248 lines
5.7 KiB
Lua
248 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
|
|
|