mirror of
https://github.com/cyberarm/cyberarm_engine.git
synced 2026-05-06 16:08:16 +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/container"
|
||||||
require_relative "cyberarm_engine/ui/elements/flow"
|
require_relative "cyberarm_engine/ui/elements/flow"
|
||||||
require_relative "cyberarm_engine/ui/elements/stack"
|
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/check_box"
|
||||||
require_relative "cyberarm_engine/ui/elements/radio"
|
require_relative "cyberarm_engine/ui/elements/radio"
|
||||||
require_relative "cyberarm_engine/ui/elements/progress"
|
require_relative "cyberarm_engine/ui/elements/progress"
|
||||||
|
|||||||
@@ -20,6 +20,10 @@ module CyberarmEngine
|
|||||||
container(CyberarmEngine::Element::Stack, options, &block)
|
container(CyberarmEngine::Element::Stack, options, &block)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def widget(options = {}, &block)
|
||||||
|
container(CyberarmEngine::Element::Widget, options, &block)
|
||||||
|
end
|
||||||
|
|
||||||
def menu(options = {}, &block)
|
def menu(options = {}, &block)
|
||||||
container(CyberarmEngine::Element::Menu, options, &block)
|
container(CyberarmEngine::Element::Menu, options, &block)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -214,6 +214,9 @@ module CyberarmEngine
|
|||||||
end
|
end
|
||||||
|
|
||||||
class ToolTip < TextBlock
|
class ToolTip < TextBlock
|
||||||
|
def needs_repaint?
|
||||||
|
@needs_repaint || !value.to_s.empty?
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class Link < TextBlock
|
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
|
# list of containers decending down to hit element
|
||||||
new_hit_elements = (@menu || @root_container).hit_element?(window.mouse_x, window.mouse_y)
|
new_hit_elements = (@menu || @root_container).hit_element?(window.mouse_x, window.mouse_y)
|
||||||
# element the mouse is over, if any.
|
# 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?
|
# is the currently hit element the same as last hit element?
|
||||||
same_element = @mouse_over && new_mouse_over == @mouse_over
|
same_element = @mouse_over && new_mouse_over == @mouse_over
|
||||||
|
|||||||
Reference in New Issue
Block a user