mirror of
https://github.com/cyberarm/cyberarm_engine.git
synced 2025-12-16 05:02:34 +00:00
Implemented ListBox- Menu
This commit is contained in:
@@ -37,9 +37,9 @@ require_relative "cyberarm_engine/ui/style"
|
||||
require_relative "cyberarm_engine/ui/border_canvas"
|
||||
require_relative "cyberarm_engine/ui/element"
|
||||
require_relative "cyberarm_engine/ui/elements/label"
|
||||
require_relative "cyberarm_engine/ui/elements/list_box"
|
||||
require_relative "cyberarm_engine/ui/elements/button"
|
||||
require_relative "cyberarm_engine/ui/elements/toggle_button"
|
||||
require_relative "cyberarm_engine/ui/elements/list_box"
|
||||
require_relative "cyberarm_engine/ui/elements/edit_line"
|
||||
require_relative "cyberarm_engine/ui/elements/edit_box"
|
||||
require_relative "cyberarm_engine/ui/elements/image"
|
||||
|
||||
@@ -22,6 +22,13 @@ module CyberarmEngine
|
||||
add_element( Element::Button.new(text, options, block) { if block.is_a?(Proc); block.call; end } )
|
||||
end
|
||||
|
||||
def list_box(options = {}, &block)
|
||||
options[:parent] = element_parent
|
||||
options[:theme] = current_theme
|
||||
|
||||
add_element( Element::ListBox.new(options, block) { if block.is_a?(Proc); block.call; end } )
|
||||
end
|
||||
|
||||
def edit_line(text, options = {}, &block)
|
||||
options[:parent] = element_parent
|
||||
options[:theme] = current_theme
|
||||
|
||||
@@ -1,6 +1,66 @@
|
||||
module CyberarmEngine
|
||||
class Element
|
||||
class ListBox < Element
|
||||
class ListBox < Button
|
||||
attr_accessor :items
|
||||
attr_reader :choose
|
||||
|
||||
def initialize(options = {}, block = nil)
|
||||
@items = options[:items] ? options[:items] : []
|
||||
@choose = options[:choose] ? options[:choose] : @items.first
|
||||
|
||||
super(@choose, options, block)
|
||||
|
||||
@style.background_canvas.background = default(:background)
|
||||
|
||||
# TODO: "Clean Up" into own class?
|
||||
@menu = Stack.new(parent: parent, width: @options[:width], theme: @options[:theme])
|
||||
@menu.define_singleton_method(:recalculate_menu) do
|
||||
@x = @__list_box.x
|
||||
@y = @__list_box.y + @__list_box.height
|
||||
end
|
||||
@menu.instance_variable_set(:"@__list_box", self)
|
||||
|
||||
def @menu.recalculate
|
||||
super
|
||||
recalculate_menu
|
||||
end
|
||||
end
|
||||
|
||||
def choose=(item)
|
||||
valid = @items.detect { |i| i == item }
|
||||
return unless valid # TODO: Throw an error?
|
||||
@choose = item
|
||||
|
||||
self.value = item.to_s
|
||||
|
||||
recalculate
|
||||
end
|
||||
|
||||
def released_left_mouse_button(sender, x, y)
|
||||
show_menu
|
||||
|
||||
return :handled
|
||||
end
|
||||
|
||||
def show_menu
|
||||
@menu.clear
|
||||
@items.each do |item|
|
||||
[ @block]
|
||||
block = proc { self.choose = item; @block.call(item) if @block }
|
||||
b = Button.new(item, { parent: @menu, width: 1.0, theme: @options[:theme], margin: 0, border_color: 0x00ffffff }, block)
|
||||
|
||||
@menu.add(b)
|
||||
end
|
||||
recalculate
|
||||
|
||||
root.gui_state.show_menu(@menu)
|
||||
end
|
||||
|
||||
def recalculate
|
||||
super
|
||||
|
||||
@menu.recalculate
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -17,6 +17,7 @@ module CyberarmEngine
|
||||
@active_width = window.width
|
||||
@active_height = window.height
|
||||
|
||||
@menu = nil
|
||||
@focus = nil
|
||||
@mouse_over = nil
|
||||
@mouse_down_on = {}
|
||||
@@ -45,6 +46,11 @@ module CyberarmEngine
|
||||
def draw
|
||||
super
|
||||
|
||||
if @menu
|
||||
Gosu.flush
|
||||
@menu.draw
|
||||
end
|
||||
|
||||
if @tip.text.length > 0
|
||||
Gosu.draw_rect(@tip.x - 2, @tip.y - 2, @tip.width + 4, @tip.height + 4, 0xff020202, Float::INFINITY)
|
||||
@tip.draw
|
||||
@@ -60,9 +66,12 @@ module CyberarmEngine
|
||||
@pending_recalculate_request = false
|
||||
end
|
||||
|
||||
@menu.update if @menu
|
||||
super
|
||||
|
||||
new_mouse_over = @root_container.hit_element?(window.mouse_x, window.mouse_y)
|
||||
new_mouse_over = @menu.hit_element?(window.mouse_x, window.mouse_y) if @menu
|
||||
new_mouse_over = @root_container.hit_element?(window.mouse_x, window.mouse_y) unless new_mouse_over
|
||||
|
||||
if new_mouse_over
|
||||
new_mouse_over.publish(:enter) if new_mouse_over != @mouse_over
|
||||
new_mouse_over.publish(:hover)
|
||||
@@ -136,6 +145,8 @@ module CyberarmEngine
|
||||
end
|
||||
|
||||
def redirect_mouse_button(button)
|
||||
hide_menu unless @menu and (@menu == @mouse_over) or (@mouse_over.parent == @menu)
|
||||
|
||||
if @focus && @mouse_over != @focus
|
||||
@focus.publish(:blur)
|
||||
@focus = nil
|
||||
@@ -153,6 +164,8 @@ module CyberarmEngine
|
||||
end
|
||||
|
||||
def redirect_released_mouse_button(button)
|
||||
hide_menu if @menu and (@menu == @mouse_over) or (@mouse_over.parent == @menu)
|
||||
|
||||
if @mouse_over
|
||||
@mouse_over.publish(:"released_#{button}_mouse_button", window.mouse_x, window.mouse_y)
|
||||
@mouse_over.publish(:"clicked_#{button}_mouse_button", window.mouse_x, window.mouse_y) if @mouse_over == @mouse_down_on[button]
|
||||
@@ -188,5 +201,13 @@ module CyberarmEngine
|
||||
def request_recalculate
|
||||
@pending_recalculate_request = true
|
||||
end
|
||||
|
||||
def show_menu(list_box)
|
||||
@menu = list_box
|
||||
end
|
||||
|
||||
def hide_menu
|
||||
@menu = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user