diff --git a/lib/cyberarm_engine/ui/element.rb b/lib/cyberarm_engine/ui/element.rb index 90ca6e2..19449b0 100644 --- a/lib/cyberarm_engine/ui/element.rb +++ b/lib/cyberarm_engine/ui/element.rb @@ -578,6 +578,20 @@ module CyberarmEngine @gui_state != nil end + def child_of?(element) + return element == self if is_root? + return false unless element.is_a?(Container) + return true if element.children.find { |child| child == self } + + element.children.find { |child| child.child_of?(element) if child.is_a?(Container) } + end + + # def parent_of?(element) + # return true if element.children.find { |child| child == self } + + # element.children.find { |child| child.parent} + # end + def focus(_) warn "#{self.class}#focus was not overridden!" diff --git a/lib/cyberarm_engine/ui/elements/container.rb b/lib/cyberarm_engine/ui/elements/container.rb index 592baea..e54cde0 100644 --- a/lib/cyberarm_engine/ui/elements/container.rb +++ b/lib/cyberarm_engine/ui/elements/container.rb @@ -36,17 +36,17 @@ module CyberarmEngine def build @block.call(self) if @block - root.gui_state.request_recalculate + root.gui_state.request_recalculate_for(self) end def add(element) @children << element - root.gui_state.request_recalculate + root.gui_state.request_recalculate_for(self) end def remove(element) - root.gui_state.request_recalculate if @children.delete(element) + root.gui_state.request_recalculate_for(self) if @children.delete(element) end def clear(&block) @@ -59,7 +59,7 @@ module CyberarmEngine CyberarmEngine::Element::Container.current_container = old_container - root.gui_state.request_recalculate + root.gui_state.request_recalculate_for(self) end def append(&block) @@ -70,7 +70,7 @@ module CyberarmEngine CyberarmEngine::Element::Container.current_container = old_container - root.gui_state.request_recalculate + root.gui_state.request_recalculate_for(self) end def render @@ -236,6 +236,15 @@ module CyberarmEngine self.scroll_top = -@scroll_position.y @scroll_target_position.y = @scroll_position.y + # NOTE: Experiment for removing need to explicitly call gui_state#recalculate at least 3 times for layout to layout... + if old_width != @width || old_height != @height + if @parent + root.gui_state.request_recalculate_for(@parent) + else + root.gui_state.request_recalculate + end + end + root.gui_state.request_repaint if @width != old_width || @height != old_height end diff --git a/lib/cyberarm_engine/ui/gui_state.rb b/lib/cyberarm_engine/ui/gui_state.rb index 6802f43..f1b8309 100644 --- a/lib/cyberarm_engine/ui/gui_state.rb +++ b/lib/cyberarm_engine/ui/gui_state.rb @@ -81,8 +81,6 @@ module CyberarmEngine if @pending_recalculate_request Stats.frame.start_timing(:gui_recalculate) @root_container.recalculate - @root_container.recalculate - @root_container.recalculate @pending_recalculate_request = false @@ -91,6 +89,7 @@ module CyberarmEngine Stats.frame.start_timing(:gui_element_recalculate_requests) + # puts "PENDING REQUESTS: #{@pending_element_recalculate_requests.size}" if @pending_element_recalculate_requests.size.positive? @pending_element_recalculate_requests.each(&:recalculate) @pending_element_recalculate_requests.clear