CCCPaste

Home-Management-Syschdem

local programs = {}
local function readPrograms(filename)
    local file = fs.open(filename, "r")
    if not file then
        print("Datei nicht gefunden: " .. filename)
        return nil
    end

    while true do
        local line = file.readLine()
        if not line then break end
        local name, exec = line:match("^(%S+)%s+(%S+)$")
        if name and exec then
            table.insert(programs, {displayName = name, execFile = exec})
        end
    end

    file.close()
    return programs
end

local programs = readPrograms("programs.txt")

local monitor = peripheral.find("monitor")

local w, h = monitor.getSize()

-- Zentrierte Textausgabe
local function centerText(periph, text, row)
    local width = periph == term and term.getSize() or periph.getSize()
    local startCol = math.floor((width - #text) / 2) + 1
    periph.setCursorPos(startCol, row)
    periph.write(text)
end

local function renderBorder(periph)
    local w, h = periph.getSize()
    periph.setTextColor(colors.yellow)
    for x = 1, w do
        periph.setCursorPos(x, 1)
        periph.write("-")
        periph.setCursorPos(x, h)
        periph.write("-")
    end
    for y = 1, h do
        periph.setCursorPos(1, y)
        periph.write("+")
        periph.setCursorPos(w, y)
        periph.write("+")
    end
    periph.setTextColor(colors.white)
end

-- Menü-Rendering (zentriert)
local function renderMenu(selected)
    for _, periph in ipairs({term, monitor}) do
        periph.clear()
        renderBorder(periph)
        periph.setTextColor(colors.green)
        centerText(periph, "Hohm-Menadschmend-Syschdem", 1)
        periph.setTextColor(colors.white)

        for i, prog in ipairs(programs) do
            local menuText = (i == selected and "> " or "  ") .. prog.displayName .. (i == selected and " <" or "  ")
            centerText(term, menuText, i+3)
            centerText(monitor, menuText, i+3)
        end
    end
end

-- Menüschleife
local selected = 1
renderMenu(selected)

while true do
    local event, key = os.pullEvent("key")
    if key == keys.up then
        selected = selected > 1 and (selected - 1) or #programs
        renderMenu(selected)
    elseif key == keys.down then
        selected = selected < #programs and (selected + 1) or 1
        renderMenu(selected)
    elseif key == keys.enter then
        term.clear()
        monitor.clear()
        centerText(term, "Starte: " .. programs[selected].displayName, 1)
        centerText(monitor, "Starte: " .. programs[selected].displayName, 1)
        sleep(1)
        shell.run(programs[selected].execFile)
        renderMenu(selected)
    elseif key == keys.backspace then
        break
    end
end

local function renderBorder(periph)
    local w, h = periph.getSize()
    periph.setTextColor(colors.gray)
    for x = 1, w do
        periph.setCursorPos(x, 1)
        periph.write("-")
        periph.setCursorPos(x, h)
        periph.write("-")
    end
    for y = 1, h do
        periph.setCursorPos(1, y)
        periph.write("|")
        periph.setCursorPos(w, y)
        periph.write("|")
    end
    periph.setTextColor(colors.white)
end