fidgit 0.0.6alpha → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/README.textile +2 -2
  2. data/config/default_schema.yml +13 -3
  3. data/examples/align_example.rb +5 -5
  4. data/examples/button_and_toggle_button_example.rb +3 -3
  5. data/examples/color_picker_example.rb +1 -1
  6. data/examples/color_well_example.rb +2 -2
  7. data/examples/combo_box_example.rb +1 -1
  8. data/examples/file_dialog_example.rb +1 -1
  9. data/examples/grid_packer_example.rb +3 -3
  10. data/examples/label_example.rb +2 -2
  11. data/examples/list_example.rb +1 -1
  12. data/examples/menu_pane_example.rb +4 -4
  13. data/examples/message_dialog_example.rb +1 -1
  14. data/examples/radio_button_example.rb +2 -2
  15. data/examples/readme_example.rb +1 -1
  16. data/examples/scroll_window_example.rb +7 -7
  17. data/examples/slider_example.rb +3 -3
  18. data/examples/splash_example.rb +3 -3
  19. data/examples/text_area_example.rb +4 -4
  20. data/lib/fidgit/elements/button.rb +43 -0
  21. data/lib/fidgit/elements/color_picker.rb +1 -1
  22. data/lib/fidgit/elements/container.rb +4 -20
  23. data/lib/fidgit/elements/element.rb +8 -1
  24. data/lib/fidgit/elements/file_browser.rb +3 -3
  25. data/lib/fidgit/elements/{grid_packer.rb → grid.rb} +23 -19
  26. data/lib/fidgit/elements/group.rb +2 -2
  27. data/lib/fidgit/elements/{horizontal_packer.rb → horizontal.rb} +1 -1
  28. data/lib/fidgit/elements/label.rb +2 -0
  29. data/lib/fidgit/elements/list.rb +1 -1
  30. data/lib/fidgit/elements/main_packer.rb +26 -0
  31. data/lib/fidgit/elements/menu_pane.rb +8 -9
  32. data/lib/fidgit/elements/scroll_area.rb +2 -2
  33. data/lib/fidgit/elements/scroll_window.rb +1 -1
  34. data/lib/fidgit/elements/toggle_button.rb +2 -2
  35. data/lib/fidgit/elements/{vertical_packer.rb → vertical.rb} +1 -1
  36. data/lib/fidgit/gosu_ext/color.rb +7 -0
  37. data/lib/fidgit/gosu_ext/gosu_module.rb +25 -0
  38. data/lib/fidgit/states/file_dialog.rb +1 -1
  39. data/lib/fidgit/states/gui_state.rb +9 -4
  40. data/lib/fidgit/states/message_dialog.rb +2 -2
  41. data/lib/fidgit/version.rb +1 -1
  42. metadata +18 -16
data/README.textile CHANGED
@@ -49,7 +49,7 @@ class MyGuiState < Fidgit::GuiState
49
49
  super
50
50
 
51
51
  # Create a vertically packed section, centred in the window.
52
- pack :vertical, align: :center do
52
+ vertical align: :center do
53
53
  # Create a label with a dark green background.
54
54
  my_label = label "Hello world!", background_color: Gosu::Color.rgb(0, 100, 0)
55
55
 
@@ -71,7 +71,7 @@ As well as a cursor and tool-tips that are managed by the GuiState for you, ther
71
71
 
72
72
  Elements are best added by using simple methods (listed below). Most of these method accept a block, some offering access to public methods of the element and others being default event handlers.
73
73
 
74
- The GuiState itself only accepts #pack, but any packer or group accepts any other element method.
74
+ The GuiState itself only accepts #vertical/#horizontal/#grid, but any packer or group accepts any other element method.
75
75
 
76
76
  h3. GuiState methods
77
77
 
@@ -32,6 +32,7 @@
32
32
  :background_color: ?dark_gray
33
33
  :border_color: ?light_gray
34
34
  :border_thickness: 2
35
+ :shortcut_color: ?red
35
36
 
36
37
  :disabled:
37
38
  :background_color: ?very_dark_gray
@@ -83,7 +84,7 @@
83
84
  :pattern: "*.*"
84
85
  :show_extension: true
85
86
 
86
- :GridPacker: # < Packer
87
+ :Grid: # < Packer
87
88
  :cell_background_color: ?none
88
89
  :cell_border_color: ?none
89
90
  :cell_border_thickness: 0
@@ -94,7 +95,7 @@
94
95
  :padding_bottom: 0
95
96
  :padding_left: 0
96
97
 
97
- :HorizontalPacker: # < GridPacker
98
+ :Horizontal: # < Grid
98
99
  :nothing: nil
99
100
 
100
101
  :HorizontalScrollBar: # < ScrollBar
@@ -112,6 +113,15 @@
112
113
  :List::Item:
113
114
  :border_thickness: 0
114
115
 
116
+ :MainPacker: # < Packer
117
+ :border_thickness: 0
118
+ :padding_top: 0
119
+ :padding_right: 0
120
+ :padding_bottom: 0
121
+ :padding_left: 0
122
+ :spacing_h: 0
123
+ :spacing_v: 0
124
+
115
125
  :MenuPane:
116
126
  :background_color: ?very_dark_gray
117
127
 
@@ -174,7 +184,7 @@
174
184
  :background_color: ?very_dark_gray
175
185
  :border_color: ?white
176
186
 
177
- :VerticalPacker: # < GridPacker
187
+ :Vertical: # < Grid
178
188
  :nothing: nil
179
189
 
180
190
  :VerticalScrollBar: # < ScrollBar
@@ -11,17 +11,17 @@ class ExampleState < Fidgit::GuiState
11
11
  def initialize
12
12
  super
13
13
 
14
- pack :vertical, align: :center, background_color: OUTER_BACKGROUND do
14
+ vertical align: :center, background_color: OUTER_BACKGROUND do
15
15
  label "h => align_h, v => align_v", align_h: :center
16
16
 
17
- pack :grid, num_columns: 4, align: :center, cell_background_color: CELL_BACKGROUND, background_color: ROW_BACKGROUND, align_h: :fill do
17
+ grid num_columns: 4, align: :center, cell_background_color: CELL_BACKGROUND, background_color: ROW_BACKGROUND do
18
18
  label "xxx"
19
19
  label "h fill", align_h: :fill
20
20
  label "h right", align_h: :right
21
21
  label "h center", align_h: :center
22
22
 
23
23
 
24
- pack :vertical do
24
+ vertical do
25
25
  label "xxx"
26
26
  label "xxx"
27
27
  end
@@ -29,7 +29,7 @@ class ExampleState < Fidgit::GuiState
29
29
  label "v center", align_v: :center
30
30
  label "v bottom", align_v: :bottom
31
31
 
32
- pack :vertical, align_h: :center do
32
+ vertical align_h: :center do
33
33
  label "h center"
34
34
  label "h center"
35
35
  end
@@ -40,7 +40,7 @@ class ExampleState < Fidgit::GuiState
40
40
  label ""
41
41
  label "bottom right", align_h: :right, align_v: :bottom
42
42
  label "bottom center", align_h: :center, align_v: :bottom
43
- pack :vertical, align_h: :right do
43
+ vertical align_h: :right do
44
44
  label "h right"
45
45
  label "h right"
46
46
  end
@@ -5,14 +5,14 @@ class ExampleState < Fidgit::GuiState
5
5
  def initialize
6
6
  super
7
7
 
8
- pack :vertical do
8
+ vertical do
9
9
  my_label = label "Label", tip: "I'm a label"
10
10
 
11
- my_button = button("Button", tip: "I'm a button; press me!") do
11
+ my_button = button("Button", tip: "I'm a button; press me!", shortcut: :auto) do
12
12
  my_label.text = "Pressed the button!"
13
13
  end
14
14
 
15
- my_toggle_button = toggle_button("ToggleButton", tip: "I'm a button that toggles") do |sender, value|
15
+ my_toggle_button = toggle_button("ToggleButton", tip: "I'm a button that toggles", shortcut: :o) do |sender, value|
16
16
  my_label.text = "Turned the toggle button #{value ? "on" : "off"}!"
17
17
  end
18
18
 
@@ -4,7 +4,7 @@ class ExampleState < Fidgit::GuiState
4
4
  def initialize
5
5
  super
6
6
 
7
- pack :vertical do
7
+ vertical do
8
8
  my_label = label 'No color picked'
9
9
 
10
10
  color_picker(width: 100) do |sender, color|
@@ -4,11 +4,11 @@ class ExampleState < Fidgit::GuiState
4
4
  def initialize
5
5
  super
6
6
 
7
- pack :vertical do
7
+ vertical do
8
8
  my_label = label "No color selected."
9
9
 
10
10
  group do
11
- pack :grid, num_columns: 15, padding: 0, spacing: 4 do
11
+ grid num_columns: 15, padding: 0, spacing: 4 do
12
12
  150.times do
13
13
  color_well(color: Gosu::Color.rgb(rand(255), rand(255), rand(255)))
14
14
  end
@@ -5,7 +5,7 @@ class ExampleState < Fidgit::GuiState
5
5
  def initialize
6
6
  super
7
7
 
8
- pack :vertical do
8
+ vertical do
9
9
  my_label = label "Label", tip: "I'm a label"
10
10
 
11
11
  combo_box(value: 1, tip: "I'm a combo box; press me and make a selection!") do
@@ -8,7 +8,7 @@ class ExampleState < Fidgit::GuiState
8
8
  super
9
9
 
10
10
  container.background_color = Gosu::Color.rgb(50, 50, 50)
11
- pack :vertical, align: :center do
11
+ vertical align: :center do
12
12
  full_base_directory = ''
13
13
  restricted_base_directory = File.expand_path(File.join(__FILE__, '..', '..'))
14
14
  directory = File.join(restricted_base_directory, 'media', 'images')
@@ -8,16 +8,16 @@ class ExampleState < Fidgit::GuiState
8
8
  def initialize
9
9
  super
10
10
 
11
- pack :vertical do
11
+ vertical do
12
12
  label "Grid with #{FIXED_NUM} columns"
13
- pack :grid, num_columns: FIXED_NUM, border_color: BORDER_COLOR, cell_border_color: Gosu::Color.rgba(0, 255, 0, 255), cell_border_thickness: 1 do
13
+ grid num_columns: FIXED_NUM, border_color: BORDER_COLOR, cell_border_color: Gosu::Color.rgba(0, 255, 0, 255), cell_border_thickness: 1 do
14
14
  NUM_CELLS.times do |i|
15
15
  label "Cell #{i}", font_size: rand(15) + 15, border_color: BORDER_COLOR, border_thickness: 1
16
16
  end
17
17
  end
18
18
 
19
19
  label "Grid with #{FIXED_NUM} rows"
20
- pack :grid, num_rows: FIXED_NUM, border_color: BORDER_COLOR, cell_background_color: Gosu::Color.rgba(0, 100, 100, 255) do
20
+ grid num_rows: FIXED_NUM, border_color: BORDER_COLOR, cell_background_color: Gosu::Color.rgba(0, 100, 100, 255) do
21
21
  NUM_CELLS.times do |i|
22
22
  label "Cell #{i}", font_size: rand(15) + 15, border_color: BORDER_COLOR, border_thickness: 1
23
23
  end
@@ -5,14 +5,14 @@ class ExampleState < Fidgit::GuiState
5
5
  def initialize
6
6
  super
7
7
 
8
- pack :vertical, background_color: Gosu::Color.rgb(255, 0, 0) do
8
+ vertical background_color: Gosu::Color.rgb(255, 0, 0) do
9
9
  label "Hello!", tip: 'A label with text'
10
10
  label "Hello!", icon: Gosu::Image["head_icon.png"], tip: 'A label with text & icon'
11
11
  label '', icon: Gosu::Image["head_icon.png"], tip: 'A label with just icon'
12
12
  label '', background_color: Gosu::Color.rgb(0, 255, 0), tip: 'No text or icon'
13
13
  end
14
14
 
15
- pack :vertical do
15
+ vertical do
16
16
  label ":left justification", width: 400, background_color: Gosu::Color.rgb(0, 100, 0), justify: :left, tip: 'A label with text'
17
17
  label ":right justification", width: 400, background_color: Gosu::Color.rgb(0, 100, 0), justify: :right, tip: 'A label with text'
18
18
  label ":center justification", width: 400, background_color: Gosu::Color.rgb(0, 100, 0), justify: :center, tip: 'A label with text'
@@ -5,7 +5,7 @@ class ExampleState < Fidgit::GuiState
5
5
  def initialize
6
6
  super
7
7
 
8
- pack :vertical do
8
+ vertical do
9
9
  my_label = label "No clicky"
10
10
 
11
11
  list do
@@ -5,15 +5,15 @@ class ExampleState < Fidgit::GuiState
5
5
  def initialize
6
6
  super
7
7
 
8
- pack :vertical do
8
+ vertical do
9
9
  my_label = label "Right click to open context menu"
10
10
 
11
11
  my_label.subscribe :released_right_mouse_button do
12
12
  menu do
13
- item "Chunky bacon", :CHUNKY_BACON, shortcut: "Ctrl-^-*"
13
+ item "Chunky bacon", :CHUNKY_BACON, shortcut_text: "Ctrl-^-*"
14
14
  separator
15
- item "Lentils", :LENTILS, shortcut: "Alt-F15"
16
- item "Tepid gruel", :GRUEL, shortcut: "CenterMeta"
15
+ item "Lentils", :LENTILS, shortcut_text: "Alt-F15"
16
+ item "Tepid gruel", :GRUEL, shortcut_text: "CenterMeta"
17
17
 
18
18
  subscribe :selected do |sender, value|
19
19
  my_label.text = "I like #{value} more than anything. Mmmm!"
@@ -5,7 +5,7 @@ class ExampleState < Fidgit::GuiState
5
5
  def initialize
6
6
  super
7
7
 
8
- pack :vertical do
8
+ vertical do
9
9
  my_label = label "Why not open a dialog? You know you want to!", tip: "I'm a label"
10
10
 
11
11
  button("Open an ok message dialog") do
@@ -4,7 +4,7 @@ class ExampleState < Fidgit::GuiState
4
4
  def initialize
5
5
  super
6
6
 
7
- pack :vertical do
7
+ vertical do
8
8
  my_label = label "No button selected"
9
9
 
10
10
  button("Deselect") do
@@ -16,7 +16,7 @@ class ExampleState < Fidgit::GuiState
16
16
  end
17
17
 
18
18
  @group = group do
19
- pack :grid, num_columns: 5, padding: 0 do
19
+ grid num_columns: 5, padding: 0 do
20
20
  15.times do |i|
21
21
  radio_button "##{i}", i, width: 60
22
22
  end
@@ -17,7 +17,7 @@ class MyGuiState < Fidgit::GuiState
17
17
  super
18
18
 
19
19
  # Create a vertically packed section, centred on the window.
20
- pack :vertical, align: :center do
20
+ vertical align: :center do
21
21
  # Create a label with a dark green background.
22
22
  my_label = label "Hello world!", background_color: Gosu::Color.rgb(0, 100, 0)
23
23
 
@@ -7,17 +7,17 @@ class ExampleState < Fidgit::GuiState
7
7
  def initialize
8
8
  super
9
9
 
10
- pack :vertical do
11
- pack :horizontal do
10
+ vertical do
11
+ horizontal do
12
12
  [
13
13
  [20, "All cheer the ascendancy of number "], # Should have both scrollers
14
14
  [20, "#"], # Only has v-scroller.
15
15
  [4, "#"], # No scrollers.
16
16
  [4, "All cheer the ascendancy of number "], # Only has h-scroller
17
17
  ].each do |num_labels, text|
18
- pack :vertical do
18
+ vertical do
19
19
  scroll_window(width: WIDTH, height: HEIGHT, background_color: Gosu::Color.rgb(0, 100, 0)) do
20
- pack :vertical do
20
+ vertical do
21
21
  (1..num_labels).each do |i|
22
22
  label "#{text}#{i}!"
23
23
  end
@@ -27,14 +27,14 @@ class ExampleState < Fidgit::GuiState
27
27
  end
28
28
  end
29
29
 
30
- pack :horizontal, padding: 0 do
31
- pack :vertical do
30
+ horizontal padding: 0 do
31
+ vertical do
32
32
  scroll_window(width: 300, height: 150) do
33
33
  text_area(text: "Hello world! " * 19, width: 284)
34
34
  end
35
35
  end
36
36
 
37
- pack :vertical do
37
+ vertical do
38
38
  scroll_window(width: 300, height: 150) do
39
39
  %w[One Two Three Four Five Six].each do |name|
40
40
  toggle_button(name)
@@ -4,8 +4,8 @@ class ExampleState < Fidgit::GuiState
4
4
  def initialize
5
5
  super
6
6
 
7
- pack :vertical do
8
- pack :horizontal do
7
+ vertical do
8
+ horizontal do
9
9
  # Discrete values (0..100)
10
10
  slider = slider(width: 100, range: 0..5, value: 3) do |sender, value|
11
11
  @discrete_label.text = "Discrete slider is at #{value}"
@@ -14,7 +14,7 @@ class ExampleState < Fidgit::GuiState
14
14
  @discrete_label = label "Discrete slider is at #{slider.value}"
15
15
  end
16
16
 
17
- pack :horizontal do
17
+ horizontal do
18
18
  # Continuous values (0.0..1.0)
19
19
 
20
20
  slider = slider(width: 100, range: 0.0..100.0, value: 77.2) do |sender, value|
@@ -4,8 +4,8 @@ require_relative 'helpers/example_window'
4
4
  class ExampleState < Fidgit::GuiState
5
5
  def initialize
6
6
  super
7
- pack :vertical do
8
- pack :horizontal do
7
+ vertical do
8
+ horizontal do
9
9
  text = label "Width:"
10
10
 
11
11
  @width_combo = combo_box(value: [640, 480]) do
@@ -33,7 +33,7 @@ class ExampleAfterState < GuiState
33
33
 
34
34
  on_input(:esc, :exit)
35
35
 
36
- pack :vertical do
36
+ vertical do
37
37
  label "Game loaded!", icon: Gosu::Image["head_icon.png"], border_color: Gosu::Color.rgb(255, 255, 255)
38
38
  end
39
39
  end
@@ -4,20 +4,20 @@ class ExampleState < Fidgit::GuiState
4
4
  def initialize
5
5
  super
6
6
 
7
- pack :horizontal do
8
- pack :vertical do
7
+ horizontal do
8
+ vertical do
9
9
  label 'editable'
10
10
  text_area(width: 200)
11
11
  end
12
12
 
13
- pack :vertical do
13
+ vertical do
14
14
  label 'mirrors to right'
15
15
  text_area(width: 200, text: "Hello, my name in brian the snail!") do |sender, text|
16
16
  @mirror.text = text
17
17
  end
18
18
  end
19
19
 
20
- pack :vertical do
20
+ vertical do
21
21
  label 'not editable'
22
22
  @mirror = text_area(width: 200, enabled: false)
23
23
  end
@@ -4,18 +4,54 @@ module Fidgit
4
4
  class Button < Label
5
5
  # @param (see Label#initialize)
6
6
  # @option (see Label#initialize)
7
+ # @option options [Symbol] :shortcut (nil) Adds a shortcut key for this element, that activates it. :auto takes the first letter of the text.
7
8
  def initialize(text, options = {}, &block)
8
9
  options = {
9
10
  color: default(:color),
10
11
  background_color: default(:background_color),
11
12
  border_color: default(:border_color),
13
+ shortcut_color: default(:shortcut_color),
14
+ shortcut: nil,
12
15
  }.merge! options
13
16
 
17
+ @shortcut_color = options[:shortcut_color].dup
18
+
19
+ @shortcut = if options[:shortcut] == :auto
20
+ raise ArgumentError.new("Can't use :auto for :shortcut without text") if text.empty?
21
+ text[0].downcase.to_sym
22
+ else
23
+ options[:shortcut]
24
+ end
25
+
26
+ raise ArgumentError.new(":shortcut must be a symbol") unless @shortcut.nil? or @shortcut.is_a? Symbol
27
+
14
28
  super(text, options)
15
29
 
16
30
  update_colors
17
31
  end
18
32
 
33
+ def text=(value)
34
+ if @shortcut
35
+ super value.sub(/#{@shortcut}/i) {|char| "<c=#{@shortcut_color.to_hex}>#{char}</c>" }
36
+ else
37
+ super value
38
+ end
39
+ end
40
+
41
+ def parent=(value)
42
+ if @shortcut
43
+ state = $window.game_state_manager.inside_state || $window.current_game_state
44
+ if parent
45
+ raise ArgumentError.new("Repeat of shortcut #{@shortcut.inspect}") if state.input.has_key? @shortcut
46
+ state.on_input(@shortcut) { activate unless state.focus }
47
+ else
48
+ state.input.delete @shortcut
49
+ end
50
+ end
51
+
52
+ super(value)
53
+ end
54
+
19
55
  def clicked_left_mouse_button(sender, x, y)
20
56
  # TODO: Play click sound?
21
57
  nil
@@ -64,5 +100,12 @@ module Fidgit
64
100
  def post_init_block(&block)
65
101
  subscribe :clicked_left_mouse_button, &block
66
102
  end
103
+
104
+ public
105
+ # Activate the button, as though it had been clicked on.
106
+ # Does not do anything if the button is disabled.
107
+ def activate
108
+ publish(:clicked_left_mouse_button, x + width / 2, y + height / 2) if enabled?
109
+ end
67
110
  end
68
111
  end
@@ -39,7 +39,7 @@ module Fidgit
39
39
  super(options)
40
40
 
41
41
  slider_width = width
42
- pack :vertical do
42
+ vertical do
43
43
  @sliders = {}
44
44
  CHANNELS.each_with_index do |channel, i|
45
45
  @sliders[channel] = slider(value: @color.send(channel), range: 0..255, width: slider_width,
@@ -6,7 +6,7 @@ module Fidgit
6
6
  class Container < Element
7
7
  extend Forwardable
8
8
 
9
- def_delegators :@children, :size, :each, :find, :index, :[]
9
+ def_delegators :@children, :size, :each, :find, :index, :[], :empty?, :map, :select, :inject
10
10
 
11
11
  def x=(value)
12
12
  each {|c| c.x += value - x }
@@ -89,38 +89,22 @@ module Fidgit
89
89
  List.new({parent: self}.merge!(options), &block)
90
90
  end
91
91
 
92
- # Deprecated: use horizontal/vertical/grid
93
- def pack(arrangement, options = {}, &block)
94
- klass = case arrangement
95
- when :horizontal
96
- HorizontalPacker
97
- when :vertical
98
- VerticalPacker
99
- when :grid
100
- GridPacker
101
- else
102
- raise ArgumentError, "packing arrangement must be one of :horizontal, :vertical or :grid"
103
- end
104
-
105
- klass.new({parent: self}.merge!(options), &block)
106
- end
107
-
108
92
  public
109
93
  # Pack elements within the block horizontally.
110
94
  def horizontal(options = {}, &block)
111
- HorizontalPacker.new({ parent: self }.merge!(options), &block)
95
+ Horizontal.new({ parent: self }.merge!(options), &block)
112
96
  end
113
97
 
114
98
  public
115
99
  # Pack elements within the blockvertically.
116
100
  def vertical(options = {}, &block)
117
- VerticalPacker.new({ parent: self }.merge!(options), &block)
101
+ Vertical.new({ parent: self }.merge!(options), &block)
118
102
  end
119
103
 
120
104
  public
121
105
  # Pack elements within the block in a grid (matrix) formation.
122
106
  def grid(options = {}, &block)
123
- GridPacker.new({ parent: self }.merge!(options), &block)
107
+ Grid.new({ parent: self }.merge!(options), &block)
124
108
  end
125
109
 
126
110
  def radio_button(text, value, options = {}, &block)
@@ -67,7 +67,14 @@ module Fidgit
67
67
  def drag?(button); false; end
68
68
 
69
69
  def enabled?; @enabled; end
70
- def enabled=(value); @enabled = value; end
70
+
71
+ def enabled=(value)
72
+ if @mouse_over and enabled? and not value
73
+ $window.current_game_state.unset_mouse_over
74
+ end
75
+
76
+ @enabled = value
77
+ end
71
78
 
72
79
  def font; @font ||= Gosu::Font[@font_name, @font_size]; end
73
80
 
@@ -50,8 +50,8 @@ module Fidgit
50
50
 
51
51
  super options
52
52
 
53
- pack :vertical do
54
- @nav_buttons = pack :horizontal, padding: 0, spacing: 2
53
+ vertical do
54
+ @nav_buttons = horizontal padding: 0, spacing: 2
55
55
 
56
56
  @scroll_window = scroll_window(height: 250, width: options[:width]) do
57
57
  @files_list = list(width: options[:width]) do
@@ -74,7 +74,7 @@ module Fidgit
74
74
 
75
75
  create_nav_buttons
76
76
 
77
- pack :horizontal, align: :center, padding: 0 do
77
+ horizontal align: :center, padding: 0 do
78
78
  @action_button = button(options[:"#{type}_text"]) do
79
79
  publish :selected, @type, file_path
80
80
  end
@@ -3,7 +3,7 @@
3
3
  module Fidgit
4
4
  # A vertically aligned element packing container.
5
5
 
6
- class GridPacker < Packer
6
+ class Grid < Packer
7
7
  # @return [Integer]
8
8
  attr_reader :num_rows
9
9
  # @return [Integer]
@@ -72,8 +72,8 @@ module Fidgit
72
72
  protected
73
73
  # Repack all the elements into their positions.
74
74
  def repack
75
- @widths = Array.new(@num_columns, 0)
76
- @heights = Array.new(@num_rows, 0)
75
+ @widths = Array.new(@rows.empty? ? 0 : @rows[0].size, 0)
76
+ @heights = Array.new(@rows.size, 0)
77
77
 
78
78
  filled_columns = []
79
79
  filled_rows = []
@@ -82,35 +82,39 @@ module Fidgit
82
82
  @rows.each_with_index do |row, row_num|
83
83
  row.each_with_index do |element, column_num|
84
84
  fills = (element.align_h == :fill)
85
- @widths[column_num] = [fills ? 0 : element.outer_width, @widths[column_num] || 0].max
85
+ @widths[column_num] = [fills ? 0 : element.outer_width, @widths[column_num]].max
86
86
  filled_columns.push fills
87
87
 
88
88
  fills = (element.align_v == :fill)
89
- @heights[row_num] = [fills ? 0 : element.outer_height, @heights[row_num] || 0].max
89
+ @heights[row_num] = [fills ? 0 : element.outer_height, @heights[row_num]].max
90
90
  filled_rows.push fills
91
91
  end
92
92
  end
93
93
 
94
94
  # Expand the size of each filled column to make the minimum size required.
95
- num_filled_columns = filled_columns.select {|value| value }.count
96
- if num_filled_columns > 0
95
+ unless @widths.empty?
96
+ num_filled_columns = filled_columns.select {|value| value }.count
97
97
  total_width = @widths.inject(0, :+) + (padding_left + padding_right) + ((@num_columns - 1) * spacing_h)
98
- if total_width < min_width
99
- extra_width = total_width / num_filled_columns
100
- filled_columns.each_with_index do |filled, i|
101
- @widths[i] += extra_width if filled
98
+ extra_width = min_width - total_width
99
+ if extra_width > 0
100
+ if num_filled_columns > 0
101
+ @widths[filled_columns.index true] += extra_width
102
+ else
103
+ @widths[-1] += extra_width
102
104
  end
103
105
  end
104
106
  end
105
107
 
106
108
  # Expand the size of each filled row to make the minimum size required.
107
- num_filled_rows = filled_rows.select {|value| value }.count
108
- if num_filled_rows > 0
109
+ unless @heights.empty?
110
+ num_filled_rows = filled_rows.select {|value| value }.count
109
111
  total_height = @heights.inject(0, :+) + (padding_left + padding_right) + ((@num_rows - 1) * spacing_v)
110
- if total_height < min_height
111
- extra_height = total_height / num_filled_rows
112
- filled_rows.each_with_index do |filled, i|
113
- @heights[i] += extra_height if filled
112
+ extra_height = min_height - total_height
113
+ if extra_height > 0
114
+ if num_filled_rows > 0
115
+ @heights[filled_rows.index true] += extra_height
116
+ else
117
+ @heights[-1] += extra_height
114
118
  end
115
119
  end
116
120
  end
@@ -127,7 +131,7 @@ module Fidgit
127
131
  when :fill
128
132
  if element.width < @widths[column_num]
129
133
  element.width = @widths[column_num]
130
- element.send :repack if element.is_a? GridPacker
134
+ element.send :repack if element.is_a? Grid
131
135
  end
132
136
  when :center
133
137
  element.x += (@widths[column_num] - element.width) / 2
@@ -144,7 +148,7 @@ module Fidgit
144
148
  when :fill
145
149
  if element.height < @heights[row_num]
146
150
  element.height = @heights[row_num]
147
- element.send :repack if element.is_a? GridPacker
151
+ element.send :repack if element.is_a? Grid
148
152
  end
149
153
  when :center
150
154
  element.y += (@heights[row_num] - element.height) / 2
@@ -10,7 +10,7 @@
10
10
 
11
11
  # @example
12
12
  # group do
13
- # pack :horizontal do
13
+ # horizontal do
14
14
  # radio_button 1, text: '1', checked: true
15
15
  # radio_button 2, text: '2'
16
16
  # subscribe :changed do |sender, value|
@@ -43,7 +43,7 @@
43
43
 
44
44
  # @example
45
45
  # @my_group = group do
46
- # pack :horizontal do
46
+ # horizontal do
47
47
  # radio_button(1, text: '1', checked: true)
48
48
  # radio_button(2, text: '2')
49
49
  # end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Fidgit
4
4
  # A vertically aligned element packing container.
5
- class HorizontalPacker < GridPacker
5
+ class Horizontal < Grid
6
6
  def initialize(options = {})
7
7
  options[:num_rows] = 1
8
8
 
@@ -41,6 +41,8 @@ module Fidgit
41
41
  @justify = options[:justify]
42
42
 
43
43
  super(options)
44
+
45
+ self.text = text # Forces stuff that manipulates text to work.
44
46
  end
45
47
 
46
48
  def draw_foreground
@@ -23,7 +23,7 @@ module Fidgit
23
23
  publish :changed, value
24
24
  end
25
25
 
26
- @items = pack :vertical, spacing: 0
26
+ @items = vertical spacing: 0
27
27
  end
28
28
  end
29
29
 
@@ -0,0 +1,26 @@
1
+ require_relative "vertical"
2
+
3
+ module Fidgit
4
+ # Main container that can contains a single "proper" packing element.
5
+ class MainPacker < Vertical
6
+ def initialize(options = {})
7
+ options = {
8
+ width: $window.width,
9
+ height: $window.height,
10
+ }.merge! options
11
+
12
+ super options
13
+ end
14
+
15
+ def width; $window.width; end
16
+ def height; $window.height; end
17
+ def width=(value); ; end
18
+ def height=(value); ; end
19
+
20
+ def add(element)
21
+ raise "MainPacker can only contain one packing element" unless empty?
22
+ raise "MainPacker can only contain packing elements" unless element.is_a? Packer
23
+ super(element)
24
+ end
25
+ end
26
+ end
@@ -4,31 +4,30 @@ module Fidgit
4
4
  class MenuPane < Composite
5
5
  # An item within the menu.
6
6
  class Item < Button
7
- attr_reader :value, :shortcut
7
+ attr_reader :value, :shortcut_text
8
8
 
9
9
  # @param (see Button#initialize)
10
10
  #
11
11
  # @option (see Button#initialize)
12
12
  # @param [any] value Value if the user picks this item
13
- # @option options [Boolean] :enabled (true)
14
- # @option options [String] :shortcut ('')
13
+ # @option options [String] :shortcut_text ('')
15
14
  def initialize(text, value, options = {})
16
15
  options = {
17
16
  enabled: true,
18
17
  border_color: default(:border_color),
18
+ shortcut_text: '',
19
19
  }.merge! options
20
20
 
21
21
  @value = value
22
- @enabled = [true, false].include?(options[:enabled]) ? options[:enabled] : true
23
- @shortcut = options[:shortcut] || ''
22
+ @shortcut_text = options[:shortcut_text]
24
23
 
25
24
  super(text, options)
26
25
  end
27
26
 
28
27
  def draw_foreground
29
28
  super
30
- unless @shortcut.empty?
31
- font.draw_rel("#{@shortcut}", rect.right - padding_right, y + ((height - font_size) / 2).floor, z, 1, 0, 1, 1, color)
29
+ unless @shortcut_text.empty?
30
+ font.draw_rel("#{@shortcut_text}", rect.right - padding_right, y + ((height - font_size) / 2).floor, z, 1, 0, 1, 1, color)
32
31
  end
33
32
 
34
33
  nil
@@ -37,7 +36,7 @@ module Fidgit
37
36
  protected
38
37
  def layout
39
38
  super
40
- rect.width += font.text_width(" #{@shortcut}") unless @shortcut.empty?
39
+ rect.width += font.text_width(" #{@shortcut_text}") unless @shortcut_text.empty?
41
40
  nil
42
41
  end
43
42
  end
@@ -89,7 +88,7 @@ module Fidgit
89
88
 
90
89
  super(options)
91
90
 
92
- @items = pack :vertical, spacing: 0, padding: 0
91
+ @items = vertical spacing: 0, padding: 0
93
92
 
94
93
  if options[:show] and state.is_a? GuiState
95
94
  show
@@ -3,7 +3,7 @@
3
3
  module Fidgit
4
4
  # A basic scrolling area. It is not managed in any way (use ScrollWindow for that).
5
5
  class ScrollArea < Container
6
- # @return [VerticalPacker] The content shown within this ScrollArea
6
+ # @return [Vertical] The content shown within this ScrollArea
7
7
  attr_reader :content
8
8
 
9
9
  def offset_x; x - @content.x; end
@@ -31,7 +31,7 @@ module Fidgit
31
31
 
32
32
  super(options)
33
33
 
34
- @content = VerticalPacker.new(parent: self, padding: 0)
34
+ @content = Vertical.new(parent: self, padding: 0)
35
35
 
36
36
  self.offset_x = options[:offset_x] || options[:offset]
37
37
  self.offset_y = options[:offset_y] || options[:offset]
@@ -24,7 +24,7 @@ module Fidgit
24
24
 
25
25
  super(options)
26
26
 
27
- @grid = pack :grid, num_columns: 2, padding: 0, spacing: 0 do
27
+ @grid = grid num_columns: 2, padding: 0, spacing: 0 do
28
28
  @view = scroll_area(owner: self, width: options[:width], height: options[:height])
29
29
  @spacer = label '', padding: 0, width: 0, height: 0
30
30
  end
@@ -48,12 +48,12 @@ module Fidgit
48
48
  protected
49
49
  def update_status
50
50
  if @value
51
- @text = @text_on.dup
51
+ self.text = @text_on.dup
52
52
  @icon = @icon_on ? @icon_on.dup : nil
53
53
  @tip = @tip_on.dup
54
54
  @border_color = @border_color_on.dup
55
55
  else
56
- @text = @text_off.dup
56
+ self.text = @text_off.dup
57
57
  @icon = @icon_off ? @icon_off.dup : nil
58
58
  @tip = @tip_off.dup
59
59
  @border_color = @border_color_off.dup
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Fidgit
4
4
  # A vertically aligned element packing container.
5
- class VerticalPacker < GridPacker
5
+ class Vertical < Grid
6
6
  def initialize(options = {})
7
7
  options[:num_columns] = 1
8
8
 
@@ -77,6 +77,13 @@ module Gosu
77
77
  [red / 255.0, green / 255.0, blue / 255.0, alpha / 255.0]
78
78
  end
79
79
 
80
+ # Convert to a 6-digit hexadecimal value, appropriate for passing to the Gosu +<c>+ tag. The alpha channel is ignored.
81
+ #
82
+ # @return [String] RGB hexadecimal string, such as "AABB00"
83
+ def to_hex
84
+ "%02x%02x%02x" % [red, green, blue]
85
+ end
86
+
80
87
  # Show the Color as <RGBA [0, 0, 0, 0]> or, if opaque, <RGB [0, 0, 0]> (Gosu default is '(ARGB:0/0/0/0)')
81
88
  def to_s
82
89
  if opaque?
@@ -0,0 +1,25 @@
1
+ module Gosu
2
+ class << self
3
+ alias_method :register_entity_fidgit, :register_entity
4
+
5
+ protected
6
+ def init_entities
7
+ @entities = {}
8
+ end
9
+
10
+ public
11
+ def register_entity(name, image)
12
+ name = name.to_sym
13
+ register_entity_fidgit(name, image)
14
+ @entities[name] = image
15
+ nil
16
+ end
17
+
18
+ public
19
+ def entity(name)
20
+ @entities[name.to_sym]
21
+ end
22
+ end
23
+
24
+ init_entities
25
+ end
@@ -10,7 +10,7 @@ module Fidgit
10
10
 
11
11
  super(options)
12
12
 
13
- pack :vertical, align: :center, padding: 0 do |packer|
13
+ vertical align: :center, padding: 0 do |packer|
14
14
  FileBrowser.new(type, { parent: packer }.merge!(options)) do |sender, result, file_name|
15
15
  hide
16
16
  block.call result, file_name if block
@@ -44,15 +44,12 @@ module Fidgit
44
44
  # (see MessageDialog#initialize)
45
45
  def message(text, options = {}, &block); MessageDialog.new(text, options, &block); end
46
46
 
47
- # (see Container#pack)
48
- def pack(*args, &block); @container.pack *args, &block; end
49
-
50
47
  # (see Container#clear)
51
48
  def clear(*args, &block); @container.clear *args, &block; end
52
49
 
53
50
  def initialize
54
51
  # The container is where the user puts their content.
55
- @container = VerticalPacker.new(padding: 0, width: $window.width, height: $window.height)
52
+ @container = MainPacker.new
56
53
 
57
54
  unless defined? @@draw_pixel
58
55
  media_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'media'))
@@ -164,11 +161,19 @@ module Fidgit
164
161
  end
165
162
 
166
163
  def finalize
164
+ unset_mouse_over
165
+
167
166
  @tool_tip = nil
168
167
 
169
168
  nil
170
169
  end
171
170
 
171
+ # Called by active elements when they are disabled.
172
+ def unset_mouse_over
173
+ @mouse_over.publish :leave if @mouse_over
174
+ @mouse_over = nil
175
+ end
176
+
172
177
  # Set the menu pane to be displayed.
173
178
  #
174
179
  # @param [MenuPane] menu Menu to display.
@@ -42,10 +42,10 @@ module Fidgit
42
42
  # Dialog is forced to the centre.
43
43
  options[:align_h] = options[:align_v] = :center
44
44
 
45
- pack :vertical, options do
45
+ vertical options do
46
46
  text_area(text: message, enabled: false, width: options[:width] - padding_left - padding_right)
47
47
 
48
- pack :horizontal, align_h: :center do
48
+ horizontal align_h: :center do
49
49
  @type.to_s.split('_').each do |type|
50
50
  button(options[:"#{type}_text"]) do
51
51
  hide
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Fidgit
4
- VERSION = '0.0.6alpha'
4
+ VERSION = '0.1.0'
5
5
  end
metadata CHANGED
@@ -1,20 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fidgit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6alpha
5
- prerelease: 5
4
+ version: 0.1.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Bil Bas (Spooner)
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-06-06 00:00:00.000000000 +01:00
12
+ date: 2011-06-10 00:00:00.000000000 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: gosu
17
- requirement: &26037252 !ruby/object:Gem::Requirement
17
+ requirement: &27888528 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 0.7.32
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *26037252
25
+ version_requirements: *27888528
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: chingu
28
- requirement: &26036940 !ruby/object:Gem::Requirement
28
+ requirement: &27888228 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 0.9rc5
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *26036940
36
+ version_requirements: *27888228
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: rspec
39
- requirement: &26036652 !ruby/object:Gem::Requirement
39
+ requirement: &27887940 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ~>
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 2.1.0
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *26036652
47
+ version_requirements: *27887940
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: texplay
50
- requirement: &26036364 !ruby/object:Gem::Requirement
50
+ requirement: &27887640 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ~>
@@ -55,7 +55,7 @@ dependencies:
55
55
  version: 0.3.5
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *26036364
58
+ version_requirements: *27887640
59
59
  description: Fidgit is a GUI library built on Gosu/Chingu
60
60
  email:
61
61
  - bil.bagpuss@gmail.com
@@ -103,11 +103,12 @@ files:
103
103
  - lib/fidgit/elements/container.rb
104
104
  - lib/fidgit/elements/element.rb
105
105
  - lib/fidgit/elements/file_browser.rb
106
- - lib/fidgit/elements/grid_packer.rb
106
+ - lib/fidgit/elements/grid.rb
107
107
  - lib/fidgit/elements/group.rb
108
- - lib/fidgit/elements/horizontal_packer.rb
108
+ - lib/fidgit/elements/horizontal.rb
109
109
  - lib/fidgit/elements/label.rb
110
110
  - lib/fidgit/elements/list.rb
111
+ - lib/fidgit/elements/main_packer.rb
111
112
  - lib/fidgit/elements/menu_pane.rb
112
113
  - lib/fidgit/elements/packer.rb
113
114
  - lib/fidgit/elements/radio_button.rb
@@ -118,9 +119,10 @@ files:
118
119
  - lib/fidgit/elements/text_area.rb
119
120
  - lib/fidgit/elements/toggle_button.rb
120
121
  - lib/fidgit/elements/tool_tip.rb
121
- - lib/fidgit/elements/vertical_packer.rb
122
+ - lib/fidgit/elements/vertical.rb
122
123
  - lib/fidgit/event.rb
123
124
  - lib/fidgit/gosu_ext/color.rb
125
+ - lib/fidgit/gosu_ext/gosu_module.rb
124
126
  - lib/fidgit/history.rb
125
127
  - lib/fidgit/redirector.rb
126
128
  - lib/fidgit/schema.rb
@@ -166,9 +168,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
166
168
  required_rubygems_version: !ruby/object:Gem::Requirement
167
169
  none: false
168
170
  requirements:
169
- - - ! '>'
171
+ - - ! '>='
170
172
  - !ruby/object:Gem::Version
171
- version: 1.3.1
173
+ version: '0'
172
174
  requirements: []
173
175
  rubyforge_project: fidgit
174
176
  rubygems_version: 1.5.2