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