From 94a65f447c5c86bb047a84b32eaa01f5d7d465a5 Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Sun, 12 Jun 2022 11:25:29 -0500 Subject: [PATCH] Fixed long standing issue with ListBox menu not taking it's parents width only the parent has a specified width and fixed clicking on the menu's host element to hide the menu causes it to hide and reappear instantly. --- lib/cyberarm_engine/ui/elements/list_box.rb | 4 +++- lib/cyberarm_engine/ui/gui_state.rb | 10 ++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/cyberarm_engine/ui/elements/list_box.rb b/lib/cyberarm_engine/ui/elements/list_box.rb index 73e0d2a..71cdb19 100644 --- a/lib/cyberarm_engine/ui/elements/list_box.rb +++ b/lib/cyberarm_engine/ui/elements/list_box.rb @@ -13,7 +13,7 @@ module CyberarmEngine @style.background_canvas.background = default(:background) # TODO: "Clean Up" into own class? - @menu = Stack.new(parent: parent, width: @options[:width], theme: @options[:theme]) + @menu = Stack.new(parent: self, theme: @options[:theme]) @menu.define_singleton_method(:recalculate_menu) do @x = @__list_box.x @y = @__list_box.y + @__list_box.height @@ -64,6 +64,8 @@ module CyberarmEngine def show_menu @menu.clear + @menu.style.width = width + @items.each do |item| next if item == self.value diff --git a/lib/cyberarm_engine/ui/gui_state.rb b/lib/cyberarm_engine/ui/gui_state.rb index 4c168b9..80def4b 100644 --- a/lib/cyberarm_engine/ui/gui_state.rb +++ b/lib/cyberarm_engine/ui/gui_state.rb @@ -171,6 +171,9 @@ module CyberarmEngine end @focus.button_up(id) if @focus.respond_to?(:button_up) + + # Prevents menu from popping back up if the listbox is clicked to hide it. + @hid_menu_for = nil end def tool_tip_delay @@ -185,7 +188,7 @@ module CyberarmEngine @focus = nil end - if @mouse_over + if @mouse_over && @hid_menu_for != @mouse_over @mouse_down_position[button] = Vector.new(window.mouse_x, window.mouse_y) @mouse_down_on[button] = @mouse_over @@ -199,7 +202,7 @@ module CyberarmEngine def redirect_released_mouse_button(button) hide_menu if @menu && (@menu == @mouse_over) || (@mouse_over&.parent == @menu) - if @mouse_over + if @mouse_over && @hid_menu_for != @mouse_over @mouse_over.publish(:"released_#{button}_mouse_button", window.mouse_x, window.mouse_y) if @mouse_over == @mouse_down_on[button] @mouse_over.publish(:"clicked_#{button}_mouse_button", window.mouse_x, @@ -255,6 +258,9 @@ module CyberarmEngine end def hide_menu + return unless @menu + + @hid_menu_for = @menu.parent @menu = nil end