Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- wm.lua - менеджер окон
- local window = require("window")
- local wm = {
- windows = {},
- focused = nil
- }
- -- Создание нового окна
- function wm:createWindow(x, y, width, height, title)
- local win = window.create(x, y, width, height, title)
- table.insert(self.windows, win)
- self:setFocused(win)
- return win
- end
- -- Установка фокуса
- function wm:setFocused(win)
- if self.focused then
- self.focused:setActive(false)
- end
- self.focused = win
- if win then
- win:setActive(true)
- -- Перемещаем окно наверх
- for i, w in ipairs(self.windows) do
- if w == win then
- table.remove(self.windows, i)
- table.insert(self.windows, 1, win)
- break
- end
- end
- end
- end
- -- Обработка событий
- function wm:handleEvent(event, ...)
- if event == "mouse_click" then
- local x, y, button = ...
- local handled = false
- -- Проверяем окна сверху вниз (обратный порядок для Z-индекса)
- for i = #self.windows, 1, -1 do
- local win = self.windows[i]
- if win:handleClick(x, y, button) then
- self:setFocused(win)
- handled = true
- break
- end
- end
- return handled
- elseif event == "mouse_drag" then
- if self.focused then
- return self.focused:handleDrag(...)
- end
- end
- return false
- end
- -- Отрисовка всех окон
- function wm:drawAll()
- term.setBackgroundColor(colors.black)
- term.clear()
- -- Рисуем окна снизу вверх (правильный порядок для Z-индекса)
- for i = #self.windows, 1, -1 do
- self.windows[i]:draw()
- end
- end
- -- Основной цикл обработки событий
- function wm:run()
- while true do
- self:drawAll()
- local event = {os.pullEvent()}
- self:handleEvent(event[1], table.unpack(event, 2))
- end
- end
- return wm
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement