diff --git a/src/elements/List.lua b/src/elements/List.lua index 099de8a..d486583 100644 --- a/src/elements/List.lua +++ b/src/elements/List.lua @@ -173,6 +173,38 @@ function List:mouse_scroll(direction, x, y) return false end +--- Selects an item by index +--- @shortDescription Selects an item by index +--- @param index number The index of the item to select +--- @return List self The List instance +function List:selectItem(index) + local items = self.get("items") + + if not self.get("multiSelection") then + for _, item in ipairs(items) do + if type(item) == "table" then + item.selected = false + end + end + end + + local item = items[index] + if type(item) == "string" then + item = {text = item} + items[index] = item + end + + item.selected = true + + if item.callback then + item.callback(self) + end + + self:fireEvent("select", index, item) + self:updateRender() + return self +end + --- Registers a callback for the select event --- @shortDescription Registers a callback for the select event --- @param callback function The callback function to register diff --git a/src/elements/Program.lua b/src/elements/Program.lua index 6c5a1ee..34ffff5 100644 --- a/src/elements/Program.lua +++ b/src/elements/Program.lua @@ -34,6 +34,10 @@ function BasaltProgram.new(program, env, addEnvironment) return self end +function BasaltProgram:setArgs(...) + self.args = {...} +end + local function createShellEnv(dir) local env = { shell = shell, multishell = multishell } env.require, env.package = newPackage(env, dir) @@ -53,6 +57,7 @@ function BasaltProgram:run(path, width, height) local env = setmetatable(createShellEnv(fs.getDir(path)), { __index = _ENV }) env.term = self.window env.term.current = term.current + env.term.redirect = term.redirect env.term.native = function () return self.window end @@ -102,6 +107,7 @@ end ---@private function BasaltProgram:resize(width, height) self.window.reposition(1, 1, width, height) + self:resume("term_resize", width, height) end ---@private @@ -165,6 +171,18 @@ end function Program:init(props, basalt) VisualElement.init(self, props, basalt) self.set("type", "Program") + self:observe("width", function(self, width) + local program = self.get("program") + if program then + program:resize(width, self.get("height")) + end + end) + self:observe("height", function(self, height) + local program = self.get("program") + if program then + program:resize(self.get("width"), height) + end + end) return self end @@ -174,12 +192,13 @@ end --- @param env? table The environment to run the program in --- @param addEnvironment? boolean Whether to add the environment to the program's environment (false = overwrite instead of adding) --- @return Program self The Program instance -function Program:execute(path, env, addEnvironment) +function Program:execute(path, env, addEnvironment, ...) self.set("path", path) self.set("running", true) local program = BasaltProgram.new(self, env, addEnvironment) self.set("program", program) - program:run(path, self.get("width"), self.get("height")) + program:setArgs(...) + program:run(path, self.get("width"), self.get("height"), ...) self:updateRender() return self end diff --git a/src/elements/Table.lua b/src/elements/Table.lua index cc9da49..ee55b8a 100644 --- a/src/elements/Table.lua +++ b/src/elements/Table.lua @@ -193,7 +193,6 @@ function Table:render() currentX = currentX + col.width end - local visibleRows = height - 2 for y = 2, height do local rowIndex = y - 2 + scrollOffset local rowData = data[rowIndex + 1] @@ -209,11 +208,10 @@ function Table:render() paddedText = string.sub(paddedText, 1, col.width - 1) .. " " end local finalText = string.sub(paddedText, 1, col.width) - local finalForeground = string.sub(string.rep(tHex[self.get("foreground")], col.width), 1, width-currentX+1) - local finalBackground = string.sub(string.rep(tHex[bg], col.width), 1, width-currentX+1) - self:blit(currentX, y, finalText, - finalForeground, - finalBackground) + local finalForeground = string.rep(tHex[self.get("foreground")], #finalText) + local finalBackground = string.rep(tHex[bg], #finalText) + + self:blit(currentX, y, finalText, finalForeground, finalBackground) currentX = currentX + col.width end else