First commit.

This commit is contained in:
2026-09-20 00:44:51 -04:00
commit d69768c649
53 changed files with 3213 additions and 0 deletions
+121
View File
@@ -0,0 +1,121 @@
------------------------------------------------------------------------------
-- Imports
------------------------------------------------------------------------------
local love = require 'love'
local make_class = require 'src.utils.classes'
local collisions = require 'src.utils.colls'
local UIElement = require 'src.ui.element'
local Color = require 'src.utils.color'
------------------------------------------------------------------------------
-- Class definitions
------------------------------------------------------------------------------
local Bar = make_class(UIElement)
------------------------------------------------------------------------------
-- Class methods
------------------------------------------------------------------------------
function Bar:_init(callback, val_fn, min, max, w, h, color, sel_color, press_col, float, x, y)
UIElement._init(self, x, y, float, false)
self.callback = callback
self.val_fn = val_fn
self.min = min
self.max = max
self.w = w
self.h = h
self.base_col = color ~= nil and color or Color(255, 255, 255)
self.sel_color = sel_color ~= nil and sel_color or Color(215, 0, 0)
self.press_col = press_col ~= nil and press_col or Color(99, 99, 139)
self.disbl_col = Color(95, 63, 75)
end
function Bar:set_dimensions()
self.w = self.w
self.h = self.h
end
function Bar:draw()
local color = self.callback == nil and self.disbl_col or ((self.pressed and self.press_col) or ((self.selected and self.sel_color) or self.base_col))
-- Convert the variable's value to the [0, 1] space.
local v = (self.val_fn() + math.abs(self.min)) / (self.max + math.abs(self.min))
love.graphics.setColor(color.r, color.g, color.b)
-- Render the bar's outline.
love.graphics.rectangle('line', self.x, self.y, self.w, self.h)
-- Render the bar's content using the [0, 1] value as a proportion of the bar's width.
love.graphics.rectangle('fill', self.x, self.y, self.w * v, self.h)
love.graphics.setColor()
end
function Bar:_mouse2bar(x)
-- Take the x coord to the [0, 1] space, with clamping.
local v = math.max(math.min(((x - self.x) / self.w), 1.0), 0.0)
-- Convert the value to a horizontal bar coordinate and return it.
return (v * (self.max + math.abs(self.min))) - self.min
end
function Bar:mousemoved(x, y)
-- Select if the pointer is inside the button's bounding rect.
self.selected = collisions.point_in_square(x, y, self.x, self.y, self.w, self.h)
-- If the button was pressed then check if the pointer is no longer inside the button.
if self.pressed then
-- If it's not, then mark the button as "was pressed".
self.pressed = collisions.point_in_square(x, y, self.x, self.y, self.w, self.h)
self.was_pressed = true
self.callback(self:_mouse2bar(x))
end
-- If the button was pressed and the pointer is inside the button right now.
if self.was_pressed and collisions.point_in_square(x, y, self.x, self.y, self.w, self.h) then
-- Then mark the button as pressed again.
self.pressed = true
self.was_pressed = false
self.callback(self:_mouse2bar(x))
end
end
function Bar:mousepressed(x, y, btn)
-- If the pointer was inside the button when it was pressed then mark the button as pressed.
if btn == 0 then
self.pressed = collisions.point_in_square(x, y, self.x, self.y, self.w, self.h)
end
end
function Bar:mousereleased(x, _, btn)
if btn == 0 then
if self.pressed then
-- If the button was pressed then execute the callback if any and unmark as pressed.
if self.callback ~= nil then
self.callback(self:_mouse2bar(x))
end
self.pressed = false
end
-- The button no longer was pressed.
self.was_pressed = false
end
end
------------------------------------------------------------------------------
-- Module return
------------------------------------------------------------------------------
return Bar
+90
View File
@@ -0,0 +1,90 @@
------------------------------------------------------------------------------
-- Imports
------------------------------------------------------------------------------
local make_class = require 'src.utils.classes'
local collisions = require 'src.utils.colls'
local UIElement = require 'src.ui.element'
------------------------------------------------------------------------------
-- Class definitions
------------------------------------------------------------------------------
---@class Button: UIElement
local Button = make_class(UIElement)
------------------------------------------------------------------------------
-- Class methods
------------------------------------------------------------------------------
---@param x number
---@param y number
---@param callback function
---@param float boolean
function Button:_init(x, y, callback, float)
UIElement._init(self, x, y, float, false)
self.selected = false
self.pressed = false
self.was_pressed = false
self.callback = callback
end
function Button:set_dimensions()
self.w = 0
self.h = 0
end
function Button:mousemoved(x, y)
-- Select if the pointer is inside the button's bounding rect.
self.selected = collisions.point_in_square(x, y, self.x, self.y, self.w, self.h)
-- If the button was pressed then check if the pointer is no longer inside the button.
if self.pressed then
-- If it's not, then mark the button as "was pressed".
self.pressed = collisions.point_in_square(x, y, self.x, self.y, self.w, self.h)
self.was_pressed = true
end
-- If the button was pressed and the pointer is inside the button right now.
if self.was_pressed and collisions.point_in_square(x, y, self.x, self.y, self.w, self.h) then
-- Then mark the button as pressed again.
self.pressed = true
self.was_pressed = false
end
end
function Button:mousepressed(x, y, btn)
-- If the pointer was inside the button when it was pressed then mark the button as pressed.
if btn == 0 then
self.pressed = collisions.point_in_square(x, y, self.x, self.y, self.w, self.h)
end
end
function Button:mousereleased(_, _, btn)
if btn == 0 then
if self.pressed then
-- If the button was pressed then execute the callback if any and unmark as pressed.
if self.callback ~= nil then
self.callback()
end
self.pressed = false
end
-- The button no longer was pressed.
self.was_pressed = false
end
end
------------------------------------------------------------------------------
-- Module return
------------------------------------------------------------------------------
return Button
+55
View File
@@ -0,0 +1,55 @@
------------------------------------------------------------------------------
-- Imports
------------------------------------------------------------------------------
local love = require 'love'
local make_class = require 'src.utils.classes'
local Button = require 'src.ui.button'
local Color = require 'src.utils.color'
------------------------------------------------------------------------------
-- Class definitions
------------------------------------------------------------------------------
local Checkbox = make_class(Button)
------------------------------------------------------------------------------
-- Class methods
------------------------------------------------------------------------------
function Checkbox:_init(callback, value, w, h, color, sel_color, press_col, float, x, y)
Button._init(self, x, y, callback, float)
self.value = value
self.w = w ~= nil and w or 20
self.h = h ~= nil and h or 20
self.base_col = color ~= nil and color or Color(255, 255, 255)
self.sel_color = sel_color ~= nil and sel_color or Color(215, 0, 0)
self.press_col = press_col ~= nil and press_col or Color(99, 99, 139)
self.disbl_col = Color(95, 63, 75)
end
function Checkbox:set_dimensions()
self.w = self.w
self.h = self.h
end
function Checkbox:draw()
local color = self.callback == nil and self.disbl_col or ((self.pressed and self.press_col) or ((self.selected and self.sel_color) or self.base_col))
local mode = nil
if self.value() then mode = 'fill' else mode = 'line' end
love.graphics.setColor(color.r, color.g, color.b)
love.graphics.rectangle(mode, self.x, self.y, self.w, self.h)
love.graphics.setColor()
end
------------------------------------------------------------------------------
-- Module return
------------------------------------------------------------------------------
return Checkbox
+35
View File
@@ -0,0 +1,35 @@
------------------------------------------------------------------------------
-- Imports
------------------------------------------------------------------------------
local make_class = require 'src.utils.classes'
local Sprite = require 'src.graphics.sprite'
------------------------------------------------------------------------------
-- Class definitions
------------------------------------------------------------------------------
local Cursor = make_class(Sprite)
------------------------------------------------------------------------------
-- Class methods
------------------------------------------------------------------------------
function Cursor:_init(x, y)
Sprite._init(self, 'imgs/pointer.png', x, y)
end
function Cursor:mousemoved(x, y)
self.x = x
self.y = y
end
------------------------------------------------------------------------------
-- Module return
------------------------------------------------------------------------------
return Cursor
+117
View File
@@ -0,0 +1,117 @@
------------------------------------------------------------------------------
-- Imports
------------------------------------------------------------------------------
local love = require 'love'
local make_class = require 'src.utils.classes'
local dialog_manager = require 'src.ui.dlgmngr'
local VBox = require 'src.ui.vbox'
local Sprite = require 'src.graphics.sprite'
local TextButton = require 'src.ui.textbtn'
local HBox = require 'src.ui.hbox'
------------------------------------------------------------------------------
-- Class definitions
------------------------------------------------------------------------------
local Dialog = make_class(VBox)
------------------------------------------------------------------------------
-- Class methods
------------------------------------------------------------------------------
function Dialog:_init(bckg, spacing, padding, close_btn, accept_btn, font)
VBox._init(self, nil, nil, nil, nil, spacing, false)
self.spacing = spacing ~= nil and spacing or 10
self.padding = padding ~= nil and padding or 15
self.background = Sprite(bckg)
self.shown = false
local close = nil
if close_btn ~= nil then
close = close_btn
else
close = TextButton(
'Close',
font,
nil,
nil,
function()
self:hide()
end)
end
local accept = nil
if accept_btn ~= nil then accept = accept_btn end
-- Create a container for the close and accept button and add them.
local box = HBox(nil, nil, nil, nil, 10, true)
box:add(close)
if accept ~= nil then box:add(accept) end
self.elements[9001] = box
end
function Dialog:add(element)
table.insert(self.elements, element)
end
function Dialog:load()
self.background:load()
self:set_dimensions()
VBox.load(self)
end
function Dialog:set_dimensions()
self.w = self.background.sprite:getWidth()
self.h = self.background.sprite:getHeight()
-- Center the dialog on the screen.
self.x = (320 - self.w) / 2
self.y = (200 - self.h) / 2
self.background.x = self.x
self.background.y = self.y
-- Add padding.
self.x = self.x + self.padding
self.y = self.y + self.padding / 2
end
function Dialog:draw()
love.graphics.setColor(0, 0, 0)
love.graphics.rectangle('line', self.x - self.padding - 1, self.y - (self.padding / 2) - 1, self.w + 2, self.h + 2)
love.graphics.setColor()
self.background:draw()
VBox.draw(self)
end
function Dialog:show()
if not self.shown then
dialog_manager:add(self)
self.shown = true
end
end
function Dialog:hide()
dialog_manager:remove(self)
self.shown = false
end
------------------------------------------------------------------------------
-- Module return
------------------------------------------------------------------------------
return Dialog
+104
View File
@@ -0,0 +1,104 @@
------------------------------------------------------------------------------
-- Imports
------------------------------------------------------------------------------
local make_class = require 'src.utils.classes'
local Drawable = require 'src.graphics.drawable'
------------------------------------------------------------------------------
-- Class definitions
------------------------------------------------------------------------------
local DialogManager = make_class(Drawable)
------------------------------------------------------------------------------
-- Class methods
------------------------------------------------------------------------------
function DialogManager:_init()
Drawable._init(self)
self.dialogs = {}
self.count = 0
end
function DialogManager:add(dialog)
self.dialogs[dialog] = true
self.count = self.count + 1
end
function DialogManager:remove(dialog)
self.dialogs[dialog] = nil
self.count = math.max(self.count - 1, 0)
end
function DialogManager:empty()
return self.count == 0
end
function DialogManager:update(dt)
for d, _ in pairs(self.dialogs) do
d:update(dt)
end
end
function DialogManager:draw()
for d, _ in pairs(self.dialogs) do
d:draw()
end
end
function DialogManager:keypressed(key, code, isrepeat)
for d, _ in pairs(self.dialogs) do
d:keypressed(key, code, isrepeat)
end
end
function DialogManager:textinput(text)
for d, _ in pairs(self.dialogs) do
d:textinput(text)
end
end
function DialogManager:keyreleased(key, code)
for d, _ in pairs(self.dialogs) do
d:keyreleased(key, code)
end
end
function DialogManager:mousemoved(x, y, dx, dy)
for d, _ in pairs(self.dialogs) do
d:mousemoved(x, y, dx, dy)
end
end
function DialogManager:mousepressed(x, y, btn)
for d, _ in pairs(self.dialogs) do
d:mousepressed(x, y, btn)
end
end
function DialogManager:mousereleased(x, y, btn)
for d, _ in pairs(self.dialogs) do
d:mousereleased(x, y, btn)
end
end
------------------------------------------------------------------------------
-- Module return
------------------------------------------------------------------------------
return DialogManager()
+84
View File
@@ -0,0 +1,84 @@
------------------------------------------------------------------------------
-- Imports
------------------------------------------------------------------------------
local make_class = require 'src.utils.classes'
local Asset = require 'src.utils.asset'
local Drawable = require 'src.graphics.drawable'
------------------------------------------------------------------------------
-- Class definitions
------------------------------------------------------------------------------
local focused_element = nil
------------------------------------------------------------------------------
-- Class definitions
------------------------------------------------------------------------------
---@class UIElement: Drawable, Asset
local UIElement = make_class(Drawable, Asset)
------------------------------------------------------------------------------
-- Class methods
------------------------------------------------------------------------------
---@param x integer
---@param y integer
---@param float boolean
---@param focusable boolean
function UIElement:_init(x, y, float, focusable)
Asset._init(self)
self.x = x
self.y = y
self.w = nil
self.h = nil
self.float_right = float and float or false
self.focusable = focusable ~= nil and focusable or false
end
function UIElement:set_dimensions()
self.w = 0
self.h = 0
end
function UIElement:load()
end
function UIElement:unload()
end
function UIElement:is_loaded()
return true
end
function UIElement:focus()
if self.focusable then
focused_element = self
end
end
function UIElement:blur()
if self.focusable and focused_element == self then
focused_element = nil
end
end
function UIElement:is_focused()
return self.focusable and focused_element == self
end
------------------------------------------------------------------------------
-- Module return
------------------------------------------------------------------------------
return UIElement
+73
View File
@@ -0,0 +1,73 @@
------------------------------------------------------------------------------
-- Imports
------------------------------------------------------------------------------
local love = require 'love'
local make_class = require 'src.utils.classes'
local Asset = require 'src.utils.asset'
------------------------------------------------------------------------------
-- Class definitions
------------------------------------------------------------------------------
---@class Font: Asset
-- Font is a simple wrapper around Löve's own Font class to allow for
-- easy loading/unloading and automatically checking if it's is valid
-- before using it.
local Font = make_class(Asset)
------------------------------------------------------------------------------
-- Class methods
------------------------------------------------------------------------------
---@param file_name string
---@param size number
function Font:_init(file_name, size)
self.file_name = string.format('assets/%s', file_name)
self.size = (size ~= nil and size) or 20
end
function Font:load()
if not self:is_loaded() then
self.f = love.graphics.newFont(self.file_name, self.size)
end
end
function Font:unload()
self.f = nil
end
function Font:is_loaded()
return self.f ~= nil
end
function Font:set()
if self.f ~= nil then love.graphics.setFont(self.f) end
end
function Font:unset()
love.graphics.setFont()
end
function Font:get_width(text)
if self.f ~= nil then return self.f:getWidth(text) else return nil end
end
function Font:get_height(text)
if self.f ~= nil then return self.f:getHeight(text) else return nil end
end
------------------------------------------------------------------------------
-- Module return
------------------------------------------------------------------------------
return Font
+63
View File
@@ -0,0 +1,63 @@
------------------------------------------------------------------------------
-- Imports
------------------------------------------------------------------------------
local make_class = require 'src.utils.classes'
local Layout = require 'src.ui.layout'
------------------------------------------------------------------------------
-- Class definitions
------------------------------------------------------------------------------
---@class HBox: Layout
local HBox = make_class(Layout)
------------------------------------------------------------------------------
-- Class methods
------------------------------------------------------------------------------
function HBox:_init(x, y, w, h, spacing, float)
Layout._init(self, x, y, w, h, spacing, float)
end
function HBox:load()
Layout.load(self)
local _x = self.x
-- Load required assets if needed and then compute the coordinates of each button.
for _, v in pairs(self.elements) do
v.y = self.y
v.x = _x
_x = _x + v.w + self.spacing
end
end
function HBox:set_dimensions()
if self.w == nil then
self.w = 0
for i, v in pairs(self.elements) do
self.w = self.w + v.w
if i < #self.elements then self.w = self.w + self.spacing end
end
end
if self.h == nil then
self.h = 0
for _, v in pairs(self.elements) do
if v.h > self.h then self.h = v.h end
end
end
end
------------------------------------------------------------------------------
-- Module return
------------------------------------------------------------------------------
return HBox
+74
View File
@@ -0,0 +1,74 @@
------------------------------------------------------------------------------
-- Imports
------------------------------------------------------------------------------
local love = require 'love'
local make_class = require 'src.utils.classes'
local UIElement = require 'src.ui.element'
local Color = require 'src.utils.color'
------------------------------------------------------------------------------
-- Class definitions
------------------------------------------------------------------------------
---@class Label: UIElement
local Label = make_class(UIElement)
------------------------------------------------------------------------------
-- Class methods
------------------------------------------------------------------------------
---@param x number
---@param y number
---@param text string
---@param font Font
---@param color Color
---@param float boolean
function Label:_init(x, y, text, font, color, float)
UIElement._init(self, x, y, float, false)
self.text = text
self.font = font
self.color = color ~= nil and color or Color(255, 255, 255)
end
function Label:set_dimensions()
self.w = self.font:get_width(self.text)
self.h = self.font:get_height(self.text)
end
function Label:load()
self.font:load()
-- If the label's size has not been computed then do it.
if self.w == nil or self.h == nil then self:set_dimensions() end
end
function Label:unload()
self.font:unload()
end
function Label:is_loaded()
return self.font:is_loaded() and self.w ~= nil and self.h ~= nil
end
function Label:draw()
love.graphics.setColor(self.color.r, self.color.g, self.color.b)
self.font:set()
love.graphics.print(self.text, self.x, self.y)
self.font:unset()
love.graphics.setColor()
end
------------------------------------------------------------------------------
-- Module return
------------------------------------------------------------------------------
return Label
+118
View File
@@ -0,0 +1,118 @@
------------------------------------------------------------------------------
-- Imports
------------------------------------------------------------------------------
local make_class = require 'src.utils.classes'
local UIElement = require 'src.ui.element'
------------------------------------------------------------------------------
-- Class definitions
------------------------------------------------------------------------------
---@class Layout: UIElement
local Layout = make_class(UIElement)
------------------------------------------------------------------------------
-- Class methods
------------------------------------------------------------------------------
function Layout:_init(x, y, w, h, spacing, float)
UIElement._init(self, x, y, float, false)
self.x = x ~= nil and x or 0
self.y = y ~= nil and y or 0
self.w = w
self.h = h
self.spacing = spacing ~= nil and spacing or 10
self.elements = {}
end
function Layout:add(element)
table.insert(self.elements, element)
end
function Layout:load()
-- Load required assets if needed and then compute the coordinates of each button.
for _, v in pairs(self.elements) do
if v.is_a[UIElement] then
v:load()
end
end
self:set_dimensions()
end
function Layout:unload()
for _, v in pairs(self.elements) do
if v.is_a[UIElement] then
v:unload()
end
end
end
function Layout:update(dt)
for _, v in pairs(self.elements) do
v:update(dt)
end
end
function Layout:draw()
for _, v in pairs(self.elements) do
v:draw()
end
end
function Layout:keypressed(key, code, isrepeat)
for _, v in pairs(self.elements) do
v:keypressed(key, code, isrepeat)
end
end
function Layout:textinput(text)
for _, v in pairs(self.elements) do
v:textinput(text)
end
end
function Layout:keyreleased(key, code)
for _, v in pairs(self.elements) do
v:keyreleased(key, code)
end
end
function Layout:mousemoved(x, y, dx, dy)
for _, v in pairs(self.elements) do
v:mousemoved(x, y, dx, dy)
end
end
function Layout:mousepressed(x, y, btn)
for _, v in pairs(self.elements) do
v:mousepressed(x, y, btn)
end
end
function Layout:mousereleased(x, y, btn)
for _, v in pairs(self.elements) do
v:mousereleased(x, y, btn)
end
end
------------------------------------------------------------------------------
-- Module return
------------------------------------------------------------------------------
return Layout
+74
View File
@@ -0,0 +1,74 @@
------------------------------------------------------------------------------
-- Imports
------------------------------------------------------------------------------
local love = require 'love'
local make_class = require 'src.utils.classes'
local Button = require 'src.ui.button'
local Color = require 'src.utils.color'
------------------------------------------------------------------------------
-- Class definitions
------------------------------------------------------------------------------
local TextButton = make_class(Button)
------------------------------------------------------------------------------
-- Class methods
------------------------------------------------------------------------------
function TextButton:_init(text, font, x, y, callback, float, base_col, sel_color, press_col)
Button._init(self, x, y, callback, float)
self.font = font
self.text = text
self.base_col = base_col ~= nil and base_col or Color(255, 255, 255)
self.sel_color = sel_color ~= nil and sel_color or Color(215, 0, 0)
self.press_col = press_col ~= nil and press_col or Color(99, 99, 139)
self.disbl_col = Color(95, 63, 75)
end
function TextButton:load()
if not self.font:is_loaded() then
self.font:load()
end
-- If the label's size has not been computed then do it.
if self.w == nil or self.h == nil then self:set_dimensions() end
end
function TextButton:unload()
self.font:unload()
end
function TextButton:is_loaded()
return self.font:is_loaded() and self.w ~= nil and self.h ~= nil
end
function TextButton:set_dimensions()
self.w = self.font:get_width(self.text)
self.h = self.font:get_height(self.text)
end
function TextButton:draw()
local color = self.callback == nil and self.disbl_col or ((self.pressed and self.press_col) or ((self.selected and self.sel_color) or self.base_col))
love.graphics.setColor(color.r, color.g, color.b)
self.font:set()
love.graphics.print(self.text, self.x, self.y)
self.font:unset()
love.graphics.setColor()
end
------------------------------------------------------------------------------
-- Module return
------------------------------------------------------------------------------
return TextButton
+118
View File
@@ -0,0 +1,118 @@
------------------------------------------------------------------------------
-- Imports
------------------------------------------------------------------------------
local love = require 'love'
local make_class = require 'src.utils.classes'
local collisions = require 'src.utils.colls'
local UIElement = require 'src.ui.element'
local Color = require 'src.utils.color'
------------------------------------------------------------------------------
-- Class definitions
------------------------------------------------------------------------------
---@class CharInput: UIElement
local TextInput = make_class(UIElement)
------------------------------------------------------------------------------
-- Class methods
------------------------------------------------------------------------------
---@param text string
---@param font Font
---@param x number
---@param y number
---@param callback function
---@param value function
---@param float boolean
---@param base_col Color
---@param sel_color Color
---@param press_col Color
function TextInput:_init(text, font, x, y, callback, value, float, base_col, sel_color, press_col)
UIElement._init(self, x, y, float, true)
self.callback = callback
self.value = value
self.font = font
self.text = text
self.base_col = base_col ~= nil and base_col or Color(255, 255, 255)
self.sel_color = sel_color ~= nil and sel_color or Color(215, 0, 0)
self.press_col = press_col ~= nil and press_col or Color(99, 99, 139)
self.disbl_col = Color(95, 63, 75)
self.selected = false
self.pressed = false
end
function TextInput:load()
self.font:load()
-- If the label's size has not been computed then do it.
if self.w == nil or self.h == nil then self:set_dimensions() end
end
function TextInput:unload()
self.font:unload()
end
function TextInput:is_loaded()
return self.font:is_loaded() and self.w ~= nil and self.h ~= nil
end
function TextInput:set_dimensions()
self.w = self.font:get_width(self.text .. 'm')
self.h = self.font:get_height(self.text)
end
function TextInput:draw()
local color = self.callback == nil and self.disbl_col or (((self.pressed or self:is_focused()) and self.press_col) or ((self.selected and self.sel_color) or self.base_col))
love.graphics.setColor(color.r, color.g, color.b)
self.font:set()
if self:is_focused() then
love.graphics.print(self.text .. ': ?', self.x, self.y)
else
love.graphics.print(self.text .. ': ' .. self.value(), self.x, self.y)
end
self.font:unset()
love.graphics.setColor()
end
function TextInput:mousemoved(x, y)
-- Select if the pointer is inside the button's bounding rect.
self.selected = collisions.point_in_square(x, y, self.x, self.y, self.w, self.h)
end
function TextInput:mousepressed(_, _, btn)
-- If the pointer was inside the button when it was pressed then mark the button as pressed.
if btn == 0 and self.selected then
self:focus()
end
end
function TextInput:keypressed(key)
if self:is_focused() then
if #key == 1 then
if self.callback ~= nil then self.callback(key) end
self:blur()
end
end
end
------------------------------------------------------------------------------
-- Module return
------------------------------------------------------------------------------
return TextInput
+66
View File
@@ -0,0 +1,66 @@
------------------------------------------------------------------------------
-- Imports
------------------------------------------------------------------------------
local make_class = require 'src.utils.classes'
local Layout = require 'src.ui.layout'
------------------------------------------------------------------------------
-- Class definitions
------------------------------------------------------------------------------
---@class VBox: Layout
local VBox = make_class(Layout)
------------------------------------------------------------------------------
-- Class methods
------------------------------------------------------------------------------
function VBox:_init(x, y, w, h, spacing, float)
Layout._init(self, x, y, w, h, spacing, float)
end
function VBox:load()
Layout.load(self)
local _y = self.y
-- Load required assets if needed and then compute the coordinates of each button.
for _, v in pairs(self.elements) do
if v.float_right then
v.x = self.w - v.w
else
v.x = self.x
end
v.y = _y
_y = _y + v.h + self.spacing
end
end
function VBox:set_dimensions()
if self.w == nil then
self.w = 0
for _, v in pairs(self.elements) do
if v.w > self.w then self.w = v.w end
end
end
if self.h == nil then
self.h = 0
for i, v in pairs(self.elements) do
self.h = self.h + v.h
if i < #self.elements then self.h = self.h + self.spacing end
end
end
end
------------------------------------------------------------------------------
-- Module return
------------------------------------------------------------------------------
return VBox