diff --git a/lib/cyberarm_engine/ui/element.rb b/lib/cyberarm_engine/ui/element.rb index 4ad7421..3fda6a1 100644 --- a/lib/cyberarm_engine/ui/element.rb +++ b/lib/cyberarm_engine/ui/element.rb @@ -39,6 +39,8 @@ module CyberarmEngine stylize default_events + + root.gui_state.request_focus(self) if @options[:autofocus] end def stylize @@ -116,6 +118,7 @@ module CyberarmEngine event(:hover) event(:leave) + event(:focus) event(:blur) event(:changed) @@ -293,6 +296,12 @@ module CyberarmEngine @gui_state != nil end + def focus(_) + warn "#{self.class}#focus was not overridden!" + + :handled + end + def recalculate raise "#{self.class}#recalculate was not overridden!" end @@ -311,5 +320,9 @@ module CyberarmEngine def to_s "#{self.class} x=#{x} y=#{y} width=#{width} height=#{height} value=#{value.is_a?(String) ? "\"#{value}\"" : value}" end + + def inspect + to_s + end end end diff --git a/lib/cyberarm_engine/ui/elements/edit_line.rb b/lib/cyberarm_engine/ui/elements/edit_line.rb index 2a4b65e..fc0830a 100644 --- a/lib/cyberarm_engine/ui/elements/edit_line.rb +++ b/lib/cyberarm_engine/ui/elements/edit_line.rb @@ -212,6 +212,16 @@ module CyberarmEngine :handled end + def focus(sender) + @focus = true + @style.background_canvas.background = default(:active, :background) + @text.color = default(:active, :color) + window.text_input = @text_input + @text_input.caret_pos = @text_input.selection_start = @text_input.text.length + + :handled + end + def blur(_sender) @focus = false @style.background_canvas.background = default(:background) diff --git a/lib/cyberarm_engine/ui/gui_state.rb b/lib/cyberarm_engine/ui/gui_state.rb index 51452f5..9e5bfa6 100644 --- a/lib/cyberarm_engine/ui/gui_state.rb +++ b/lib/cyberarm_engine/ui/gui_state.rb @@ -66,6 +66,13 @@ module CyberarmEngine @pending_recalculate_request = false end + if @pending_focus_request + @pending_focus_request = false + + self.focus = @pending_focus_element + @pending_focus_element.publish(:focus) + end + @menu&.update super @@ -215,6 +222,11 @@ module CyberarmEngine @pending_recalculate_request = true end + def request_focus(element) + @pending_focus_request = true + @pending_focus_element = element + end + def show_menu(list_box) @menu = list_box end @@ -222,5 +234,14 @@ module CyberarmEngine def hide_menu @menu = nil end + + def to_s + # "#{self.class} children=#{@children.map { |c| c.to_s }}" + @root_container.to_s + end + + def inspect + to_s + end end end