226 lines
5.0 KiB
Lua
226 lines
5.0 KiB
Lua
--[[
|
|
Example: Advanced Layout with Flexbox and Grid
|
|
This example demonstrates advanced layout techniques using both flexbox and grid layouts
|
|
]]
|
|
|
|
local FlexLove = require("libs.FlexLove")
|
|
local Color = FlexLove.Color
|
|
local Theme = FlexLove.Theme
|
|
|
|
-- Create the main window
|
|
local window = FlexLove.new({
|
|
x = "10%",
|
|
y = "10%",
|
|
width = "80%",
|
|
height = "80%",
|
|
themeComponent = "framev3",
|
|
positioning = "flex",
|
|
flexDirection = "vertical",
|
|
gap = 20,
|
|
padding = { horizontal = 20, vertical = 20 },
|
|
})
|
|
|
|
-- Title
|
|
FlexLove.new({
|
|
parent = window,
|
|
text = "Advanced Layout Example",
|
|
textAlign = "center",
|
|
textSize = "3xl",
|
|
width = "100%",
|
|
})
|
|
|
|
-- Flex container with complex layout
|
|
local flexContainer = FlexLove.new({
|
|
parent = window,
|
|
positioning = "flex",
|
|
flexDirection = "horizontal",
|
|
justifyContent = "space-between",
|
|
alignItems = "stretch",
|
|
gap = 15,
|
|
height = "70%",
|
|
})
|
|
|
|
-- Left panel - True Grid Layout
|
|
local leftPanel = FlexLove.new({
|
|
parent = flexContainer,
|
|
width = "40%",
|
|
positioning = "flex",
|
|
flexDirection = "vertical",
|
|
gap = 10,
|
|
padding = { horizontal = 10, vertical = 10 },
|
|
})
|
|
|
|
FlexLove.new({
|
|
parent = leftPanel,
|
|
text = "True Grid Layout (3x3)",
|
|
textAlign = "center",
|
|
textSize = "lg",
|
|
width = "100%",
|
|
})
|
|
|
|
-- Grid container using positioning = "grid"
|
|
local gridContainer = FlexLove.new({
|
|
parent = leftPanel,
|
|
positioning = "grid",
|
|
gridRows = 3,
|
|
gridColumns = 3,
|
|
columnGap = 5,
|
|
rowGap = 5,
|
|
height = "80%",
|
|
alignItems = "stretch",
|
|
})
|
|
|
|
-- Grid items (will auto-flow into cells)
|
|
for i = 1, 9 do
|
|
FlexLove.new({
|
|
parent = gridContainer,
|
|
themeComponent = "buttonv2",
|
|
text = "Cell " .. i,
|
|
textAlign = "center",
|
|
textSize = "md",
|
|
onEvent = function(_, event)
|
|
if event.type == "release" then
|
|
print("Grid cell " .. i .. " clicked")
|
|
end
|
|
end,
|
|
})
|
|
end
|
|
|
|
-- Right panel - Grid with Headers (like a schedule)
|
|
local rightPanel = FlexLove.new({
|
|
parent = flexContainer,
|
|
width = "55%",
|
|
positioning = "flex",
|
|
flexDirection = "vertical",
|
|
gap = 10,
|
|
})
|
|
|
|
FlexLove.new({
|
|
parent = rightPanel,
|
|
text = "Grid with Headers (4x4)",
|
|
textAlign = "center",
|
|
textSize = "lg",
|
|
width = "100%",
|
|
})
|
|
|
|
-- Example data for schedule-like grid
|
|
local columnHeaders = { "Mon", "Tue", "Wed" }
|
|
local rowHeaders = { "Task A", "Task B", "Task C" }
|
|
|
|
-- Calculate grid dimensions: +1 for header row and column
|
|
local numRows = #rowHeaders + 1 -- +1 for header row
|
|
local numColumns = #columnHeaders + 1 -- +1 for row labels column
|
|
|
|
local scheduleGrid = FlexLove.new({
|
|
parent = rightPanel,
|
|
positioning = "grid",
|
|
gridRows = numRows,
|
|
gridColumns = numColumns,
|
|
columnGap = 2,
|
|
rowGap = 2,
|
|
height = "80%",
|
|
alignItems = "stretch",
|
|
})
|
|
|
|
local accentColor = Theme.getColor("primary")
|
|
local textColor = Theme.getColor("text")
|
|
|
|
-- Top-left corner cell (empty)
|
|
FlexLove.new({
|
|
parent = scheduleGrid,
|
|
})
|
|
|
|
-- Column headers
|
|
for _, header in ipairs(columnHeaders) do
|
|
FlexLove.new({
|
|
parent = scheduleGrid,
|
|
text = header,
|
|
textColor = textColor,
|
|
textAlign = "center",
|
|
backgroundColor = Color.new(0, 0, 0, 0.3),
|
|
border = { top = true, right = true, bottom = true, left = true },
|
|
borderColor = accentColor,
|
|
textSize = 12,
|
|
})
|
|
end
|
|
|
|
-- Data rows
|
|
for i, rowHeader in ipairs(rowHeaders) do
|
|
-- Row header
|
|
FlexLove.new({
|
|
parent = scheduleGrid,
|
|
text = rowHeader,
|
|
backgroundColor = Color.new(0, 0, 0, 0.3),
|
|
textColor = textColor,
|
|
textAlign = "center",
|
|
border = { top = true, right = true, bottom = true, left = true },
|
|
borderColor = accentColor,
|
|
textSize = 10,
|
|
})
|
|
|
|
-- Data cells
|
|
for j = 1, #columnHeaders do
|
|
local value = (i * j) % 5
|
|
FlexLove.new({
|
|
parent = scheduleGrid,
|
|
text = tostring(value),
|
|
textAlign = "center",
|
|
border = { top = true, right = true, bottom = true, left = true },
|
|
borderColor = Color.new(0.5, 0.5, 0.5, 1.0),
|
|
textSize = 12,
|
|
themeComponent = "buttonv2",
|
|
onEvent = function(elem, event)
|
|
if event.type == "click" then
|
|
local newValue = (tonumber(elem.text) + 1) % 10
|
|
elem:updateText(tostring(newValue))
|
|
print("Cell [" .. i .. "," .. j .. "] clicked, new value: " .. newValue)
|
|
end
|
|
end,
|
|
})
|
|
end
|
|
end
|
|
|
|
-- Footer with progress bar
|
|
local footer = FlexLove.new({
|
|
parent = window,
|
|
positioning = "flex",
|
|
flexDirection = "horizontal",
|
|
justifyContent = "space-between",
|
|
alignItems = "center",
|
|
gap = 15,
|
|
height = "20%",
|
|
})
|
|
|
|
FlexLove.new({
|
|
parent = footer,
|
|
text = "Progress:",
|
|
textAlign = "start",
|
|
textSize = "md",
|
|
})
|
|
|
|
local progressContainer = FlexLove.new({
|
|
parent = footer,
|
|
width = "60%",
|
|
height = "30%",
|
|
themeComponent = "framev3",
|
|
positioning = "flex",
|
|
flexDirection = "horizontal",
|
|
alignItems = "center",
|
|
gap = 5,
|
|
})
|
|
|
|
-- Progress bar fill
|
|
local progressFill = FlexLove.new({
|
|
parent = progressContainer,
|
|
width = "70%",
|
|
height = "100%",
|
|
themeComponent = "buttonv1",
|
|
})
|
|
|
|
FlexLove.new({
|
|
parent = footer,
|
|
text = "70%",
|
|
textAlign = "end",
|
|
textSize = "md",
|
|
})
|