Advertisement
kaibochan

Display.lua

Feb 22nd, 2025
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.03 KB | None | 0 0
  1. local Element = require("gui.Element")
  2. local Buffer = require("gui.Buffer")
  3.  
  4. local Display = {
  5.     __name = "Display",
  6.     device = nil,
  7.     is_monitor = false,
  8.     width = 1,
  9.     height = 1,
  10.     window = Element,
  11.     elements = {},
  12. }
  13.  
  14. function Display:new(o)
  15.     o = o or {}
  16.  
  17.     setmetatable(o, self)
  18.     self.__index = self
  19.  
  20.     o.window = Element:new {
  21.         width = o.width,
  22.         height = o.height,
  23.     }
  24.     o.elements = {}
  25.  
  26.     return o
  27. end
  28.  
  29. function Display:render()
  30.  
  31.     -- draw all elements in breadth-first traversal order
  32.     local index = 1
  33.     self.elements = {{
  34.         element = self.window,
  35.         global_x = self.window.x,
  36.         global_y = self.window.y,
  37.     }}
  38.  
  39.     -- traversal loop
  40.     repeat
  41.         -- add children of current element to elements list
  42.         for _, child in ipairs(self.elements[index].element.children) do
  43.             table.insert(self.elements, {
  44.                 element = child,
  45.                 global_x = self.elements[index].global_x + child.x,
  46.                 global_y = self.elements[index].global_y + child.y,
  47.             })
  48.         end
  49.  
  50.         -- update buffer of current element before copying
  51.         self.elements[index].element:updateBuffer()
  52.  
  53.         -- write the current element's buffer data to screen buffer
  54.         local offset_x = self.elements[index].global_x
  55.         local offset_y = self.elements[index].global_y
  56.        
  57.         for x = 0, self.elements[index].element.width - 1 do
  58.             for y = 0, self.elements[index].element.height - 1 do
  59.                 if (x + offset_x < self.window.width and y + offset_y < self.window.height) then
  60.                     self.window.buffer.cells[x + offset_x][y + offset_y]:copy(
  61.                         self.elements[index].element.buffer.cells[x][y]
  62.                     )
  63.                 end
  64.             end
  65.         end
  66.  
  67.         index = index + 1
  68.     until index > #self.elements
  69.  
  70.     -- write screen buffer data to the display device
  71.     for y = 0, self.height - 1 do
  72.         local characters = ""
  73.         local fg_colors = ""
  74.         local bg_colors = ""
  75.  
  76.         for x = 0, self.width - 1 do
  77.             characters = characters .. self.window.buffer.cells[x][y].character
  78.             fg_colors = fg_colors .. colors.toBlit(self.window.buffer.cells[x][y].fg_color)
  79.             bg_colors = bg_colors ..  colors.toBlit(self.window.buffer.cells[x][y].bg_color)
  80.         end
  81.  
  82.         self.device.setCursorPos(1, y + 1)
  83.         self.device.blit(characters, fg_colors, bg_colors)
  84.     end
  85. end
  86.  
  87. function Display:getSelectedElement(x, y)
  88.     local selection = nil
  89.  
  90.     for i = #self.elements, 1, -1 do
  91.         if (x - 1 >= self.elements[i].global_x
  92.         and x - 1 <  self.elements[i].global_x + self.elements[i].element.width
  93.         and y - 1 >= self.elements[i].global_y
  94.         and y - 1 <  self.elements[i].global_y + self.elements[i].element.height) then
  95.             selection = self.elements[i].element
  96.             break
  97.         end
  98.     end
  99.  
  100.     return selection
  101. end
  102.  
  103. return Display
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement