From e083b3f2ad87754b10a33b38289908bfbd074bcb Mon Sep 17 00:00:00 2001 From: Gabriel Moreira Minossi Date: Sun, 10 Jan 2021 18:58:02 -0300 Subject: [PATCH 1/7] Refactoring pages widget logic to be on widget file Moving page logic to be on page file --- Programs/monitor-system/api/gui/page/help.lua | 7 + Programs/monitor-system/api/gui/page/init.lua | 126 ++++++---- .../monitor-system/api/gui/page/overview.lua | 4 + .../monitor-system/api/gui/page/stock.lua | 7 + Programs/monitor-system/api/gui/widget.lua | 225 +++++++++++++---- Programs/monitor-system/init.lua | 226 +----------------- 6 files changed, 294 insertions(+), 301 deletions(-) create mode 100644 Programs/monitor-system/api/gui/page/help.lua create mode 100644 Programs/monitor-system/api/gui/page/stock.lua diff --git a/Programs/monitor-system/api/gui/page/help.lua b/Programs/monitor-system/api/gui/page/help.lua new file mode 100644 index 0000000..78bab6d --- /dev/null +++ b/Programs/monitor-system/api/gui/page/help.lua @@ -0,0 +1,7 @@ +--[[ +|gla| help | +|wid|ev ti|ev ti| +|ove|ev ti|ev ti| +|sto|ev ti|ev ti| +|not| power |b|f| +--]] diff --git a/Programs/monitor-system/api/gui/page/init.lua b/Programs/monitor-system/api/gui/page/init.lua index ebdcf5f..3f3a48c 100644 --- a/Programs/monitor-system/api/gui/page/init.lua +++ b/Programs/monitor-system/api/gui/page/init.lua @@ -1,54 +1,98 @@ -- Import section -local doubleBuffer = require("graphics.doubleBuffering") +DoubleBuffer = require("graphics.doubleBuffering") Colors = require("graphics.colors") Unicode = require("unicode") +Widget = require("api.gui.widget") -- +-- GPU resolution should be 160 x 50. +-- Screen should be 16 blocks by 10 blocks. (Could also be 8 x 5). +-- That way, each block should have a resolution of 10 x 10 +-- Organizing the page: +---- Title on top of the page (title) +---- Side panel on the left With a width of 20 pixels (panel) +---- Two buttons for page navigation (b, f) +------- Each with a width of 10 pixels +---- 1 Power widget on the bottom, with a width of 40 pixels (power) +---- 9 Regular widgets on the right, in a 3 x 3 grid (w) +------ Each one with a width of 20 pixels +--[[ +| p | title | +| a | w | w | w | +| n | w | w | w | +| e | w | w | w | +| l | power |b|f| +--]] +local page = {} + local pages = { - overview = require("Overview"), - notifications = require("notifications"), - stock = require("stock"), - help = require("help"), - widgets = require("widgets"), - glasses = require("glasses") + overview = require("api.gui.page.overview"), + notifications = require("api.gui.page.notifications"), + stock = require("api.gui.page.stock"), + help = require("api.gui.page.help"), + widgets = require("api.gui.page.widgets"), + glasses = require("api.gui.page.glasses") } -function pages:draw(component, index) - if index < 10 then - local x = 40 + 40 * ((index - 1) % 3) - local y = 10 * math.ceil((index) / 3) - doubleBuffer.drawRectangle(x + 1, y + 1, 38, 8, Colors.machineBackground, Colors.machineBackground, "█") - doubleBuffer.drawFrame(x + 1, y + 1, 38, 8, Colors.labelColor) - doubleBuffer.drawLine(x + 4, y + 4, x + 16, y + 4, Colors.machineBackground, Colors.mainColor, "_") - doubleBuffer.drawText(x + 1, y + 1, Colors.labelColor, component.name) - doubleBuffer.drawText( - x + 4, - y + 4, - component.working and Colors.workingColor or Colors.errorColor, - component.leftInfo - ) - if component.middleInfo then - doubleBuffer.drawText( - x + 20 - Unicode.len(component.middleInfo), - y + 5, - Colors.accentB, - component.middleInfo - ) - end - if component.rightInfo then - doubleBuffer.drawText( - x + 20 - Unicode.len(component.rightInfo) - 4, - y + 5, - Colors.accentA, - component.rightInfo - ) - end - elseif index == 10 then +local widgets = {} + +Event.listen( + "touch", + function(_, _, x, y) + local index = + 1 + + (math.floor( + 2 * + ((x - Widget.baseWidth) / Widget.baseWidth + + 3 * math.floor((y - Widget.baseHeight) / Widget.baseHeight)) + )) / + 2 + local widget = widgets[index] or widgets[index - 0.5] + + widget:onClick() end - return +) + +local function drawTitle(title) + local x = Widget.baseWidth + local y = 0 + local scale = 3 + local width = Widget.baseWidth * scale + local height = Widget.baseHeight + DoubleBuffer.drawRectangle( + x + 1, + y + 1, + width - 1, + height - 1, + Colors.machineBackground, + Colors.machineBackground, + "█" + ) + DoubleBuffer.drawFrame(x + 1, y + 1, width - 1, height - 1, Colors.labelColor) + DoubleBuffer.drawLine(x + 3, y + 6, x + width - 3, y + 6, Colors.machineBackground, Colors.textColor, "─") + DoubleBuffer.drawText(x + (width - Unicode.len(title)) / 2, y + 5, Colors.mainColor, title) end -function pages:render() +function page.create(page) + drawTitle(page.title) end -return pages +function page.fake() + for i = 1, 9 do + table.insert(widgets, Widget.machineWidget.fake()) + end + table.insert(widgets, Widget.powerWidget.fake()) + widgets[11] = widgets[10] + + page.create(pages.overview) +end + +function page.update() + for index, widget in ipairs(widgets) do + widget:update() + widget:draw(index) + end + DoubleBuffer.drawChanges() +end + +return page diff --git a/Programs/monitor-system/api/gui/page/overview.lua b/Programs/monitor-system/api/gui/page/overview.lua index 541df2d..bd7790d 100644 --- a/Programs/monitor-system/api/gui/page/overview.lua +++ b/Programs/monitor-system/api/gui/page/overview.lua @@ -5,3 +5,7 @@ |sto| w | w | w | |not| power |b|f| --]] + +return { + title = "Overview" +} diff --git a/Programs/monitor-system/api/gui/page/stock.lua b/Programs/monitor-system/api/gui/page/stock.lua new file mode 100644 index 0000000..73a7143 --- /dev/null +++ b/Programs/monitor-system/api/gui/page/stock.lua @@ -0,0 +1,7 @@ +--[[ +|gla| stock | +|wid|ev ti|ev ti| +|hel|ev ti|ev ti| +|ove|ev ti|ev ti| +|not| power |b|f| +--]] diff --git a/Programs/monitor-system/api/gui/widget.lua b/Programs/monitor-system/api/gui/widget.lua index 33938ae..dfa558d 100644 --- a/Programs/monitor-system/api/gui/widget.lua +++ b/Programs/monitor-system/api/gui/widget.lua @@ -1,46 +1,191 @@ Component = require("component") -GPU = Component.gpu -Screen = Component.screen - --- GPU resolution should be 160 x 50. --- Screen should be 16 blocks by 10 blocks. (Could also be 8 x 5). --- That way, each block should have a resolution of 10 x 10 --- Organizing the page: ----- Title on top of the page (title) ----- Side panel on the left With a width of 20 pixels (panel) ----- Two buttons for page navigation (b, f) -------- Each with a width of 10 pixels ----- 1 Power widget on the bottom, with a width of 40 pixels (power) ----- 9 Regular widgets on the right, in a 3 x 3 grid (w) ------- Each one with a width of 20 pixels ---[[ -| p | title | -| a | w | w | w | -| n | w | w | w | -| e | w | w | w | -| l | power |b|f| ---]] - - -local page = { - title = {}, - panel = {}, - back = {}, - forwards = {} -} +Unicode = require("unicode") +Colors = require("graphics.colors") +DoubleBuffer = require("graphics.doubleBuffering") local widget = { - name = "", - leftString = "", - middleString = "", - rightString = "", - height = 10, - width = 20, + baseHeight = 10, + baseWidth = 40 } -function widget.create(name, leftString, middleString, rightString, screenIndex) - widget.name = name or "Unused" - widget.leftString = leftString or "" - widget.middleString = middleString or "" - widget.rightString = rightString or "" +-- function widget.create(name, leftString, middleString, rightString, screenIndex) +-- widget.name = name or "Unused" +-- widget.leftString = leftString or "" +-- widget.middleString = middleString or "" +-- widget.rightString = rightString or "" +-- end + +local states = { + {name = "ON", color = Colors.workingColor}, + {name = "IDLE", color = Colors.idleColor}, + {name = "OFF", color = Colors.offColor}, + {name = "BROKEN", color = Colors.errorColor} +} + +local function drawProgress(x, y, width, height, progress, maxProgress, color) + progress = math.floor(progress * (width + height - 2) / (maxProgress ~= 0 and maxProgress or 1)) + + local lengths = { + first = progress > 5 and 5 or progress, + second = progress > height - 2 + 5 and height - 2 or progress - (5), + third = progress > width - 7 + height - 2 + 5 and width - 7 or progress - (height - 2 + 5) + } + DoubleBuffer.drawSemiPixelRectangle(x + 6 - lengths.first, y + 1, lengths.first, 1, color) + DoubleBuffer.drawSemiPixelRectangle(x + 1, y + 2, 1, lengths.second, color) + DoubleBuffer.drawSemiPixelRectangle(x + 1, y + height, lengths.third, 1, color) + DoubleBuffer.drawSemiPixelRectangle(x + width - 4, y + height, lengths.first, 1, color) + DoubleBuffer.drawSemiPixelRectangle(x + width, y + height - lengths.second, 1, lengths.second, color) + DoubleBuffer.drawSemiPixelRectangle(x + 1 + width - lengths.third, y + 1, lengths.third, 1, color) end + +local function draw(self, index) + if index > 10 then + return + end + local scale = self.scale or 1 + local x = widget.baseWidth + widget.baseWidth * ((index - 1) % 3) + local width = widget.baseWidth * scale + local height = widget.baseHeight + local y = height * math.ceil((index) / 3) + + DoubleBuffer.drawRectangle( + x + 1, + y + 1, + width - 1, + height - 1, + Colors.machineBackground, + Colors.machineBackground, + "█" + ) + drawProgress(x, 2 * y, width - 1, 2 * (height - 1), 1, 1, Colors.progressBackground) + DoubleBuffer.drawLine(x + 3, y + 5, x + width - 3, y + 5, Colors.machineBackground, Colors.textColor, "─") + DoubleBuffer.drawText(x + 3, y + 3, Colors.labelColor, self.name) + + drawProgress(x, 2 * y, width - 1, 2 * (height - 1), self.progress, self.maxProgress, Colors.barColor) + DoubleBuffer.drawText(x + 3, y + 7, self.state.color, self.state.name) + if self.state == states[4] then + drawProgress(x, 2 * y, width - 1, 2 * (height - 1), 1, 1, Colors.errorColor) + else + local middleInfo = self:getMiddleString() + if middleInfo then + DoubleBuffer.drawText(x + 3 + 3 + Unicode.len("IDLE"), y + height - 3, Colors.textColor, middleInfo) + end + DoubleBuffer.drawText( + x + width - Unicode.len(self.progress .. "/" .. self.maxProgress .. " s") - 3, + y + height - 3, + Colors.accentA, + self.progress .. "/" .. self.maxProgress .. " s" + ) + end +end + +local fakeNames = { + "Cleanroom", + "Electric Blast Furnace", + "Miner", + "Vacuum Freezer", + "Multi Smelter", + "Sifter", + "Large Chemical Reactor", + "Distillery", + "Oil Cracking Unit", + "Implosion Compressor" +} + +widget.machineWidget = {} + +function widget.machineWidget:update() + local breakWidget = math.random(10000) > 9999 + if breakWidget and self.state ~= states[3] then + self.state = states[4] + end + if self.state == states[1] then + self.progress = self.progress + 1 + if self.progress >= self.maxProgress then + self.progress = 0 + self.maxProgress = 0 + self.state = states[2] + end + elseif self.state == states[2] then + if math.random(1000) > 999 then + self.state = states[1] + self.maxProgress = math.random(500) + end + elseif self.state == states[3] then + self.progress = self.progress + 1 + if self.progress >= self.maxProgress then + self.progress = 0 + self.maxProgress = 0 + end + end +end + +function widget.machineWidget:onClick() + if self.state == states[1] or self.state == states[2] then + self.state = states[3] + elseif self.state == states[3] then + if self.progress < self.maxProgress then + self.state = states[1] + else + self.progress = 0 + self.maxProgress = 0 + self.state = states[2] + end + elseif self.state == states[4] then + self.progress = 0 + self.maxProgress = 0 + self.state = states[2] + end +end + +function widget.machineWidget:getMiddleString() +end + +function widget.machineWidget.fake() + local state = states[math.random(4)] + return { + name = fakeNames[math.random(10)] .. " " .. math.floor(math.random(3)), + state = state, + progress = 0, + maxProgress = state ~= states[3] and state ~= states[4] and math.random(500) or 0, + type = "machine", + update = widget.machineWidget.update, + onClick = widget.machineWidget.onClick, + getMiddleString = widget.machineWidget.getMiddleString, + draw = draw + } +end + +widget.powerWidget = {} + +function widget.powerWidget:update() + self.progress = self.progress + self.dProgress +end + +function widget.powerWidget:onClick() + self.dProgress = -self.dProgress +end + +function widget.powerWidget:getMiddleString() + local remaining = self.dProgress > 0 and self.maxProgress - self.progress or -self.progress + return (self.dProgress > 0 and "+" or "") .. + self.dProgress .. "EU/s. " .. (self.dProgress > 0 and "Full in: " or "Empty in: ") .. remaining / self.dProgress +end + +function widget.powerWidget.fake() + return { + name = "Power", + state = states[1], + progress = math.random(16000000), + maxProgress = 16000000, + scale = 2, + type = "power", + dProgress = 1, + update = widget.powerWidget.update, + onClick = widget.powerWidget.onClick, + getMiddleString = widget.powerWidget.getMiddleString, + draw = draw + } +end + +return widget diff --git a/Programs/monitor-system/init.lua b/Programs/monitor-system/init.lua index 6c678c7..303709e 100755 --- a/Programs/monitor-system/init.lua +++ b/Programs/monitor-system/init.lua @@ -1,8 +1,8 @@ -- Import section -Colors = require("graphics.colors") -Unicode = require("unicode") -DoubleBuffer = require("graphics.doubleBuffering") Event = require("event") +Colors = require("graphics.colors") +Widget = require("api.gui.widget") +Page = require("api.gui.page") -- Graphics = require("graphics.graphics") -- MultiBlock = require("data.datasource.multi-block") -- SingleBlock = require("data.datasource.single-block") @@ -64,228 +64,14 @@ end require("api.sound.zelda-secret")() --]] -local baseWidth = 40 -local baseHeight = 10 -local states = { - {name = "ON", color = Colors.workingColor}, - {name = "IDLE", color = Colors.idleColor}, - {name = "OFF", color = Colors.offColor}, - {name = "BROKEN", color = Colors.errorColor} -} +Page.fake() -local fakeNames = { - "Cleanroom", - "Electric Blast Furnace", - "Miner", - "Vacuum Freezer", - "Multi Smelter", - "Sifter", - "Large Chemical Reactor", - "Distillery", - "Oil Cracking Unit", - "Implosion Compressor" -} - -local machineWidget = {} - -function machineWidget:update() - local breakWidget = math.random(10000) > 9999 - if breakWidget and self.state ~= states[3] then - self.state = states[4] - end - if self.state == states[1] then - self.progress = self.progress + 1 - if self.progress >= self.maxProgress then - self.progress = 0 - self.maxProgress = 0 - self.state = states[2] - end - elseif self.state == states[2] then - if math.random(1000) > 999 then - self.state = states[1] - self.maxProgress = math.random(500) - end - elseif self.state == states[3] then - self.progress = self.progress + 1 - if self.progress >= self.maxProgress then - self.progress = 0 - self.maxProgress = 0 - end - end -end - -function machineWidget:onClick() - if self.state == states[1] or self.state == states[2] then - self.state = states[3] - elseif self.state == states[3] then - if self.progress < self.maxProgress then - self.state = states[1] - else - self.progress = 0 - self.maxProgress = 0 - self.state = states[2] - end - elseif self.state == states[4] then - self.progress = 0 - self.maxProgress = 0 - self.state = states[2] - end -end - -function machineWidget:getMiddleString() -end - -function machineWidget.fake() - local state = states[math.random(4)] - return { - name = fakeNames[math.random(10)] .. " " .. math.floor(math.random(3)), - state = state, - progress = 0, - maxProgress = state ~= states[3] and state ~= states[4] and math.random(500) or 0, - type = "machine", - update = machineWidget.update, - onClick = machineWidget.onClick, - getMiddleString = machineWidget.getMiddleString - } -end - -local powerWidget = {} - -function powerWidget:update() - self.progress = self.progress + self.dProgress -end - -function powerWidget:onClick() - self.dProgress = -self.dProgress -end - -function powerWidget:getMiddleString() - local remaining = self.dProgress > 0 and self.maxProgress - self.progress or -self.progress - return (self.dProgress > 0 and "+" or "") .. - self.dProgress .. "EU/s. " .. (self.dProgress > 0 and "Full in: " or "Empty in: ") .. remaining / self.dProgress -end - -function powerWidget.fake() - return { - name = "Power", - state = states[1], - progress = math.random(16000000), - maxProgress = 16000000, - scale = 2, - type = "power", - dProgress = 1, - update = powerWidget.update, - onClick = powerWidget.onClick, - getMiddleString = powerWidget.getMiddleString - } -end - -local widgets = {} - -for i = 1, 9 do - table.insert(widgets, machineWidget.fake()) -end -table.insert(widgets, powerWidget.fake()) -widgets[11] = widgets[10] - -Event.listen( - "touch", - function(_, _, x, y) - local index = - 1 + (math.floor(2 * ((x - baseWidth) / baseWidth + 3 * math.floor((y - baseHeight) / baseHeight)))) / 2 - local widget = widgets[index] or widgets[index - 0.5] - - widget:onClick() - end -) - -local function drawTitle(title) - local x = baseWidth - local y = 0 - local scale = 3 - local width = baseWidth * scale - local height = baseHeight - DoubleBuffer.drawRectangle( - x + 1, - y + 1, - width - 1, - height - 1, - Colors.machineBackground, - Colors.machineBackground, - "█" - ) - DoubleBuffer.drawFrame(x + 1, y + 1, width - 1, height - 1, Colors.labelColor) - DoubleBuffer.drawLine(x + 3, y + 6, x + width - 3, y + 6, Colors.machineBackground, Colors.textColor, "─") - DoubleBuffer.drawText(x + (width - Unicode.len(title)) / 2, y + 5, Colors.mainColor, title) -end - -local function drawProgress(x, y, width, height, progress, maxProgress, color) - progress = math.floor(progress * (width + height - 2) / (maxProgress ~= 0 and maxProgress or 1)) - - local lengths = { - first = progress > 5 and 5 or progress, - second = progress > height - 2 + 5 and height - 2 or progress - (5), - third = progress > width - 7 + height - 2 + 5 and width - 7 or progress - (height - 2 + 5) - } - DoubleBuffer.drawSemiPixelRectangle(x + 6 - lengths.first, y + 1, lengths.first, 1, color) - DoubleBuffer.drawSemiPixelRectangle(x + 1, y + 2, 1, lengths.second, color) - DoubleBuffer.drawSemiPixelRectangle(x + 1, y + height, lengths.third, 1, color) - DoubleBuffer.drawSemiPixelRectangle(x + width - 4, y + height, lengths.first, 1, color) - DoubleBuffer.drawSemiPixelRectangle(x + width, y + height - lengths.second, 1, lengths.second, color) - DoubleBuffer.drawSemiPixelRectangle(x + 1 + width - lengths.third, y + 1, lengths.third, 1, color) -end - -local function drawWidget(index, widget) - if index > 10 then - return - end - local scale = widget.scale or 1 - local x = baseWidth + baseWidth * ((index - 1) % 3) - local width = baseWidth * scale - local height = baseHeight - local y = height * math.ceil((index) / 3) - DoubleBuffer.drawRectangle( - x + 1, - y + 1, - width - 1, - height - 1, - Colors.machineBackground, - Colors.machineBackground, - "█" - ) - - drawProgress(x, 2 * y, width - 1, 2 * (height - 1), 1, 1, Colors.progressBackground) - drawProgress(x, 2 * y, width - 1, 2 * (height - 1), widget.progress, widget.maxProgress, Colors.barColor) - - DoubleBuffer.drawLine(x + 3, y + 5, x + width - 3, y + 5, Colors.machineBackground, Colors.textColor, "─") - DoubleBuffer.drawText(x + 3, y + 3, Colors.labelColor, widget.name) - DoubleBuffer.drawText(x + 3, y + 7, widget.state.color, widget.state.name) - if widget.state == states[4] then - drawProgress(x, 2 * y, width - 1, 2 * (height - 1), 1, 1, Colors.errorColor) - else - local middleInfo = widget:getMiddleString() - if middleInfo then - DoubleBuffer.drawText(x + 3 + 3 + Unicode.len("IDLE"), y + height - 3, Colors.textColor, middleInfo) - end - DoubleBuffer.drawText( - x + width - Unicode.len(widget.progress .. "/" .. widget.maxProgress .. " s") - 3, - y + height - 3, - Colors.accentA, - widget.progress .. "/" .. widget.maxProgress .. " s" - ) - end -end - -drawTitle("Overview") while true do - for index, widget in ipairs(widgets) do - widget:update() - drawWidget(index, widget) - end - DoubleBuffer.drawChanges() + Page.update() os.sleep(0) end + --[[ Page = require("api.gui.page") Notifications = {} From aea2f475e5d8449a34f9e16104a9bf3d3f151c1f Mon Sep 17 00:00:00 2001 From: Gabriel Moreira Minossi Date: Mon, 11 Jan 2021 12:43:55 -0300 Subject: [PATCH 2/7] Refactoring widget Using a fake method to create fake widgets Using constants from constants file Creating a base widget --- Programs/monitor-system/api/gui/constants.lua | 6 + Programs/monitor-system/api/gui/widget.lua | 107 +++++++++++------- 2 files changed, 70 insertions(+), 43 deletions(-) create mode 100644 Programs/monitor-system/api/gui/constants.lua diff --git a/Programs/monitor-system/api/gui/constants.lua b/Programs/monitor-system/api/gui/constants.lua new file mode 100644 index 0000000..b0c6562 --- /dev/null +++ b/Programs/monitor-system/api/gui/constants.lua @@ -0,0 +1,6 @@ +local constants = {} + +constants.baseWidth = 40 +constants.baseHeight = 10 + +return constants diff --git a/Programs/monitor-system/api/gui/widget.lua b/Programs/monitor-system/api/gui/widget.lua index dfa558d..a0c8e83 100644 --- a/Programs/monitor-system/api/gui/widget.lua +++ b/Programs/monitor-system/api/gui/widget.lua @@ -2,18 +2,9 @@ Component = require("component") Unicode = require("unicode") Colors = require("graphics.colors") DoubleBuffer = require("graphics.doubleBuffering") +Constants = require("api.gui.constants") -local widget = { - baseHeight = 10, - baseWidth = 40 -} - --- function widget.create(name, leftString, middleString, rightString, screenIndex) --- widget.name = name or "Unused" --- widget.leftString = leftString or "" --- widget.middleString = middleString or "" --- widget.rightString = rightString or "" --- end +local widget = {} local states = { {name = "ON", color = Colors.workingColor}, @@ -30,24 +21,19 @@ local function drawProgress(x, y, width, height, progress, maxProgress, color) second = progress > height - 2 + 5 and height - 2 or progress - (5), third = progress > width - 7 + height - 2 + 5 and width - 7 or progress - (height - 2 + 5) } + DoubleBuffer.drawRectangle(x + 6, y / 2 + 1, 2, 1, Colors.machineBackground, Colors.machineBackground, "█") DoubleBuffer.drawSemiPixelRectangle(x + 6 - lengths.first, y + 1, lengths.first, 1, color) DoubleBuffer.drawSemiPixelRectangle(x + 1, y + 2, 1, lengths.second, color) DoubleBuffer.drawSemiPixelRectangle(x + 1, y + height, lengths.third, 1, color) + DoubleBuffer.drawRectangle(x + width - 6, (y + height) / 2, 2, 1, Colors.machineBackground, Colors.machineBackground, "█") DoubleBuffer.drawSemiPixelRectangle(x + width - 4, y + height, lengths.first, 1, color) DoubleBuffer.drawSemiPixelRectangle(x + width, y + height - lengths.second, 1, lengths.second, color) DoubleBuffer.drawSemiPixelRectangle(x + 1 + width - lengths.third, y + 1, lengths.third, 1, color) end -local function draw(self, index) - if index > 10 then - return - end - local scale = self.scale or 1 - local x = widget.baseWidth + widget.baseWidth * ((index - 1) % 3) - local width = widget.baseWidth * scale - local height = widget.baseHeight - local y = height * math.ceil((index) / 3) - +function widget.drawBaseWidget(x, y, scale, title) + local width = Constants.baseWidth * scale + local height = Constants.baseHeight DoubleBuffer.drawRectangle( x + 1, y + 1, @@ -57,12 +43,26 @@ local function draw(self, index) Colors.machineBackground, "█" ) - drawProgress(x, 2 * y, width - 1, 2 * (height - 1), 1, 1, Colors.progressBackground) + DoubleBuffer.drawFrame(x + 1, y + 1, width - 1, height - 1, Colors.labelColor) DoubleBuffer.drawLine(x + 3, y + 5, x + width - 3, y + 5, Colors.machineBackground, Colors.textColor, "─") - DoubleBuffer.drawText(x + 3, y + 3, Colors.labelColor, self.name) + DoubleBuffer.drawText(x + (width - Unicode.len(title)) / 2, y + 3, Colors.labelColor, title) +end +local function draw(self, index) + if self.type == "power" then + index = 10 + end + local scale = self.scale or 1 + local width = Constants.baseWidth * scale + local height = Constants.baseHeight + local x = Constants.baseWidth + Constants.baseWidth * ((index - 1) % 3) + local y = height * math.ceil((index) / 3) + + widget.drawBaseWidget(x, y, scale, self.name) + + drawProgress(x, 2 * y, width - 1, 2 * (height - 1), 1, 1, Colors.progressBackground) drawProgress(x, 2 * y, width - 1, 2 * (height - 1), self.progress, self.maxProgress, Colors.barColor) - DoubleBuffer.drawText(x + 3, y + 7, self.state.color, self.state.name) + DoubleBuffer.drawText(x + 4, y + 7, self.state.color, self.state.name) if self.state == states[4] then drawProgress(x, 2 * y, width - 1, 2 * (height - 1), 1, 1, Colors.errorColor) else @@ -71,7 +71,7 @@ local function draw(self, index) DoubleBuffer.drawText(x + 3 + 3 + Unicode.len("IDLE"), y + height - 3, Colors.textColor, middleInfo) end DoubleBuffer.drawText( - x + width - Unicode.len(self.progress .. "/" .. self.maxProgress .. " s") - 3, + x + width - Unicode.len(self.progress .. "/" .. self.maxProgress .. " s") - 2, y + height - 3, Colors.accentA, self.progress .. "/" .. self.maxProgress .. " s" @@ -79,7 +79,9 @@ local function draw(self, index) end end -local fakeNames = { +local fake = {} + +fake.names = { "Cleanroom", "Electric Blast Furnace", "Miner", @@ -92,9 +94,9 @@ local fakeNames = { "Implosion Compressor" } -widget.machineWidget = {} +fake.machineWidget = {} -function widget.machineWidget:update() +function fake.machineWidget:update() local breakWidget = math.random(10000) > 9999 if breakWidget and self.state ~= states[3] then self.state = states[4] @@ -120,7 +122,7 @@ function widget.machineWidget:update() end end -function widget.machineWidget:onClick() +function fake.machineWidget:onClick() if self.state == states[1] or self.state == states[2] then self.state = states[3] elseif self.state == states[3] then @@ -138,41 +140,41 @@ function widget.machineWidget:onClick() end end -function widget.machineWidget:getMiddleString() +function fake.machineWidget:getMiddleString() end -function widget.machineWidget.fake() +function fake.machineWidget.create() local state = states[math.random(4)] return { - name = fakeNames[math.random(10)] .. " " .. math.floor(math.random(3)), + name = fake.names[math.random(10)] .. " " .. math.floor(math.random(3)), state = state, progress = 0, maxProgress = state ~= states[3] and state ~= states[4] and math.random(500) or 0, type = "machine", - update = widget.machineWidget.update, - onClick = widget.machineWidget.onClick, - getMiddleString = widget.machineWidget.getMiddleString, + update = fake.machineWidget.update, + onClick = fake.machineWidget.onClick, + getMiddleString = fake.machineWidget.getMiddleString, draw = draw } end -widget.powerWidget = {} +fake.powerWidget = {} -function widget.powerWidget:update() +function fake.powerWidget:update() self.progress = self.progress + self.dProgress end -function widget.powerWidget:onClick() +function fake.powerWidget:onClick() self.dProgress = -self.dProgress end -function widget.powerWidget:getMiddleString() +function fake.powerWidget:getMiddleString() local remaining = self.dProgress > 0 and self.maxProgress - self.progress or -self.progress return (self.dProgress > 0 and "+" or "") .. self.dProgress .. "EU/s. " .. (self.dProgress > 0 and "Full in: " or "Empty in: ") .. remaining / self.dProgress end -function widget.powerWidget.fake() +function fake.powerWidget.create() return { name = "Power", state = states[1], @@ -181,11 +183,30 @@ function widget.powerWidget.fake() scale = 2, type = "power", dProgress = 1, - update = widget.powerWidget.update, - onClick = widget.powerWidget.onClick, - getMiddleString = widget.powerWidget.getMiddleString, + update = fake.powerWidget.update, + onClick = fake.powerWidget.onClick, + getMiddleString = fake.powerWidget.getMiddleString, draw = draw } end +function widget.fakeWidgets() + local fakeWidgets = {} + + for _ = 1, 9 do + table.insert(fakeWidgets, fake.machineWidget.create()) + end + + return fakeWidgets +end + +function widget.fakePowerWidget() + local fakePowerWidgets = {} + + table.insert(fakePowerWidgets, fake.powerWidget.create()) + fakePowerWidgets[11] = fakePowerWidgets[10] + + return fakePowerWidgets +end + return widget From 1720f162e437d79bdaf025bd0eac1c66c89e8d8c Mon Sep 17 00:00:00 2001 From: Gabriel Moreira Minossi Date: Mon, 11 Jan 2021 13:03:50 -0300 Subject: [PATCH 3/7] Adding titles to pages --- Programs/monitor-system/api/gui/page/glasses.lua | 4 ++++ Programs/monitor-system/api/gui/page/help.lua | 4 ++++ Programs/monitor-system/api/gui/page/notifications.lua | 4 ++++ Programs/monitor-system/api/gui/page/stock.lua | 4 ++++ Programs/monitor-system/api/gui/page/widgets.lua | 4 ++++ 5 files changed, 20 insertions(+) diff --git a/Programs/monitor-system/api/gui/page/glasses.lua b/Programs/monitor-system/api/gui/page/glasses.lua index 62d6844..a2032da 100644 --- a/Programs/monitor-system/api/gui/page/glasses.lua +++ b/Programs/monitor-system/api/gui/page/glasses.lua @@ -5,3 +5,7 @@ |sto| w | w | w | |not| power |b|f| --]] + +return { + title = "Glasses" +} diff --git a/Programs/monitor-system/api/gui/page/help.lua b/Programs/monitor-system/api/gui/page/help.lua index 78bab6d..220cf46 100644 --- a/Programs/monitor-system/api/gui/page/help.lua +++ b/Programs/monitor-system/api/gui/page/help.lua @@ -5,3 +5,7 @@ |sto|ev ti|ev ti| |not| power |b|f| --]] + +return { + title = "Help" +} diff --git a/Programs/monitor-system/api/gui/page/notifications.lua b/Programs/monitor-system/api/gui/page/notifications.lua index e00ed86..edfabbf 100644 --- a/Programs/monitor-system/api/gui/page/notifications.lua +++ b/Programs/monitor-system/api/gui/page/notifications.lua @@ -5,3 +5,7 @@ |sto|ev ti|ev ti| |ove| power |b|f| --]] + +return { + title ="Notifications" +} diff --git a/Programs/monitor-system/api/gui/page/stock.lua b/Programs/monitor-system/api/gui/page/stock.lua index 73a7143..24a8387 100644 --- a/Programs/monitor-system/api/gui/page/stock.lua +++ b/Programs/monitor-system/api/gui/page/stock.lua @@ -5,3 +5,7 @@ |ove|ev ti|ev ti| |not| power |b|f| --]] + +return { + title = "Stock" +} diff --git a/Programs/monitor-system/api/gui/page/widgets.lua b/Programs/monitor-system/api/gui/page/widgets.lua index e444c56..f02073f 100644 --- a/Programs/monitor-system/api/gui/page/widgets.lua +++ b/Programs/monitor-system/api/gui/page/widgets.lua @@ -5,3 +5,7 @@ |sto| w | w | w | |not| power |b|f| --]] + +return { + title = "Widgets" +} From f0ac9ac7b01c01070162d7a54eb1fc9f1050efe8 Mon Sep 17 00:00:00 2001 From: Gabriel Moreira Minossi Date: Mon, 11 Jan 2021 13:04:52 -0300 Subject: [PATCH 4/7] Adding pages init to main init --- Programs/monitor-system/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Programs/monitor-system/init.lua b/Programs/monitor-system/init.lua index 303709e..5e186c3 100755 --- a/Programs/monitor-system/init.lua +++ b/Programs/monitor-system/init.lua @@ -1,7 +1,7 @@ -- Import section -Event = require("event") -Colors = require("graphics.colors") -Widget = require("api.gui.widget") +-- Event = require("event") +-- Colors = require("graphics.colors") +-- Widget = require("api.gui.widget") Page = require("api.gui.page") -- Graphics = require("graphics.graphics") -- MultiBlock = require("data.datasource.multi-block") From 1c90d83f88b69d2578494613b40bab050b22b429 Mon Sep 17 00:00:00 2001 From: Gabriel Moreira Minossi Date: Mon, 11 Jan 2021 13:08:06 -0300 Subject: [PATCH 5/7] Adding panel elements Improving touch envent listener Using baseWidget method Creating page fake method --- Libraries/graphics/doubleBuffering.lua | 4 +- Programs/monitor-system/api/gui/page/init.lua | 139 +++++++++++------- 2 files changed, 88 insertions(+), 55 deletions(-) diff --git a/Libraries/graphics/doubleBuffering.lua b/Libraries/graphics/doubleBuffering.lua index 8d3f219..933f6d1 100644 --- a/Libraries/graphics/doubleBuffering.lua +++ b/Libraries/graphics/doubleBuffering.lua @@ -458,8 +458,8 @@ end local function drawFrame(x, y, width, height, color) local stringUp, stringDown, x2 = - "┌" .. string.rep("─", width - 2) .. "┐", - "└" .. string.rep("─", width - 2) .. "┘", + "╭" .. string.rep("─", width - 2) .. "╮", + "╰" .. string.rep("─", width - 2) .. "╯", x + width - 1 drawText(x, y, color, stringUp) diff --git a/Programs/monitor-system/api/gui/page/init.lua b/Programs/monitor-system/api/gui/page/init.lua index 3f3a48c..1822c4a 100644 --- a/Programs/monitor-system/api/gui/page/init.lua +++ b/Programs/monitor-system/api/gui/page/init.lua @@ -1,21 +1,23 @@ -- Import section +Unicode = require("unicode") +Event = require("event") DoubleBuffer = require("graphics.doubleBuffering") Colors = require("graphics.colors") -Unicode = require("unicode") Widget = require("api.gui.widget") +Constants = require("api.gui.constants") -- -- GPU resolution should be 160 x 50. --- Screen should be 16 blocks by 10 blocks. (Could also be 8 x 5). --- That way, each block should have a resolution of 10 x 10 +-- Screen should be 8 x 5 blocks. +-- That way, each block should have a resolution of 20 x 10 -- Organizing the page: ---- Title on top of the page (title) ----- Side panel on the left With a width of 20 pixels (panel) ----- Two buttons for page navigation (b, f) -------- Each with a width of 10 pixels ----- 1 Power widget on the bottom, with a width of 40 pixels (power) +---- Side panel on the left With a width of 40 pixels (panel) +---- 2 buttons for page navigation (b, f) +------- Each with a width of 20 pixels +---- 1 Power widget on the bottom, with a width of 80 pixels (power) ---- 9 Regular widgets on the right, in a 3 x 3 grid (w) ------- Each one with a width of 20 pixels +------ Each one with a width of 40 pixels --[[ | p | title | | a | w | w | w | @@ -23,74 +25,105 @@ Widget = require("api.gui.widget") | e | w | w | w | | l | power |b|f| --]] +local pages = { + glasses = require("api.gui.page.glasses"), + widgets = require("api.gui.page.widgets"), + help = require("api.gui.page.help"), + stock = require("api.gui.page.stock"), + notifications = require("api.gui.page.notifications"), + overview = require("api.gui.page.overview") +} +pages[1] = pages.glasses +pages[2] = pages.widgets +pages[3] = pages.help +pages[4] = pages.stock +pages[5] = pages.notifications +pages[6] = pages.overview + local page = {} -local pages = { - overview = require("api.gui.page.overview"), - notifications = require("api.gui.page.notifications"), - stock = require("api.gui.page.stock"), - help = require("api.gui.page.help"), - widgets = require("api.gui.page.widgets"), - glasses = require("api.gui.page.glasses") +local elements = { + machineWidgets = {}, + powerWidgets = {}, + panelSections = {}, + navigationButtons = {} } -local widgets = {} - Event.listen( "touch", function(_, _, x, y) - local index = - 1 + - (math.floor( - 2 * - ((x - Widget.baseWidth) / Widget.baseWidth + - 3 * math.floor((y - Widget.baseHeight) / Widget.baseHeight)) - )) / - 2 - local widget = widgets[index] or widgets[index - 0.5] + local xContribution = x / Constants.baseWidth + local yContribution = 4 * math.floor(y / Constants.baseHeight) + local screenIndex = 1 + (math.floor(2 * (xContribution + yContribution))) / 2 - widget:onClick() + local selected = elements[screenIndex] or elements[screenIndex - 0.5] + selected:onClick() end ) local function drawTitle(title) - local x = Widget.baseWidth + local x = Constants.baseWidth local y = 0 local scale = 3 - local width = Widget.baseWidth * scale - local height = Widget.baseHeight - DoubleBuffer.drawRectangle( - x + 1, - y + 1, - width - 1, - height - 1, - Colors.machineBackground, - Colors.machineBackground, - "█" - ) - DoubleBuffer.drawFrame(x + 1, y + 1, width - 1, height - 1, Colors.labelColor) - DoubleBuffer.drawLine(x + 3, y + 6, x + width - 3, y + 6, Colors.machineBackground, Colors.textColor, "─") - DoubleBuffer.drawText(x + (width - Unicode.len(title)) / 2, y + 5, Colors.mainColor, title) + Widget.drawBaseWidget(x, y, scale, title) end -function page.create(page) - drawTitle(page.title) +local function drawPanelSection(index, title) + local x = 0 + local y = (index - 1) * Constants.baseHeight + local scale = 1 + Widget.drawBaseWidget(x, y, scale, title) +end + +function page.create(element) + drawTitle(element.title) + + local panelIndex = 1 + for _, pg in pairs(pages) do + if pg ~= element then + elements.panelSections[panelIndex] = pg + drawPanelSection(panelIndex, pg.title) + panelIndex = panelIndex + 1 + end + end + + elements[6] = elements.machineWidgets[1] + elements[7] = elements.machineWidgets[2] + elements[8] = elements.machineWidgets[3] + elements[10] = elements.machineWidgets[4] + elements[11] = elements.machineWidgets[5] + elements[12] = elements.machineWidgets[6] + elements[14] = elements.machineWidgets[7] + elements[15] = elements.machineWidgets[8] + elements[16] = elements.machineWidgets[9] + + elements[18] = elements.powerWidgets[1] + elements[19] = elements.powerWidgets[1] + + elements[1] = elements.panelSections[1] + elements[5] = elements.panelSections[2] + elements[9] = elements.panelSections[3] + elements[13] = elements.panelSections[3] + elements[17] = elements.panelSections[5] + + elements[20] = elements.navigationButtons[1] + elements[20.5] = elements.navigationButtons[2] end function page.fake() - for i = 1, 9 do - table.insert(widgets, Widget.machineWidget.fake()) - end - table.insert(widgets, Widget.powerWidget.fake()) - widgets[11] = widgets[10] - + elements.machineWidgets = Widget.fakeWidgets() + elements.powerWidgets = Widget.fakePowerWidget() page.create(pages.overview) end function page.update() - for index, widget in ipairs(widgets) do - widget:update() - widget:draw(index) + for index, machineWidget in ipairs(elements.machineWidgets) do + machineWidget:update() + machineWidget:draw(index) + end + for index, powerWidget in ipairs(elements.powerWidgets) do + powerWidget:update() + powerWidget:draw(index) end DoubleBuffer.drawChanges() end From 9e49d86bd96e2afff36443298a02f39e455fece1 Mon Sep 17 00:00:00 2001 From: Gabriel Moreira Minossi Date: Mon, 11 Jan 2021 13:44:48 -0300 Subject: [PATCH 6/7] Adding reboot button on top right Fixing drawBaseWidget bug --- Programs/monitor-system/api/gui/page/init.lua | 11 ++++++++--- Programs/monitor-system/api/gui/widget.lua | 6 +++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Programs/monitor-system/api/gui/page/init.lua b/Programs/monitor-system/api/gui/page/init.lua index 1822c4a..0ef136e 100644 --- a/Programs/monitor-system/api/gui/page/init.lua +++ b/Programs/monitor-system/api/gui/page/init.lua @@ -1,10 +1,11 @@ -- Import section +Computer = require("computer") Unicode = require("unicode") Event = require("event") DoubleBuffer = require("graphics.doubleBuffering") +Constants = require("api.gui.constants") Colors = require("graphics.colors") Widget = require("api.gui.widget") -Constants = require("api.gui.constants") -- -- GPU resolution should be 160 x 50. @@ -79,14 +80,18 @@ function page.create(element) drawTitle(element.title) local panelIndex = 1 - for _, pg in pairs(pages) do + for _, pg in ipairs(pages) do if pg ~= element then - elements.panelSections[panelIndex] = pg + elements.panelSections[panelIndex] = pg.title drawPanelSection(panelIndex, pg.title) panelIndex = panelIndex + 1 end end + elements[4.5] = {onClick = function() + Computer.shutdown(true) + end} + elements[6] = elements.machineWidgets[1] elements[7] = elements.machineWidgets[2] elements[8] = elements.machineWidgets[3] diff --git a/Programs/monitor-system/api/gui/widget.lua b/Programs/monitor-system/api/gui/widget.lua index a0c8e83..36fd601 100644 --- a/Programs/monitor-system/api/gui/widget.lua +++ b/Programs/monitor-system/api/gui/widget.lua @@ -1,8 +1,8 @@ Component = require("component") Unicode = require("unicode") -Colors = require("graphics.colors") DoubleBuffer = require("graphics.doubleBuffering") Constants = require("api.gui.constants") +Colors = require("graphics.colors") local widget = {} @@ -45,7 +45,7 @@ function widget.drawBaseWidget(x, y, scale, title) ) DoubleBuffer.drawFrame(x + 1, y + 1, width - 1, height - 1, Colors.labelColor) DoubleBuffer.drawLine(x + 3, y + 5, x + width - 3, y + 5, Colors.machineBackground, Colors.textColor, "─") - DoubleBuffer.drawText(x + (width - Unicode.len(title)) / 2, y + 3, Colors.labelColor, title) + DoubleBuffer.drawText(x + math.floor((width - Unicode.len(title)) / 2), y + 3, Colors.labelColor, title) end local function draw(self, index) @@ -71,7 +71,7 @@ local function draw(self, index) DoubleBuffer.drawText(x + 3 + 3 + Unicode.len("IDLE"), y + height - 3, Colors.textColor, middleInfo) end DoubleBuffer.drawText( - x + width - Unicode.len(self.progress .. "/" .. self.maxProgress .. " s") - 2, + x + width - Unicode.len(self.progress .. "/" .. self.maxProgress .. " s") - 3, y + height - 3, Colors.accentA, self.progress .. "/" .. self.maxProgress .. " s" From 6d4d97229bebce5780b0781cab97ad20df21c93c Mon Sep 17 00:00:00 2001 From: Gabriel Moreira Minossi Date: Mon, 11 Jan 2021 14:03:15 -0300 Subject: [PATCH 7/7] Adding panel buttons --- Programs/monitor-system/api/gui/page/init.lua | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Programs/monitor-system/api/gui/page/init.lua b/Programs/monitor-system/api/gui/page/init.lua index 0ef136e..ab1bf95 100644 --- a/Programs/monitor-system/api/gui/page/init.lua +++ b/Programs/monitor-system/api/gui/page/init.lua @@ -82,15 +82,22 @@ function page.create(element) local panelIndex = 1 for _, pg in ipairs(pages) do if pg ~= element then - elements.panelSections[panelIndex] = pg.title + elements.panelSections[panelIndex] = { + title = pg.title, + onClick = function() + page.create(pg) + end + } drawPanelSection(panelIndex, pg.title) panelIndex = panelIndex + 1 end end - elements[4.5] = {onClick = function() + elements[4.5] = { + onClick = function() Computer.shutdown(true) - end} + end + } elements[6] = elements.machineWidgets[1] elements[7] = elements.machineWidgets[2] @@ -108,7 +115,7 @@ function page.create(element) elements[1] = elements.panelSections[1] elements[5] = elements.panelSections[2] elements[9] = elements.panelSections[3] - elements[13] = elements.panelSections[3] + elements[13] = elements.panelSections[4] elements[17] = elements.panelSections[5] elements[20] = elements.navigationButtons[1]