217 lines
5.8 KiB
Lua
217 lines
5.8 KiB
Lua
local FlexLove = require("FlexLove")
|
|
local Gui = FlexLove.GUI
|
|
local Theme = FlexLove.Theme
|
|
local Color = FlexLove.Color
|
|
|
|
---@class ThemeDemo
|
|
---@field window Element
|
|
---@field statusText Element
|
|
local ThemeDemo = {}
|
|
ThemeDemo.__index = ThemeDemo
|
|
|
|
function ThemeDemo.init()
|
|
local self = setmetatable({}, ThemeDemo)
|
|
|
|
-- Try to load and set the default theme
|
|
-- Note: This will fail if the atlas image doesn't exist yet
|
|
-- For now, we'll demonstrate the API without actually loading a theme
|
|
local themeLoaded = false
|
|
local themeError = nil
|
|
|
|
pcall(function()
|
|
Theme.load("default")
|
|
Theme.setActive("default")
|
|
themeLoaded = true
|
|
end)
|
|
|
|
-- Create main demo window (without theme for now)
|
|
self.window = Gui.new({
|
|
x = 50,
|
|
y = 50,
|
|
width = 700,
|
|
height = 550,
|
|
background = Color.new(0.15, 0.15, 0.2, 0.95),
|
|
border = { top = true, bottom = true, left = true, right = true },
|
|
borderColor = Color.new(0.8, 0.8, 0.8, 1),
|
|
positioning = "flex",
|
|
flexDirection = "vertical",
|
|
gap = 20,
|
|
padding = { top = 20, right = 20, bottom = 20, left = 20 },
|
|
})
|
|
|
|
-- Title
|
|
local title = Gui.new({
|
|
parent = self.window,
|
|
height = 40,
|
|
text = "Theme System Demo",
|
|
textSize = 20,
|
|
textAlign = "center",
|
|
textColor = Color.new(1, 1, 1, 1),
|
|
background = Color.new(0.2, 0.2, 0.3, 1),
|
|
})
|
|
|
|
-- Status message
|
|
self.statusText = Gui.new({
|
|
parent = self.window,
|
|
height = 60,
|
|
text = themeLoaded and "✓ Theme loaded successfully!\nTheme system is ready to use."
|
|
or "⚠ Theme not loaded (atlas image missing)\nShowing API demonstration without actual theme rendering.",
|
|
textSize = 14,
|
|
textAlign = "center",
|
|
textColor = themeLoaded and Color.new(0.3, 0.9, 0.3, 1) or Color.new(0.9, 0.7, 0.3, 1),
|
|
background = Color.new(0.1, 0.1, 0.15, 0.8),
|
|
padding = { top = 10, right = 10, bottom = 10, left = 10 },
|
|
})
|
|
|
|
-- Info section
|
|
local infoSection = Gui.new({
|
|
parent = self.window,
|
|
height = 350,
|
|
positioning = "flex",
|
|
flexDirection = "vertical",
|
|
gap = 15,
|
|
background = Color.new(0.1, 0.1, 0.15, 0.5),
|
|
padding = { top = 15, right = 15, bottom = 15, left = 15 },
|
|
})
|
|
|
|
-- Example 1: Basic themed button
|
|
local example1 = Gui.new({
|
|
parent = infoSection,
|
|
height = 80,
|
|
positioning = "flex",
|
|
flexDirection = "vertical",
|
|
gap = 10,
|
|
background = Color.new(0.12, 0.12, 0.17, 1),
|
|
padding = { top = 10, right = 10, bottom = 10, left = 10 },
|
|
})
|
|
|
|
Gui.new({
|
|
parent = example1,
|
|
height = 20,
|
|
text = "Example 1: Basic Themed Button",
|
|
textSize = 14,
|
|
textColor = Color.new(0.8, 0.9, 1, 1),
|
|
background = Color.new(0, 0, 0, 0),
|
|
})
|
|
|
|
-- This button would use theme if loaded
|
|
local themedButton = Gui.new({
|
|
parent = example1,
|
|
width = 150,
|
|
height = 40,
|
|
text = "Themed Button",
|
|
textAlign = "center",
|
|
textColor = Color.new(1, 1, 1, 1),
|
|
background = Color.new(0.2, 0.6, 0.9, 0.8),
|
|
-- theme = "button", -- Uncomment when theme atlas exists
|
|
callback = function(element, event)
|
|
if event.type == "click" then
|
|
print("Themed button clicked!")
|
|
end
|
|
end,
|
|
})
|
|
|
|
-- Example 2: Button with states
|
|
local example2 = Gui.new({
|
|
parent = infoSection,
|
|
height = 100,
|
|
positioning = "flex",
|
|
flexDirection = "vertical",
|
|
gap = 10,
|
|
background = Color.new(0.12, 0.12, 0.17, 1),
|
|
padding = { top = 10, right = 10, bottom = 10, left = 10 },
|
|
})
|
|
|
|
Gui.new({
|
|
parent = example2,
|
|
height = 20,
|
|
text = "Example 2: Button with Hover/Pressed States",
|
|
textSize = 14,
|
|
textColor = Color.new(0.8, 0.9, 1, 1),
|
|
background = Color.new(0, 0, 0, 0),
|
|
})
|
|
|
|
Gui.new({
|
|
parent = example2,
|
|
height = 15,
|
|
text = "Hover over or click the button to see state changes (when theme is loaded)",
|
|
textSize = 11,
|
|
textColor = Color.new(0.6, 0.7, 0.8, 1),
|
|
background = Color.new(0, 0, 0, 0),
|
|
})
|
|
|
|
local stateButton = Gui.new({
|
|
parent = example2,
|
|
width = 200,
|
|
height = 40,
|
|
text = "Interactive Button",
|
|
textAlign = "center",
|
|
textColor = Color.new(1, 1, 1, 1),
|
|
background = Color.new(0.3, 0.7, 0.4, 0.8),
|
|
-- theme = "button", -- Will automatically handle hover/pressed states
|
|
callback = function(element, event)
|
|
if event.type == "click" then
|
|
print("State button clicked! State was:", element._themeState)
|
|
end
|
|
end,
|
|
})
|
|
|
|
-- Example 3: Themed panel
|
|
local example3 = Gui.new({
|
|
parent = infoSection,
|
|
height = 120,
|
|
positioning = "flex",
|
|
flexDirection = "vertical",
|
|
gap = 10,
|
|
background = Color.new(0.12, 0.12, 0.17, 1),
|
|
padding = { top = 10, right = 10, bottom = 10, left = 10 },
|
|
})
|
|
|
|
Gui.new({
|
|
parent = example3,
|
|
height = 20,
|
|
text = "Example 3: Themed Panel/Container",
|
|
textSize = 14,
|
|
textColor = Color.new(0.8, 0.9, 1, 1),
|
|
background = Color.new(0, 0, 0, 0),
|
|
})
|
|
|
|
local themedPanel = Gui.new({
|
|
parent = example3,
|
|
width = 300,
|
|
height = 80,
|
|
background = Color.new(0.25, 0.25, 0.35, 0.9),
|
|
-- theme = "panel", -- Would use panel theme component
|
|
padding = { top = 10, right = 10, bottom = 10, left = 10 },
|
|
})
|
|
|
|
Gui.new({
|
|
parent = themedPanel,
|
|
text = "This is a themed panel container.\nIt would have a 9-slice border when theme is loaded.",
|
|
textSize = 12,
|
|
textColor = Color.new(0.9, 0.9, 1, 1),
|
|
textAlign = "center",
|
|
background = Color.new(0, 0, 0, 0),
|
|
})
|
|
|
|
-- Code example section
|
|
local codeSection = Gui.new({
|
|
parent = self.window,
|
|
height = 40,
|
|
background = Color.new(0.08, 0.08, 0.12, 1),
|
|
padding = { top = 10, right = 10, bottom = 10, left = 10 },
|
|
})
|
|
|
|
Gui.new({
|
|
parent = codeSection,
|
|
text = 'Usage: element = Gui.new({ theme = "button", ... })',
|
|
textSize = 12,
|
|
textColor = Color.new(0.5, 0.9, 0.5, 1),
|
|
background = Color.new(0, 0, 0, 0),
|
|
})
|
|
|
|
return self
|
|
end
|
|
|
|
return ThemeDemo.init()
|