fidgit 0.0.2alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +8 -0
- data/.rspec +2 -0
- data/COPYING.txt +674 -0
- data/Gemfile +4 -0
- data/README.textile +138 -0
- data/Rakefile +38 -0
- data/config/default_schema.yml +180 -0
- data/examples/_all_examples.rb +9 -0
- data/examples/align_example.rb +56 -0
- data/examples/button_and_toggle_button_example.rb +27 -0
- data/examples/color_picker_example.rb +17 -0
- data/examples/color_well_example.rb +25 -0
- data/examples/combo_box_example.rb +24 -0
- data/examples/file_dialog_example.rb +42 -0
- data/examples/grid_packer_example.rb +29 -0
- data/examples/helpers/example_window.rb +17 -0
- data/examples/label_example.rb +17 -0
- data/examples/list_example.rb +23 -0
- data/examples/media/images/head_icon.png +0 -0
- data/examples/menu_pane_example.rb +27 -0
- data/examples/message_dialog_example.rb +65 -0
- data/examples/radio_button_example.rb +37 -0
- data/examples/readme_example.rb +32 -0
- data/examples/scroll_window_example.rb +49 -0
- data/examples/slider_example.rb +30 -0
- data/examples/splash_example.rb +42 -0
- data/examples/text_area_example.rb +28 -0
- data/fidgit.gemspec +28 -0
- data/lib/fidgit.rb +4 -0
- data/lib/fidgit/chingu_ext/window.rb +6 -0
- data/lib/fidgit/clipboard.rb +23 -0
- data/lib/fidgit/cursor.rb +38 -0
- data/lib/fidgit/elements/button.rb +68 -0
- data/lib/fidgit/elements/color_picker.rb +63 -0
- data/lib/fidgit/elements/color_well.rb +39 -0
- data/lib/fidgit/elements/combo_box.rb +85 -0
- data/lib/fidgit/elements/composite.rb +17 -0
- data/lib/fidgit/elements/container.rb +187 -0
- data/lib/fidgit/elements/element.rb +252 -0
- data/lib/fidgit/elements/file_browser.rb +152 -0
- data/lib/fidgit/elements/grid_packer.rb +219 -0
- data/lib/fidgit/elements/group.rb +66 -0
- data/lib/fidgit/elements/horizontal_packer.rb +12 -0
- data/lib/fidgit/elements/label.rb +77 -0
- data/lib/fidgit/elements/list.rb +47 -0
- data/lib/fidgit/elements/menu_pane.rb +149 -0
- data/lib/fidgit/elements/packer.rb +42 -0
- data/lib/fidgit/elements/radio_button.rb +86 -0
- data/lib/fidgit/elements/scroll_area.rb +75 -0
- data/lib/fidgit/elements/scroll_bar.rb +114 -0
- data/lib/fidgit/elements/scroll_window.rb +92 -0
- data/lib/fidgit/elements/slider.rb +119 -0
- data/lib/fidgit/elements/text_area.rb +351 -0
- data/lib/fidgit/elements/toggle_button.rb +67 -0
- data/lib/fidgit/elements/tool_tip.rb +35 -0
- data/lib/fidgit/elements/vertical_packer.rb +12 -0
- data/lib/fidgit/event.rb +99 -0
- data/lib/fidgit/gosu_ext/color.rb +123 -0
- data/lib/fidgit/history.rb +85 -0
- data/lib/fidgit/redirector.rb +83 -0
- data/lib/fidgit/schema.rb +123 -0
- data/lib/fidgit/selection.rb +106 -0
- data/lib/fidgit/standard_ext/hash.rb +21 -0
- data/lib/fidgit/states/dialog_state.rb +42 -0
- data/lib/fidgit/states/file_dialog.rb +24 -0
- data/lib/fidgit/states/gui_state.rb +301 -0
- data/lib/fidgit/states/message_dialog.rb +61 -0
- data/lib/fidgit/thumbnail.rb +29 -0
- data/lib/fidgit/version.rb +5 -0
- data/lib/fidgit/window.rb +19 -0
- data/media/images/arrow.png +0 -0
- data/media/images/file_directory.png +0 -0
- data/media/images/file_file.png +0 -0
- data/media/images/pixel.png +0 -0
- data/spec/fidgit/elements/helpers/helper.rb +3 -0
- data/spec/fidgit/elements/label_spec.rb +49 -0
- data/spec/fidgit/event_spec.rb +149 -0
- data/spec/fidgit/gosu_ext/color_spec.rb +130 -0
- data/spec/fidgit/gosu_ext/helpers/helper.rb +3 -0
- data/spec/fidgit/helpers/helper.rb +4 -0
- data/spec/fidgit/helpers/tex_play_helper.rb +9 -0
- data/spec/fidgit/history_spec.rb +144 -0
- data/spec/fidgit/redirector_spec.rb +78 -0
- data/spec/fidgit/schema_spec.rb +67 -0
- data/spec/fidgit/schema_test.yml +32 -0
- data/spec/fidgit/thumbnail_spec.rb +50 -0
- metadata +177 -0
| @@ -0,0 +1,42 @@ | |
| 1 | 
            +
            require_relative 'helpers/example_window'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # By using a splash screen of some sort, one can switch to another resolution for the main game.
         | 
| 4 | 
            +
            class ExampleState < Fidgit::GuiState
         | 
| 5 | 
            +
              def initialize
         | 
| 6 | 
            +
                super
         | 
| 7 | 
            +
                pack :vertical do
         | 
| 8 | 
            +
                  pack :horizontal do
         | 
| 9 | 
            +
                    text = label "Width:"
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                    @width_combo = combo_box(value: [640, 480]) do
         | 
| 12 | 
            +
                      [[640, 480], [800, 600], [Gosu::screen_width, Gosu::screen_height]].each do |width, height|
         | 
| 13 | 
            +
                        item "#{width}x#{height}", [width, height]
         | 
| 14 | 
            +
                      end
         | 
| 15 | 
            +
                    end
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  @full_screen_button = toggle_button "Fullscreen?"
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  button "Load game", icon: Gosu::Image["head_icon.png"] do
         | 
| 21 | 
            +
                    $window.close
         | 
| 22 | 
            +
                    window = Chingu::Window.new(*@width_combo.value, @full_screen_button.value)
         | 
| 23 | 
            +
                    window.push_game_state ExampleAfterState
         | 
| 24 | 
            +
                    window.show
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
            end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            class ExampleAfterState < GuiState
         | 
| 31 | 
            +
              def initialize
         | 
| 32 | 
            +
                super
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                on_input(:esc, :exit)
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                pack :vertical do
         | 
| 37 | 
            +
                  label "Game loaded!", icon: Gosu::Image["head_icon.png"], border_color: Gosu::Color.rgb(255, 255, 255)
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
            end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            ExampleWindow.new.show
         | 
| @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            require_relative 'helpers/example_window'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class ExampleState < Fidgit::GuiState
         | 
| 4 | 
            +
              def initialize
         | 
| 5 | 
            +
                super
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                pack :horizontal do
         | 
| 8 | 
            +
                  pack :vertical do
         | 
| 9 | 
            +
                    label 'editable'
         | 
| 10 | 
            +
                    text_area(width: 200)
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  pack :vertical do
         | 
| 14 | 
            +
                    label 'mirrors to right'
         | 
| 15 | 
            +
                    text_area(width: 200, text: "Hello, my name in brian the snail!") do |sender, text|
         | 
| 16 | 
            +
                      @mirror.text = text
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  pack :vertical do
         | 
| 21 | 
            +
                    label 'not editable'
         | 
| 22 | 
            +
                    @mirror = text_area(width: 200, enabled: false)
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
            end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            ExampleWindow.new.show
         | 
    
        data/fidgit.gemspec
    ADDED
    
    | @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            # -*- encoding: utf-8 -*-
         | 
| 2 | 
            +
            $:.push File.expand_path("../lib", __FILE__)
         | 
| 3 | 
            +
            require "fidgit/version"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            Gem::Specification.new do |s|
         | 
| 6 | 
            +
              s.name        = "fidgit"
         | 
| 7 | 
            +
              s.version     = Fidgit::VERSION
         | 
| 8 | 
            +
              s.platform    = Gem::Platform::RUBY
         | 
| 9 | 
            +
              s.authors     = ["Bil Bas (Spooner)"]
         | 
| 10 | 
            +
              s.email       = ["bil.bagpuss@gmail.com"]
         | 
| 11 | 
            +
              s.homepage    = "http://github.com/Spooner/fidgit/"
         | 
| 12 | 
            +
              s.summary     = %q{Fidgit is a GUI library built on Gosu/Chingu}
         | 
| 13 | 
            +
              s.description = %q{Fidgit is a GUI library built on Gosu/Chingu}
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              s.rubyforge_project = "fidgit"
         | 
| 16 | 
            +
              s.has_rdoc = true
         | 
| 17 | 
            +
              s.required_ruby_version = "~> 1.9.2"
         | 
| 18 | 
            +
              
         | 
| 19 | 
            +
              s.files         = `git ls-files`.split("\n")
         | 
| 20 | 
            +
              s.test_files    = `git ls-files -- {test,spec,features}/*`.split("\n")
         | 
| 21 | 
            +
              s.executables   = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
         | 
| 22 | 
            +
              s.require_paths = ["lib"]
         | 
| 23 | 
            +
              
         | 
| 24 | 
            +
              s.add_dependency('gosu')
         | 
| 25 | 
            +
              s.add_dependency('chingu')
         | 
| 26 | 
            +
              s.add_development_dependency('rspec')
         | 
| 27 | 
            +
              s.add_development_dependency('texplay')
         | 
| 28 | 
            +
            end
         | 
    
        data/lib/fidgit.rb
    ADDED
    
    
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Fidgit
         | 
| 4 | 
            +
              class Clipboard
         | 
| 5 | 
            +
                # Items held in the clipboard.
         | 
| 6 | 
            +
                attr_reader :items
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def empty?; @items.empty?; end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def initialize
         | 
| 11 | 
            +
                  @items = []
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                # Copy items into the clipboard.
         | 
| 15 | 
            +
                #
         | 
| 16 | 
            +
                # @param [Array] items Items to copy
         | 
| 17 | 
            +
                def copy(items)
         | 
| 18 | 
            +
                  @items = items.to_a.dup
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  nil
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| @@ -0,0 +1,38 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Fidgit
         | 
| 4 | 
            +
              class Cursor < Chingu::GameObject
         | 
| 5 | 
            +
                ARROW = 'arrow.png'
         | 
| 6 | 
            +
                HAND = 'hand.png'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def initialize(options = {})
         | 
| 9 | 
            +
                  options = {
         | 
| 10 | 
            +
                    image: Gosu::Image[ARROW],
         | 
| 11 | 
            +
                    rotation_center: :top_left,
         | 
| 12 | 
            +
                    zorder: Float::INFINITY
         | 
| 13 | 
            +
                  }.merge!(options)
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  super(options)
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  nil
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                # Is the mouse pointer position inside the game window pane?
         | 
| 21 | 
            +
                def inside_window?
         | 
| 22 | 
            +
                  x >= 0 and y >= 0 and x < $window.width and y < $window.height
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                def update
         | 
| 26 | 
            +
                  self.x, self.y = $window.mouse_x, $window.mouse_y
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  super
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  nil
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                def draw
         | 
| 34 | 
            +
                  # Prevent system and game mouse from being shown at the same time.
         | 
| 35 | 
            +
                  super if inside_window? and $window.current_game_state.is_a? GuiState and not $window.needs_cursor?
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
            end
         | 
| @@ -0,0 +1,68 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Fidgit
         | 
| 4 | 
            +
              class Button < Label
         | 
| 5 | 
            +
                # @param (see Label#initialize)
         | 
| 6 | 
            +
                # @option (see Label#initialize)
         | 
| 7 | 
            +
                def initialize(text, options = {}, &block)
         | 
| 8 | 
            +
                  options = {
         | 
| 9 | 
            +
                    color: default(:color),
         | 
| 10 | 
            +
                    background_color: default(:background_color),
         | 
| 11 | 
            +
                    border_color: default(:border_color),
         | 
| 12 | 
            +
                  }.merge! options
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  super(text, options)
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  update_colors
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                def clicked_left_mouse_button(sender, x, y)
         | 
| 20 | 
            +
                  # TODO: Play click sound?
         | 
| 21 | 
            +
                  nil
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                def enabled=(value)
         | 
| 25 | 
            +
                  super(value)
         | 
| 26 | 
            +
                  update_colors
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  value
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                def enter(sender)
         | 
| 32 | 
            +
                  @mouse_over = true
         | 
| 33 | 
            +
                  update_colors
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  nil
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                def leave(sender)
         | 
| 39 | 
            +
                  @mouse_over = false
         | 
| 40 | 
            +
                  update_colors
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  nil
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                protected
         | 
| 46 | 
            +
                def update_colors
         | 
| 47 | 
            +
                  @background_color = if @mouse_over and enabled?
         | 
| 48 | 
            +
                    default(:hover, :background_color)
         | 
| 49 | 
            +
                  else
         | 
| 50 | 
            +
                    default(:background_color)
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  @color = if enabled?
         | 
| 54 | 
            +
                    default(:color)
         | 
| 55 | 
            +
                  else
         | 
| 56 | 
            +
                    default(:disabled, :color)
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                  nil
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                protected
         | 
| 63 | 
            +
                # A block added to any button subscribes to LMB click.
         | 
| 64 | 
            +
                def post_init_block(&block)
         | 
| 65 | 
            +
                  subscribe :clicked_left_mouse_button, &block
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
              end
         | 
| 68 | 
            +
            end
         | 
| @@ -0,0 +1,63 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Fidgit
         | 
| 4 | 
            +
              class ColorPicker < Composite
         | 
| 5 | 
            +
                CHANNELS = [:red, :green, :blue]
         | 
| 6 | 
            +
                DEFAULT_CHANNEL_NAMES = CHANNELS.map {|c| c.to_s.capitalize }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                INDICATOR_HEIGHT = 25
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                event :changed
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def color; @color.dup; end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                def color=(value)
         | 
| 15 | 
            +
                  @color = value.dup
         | 
| 16 | 
            +
                  CHANNELS.each do |channel|
         | 
| 17 | 
            +
                    @sliders[channel].value = @color.send channel
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  publish :changed, @color.dup
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  value
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                # @param (see Composite#initialize)
         | 
| 26 | 
            +
                # @option (see Composite#initialize)
         | 
| 27 | 
            +
                def initialize(options = {}, &block)
         | 
| 28 | 
            +
                  options = {
         | 
| 29 | 
            +
                    padding: 0,
         | 
| 30 | 
            +
                    spacing: 0,
         | 
| 31 | 
            +
                    channel_names: DEFAULT_CHANNEL_NAMES,
         | 
| 32 | 
            +
                    color: default(:color),
         | 
| 33 | 
            +
                    indicator_height: default(:indicator_height),
         | 
| 34 | 
            +
                  }.merge! options
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  @color = options[:color].dup
         | 
| 37 | 
            +
                  @indicator_height = options[:indicator_height]
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  super(options)
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  slider_width = width
         | 
| 42 | 
            +
                  pack :vertical do
         | 
| 43 | 
            +
                    @sliders = {}
         | 
| 44 | 
            +
                    CHANNELS.each_with_index do |channel, i|
         | 
| 45 | 
            +
                      @sliders[channel] = slider(value: @color.send(channel), range: 0..255, width: slider_width,
         | 
| 46 | 
            +
                                                 tip: options[:channel_names][i]) do |sender, value|
         | 
| 47 | 
            +
                        @color.send "#{channel}=", value
         | 
| 48 | 
            +
                        @indicator.background_color = @color
         | 
| 49 | 
            +
                        publish :changed, @color.dup
         | 
| 50 | 
            +
                      end
         | 
| 51 | 
            +
                    end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    @indicator = label '', background_color: @color, width: slider_width, height: @indicator_height
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                protected
         | 
| 58 | 
            +
                # Use block as an event handler.
         | 
| 59 | 
            +
                def post_init_block(&block)
         | 
| 60 | 
            +
                  subscribe :changed, &block
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
              end
         | 
| 63 | 
            +
            end
         | 
| @@ -0,0 +1,39 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Fidgit
         | 
| 4 | 
            +
              class ColorWell < RadioButton
         | 
| 5 | 
            +
                alias_method :color, :value
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                # @param (see RadioButton#initialize)
         | 
| 8 | 
            +
                # @option (see RadioButton#initialize)
         | 
| 9 | 
            +
                def initialize(options = {}, &block)
         | 
| 10 | 
            +
                  options = {
         | 
| 11 | 
            +
                    width: default(:width),
         | 
| 12 | 
            +
                    height: default(:height),
         | 
| 13 | 
            +
                    color: default(:color),
         | 
| 14 | 
            +
                    outline_color: default(:outline_color),
         | 
| 15 | 
            +
                    checked_border_color: default(:checked, :border_color),
         | 
| 16 | 
            +
                  }.merge! options
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  @outline_color = options[:outline_color].dup
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  super('', (options[:color] || options[:value]).dup, options)
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                protected
         | 
| 24 | 
            +
                def draw_background
         | 
| 25 | 
            +
                  super
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  draw_frame x + 2, y + 2, width - 4, height - 4, 1, z, @outline_color
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  nil
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                protected
         | 
| 33 | 
            +
                def draw_foreground
         | 
| 34 | 
            +
                  draw_rect x + 3, y + 3, width - 6, height - 6, z, value
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  nil
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
            end
         | 
| @@ -0,0 +1,85 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Fidgit
         | 
| 4 | 
            +
            class ComboBox < Button
         | 
| 5 | 
            +
              event :changed
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              def index; @menu.index(@value) end
         | 
| 8 | 
            +
              def value; @value; end
         | 
| 9 | 
            +
              
         | 
| 10 | 
            +
              def value=(value)
         | 
| 11 | 
            +
                if @value != value
         | 
| 12 | 
            +
                  @value = value
         | 
| 13 | 
            +
                  @text = @menu.find(@value).text
         | 
| 14 | 
            +
                  publish :changed, @value
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                value
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              def index=(index)
         | 
| 21 | 
            +
                if index.between?(0, @menu.size - 1)
         | 
| 22 | 
            +
                  self.value = @menu[index].value
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                index
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              # @param (see Button#initialize)
         | 
| 29 | 
            +
              # @option (see Button#initialize)
         | 
| 30 | 
            +
              # @option options [] :value
         | 
| 31 | 
            +
              def initialize(options = {}, &block)
         | 
| 32 | 
            +
                options = {
         | 
| 33 | 
            +
                  background_color: default(:background_color),
         | 
| 34 | 
            +
                  border_color: default(:border_color),
         | 
| 35 | 
            +
                }.merge! options
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                @value = options[:value]
         | 
| 38 | 
            +
                
         | 
| 39 | 
            +
                @hover_index = 0
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                @menu = MenuPane.new(show: false) do
         | 
| 42 | 
            +
                  subscribe :selected do |widget, value|
         | 
| 43 | 
            +
                    self.value = value
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                super('', options)
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                rect.height = [height, font_size + padding_top + padding_bottom].max
         | 
| 50 | 
            +
                rect.width = [width, font_size * 4 + padding_left + padding_right].max
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
              def item(text, value, options = {}, &block)
         | 
| 54 | 
            +
                item = @menu.item(text, value, options, &block)
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                # Force text to be updated if the item added has the same value.
         | 
| 57 | 
            +
                if item.value == @value
         | 
| 58 | 
            +
                  @text = item.text
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                item
         | 
| 62 | 
            +
              end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
              def clicked_left_mouse_button(sender, x, y)
         | 
| 65 | 
            +
                @menu.x = self.x
         | 
| 66 | 
            +
                @menu.y = self.y + height + border_thickness
         | 
| 67 | 
            +
                $window.game_state_manager.current_game_state.show_menu @menu
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                nil
         | 
| 70 | 
            +
              end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              protected
         | 
| 73 | 
            +
              # Any combo-box passed a block will allow you access to its methods.
         | 
| 74 | 
            +
              def post_init_block(&block)
         | 
| 75 | 
            +
                  case block.arity
         | 
| 76 | 
            +
                    when 1
         | 
| 77 | 
            +
                      yield self
         | 
| 78 | 
            +
                    when 0
         | 
| 79 | 
            +
                      instance_methods_eval &block
         | 
| 80 | 
            +
                    else
         | 
| 81 | 
            +
                      raise "block arity must be 0 or 1"
         | 
| 82 | 
            +
                  end
         | 
| 83 | 
            +
              end
         | 
| 84 | 
            +
            end
         | 
| 85 | 
            +
            end
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Fidgit
         | 
| 4 | 
            +
              # A composite element, made up of other elements (but manages them internally).
         | 
| 5 | 
            +
              class Composite < Packer
         | 
| 6 | 
            +
                DEBUG_BORDER_COLOR = Gosu::Color.rgba(0, 255, 0, 100) # Color to draw an outline in when debugging layout.
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                # @param (see Element#initialize)
         | 
| 9 | 
            +
                #
         | 
| 10 | 
            +
                # @option (see Element#initialize)
         | 
| 11 | 
            +
                def initialize(options = {})
         | 
| 12 | 
            +
                  options[:border_color] = DEBUG_BORDER_COLOR if Fidgit.debug_mode?
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  super(options)
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
            end
         |