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.

This commit is contained in:
2022-06-12 11:25:29 -05:00
parent 97296b080c
commit 94a65f447c
2 changed files with 11 additions and 3 deletions

View File

@@ -13,7 +13,7 @@ module CyberarmEngine
@style.background_canvas.background = default(:background) @style.background_canvas.background = default(:background)
# TODO: "Clean Up" into own class? # 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 @menu.define_singleton_method(:recalculate_menu) do
@x = @__list_box.x @x = @__list_box.x
@y = @__list_box.y + @__list_box.height @y = @__list_box.y + @__list_box.height
@@ -64,6 +64,8 @@ module CyberarmEngine
def show_menu def show_menu
@menu.clear @menu.clear
@menu.style.width = width
@items.each do |item| @items.each do |item|
next if item == self.value next if item == self.value

View File

@@ -171,6 +171,9 @@ module CyberarmEngine
end end
@focus.button_up(id) if @focus.respond_to?(:button_up) @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 end
def tool_tip_delay def tool_tip_delay
@@ -185,7 +188,7 @@ module CyberarmEngine
@focus = nil @focus = nil
end 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_position[button] = Vector.new(window.mouse_x, window.mouse_y)
@mouse_down_on[button] = @mouse_over @mouse_down_on[button] = @mouse_over
@@ -199,7 +202,7 @@ module CyberarmEngine
def redirect_released_mouse_button(button) def redirect_released_mouse_button(button)
hide_menu if @menu && (@menu == @mouse_over) || (@mouse_over&.parent == @menu) 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) @mouse_over.publish(:"released_#{button}_mouse_button", window.mouse_x, window.mouse_y)
if @mouse_over == @mouse_down_on[button] if @mouse_over == @mouse_down_on[button]
@mouse_over.publish(:"clicked_#{button}_mouse_button", window.mouse_x, @mouse_over.publish(:"clicked_#{button}_mouse_button", window.mouse_x,
@@ -255,6 +258,9 @@ module CyberarmEngine
end end
def hide_menu def hide_menu
return unless @menu
@hid_menu_for = @menu.parent
@menu = nil @menu = nil
end end