Files
FlexLove/examples/stateful_ui.lua
2025-11-18 19:51:05 -05:00

247 lines
5.7 KiB
Lua

-- Example: Stateful Interactive UI
-- This demonstrates how to create interactive UI elements with state management
local FlexLove = require("libs.FlexLove")
local StatefulUIExample = {}
function StatefulUIExample:new()
local obj = {
-- State variables for the example
counter = 0,
isToggled = false,
inputValue = "",
selectedOption = "option1",
}
setmetatable(obj, { __index = self })
return obj
end
function StatefulUIExample:render()
local flex = FlexLove.new({
x = "10%",
y = "10%",
width = "80%",
height = "80%",
positioning = "flex",
flexDirection = "vertical",
gap = 10,
padding = { horizontal = 10, vertical = 10 },
})
-- Title
FlexLove.new({
parent = flex,
text = "Stateful Interactive UI Example",
textAlign = "center",
textSize = "2xl",
width = "100%",
height = "10%",
})
-- Counter section
local counterSection = FlexLove.new({
parent = flex,
positioning = "flex",
flexDirection = "horizontal",
justifyContent = "space-between",
alignItems = "center",
width = "100%",
height = "20%",
backgroundColor = "#2d3748",
borderRadius = 8,
padding = { horizontal = 15 },
})
FlexLove.new({
parent = counterSection,
text = "Counter: " .. self.counter,
textAlign = "left",
textSize = "lg",
width = "40%",
})
-- Increment button
FlexLove.new({
parent = counterSection,
themeComponent = "buttonv2",
text = "Increment",
textAlign = "center",
width = "25%",
onEvent = function(_, event)
if event.type == "release" then
self.counter = self.counter + 1
print("Counter incremented to: " .. self.counter)
end
end,
})
-- Reset button
FlexLove.new({
parent = counterSection,
themeComponent = "buttonv2",
text = "Reset",
textAlign = "center",
width = "25%",
onEvent = function(_, event)
if event.type == "release" then
self.counter = 0
print("Counter reset to: " .. self.counter)
end
end,
})
-- Toggle switch section
local toggleSection = FlexLove.new({
parent = flex,
positioning = "flex",
flexDirection = "horizontal",
justifyContent = "space-between",
alignItems = "center",
width = "100%",
height = "20%",
backgroundColor = "#4a5568",
borderRadius = 8,
padding = { horizontal = 15 },
})
FlexLove.new({
parent = toggleSection,
text = "Toggle Switch: " .. tostring(self.isToggled),
textAlign = "left",
textSize = "lg",
width = "40%",
})
-- Toggle button
local toggleButton = FlexLove.new({
parent = toggleSection,
positioning = "flex",
width = 60,
height = 30,
backgroundColor = self.isToggled and "#48bb78" or "#a0aec0", -- Green when on, gray when off
borderRadius = 15,
padding = { horizontal = 5 },
})
FlexLove.new({
parent = toggleButton,
text = self.isToggled and "ON" or "OFF",
textAlign = "center",
textSize = "sm",
width = "100%",
height = "100%",
color = "#ffffff", -- White text
})
-- Toggle event handler
toggleButton.onEvent = function(_, event)
if event.type == "release" then
self.isToggled = not self.isToggled
print("Toggle switched to: " .. tostring(self.isToggled))
-- This would normally update the visual state, but we'll do it manually for this example
end
end
-- Input section
local inputSection = FlexLove.new({
parent = flex,
positioning = "flex",
flexDirection = "horizontal",
justifyContent = "space-between",
alignItems = "center",
width = "100%",
height = "20%",
backgroundColor = "#2d3748",
borderRadius = 8,
padding = { horizontal = 15 },
})
FlexLove.new({
parent = inputSection,
text = "Input Value:",
textAlign = "left",
textSize = "lg",
width = "30%",
})
FlexLove.new({
parent = inputSection,
themeComponent = "inputv2",
text = self.inputValue,
textAlign = "left",
textSize = "md",
width = "50%",
onEvent = function(_, event)
if event.type == "textinput" then
self.inputValue = event.text
print("Input value changed to: " .. self.inputValue)
end
end,
})
-- Dropdown section
local dropdownSection = FlexLove.new({
parent = flex,
positioning = "flex",
flexDirection = "horizontal",
justifyContent = "space-between",
alignItems = "center",
width = "100%",
height = "20%",
backgroundColor = "#4a5568",
borderRadius = 8,
padding = { horizontal = 15 },
})
FlexLove.new({
parent = dropdownSection,
text = "Selected Option:",
textAlign = "left",
textSize = "lg",
width = "30%",
})
FlexLove.new({
parent = dropdownSection,
themeComponent = "dropdownv2",
text = self.selectedOption,
textAlign = "left",
textSize = "md",
width = "50%",
options = { "option1", "option2", "option3" },
onEvent = function(_, event)
if event.type == "select" then
self.selectedOption = event.value
print("Selected option changed to: " .. self.selectedOption)
end
end,
})
-- Status indicator at the bottom
local statusIndicator = FlexLove.new({
parent = flex,
positioning = "flex",
flexDirection = "horizontal",
justifyContent = "space-between",
alignItems = "center",
width = "100%",
height = "10%",
backgroundColor = "#2d3748",
borderRadius = 8,
padding = { horizontal = 15 },
})
FlexLove.new({
parent = statusIndicator,
text = "Current State - Counter: " .. self.counter .. ", Toggle: " .. tostring(self.isToggled),
textAlign = "left",
textSize = "sm",
width = "70%",
})
return flex
end
return StatefulUIExample