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