diff --git a/README.md b/README.md index 073d83b..682cbe5 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ class Hello < CyberarmEngine::GuiState end end -class Window < CyberarmEngine::Engine +class Window < CyberarmEngine::Window def initialize super self.show_cursor = true diff --git a/lib/cyberarm_engine.rb b/lib/cyberarm_engine.rb index bd97a17..41727c5 100644 --- a/lib/cyberarm_engine.rb +++ b/lib/cyberarm_engine.rb @@ -11,10 +11,8 @@ require_relative "cyberarm_engine/version" require_relative "cyberarm_engine/common" -require_relative "cyberarm_engine/gosu_ext/circle" - require_relative "cyberarm_engine/game_object" -require_relative "cyberarm_engine/engine" +require_relative "cyberarm_engine/window" require_relative "cyberarm_engine/bounding_box" require_relative "cyberarm_engine/vector" diff --git a/lib/cyberarm_engine/common.rb b/lib/cyberarm_engine/common.rb index a578b2c..51b6c32 100644 --- a/lib/cyberarm_engine/common.rb +++ b/lib/cyberarm_engine/common.rb @@ -78,15 +78,15 @@ module CyberarmEngine end def get_image(path, retro: false, tileable: false) - get_asset(path, Engine::IMAGES, Gosu::Image, retro, tileable) + get_asset(path, Window::IMAGES, Gosu::Image, retro, tileable) end def get_sample(path) - get_asset(path, Engine::SAMPLES, Gosu::Sample) + get_asset(path, Window::SAMPLES, Gosu::Sample) end def get_song(path) - get_asset(path, Engine::SONGS, Gosu::Song) + get_asset(path, Window::SONGS, Gosu::Song) end def window diff --git a/lib/cyberarm_engine/gosu_ext/circle.rb b/lib/cyberarm_engine/gosu_ext/circle.rb deleted file mode 100644 index fd17606..0000000 --- a/lib/cyberarm_engine/gosu_ext/circle.rb +++ /dev/null @@ -1,9 +0,0 @@ -module Gosu - # Sourced from https://gist.github.com/ippa/662583 - def self.draw_circle(cx,cy,r, z = 9999,color = Gosu::Color::GREEN, step = 10) - 0.step(360, step) do |a1| - a2 = a1 + step - draw_line(cx + Gosu.offset_x(a1, r), cy + Gosu.offset_y(a1, r), color, cx + Gosu.offset_x(a2, r), cy + Gosu.offset_y(a2, r), color, z) - end - end -end \ No newline at end of file diff --git a/lib/cyberarm_engine/ui/element.rb b/lib/cyberarm_engine/ui/element.rb index 3729cf1..272aecc 100644 --- a/lib/cyberarm_engine/ui/element.rb +++ b/lib/cyberarm_engine/ui/element.rb @@ -111,6 +111,8 @@ module CyberarmEngine event(:leave) event(:blur) + + event(:changed) end def enabled? diff --git a/lib/cyberarm_engine/ui/elements/check_box.rb b/lib/cyberarm_engine/ui/elements/check_box.rb index 8b2563f..2fd4870 100644 --- a/lib/cyberarm_engine/ui/elements/check_box.rb +++ b/lib/cyberarm_engine/ui/elements/check_box.rb @@ -8,7 +8,25 @@ module CyberarmEngine @toggle_button = ToggleButton.new(options) @label = Label.new(text, options) - define_label_singletons + @label.subscribe(:holding_left_mouse_button) do |sender, x, y| + @toggle_button.left_mouse_button(sender, x, y) + end + + @label.subscribe(:released_left_mouse_button) do |sender, x, y| + @toggle_button.released_left_mouse_button(sender, x, y) + end + + @label.subscribe(:clicked_left_mouse_button) do |sender, x, y| + @toggle_button.clicked_left_mouse_button(sender, x, y) + end + + @label.subscribe(:enter) do |sender| + @toggle_button.enter(sender) + end + + @label.subscribe(:leave) do |sender| + @toggle_button.leave(sender) + end add(@toggle_button) add(@label) @@ -26,34 +44,6 @@ module CyberarmEngine def value=(bool) @toggle_button.vlaue = bool end - - def define_label_singletons - @label.define_singleton_method(:_toggle_button) do |button| - @_toggle_button = button - end - - @label._toggle_button(@toggle_button) - - @label.define_singleton_method(:holding_left_mouse_button) do |sender, x, y| - @_toggle_button.left_mouse_button(sender, x, y) - end - - @label.define_singleton_method(:released_left_mouse_button) do |sender, x, y| - @_toggle_button.released_left_mouse_button(sender, x, y) - end - - @label.define_singleton_method(:clicked_left_mouse_button) do |sender, x, y| - @_toggle_button.clicked_left_mouse_button(sender, x, y) - end - - @label.define_singleton_method(:enter) do |sender| - @_toggle_button.enter(sender) - end - - @label.define_singleton_method(:leave) do |sender| - @_toggle_button.leave(sender) - end - end end end end \ No newline at end of file diff --git a/lib/cyberarm_engine/ui/elements/label.rb b/lib/cyberarm_engine/ui/elements/label.rb index 2ffadb1..f8b5b50 100644 --- a/lib/cyberarm_engine/ui/elements/label.rb +++ b/lib/cyberarm_engine/ui/elements/label.rb @@ -44,6 +44,8 @@ module CyberarmEngine recalculate root.gui_state.request_recalculate if old_width != width || old_height != height + + publish(:changed, self.value) end end end diff --git a/lib/cyberarm_engine/ui/elements/progress.rb b/lib/cyberarm_engine/ui/elements/progress.rb index 4827ce6..d54a24d 100644 --- a/lib/cyberarm_engine/ui/elements/progress.rb +++ b/lib/cyberarm_engine/ui/elements/progress.rb @@ -43,6 +43,7 @@ module CyberarmEngine @fraction = decimal.clamp(0.0, 1.0) update_background + publish(:changed, @fraction) return @fraction end end diff --git a/lib/cyberarm_engine/ui/elements/slider.rb b/lib/cyberarm_engine/ui/elements/slider.rb index 599fa42..1ba9c63 100644 --- a/lib/cyberarm_engine/ui/elements/slider.rb +++ b/lib/cyberarm_engine/ui/elements/slider.rb @@ -8,31 +8,29 @@ module CyberarmEngine event(:begin_drag) event(:drag_update) event(:end_drag) + + subscribe :begin_drag do |sender, x, y, button| + @drag_start_pos = Vector.new(x, y) + + :handled + end + + subscribe :drag_update do |sender, x, y, button| + @parent.handle_dragged_to(x, y) + + :handled + end + + subscribe :end_drag do + @drag_start_pos = nil + + :handled + end end def draggable?(button) button == :left end - - def begin_drag(sender, x, y, button) - @drag_start_pos = Vector.new(x, y) - - :handled - end - - def drag_update(sender, x, y, button) - # ratio = (@parent.x - (x - @drag_start_pos.x) / (@parent.width - width) * -1).clamp(0.0, 1.0) - # @x = @parent.x + width + ((@parent.width * ratio) - width * 2) - @parent.handle_dragged_to(x, y) - - :handled - end - - def end_drag(sender, x, y, button) - @drag_start_pos = nil - - :handled - end end attr_reader :range, :step_size @@ -43,7 +41,7 @@ module CyberarmEngine @step_size = @options[:step] ? @options[:step] : 0.1 @value = @options[:value] ? @options[:value] : 0.5 - @handle = Handle.new("", parent: self, width: 8) { close } + @handle = Handle.new("", parent: self, width: 8, height: 1.0) { close } self.add(@handle) end @@ -55,8 +53,11 @@ module CyberarmEngine @height = _height @handle.x = @x + @style.border_thickness_left + @style.padding_left - @handle.y = @y + @style.border_thickness_top + @style.padding_left + @handle.y = @y + @style.border_thickness_top + @style.padding_top @handle.recalculate + @handle.update_background + + pp @handle.height update_background end @@ -76,9 +77,13 @@ module CyberarmEngine def holding_left_mouse_button(sender, x, y) handle_dragged_to(x, y) + + :handled end def handle_dragged_to(x, y) + puts + pp x, y, @handle.width, content_width @ratio = ((x - @handle.width) - @x) / content_width # p [@ratio, @value] @@ -94,7 +99,10 @@ module CyberarmEngine @value = n @handle.x = @x + @style.padding_left + @style.border_thickness_left + (content_width * (@value - @range.min) / (@range.max - @range.min).to_f) + @handle.recalculate + + publish(:changed, @value) end end end diff --git a/lib/cyberarm_engine/ui/elements/toggle_button.rb b/lib/cyberarm_engine/ui/elements/toggle_button.rb index 9139e80..8b66b0b 100644 --- a/lib/cyberarm_engine/ui/elements/toggle_button.rb +++ b/lib/cyberarm_engine/ui/elements/toggle_button.rb @@ -5,8 +5,8 @@ module CyberarmEngine def initialize(options, block = nil) super(options[:checkmark], options, block) - @toggled = options[:toggled] || false - if @toggled + @value = options[:checked] || false + if @value @text.text = @options[:checkmark] else @text.text = "" @@ -15,29 +15,14 @@ module CyberarmEngine return self end - def toggled=(boolean) - @toggled = !boolean - toggle - end - def clicked_left_mouse_button(sender, x, y) - toggle + self.value = !@value @block.call(self) if @block return :handled end - def toggle - if @toggled - @toggled = false - @text.text = "" - else - @toggled = true - @text.text = @options[:checkmark] - end - end - def recalculate super @@ -51,7 +36,21 @@ module CyberarmEngine end def value - @toggled + @value + end + + def value=(boolean) + @value = boolean + + if boolean + @text.text = @options[:checkmark] + else + @text.text = "" + end + + recalculate + + publish(:changed, @value) end end end diff --git a/lib/cyberarm_engine/engine.rb b/lib/cyberarm_engine/window.rb similarity index 98% rename from lib/cyberarm_engine/engine.rb rename to lib/cyberarm_engine/window.rb index a3e5a1c..c166903 100644 --- a/lib/cyberarm_engine/engine.rb +++ b/lib/cyberarm_engine/window.rb @@ -1,5 +1,5 @@ module CyberarmEngine - class Engine < Gosu::Window + class Window < Gosu::Window IMAGES = {} SAMPLES= {} SONGS = {}