local function newProgressBar(t) local mt = { borderStart = { text = "", textColor = nil, backgroundColor = nil, }, borderMiddleLoaded = { text = " ", textColor = nil, backgroundColor = colors.white }, borderEnd = { text = "", textColor = nil, backgroundColor = nil }, borderMiddleEmpty ={ text = " ", textColor = nil, backgroundColor = colors.black }, minValue = 1, maxValue = 100, currentValue = 1, pos = {1, 1}, size = {5, 1}, update = function(self, currentValue) self.currentValue = currentValue end, draw = function(self) local posX, posY = unpack(self.pos) local sizeX, sizeY = unpack(self.size) local percentage = (self.currentValue - self.minValue) / (self.maxValue - self.minValue) local loadedLength = math.floor(percentage * (sizeX - 1) + 0.5) for i = 1, 2 do local borderType = i == 1 and "borderMiddleLoaded" or "borderMiddleEmpty" if self[borderType].textColor then term.setTextColor(self[borderType].textColor) end if self[borderType].backgroundColor then term.setBackgroundColor(self[borderType].backgroundColor) end if type(self[borderType].text) == "string" then term.setCursorPos(posX + (i == 1 and 0 or loadedLength) + 1, posY) local emptyLength = (sizeX - loadedLength - 1) > 0 and (sizeX - loadedLength - 1) or 0 term.write(string.rep(self[borderType].text, (i == 1 and loadedLength or emptyLength))) elseif type(self[borderType].text) == "table" then for j, v in ipairs(self[borderType].text) do term.setCursorPos(posX + (i == 1 and 0 or loadedLength) + 1, posY + j - 1) term.write(string.rep(v, (i == 1 and loadedLength or emptyLength))) end end end for i = 1, 2 do local borderType = i == 1 and "borderStart" or "borderEnd" if self[borderType].textColor then term.setTextColor(self[borderType].textColor) end if self[borderType].backgroundColor then term.setBackgroundColor(self[borderType].backgroundColor) end if type(self[borderType].text) == "string" then term.setCursorPos(posX + (i == 1 and 0 or sizeX), posY) term.write(self[borderType].text) elseif type(self[borderType].text) == "table" then for j, v in ipairs(self[borderType].text) do term.setCursorPos(posX + (i == 1 and 0 or sizeX), posY + j - 1) term.write(v) end end end end } setmetatable(t, {__index = mt}) return t end