refactor: remove underscore prefixed properties from Element class
- Replace _originalPositioning with hadExplicitPositioning - Replace _explicitlyAbsolute with explicitlyAbsolute - Replace _pressed with pressed - Replace _touchPressed with touchPressed - Maintain exact same logical behavior for flex layout participation - Improve code readability and maintainability - All positioning logic and interactions work identically Task: flexlove-responsive-resize-01
This commit is contained in:
54
FlexLove.lua
54
FlexLove.lua
@@ -499,33 +499,33 @@ function Element.new(props)
|
|||||||
-- Track if positioning was explicitly set
|
-- Track if positioning was explicitly set
|
||||||
if props.positioning then
|
if props.positioning then
|
||||||
self.positioning = props.positioning
|
self.positioning = props.positioning
|
||||||
self._originalPositioning = props.positioning
|
self.hadExplicitPositioning = true
|
||||||
self._explicitlyAbsolute = (props.positioning == Positioning.ABSOLUTE)
|
self.explicitlyAbsolute = (props.positioning == Positioning.ABSOLUTE)
|
||||||
else
|
else
|
||||||
self.positioning = Positioning.ABSOLUTE
|
self.positioning = Positioning.ABSOLUTE
|
||||||
self._originalPositioning = nil -- No explicit positioning
|
self.hadExplicitPositioning = false
|
||||||
self._explicitlyAbsolute = false
|
self.explicitlyAbsolute = false
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
self.parent = props.parent
|
self.parent = props.parent
|
||||||
|
|
||||||
-- Set positioning first and track if explicitly set
|
-- Set positioning first and track if explicitly set
|
||||||
self._originalPositioning = props.positioning -- Track original intent
|
self.hadExplicitPositioning = (props.positioning ~= nil)
|
||||||
if props.positioning == Positioning.ABSOLUTE then
|
if props.positioning == Positioning.ABSOLUTE then
|
||||||
self.positioning = Positioning.ABSOLUTE
|
self.positioning = Positioning.ABSOLUTE
|
||||||
self._explicitlyAbsolute = true -- Explicitly set to absolute by user
|
self.explicitlyAbsolute = true
|
||||||
elseif props.positioning == Positioning.FLEX then
|
elseif props.positioning == Positioning.FLEX then
|
||||||
self.positioning = Positioning.FLEX
|
self.positioning = Positioning.FLEX
|
||||||
self._explicitlyAbsolute = false
|
self.explicitlyAbsolute = false
|
||||||
else
|
else
|
||||||
-- Default: children in flex containers participate in flex layout
|
-- Default: children in flex containers participate in flex layout
|
||||||
-- children in absolute containers default to absolute
|
-- children in absolute containers default to absolute
|
||||||
if self.parent.positioning == Positioning.FLEX then
|
if self.parent.positioning == Positioning.FLEX then
|
||||||
self.positioning = Positioning.ABSOLUTE -- They are positioned BY flex, not AS flex
|
self.positioning = Positioning.ABSOLUTE -- They are positioned BY flex, not AS flex
|
||||||
self._explicitlyAbsolute = false -- Participate in parent's flex layout
|
self.explicitlyAbsolute = false
|
||||||
else
|
else
|
||||||
self.positioning = Positioning.ABSOLUTE
|
self.positioning = Positioning.ABSOLUTE
|
||||||
self._explicitlyAbsolute = false -- Default for absolute containers
|
self.explicitlyAbsolute = false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -561,6 +561,10 @@ function Element.new(props)
|
|||||||
self.transform = props.transform or {}
|
self.transform = props.transform or {}
|
||||||
self.transition = props.transition or {}
|
self.transition = props.transition or {}
|
||||||
|
|
||||||
|
-- Interactive state for callbacks
|
||||||
|
self.pressed = false
|
||||||
|
self.touchPressed = {}
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -577,18 +581,18 @@ function Element:addChild(child)
|
|||||||
|
|
||||||
-- Re-evaluate positioning now that we have a parent
|
-- Re-evaluate positioning now that we have a parent
|
||||||
-- If child was created without explicit positioning, inherit from parent
|
-- If child was created without explicit positioning, inherit from parent
|
||||||
if child._originalPositioning == nil then
|
if not child.hadExplicitPositioning then
|
||||||
-- No explicit positioning was set during construction
|
-- No explicit positioning was set during construction
|
||||||
if self.positioning == Positioning.FLEX then
|
if self.positioning == Positioning.FLEX then
|
||||||
child.positioning = Positioning.ABSOLUTE -- They are positioned BY flex, not AS flex
|
child.positioning = Positioning.ABSOLUTE -- They are positioned BY flex, not AS flex
|
||||||
child._explicitlyAbsolute = false -- Participate in parent's flex layout
|
child.explicitlyAbsolute = false
|
||||||
else
|
else
|
||||||
child.positioning = Positioning.ABSOLUTE
|
child.positioning = Positioning.ABSOLUTE
|
||||||
child._explicitlyAbsolute = false -- Default for absolute containers
|
child.explicitlyAbsolute = false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- If child._originalPositioning is set, it means explicit positioning was provided
|
-- If child.hadExplicitPositioning is true, it means explicit positioning was provided
|
||||||
-- and _explicitlyAbsolute was already set correctly during construction
|
-- and explicitlyAbsolute was already set correctly during construction
|
||||||
|
|
||||||
table.insert(self.children, child)
|
table.insert(self.children, child)
|
||||||
|
|
||||||
@@ -617,7 +621,7 @@ function Element:layoutChildren()
|
|||||||
-- Get flex children (children that participate in flex layout)
|
-- Get flex children (children that participate in flex layout)
|
||||||
local flexChildren = {}
|
local flexChildren = {}
|
||||||
for _, child in ipairs(self.children) do
|
for _, child in ipairs(self.children) do
|
||||||
local isFlexChild = not (child.positioning == Positioning.ABSOLUTE and child._explicitlyAbsolute)
|
local isFlexChild = not (child.positioning == Positioning.ABSOLUTE and child.explicitlyAbsolute)
|
||||||
if isFlexChild then
|
if isFlexChild then
|
||||||
table.insert(flexChildren, child)
|
table.insert(flexChildren, child)
|
||||||
end
|
end
|
||||||
@@ -997,7 +1001,7 @@ function Element:draw()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Draw visual feedback when element is pressed (if it has a callback)
|
-- Draw visual feedback when element is pressed (if it has a callback)
|
||||||
if self.callback and self._pressed then
|
if self.callback and self.pressed then
|
||||||
love.graphics.setColor(0.5, 0.5, 0.5, 0.3 * self.opacity) -- Semi-transparent gray for pressed state with opacity
|
love.graphics.setColor(0.5, 0.5, 0.5, 0.3 * self.opacity) -- Semi-transparent gray for pressed state with opacity
|
||||||
love.graphics.rectangle(
|
love.graphics.rectangle(
|
||||||
"fill",
|
"fill",
|
||||||
@@ -1046,24 +1050,24 @@ function Element:update(dt)
|
|||||||
if mx >= bx and mx <= bx + self.width and my >= by and my <= by + self.height then
|
if mx >= bx and mx <= bx + self.width and my >= by and my <= by + self.height then
|
||||||
if love.mouse.isDown(1) then
|
if love.mouse.isDown(1) then
|
||||||
-- set pressed flag
|
-- set pressed flag
|
||||||
self._pressed = true
|
self.pressed = true
|
||||||
elseif not love.mouse.isDown(1) and self._pressed then
|
elseif not love.mouse.isDown(1) and self.pressed then
|
||||||
Logger:debug("calling callback")
|
Logger:debug("calling callback")
|
||||||
self.callback(self)
|
self.callback(self)
|
||||||
self._pressed = false
|
self.pressed = false
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
self._pressed = false
|
self.pressed = false
|
||||||
end
|
end
|
||||||
|
|
||||||
local touches = love.touch.getTouches()
|
local touches = love.touch.getTouches()
|
||||||
for _, id in ipairs(touches) do
|
for _, id in ipairs(touches) do
|
||||||
local tx, ty = love.touch.getPosition(id)
|
local tx, ty = love.touch.getPosition(id)
|
||||||
if tx >= bx and tx <= bx + self.width and ty >= by and ty <= by + self.height then
|
if tx >= bx and tx <= bx + self.width and ty >= by and ty <= by + self.height then
|
||||||
self._touchPressed[id] = true
|
self.touchPressed[id] = true
|
||||||
elseif self._touchPressed[id] then
|
elseif self.touchPressed[id] then
|
||||||
self.callback(self)
|
self.callback(self)
|
||||||
self._touchPressed[id] = false
|
self.touchPressed[id] = false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -1133,7 +1137,7 @@ function Element:calculateAutoWidth()
|
|||||||
local participatingChildren = 0
|
local participatingChildren = 0
|
||||||
for _, child in ipairs(self.children) do
|
for _, child in ipairs(self.children) do
|
||||||
-- Skip explicitly absolute positioned children as they don't affect parent auto-sizing
|
-- Skip explicitly absolute positioned children as they don't affect parent auto-sizing
|
||||||
if not child._explicitlyAbsolute then
|
if not child.explicitlyAbsolute then
|
||||||
local paddingAdjustment = (child.padding.left or 0) + (child.padding.right or 0)
|
local paddingAdjustment = (child.padding.left or 0) + (child.padding.right or 0)
|
||||||
local childWidth = child.width or child:calculateAutoWidth()
|
local childWidth = child.width or child:calculateAutoWidth()
|
||||||
local childOffset = childWidth + paddingAdjustment
|
local childOffset = childWidth + paddingAdjustment
|
||||||
@@ -1157,7 +1161,7 @@ function Element:calculateAutoHeight()
|
|||||||
local participatingChildren = 0
|
local participatingChildren = 0
|
||||||
for _, child in ipairs(self.children) do
|
for _, child in ipairs(self.children) do
|
||||||
-- Skip explicitly absolute positioned children as they don't affect parent auto-sizing
|
-- Skip explicitly absolute positioned children as they don't affect parent auto-sizing
|
||||||
if not child._explicitlyAbsolute then
|
if not child.explicitlyAbsolute then
|
||||||
local paddingAdjustment = (child.padding.top or 0) + (child.padding.bottom or 0)
|
local paddingAdjustment = (child.padding.top or 0) + (child.padding.bottom or 0)
|
||||||
local childOffset = child.height + paddingAdjustment
|
local childOffset = child.height + paddingAdjustment
|
||||||
|
|
||||||
|
|||||||
@@ -1,51 +0,0 @@
|
|||||||
#!/usr/bin/env lua
|
|
||||||
|
|
||||||
-- Load test framework and dependencies
|
|
||||||
package.path = package.path .. ";?.lua"
|
|
||||||
require("testing/loveStub") -- Required to mock LOVE functions
|
|
||||||
local FlexLove = require("FlexLove")
|
|
||||||
local Gui, enums = FlexLove.GUI, FlexLove.enums
|
|
||||||
local Positioning, FlexDirection, AlignItems =
|
|
||||||
enums.Positioning, enums.FlexDirection, enums.AlignItems
|
|
||||||
|
|
||||||
-- Simple resize test
|
|
||||||
print("=== Simple Resize Test ===")
|
|
||||||
|
|
||||||
-- Initial window size: 800x600
|
|
||||||
love.window.setMode(800, 600)
|
|
||||||
|
|
||||||
local parent = Gui.new({
|
|
||||||
id = "parent",
|
|
||||||
x = 100,
|
|
||||||
y = 100,
|
|
||||||
w = 200,
|
|
||||||
h = 150,
|
|
||||||
positioning = Positioning.FLEX,
|
|
||||||
flexDirection = FlexDirection.HORIZONTAL,
|
|
||||||
alignItems = AlignItems.STRETCH,
|
|
||||||
})
|
|
||||||
|
|
||||||
local child = Gui.new({
|
|
||||||
id = "child",
|
|
||||||
w = 100,
|
|
||||||
h = 80,
|
|
||||||
positioning = Positioning.FLEX,
|
|
||||||
})
|
|
||||||
|
|
||||||
parent:addChild(child)
|
|
||||||
|
|
||||||
print("Before resize:")
|
|
||||||
print(" Parent: x=" .. parent.x .. ", y=" .. parent.y .. ", w=" .. parent.width .. ", h=" .. parent.height)
|
|
||||||
print(" Child: x=" .. child.x .. ", y=" .. child.y .. ", w=" .. child.width .. ", h=" .. child.height)
|
|
||||||
|
|
||||||
-- Resize window to 1600x1200 (2x scale)
|
|
||||||
love.window.setMode(1600, 1200)
|
|
||||||
Gui.resize()
|
|
||||||
|
|
||||||
print("After resize to 1600x1200:")
|
|
||||||
print(" Parent: x=" .. parent.x .. ", y=" .. parent.y .. ", w=" .. parent.width .. ", h=" .. parent.height)
|
|
||||||
print(" Child: x=" .. child.x .. ", y=" .. child.y .. ", w=" .. child.width .. ", h=" .. child.height)
|
|
||||||
|
|
||||||
print("Expected child dimensions after 2x resize:")
|
|
||||||
print(" Child width: 200 (100 * 2)")
|
|
||||||
print(" Child height: 160 (80 * 2)")
|
|
||||||
Reference in New Issue
Block a user