diff --git a/lib/cyberarm_engine/ui/element.rb b/lib/cyberarm_engine/ui/element.rb index b4ece42..fca3221 100644 --- a/lib/cyberarm_engine/ui/element.rb +++ b/lib/cyberarm_engine/ui/element.rb @@ -333,6 +333,11 @@ module CyberarmEngine def update recalculate_if_size_changed + + if @style.dirty? + @style.mark_clean! + stylize + end end def button_down(id) diff --git a/lib/cyberarm_engine/ui/style.rb b/lib/cyberarm_engine/ui/style.rb index 29e8ae7..54966de 100644 --- a/lib/cyberarm_engine/ui/style.rb +++ b/lib/cyberarm_engine/ui/style.rb @@ -19,6 +19,7 @@ module CyberarmEngine class StyleData def initialize(hash = {}) @hash = hash + @dirty = false end %i[ @@ -38,6 +39,8 @@ module CyberarmEngine @hash[item] end define_method(:"#{item}=") do |value| + @dirty = true if @hash[item] != value + @hash[item] = value end end @@ -46,6 +49,14 @@ module CyberarmEngine def default nil end + + def dirty? + @dirty + end + + def mark_clean! + @dirty = false + end end class Style < StyleData @@ -58,7 +69,18 @@ module CyberarmEngine @active = StyleData.new(hash[:active] || {}) @disabled = StyleData.new(hash[:disabled] || {}) + @substyles = [@hover, @active, @disabled] + super end + + def dirty? + @dirty || @substyles.any?(&:dirty?) + end + + def mark_clean! + @substyles.each(&:mark_clean!) + @dirty = false + end end end