mirror of
https://github.com/cyberarm/cyberarm_engine.git
synced 2026-05-06 07:58:15 +00:00
Added Widget, which acts like a Flow and a button.
This commit is contained in:
@@ -58,6 +58,7 @@ require_relative "cyberarm_engine/ui/elements/image"
|
||||
require_relative "cyberarm_engine/ui/elements/container"
|
||||
require_relative "cyberarm_engine/ui/elements/flow"
|
||||
require_relative "cyberarm_engine/ui/elements/stack"
|
||||
require_relative "cyberarm_engine/ui/elements/widget"
|
||||
require_relative "cyberarm_engine/ui/elements/check_box"
|
||||
require_relative "cyberarm_engine/ui/elements/radio"
|
||||
require_relative "cyberarm_engine/ui/elements/progress"
|
||||
|
||||
@@ -20,6 +20,10 @@ module CyberarmEngine
|
||||
container(CyberarmEngine::Element::Stack, options, &block)
|
||||
end
|
||||
|
||||
def widget(options = {}, &block)
|
||||
container(CyberarmEngine::Element::Widget, options, &block)
|
||||
end
|
||||
|
||||
def menu(options = {}, &block)
|
||||
container(CyberarmEngine::Element::Menu, options, &block)
|
||||
end
|
||||
|
||||
@@ -214,6 +214,9 @@ module CyberarmEngine
|
||||
end
|
||||
|
||||
class ToolTip < TextBlock
|
||||
def needs_repaint?
|
||||
@needs_repaint || !value.to_s.empty?
|
||||
end
|
||||
end
|
||||
|
||||
class Link < TextBlock
|
||||
|
||||
36
lib/cyberarm_engine/ui/elements/widget.rb
Normal file
36
lib/cyberarm_engine/ui/elements/widget.rb
Normal file
@@ -0,0 +1,36 @@
|
||||
module CyberarmEngine
|
||||
class Element
|
||||
# Special container that has a layout like a Flow
|
||||
# and makes all its children mirror its styling (i.e. hover, active, disabled...)
|
||||
class Widget < Flow
|
||||
def update_styles(style = :default)
|
||||
super
|
||||
|
||||
@children.each do |child|
|
||||
recursive_styles(style, self)
|
||||
end
|
||||
end
|
||||
|
||||
# Make child elements mirror the widgets styling
|
||||
# disabled elements will not have their styling overridden
|
||||
def recursive_styles(style, container)
|
||||
container.children.each do |child|
|
||||
child.update_styles(style)
|
||||
|
||||
recursive_styles(style, child) if child.is_a?(Container)
|
||||
end
|
||||
end
|
||||
|
||||
# Enable child elements to display their tooltips
|
||||
# but fall back to the Widget if no hit element has a tip
|
||||
def tip
|
||||
elements = hit_element?(window.mouse_x, window.mouse_y)
|
||||
|
||||
return @tip unless elements
|
||||
|
||||
elements.delete(self) # prevent infinite recursive loop (Widget#tip)
|
||||
elements.reverse.find { |e| !e.tip.empty? }&.tip || @tip
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -168,7 +168,7 @@ module CyberarmEngine
|
||||
# list of containers decending down to hit element
|
||||
new_hit_elements = (@menu || @root_container).hit_element?(window.mouse_x, window.mouse_y)
|
||||
# element the mouse is over, if any.
|
||||
new_mouse_over = new_hit_elements&.last
|
||||
new_mouse_over = new_hit_elements&.find { |c| c.is_a?(CyberarmEngine::Element::Widget) } || new_hit_elements&.last
|
||||
|
||||
# is the currently hit element the same as last hit element?
|
||||
same_element = @mouse_over && new_mouse_over == @mouse_over
|
||||
|
||||
Reference in New Issue
Block a user