Added initial support for pages, fixed image not accounting for margin refactor

This commit is contained in:
2026-04-17 17:45:58 -05:00
parent 9f654129ef
commit d158d2fdd2
5 changed files with 94 additions and 4 deletions

View File

@@ -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"

View File

@@ -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

View File

@@ -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)
)

View File

@@ -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

View File

@@ -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