diff --git a/lib/cyberarm_engine.rb b/lib/cyberarm_engine.rb index bdb27c6..179e12a 100644 --- a/lib/cyberarm_engine.rb +++ b/lib/cyberarm_engine.rb @@ -67,6 +67,7 @@ require_relative "cyberarm_engine/ui/elements/menu_item" require_relative "cyberarm_engine/game_state" require_relative "cyberarm_engine/ui/gui_state" +require_relative "cyberarm_engine/ui/page" require_relative "cyberarm_engine/builtin/intro_state" diff --git a/lib/cyberarm_engine/ui/dsl.rb b/lib/cyberarm_engine/ui/dsl.rb index 48fcfbe..bc3b129 100644 --- a/lib/cyberarm_engine/ui/dsl.rb +++ b/lib/cyberarm_engine/ui/dsl.rb @@ -1,13 +1,13 @@ module CyberarmEngine module DSL def every(milliseconds, &block) - element_parent.gui_state.add_timer( + element_parent.root.gui_state.add_timer( CyberarmEngine::Timer.new(milliseconds, true, &block) ) end def after(milliseconds, &block) - element_parent.gui_state.add_timer( + element_parent.root.gui_state.add_timer( CyberarmEngine::Timer.new(milliseconds, false, &block) ) end @@ -112,6 +112,14 @@ module CyberarmEngine add_element(Element::Slider.new(options, block)) end + def page(klass, options = {}) + element_parent.root.gui_state.page(klass, options) + end + + def current_page + element_parent.root.gui_state.current_page + end + def background(color = Gosu::Color::NONE) element_parent.style.background = color end diff --git a/lib/cyberarm_engine/ui/elements/image.rb b/lib/cyberarm_engine/ui/elements/image.rb index 1ae27a7..be720ad 100644 --- a/lib/cyberarm_engine/ui/elements/image.rb +++ b/lib/cyberarm_engine/ui/elements/image.rb @@ -14,8 +14,8 @@ module CyberarmEngine def render @image.draw( - styled(:border_thickness_left) + styled(:padding_left) + @x, - styled(:border_thickness_top) + styled(:padding_top) + @y, + styled(:margin_left) + styled(:border_thickness_left) + styled(:padding_left) + @x, + styled(:margin_top) + styled(:border_thickness_top) + styled(:padding_top) + @y, @z + 2, @scale_x, @scale_y, styled(:color) ) diff --git a/lib/cyberarm_engine/ui/gui_state.rb b/lib/cyberarm_engine/ui/gui_state.rb index 01d9879..d13c423 100644 --- a/lib/cyberarm_engine/ui/gui_state.rb +++ b/lib/cyberarm_engine/ui/gui_state.rb @@ -18,6 +18,10 @@ module CyberarmEngine @active_width = window.width @active_height = window.height + @pages = {} + @page_host = nil + @page = nil + @menu = nil @focus = nil @mouse_over = nil @@ -43,6 +47,36 @@ module CyberarmEngine @menu end + def page(klass, options = {}) + @page&.blur + + @pages[klass] = klass.new(parent: options[:parent] || self) unless @pages[klass] + @page = @pages[klass] + + @page.options = options + page_host.clear do + @page.setup + end + @page.focus + end + + def current_page + @page + end + + def page_host + return @page.parent if @page.parent.is_a?(CyberarmEngine::Element::Container) + return @page_host if @page_host && @page_host.is_a?(CyberarmEngine::Element::Container) + + @root_container + end + + def page_host=(container) + raise "page host must be a CyberarmEngine::Element::Container" unless container.is_a?(Container) + + @page_host = container + end + # throws :blur event to focused element and sets GuiState focused element # Does NOT throw :focus event at element or set element as focused def focus=(element) @@ -98,6 +132,8 @@ module CyberarmEngine end @needs_repaint = false + + @page&.draw end def needs_repaint? @@ -162,6 +198,8 @@ module CyberarmEngine @last_mouse_pos = Vector.new(window.mouse_x, window.mouse_y) @mouse_pos = @last_mouse_pos.clone + + @page&.update end def button_down(id) @@ -179,6 +217,8 @@ module CyberarmEngine end @focus.button_down(id) if @focus.respond_to?(:button_down) + + @page&.button_down(id) end def button_up(id) @@ -209,6 +249,8 @@ module CyberarmEngine # Prevents menu from popping back up if the listbox is clicked to hide it. @hid_menu_for = nil + + @page&.button_up(id) end def tool_tip_delay diff --git a/lib/cyberarm_engine/ui/page.rb b/lib/cyberarm_engine/ui/page.rb new file mode 100644 index 0000000..1e942af --- /dev/null +++ b/lib/cyberarm_engine/ui/page.rb @@ -0,0 +1,39 @@ +module CyberarmEngine + class Page + include CyberarmEngine::DSL + include CyberarmEngine::Common + + attr_reader :parent + + def initialize(parent:) + @parent = parent + + @options = {} + end + + def options=(options) + @options = options + end + + def setup + end + + def focus + end + + def blur + end + + def draw + end + + def update + end + + def button_down(id) + end + + def button_up(id) + end + end +end