fidgit 0.1.5 → 0.1.6

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/README.textile CHANGED
@@ -99,6 +99,7 @@ Elements can be placed inside a packer or group.
99
99
 
100
100
  * _button(text, ...)_ - Button with text and/or icon (Block handles :clicked_left_mouse_button event).
101
101
  * _color_picker(...)_ - Red, green and blue sliders and colour indicator (Block handles :changed event).
102
+ * _image_frame(image, ...)_ - Wrapper around a Gosu::Image to embed it in the GUI.
102
103
  * _label(text, ...)_ - Label with text and, optionally, an icon (No block accepted).
103
104
  * _slider(...)_ - Horizontal slider with handle (Block handles :changed event).
104
105
  * _text_area(...)_ - An multi-line element, containing editable text (Block handles :changed event).
@@ -33,6 +33,10 @@
33
33
  :border_color: ?light_gray
34
34
  :border_thickness: 2
35
35
  :shortcut_color: ?red
36
+ :padding_top: 2
37
+ :padding_right: 4
38
+ :padding_bottom: 2
39
+ :padding_left: 4
36
40
 
37
41
  :disabled:
38
42
  :background_color: ?very_dark_gray
@@ -63,7 +67,7 @@
63
67
  :padding_left: 0
64
68
 
65
69
  :Container: # < Element
66
- :nothing: nil
70
+ {}
67
71
 
68
72
  :Element:
69
73
  :align_h: :left
@@ -73,13 +77,14 @@
73
77
  :border_color: ?none
74
78
  :border_thickness: 0
75
79
  :color: ?white
76
- :font_size: 30
80
+ :font_height: 30
77
81
  :font_name: :default
78
82
  :padding_top: 2
79
83
  :padding_right: 4
80
84
  :padding_bottom: 2
81
85
  :padding_left: 4
82
86
 
87
+
83
88
  :FileBrowser: # < Composite
84
89
  :pattern: "*.*"
85
90
  :show_extension: true
@@ -96,13 +101,21 @@
96
101
  :padding_left: 0
97
102
 
98
103
  :Horizontal: # < Grid
99
- :nothing: nil
104
+ {}
100
105
 
101
106
  :HorizontalScrollBar: # < ScrollBar
102
107
  :height: ?scroll_bar_thickness
103
108
 
109
+ :ImageFrame: # <Element
110
+ :padding_top: 0
111
+ :padding_right: 0
112
+ :padding_bottom: 0
113
+ :padding_left: 0
114
+
104
115
  :Label: # < Element
105
116
  :justify: :left
117
+ :icon_position: :left
118
+
106
119
  :disabled:
107
120
  :color: ?light_gray
108
121
 
@@ -142,7 +155,7 @@
142
155
  :border_color: ?blue
143
156
 
144
157
  :ScrollArea: # < Composite
145
- :nothing: nil
158
+ {}
146
159
 
147
160
  :ScrollBar: # < Composite
148
161
  :background_color: ?none
@@ -176,16 +189,28 @@
176
189
  :focused:
177
190
  :border_color: ?green
178
191
 
192
+ :TextLine: # < Element
193
+ :justify: :left
194
+ :padding_top: 0
195
+ :padding_right: 0
196
+ :padding_bottom: 0
197
+ :padding_left: 0
198
+
179
199
  :ToggleButton: # < Button
180
200
  :toggled:
181
201
  :border_color: ?red
182
202
 
183
203
  :ToolTip: # < Label
184
204
  :background_color: ?very_dark_gray
205
+ :font_height: 20
185
206
  :border_color: ?white
207
+ :padding_top: 2
208
+ :padding_right: 4
209
+ :padding_bottom: 2
210
+ :padding_left: 4
186
211
 
187
212
  :Vertical: # < Grid
188
- :nothing: nil
213
+ {}
189
214
 
190
215
  :VerticalScrollBar: # < ScrollBar
191
216
  :width: ?scroll_bar_thickness
@@ -1,7 +1,7 @@
1
1
  require_relative 'helpers/example_window'
2
2
 
3
3
  # Change font and labels in the schema.
4
- Fidgit::Element.schema.merge_elements!(Element: { font_size: 24 }, Label: { background_color: "?dark_blue" })
4
+ Fidgit::Element.schema.merge_elements!(Element: { font_height: 24 }, Label: { background_color: "?dark_blue" })
5
5
 
6
6
  class ExampleState < Fidgit::GuiState
7
7
  ROW_BACKGROUND = Gosu::Color.rgb(0, 100, 0)
@@ -8,17 +8,28 @@ class ExampleState < Fidgit::GuiState
8
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!", shortcut: :auto) do
11
+ buttons = []
12
+
13
+ # A plain button, with some text on it.
14
+ buttons << button("Button", tip: "I'm a button; press me!", shortcut: :auto) do
12
15
  my_label.text = "Pressed the button!"
13
16
  end
14
17
 
15
- my_toggle_button = toggle_button("ToggleButton", tip: "I'm a button that toggles", shortcut: :o) do |sender, value|
18
+ # Buttons with icons in each possible positions.
19
+ [:left, :right, :top, :bottom].each do |position|
20
+ buttons << button("Icon at #{position}", icon: Gosu::Image["head_icon.png"], icon_position: position, icon_options: { factor: 2 }, tip: "I'm a button; press me!", shortcut: :auto) do
21
+ my_label.text = "Pressed the button (icon to #{position})!"
22
+ end
23
+ end
24
+
25
+ # A toggling button.
26
+ buttons << toggle_button("ToggleButton", tip: "I'm a button that toggles", shortcut: :o) do |sender, value|
16
27
  my_label.text = "Turned the toggle button #{value ? "on" : "off"}!"
17
28
  end
18
29
 
30
+ # A toggle-button that controls whether all the other buttons are enabled.
19
31
  toggle_button("Enable other two buttons", value: true) do |sender, value|
20
- my_button.enabled = value
21
- my_toggle_button.enabled = value
32
+ buttons.each {|button| button.enabled = value }
22
33
  end
23
34
  end
24
35
  end
@@ -1,7 +1,7 @@
1
1
  require_relative 'helpers/example_window'
2
2
 
3
3
 
4
- Fidgit::Element.schema.merge_elements!(Element: { font_size: 15 })
4
+ Fidgit::Element.schema.merge_elements!(Element: { font_height: 15 })
5
5
 
6
6
  class ExampleState < Fidgit::GuiState
7
7
  def initialize
@@ -12,14 +12,14 @@ class ExampleState < Fidgit::GuiState
12
12
  label "Grid with #{FIXED_NUM} columns"
13
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
- label "Cell #{i}", font_size: rand(15) + 15, border_color: BORDER_COLOR, border_thickness: 1
15
+ label "Cell #{i}", font_height: 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
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
- label "Cell #{i}", font_size: rand(15) + 15, border_color: BORDER_COLOR, border_thickness: 1
22
+ label "Cell #{i}", font_height: rand(15) + 15, border_color: BORDER_COLOR, border_thickness: 1
23
23
  end
24
24
  end
25
25
  end
@@ -27,6 +27,8 @@ module Fidgit
27
27
 
28
28
  super(text, options)
29
29
 
30
+ self.text = text # Force shortcut to be written out properly.
31
+
30
32
  update_colors
31
33
  end
32
34
 
@@ -86,12 +88,14 @@ module Fidgit
86
88
  default(:background_color)
87
89
  end
88
90
 
89
- @color = if enabled?
91
+ self.color = if enabled?
90
92
  default(:color)
91
93
  else
92
94
  default(:disabled, :color)
93
95
  end
94
96
 
97
+ @icon.enabled = enabled? if @icon
98
+
95
99
  nil
96
100
  end
97
101
 
@@ -4,6 +4,8 @@ module Fidgit
4
4
  class ComboBox < Button
5
5
  extend Forwardable
6
6
 
7
+ ARROW_IMAGE = "combo_arrow.png"
8
+
7
9
  def_delegators :@menu, :each
8
10
 
9
11
  event :changed
@@ -50,12 +52,12 @@ class ComboBox < Button
50
52
  end
51
53
  end
52
54
 
53
- @@arrow ||= Gosu::Image["combo_arrow.png"]
55
+ @@arrow ||= Gosu::Image[ARROW_IMAGE]
54
56
 
55
57
  super('', options)
56
58
 
57
- rect.height = [height, font_size + padding_top + padding_bottom].max
58
- rect.width = [width, font_size * 4 + padding_left + padding_right].max
59
+ rect.height = [height, font.height + padding_top + padding_bottom].max
60
+ rect.width = [width, font.height * 4 + padding_left + padding_right].max
59
61
  end
60
62
 
61
63
  def item(text, value, options = {}, &block)
@@ -67,6 +69,8 @@ class ComboBox < Button
67
69
  self.icon = item.icon
68
70
  end
69
71
 
72
+ recalc
73
+
70
74
  item
71
75
  end
72
76
 
@@ -93,7 +97,9 @@ class ComboBox < Button
93
97
  protected
94
98
  def layout
95
99
  super
96
- rect.width += height # Allow size for the arrow.
100
+
101
+ # Max width of all items + allow size for the arrow.
102
+ rect.width = [@menu.width + height, min_width].max
97
103
 
98
104
  nil
99
105
  end
@@ -80,6 +80,11 @@ module Fidgit
80
80
  Group.new({parent: self}.merge!(options), &block)
81
81
  end
82
82
 
83
+ # Create an icon.
84
+ def image_frame(image, options = {}, &block)
85
+ ImageFrame.new(image, {parent: self}.merge!(options), &block)
86
+ end
87
+
83
88
  # Create a label within the container.
84
89
  def label(text, options = {})
85
90
  Label.new(text, {parent: self}.merge!(options))
@@ -165,7 +170,7 @@ module Fidgit
165
170
 
166
171
  protected
167
172
  def draw_foreground
168
- each { |c| c.draw }
173
+ @children.each {|c| c.draw }
169
174
 
170
175
  font.draw self.class.name, x, y, z if Fidgit.debug_mode?
171
176
 
@@ -177,5 +182,28 @@ module Fidgit
177
182
  def post_init_block(&block)
178
183
  with(&block)
179
184
  end
185
+
186
+ public
187
+ def to_s
188
+ "#{super} [#{@children.size} #{@children.size == 1 ? 'child' : 'children'}]"
189
+ end
190
+
191
+ public
192
+ def write_tree(indent = "", index = 0)
193
+ puts self
194
+
195
+ indent = indent + " "
196
+
197
+ @children.each.with_index do |element, i|
198
+ print "#{indent}#{i}: "
199
+
200
+ case element
201
+ when Container
202
+ element.write_tree(indent)
203
+ else
204
+ puts element
205
+ end
206
+ end
207
+ end
180
208
  end
181
209
  end
@@ -37,7 +37,8 @@ module Fidgit
37
37
  VALID_ALIGN_H = [:left, :center, :right, :fill]
38
38
  VALID_ALIGN_V = [:top, :center, :bottom, :fill]
39
39
 
40
- attr_reader :z, :tip, :font_size, :padding_top, :padding_right, :padding_bottom, :padding_left, :align_h, :align_v, :parent, :border_thickness
40
+ attr_reader :z, :tip, :padding_top, :padding_right, :padding_bottom, :padding_left,
41
+ :align_h, :align_v, :parent, :border_thickness, :font
41
42
 
42
43
  attr_accessor :background_color
43
44
 
@@ -76,8 +77,6 @@ module Fidgit
76
77
  @enabled = value
77
78
  end
78
79
 
79
- def font; @font ||= Gosu::Font[@font_name, @font_size]; end
80
-
81
80
  def rect; @rect; end; protected :rect
82
81
 
83
82
  def self.schema; @@schema ||= Schema.new(YAML.load(File.read(DEFAULT_SCHEMA_FILE)));; end
@@ -116,7 +115,7 @@ module Fidgit
116
115
  #
117
116
  # @option options [String] :tip ('') Tool-tip text
118
117
  # @option options [String, :default] :font_name (:default, which resolves as the default Gosu font)
119
- # @option options [String] :font_size (30)
118
+ # @option options [String] :font_height (30)
120
119
  #
121
120
  # @option options [Gosu::Color] :background_color (transparent)
122
121
  # @option options [Gosu::Color] :border_color (transparent)
@@ -143,7 +142,7 @@ module Fidgit
143
142
  z: 0,
144
143
  tip: '',
145
144
  font_name: default(:font_name),
146
- font_size: default(:font_size),
145
+ font_height: default(:font_height),
147
146
  background_color: default(:background_color),
148
147
  border_color: default(:border_color),
149
148
  border_thickness: default(:border_thickness),
@@ -181,13 +180,13 @@ module Fidgit
181
180
 
182
181
  @z = options[:z]
183
182
  @tip = options[:tip].dup
184
- @font_name = if options[:font_name].nil? or options[:font_name] == :default
183
+ font_name = if options[:font_name].nil? or options[:font_name] == :default
185
184
  Gosu::default_font_name
186
185
  else
187
186
  options[:font_name].dup
188
187
  end
189
188
 
190
- @font_size = options[:font_size]
189
+ @font = Gosu::Font[font_name, options[:font_height]]
191
190
 
192
191
  @rect = Chingu::Rect.new(options[:x], options[:y], options[:width] || 0, options[:height] || 0)
193
192
  end
@@ -276,5 +275,10 @@ module Fidgit
276
275
  def post_init_block(&block)
277
276
  raise ArgumentError, "does not accept a block"
278
277
  end
278
+
279
+ public
280
+ def to_s
281
+ "#{self.class} (#{x}, #{y}) #{width}x#{height}"
282
+ end
279
283
  end
280
284
  end
@@ -70,7 +70,7 @@ module Fidgit
70
70
  end
71
71
  end
72
72
 
73
- @file_name_text = text_area(text: options[:file_name], max_height: font_size * 1.5, width: options[:width], border_thickness: 1)
73
+ @file_name_text = text_area(text: options[:file_name], max_height: font.height * 1.5, width: options[:width], border_thickness: 1)
74
74
 
75
75
  create_nav_buttons
76
76
 
@@ -4,8 +4,12 @@ module Fidgit
4
4
  # A vertically aligned element packing container.
5
5
 
6
6
  class Grid < Packer
7
+ # @return [Symbol]
8
+ attr_reader :type
9
+
7
10
  # @return [Integer]
8
11
  attr_reader :num_rows
12
+
9
13
  # @return [Integer]
10
14
  attr_reader :num_columns
11
15
 
@@ -82,11 +86,11 @@ module Fidgit
82
86
  @rows.each_with_index do |row, row_num|
83
87
  row.each_with_index do |element, column_num|
84
88
  fills = (element.align_h == :fill)
85
- @widths[column_num] = [fills ? 0 : element.outer_width, @widths[column_num]].max
89
+ @widths[column_num] = [fills ? element.min_width : element.outer_width, @widths[column_num]].max
86
90
  filled_columns.push fills
87
91
 
88
92
  fills = (element.align_v == :fill)
89
- @heights[row_num] = [fills ? 0 : element.outer_height, @heights[row_num]].max
93
+ @heights[row_num] = [fills ? element.min_width : element.outer_height, @heights[row_num]].max
90
94
  filled_rows.push fills
91
95
  end
92
96
  end
@@ -0,0 +1,65 @@
1
+ module Fidgit
2
+ # A wrapper around a Gosu::Image to show it in the GUI.
3
+ class ImageFrame < Element
4
+ ENABLED_COLOR = Gosu::Color::WHITE
5
+ DISABLED_COLOR = Gosu::Color.rgb(150, 150, 150)
6
+
7
+ attr_reader :image, :factor_x, :factor_y
8
+
9
+ def thumbnail?; @thumbnail; end
10
+
11
+ # @param (see Element#initialize)
12
+ # @param [Gosu::Image] image Gosu image to display.
13
+ #
14
+ # @option (see Element#initialize)
15
+ # @option options [Boolean] :thumbnail (false) Is the image expanded to be square?
16
+ def initialize(image, options = {})
17
+ options = {
18
+ thumbnail: false,
19
+ factor: 1,
20
+ }.merge! options
21
+
22
+ @thumbnail = options[:thumbnail]
23
+ @factor_x = options[:factor_x] || options[:factor]
24
+ @factor_y = options[:factor_y] || options[:factor]
25
+
26
+ super(options)
27
+
28
+ self.image = image
29
+ end
30
+
31
+ def image=(image)
32
+ @image = image
33
+
34
+ recalc
35
+
36
+ image
37
+ end
38
+
39
+
40
+ def draw_foreground
41
+ @image.draw(x + padding_left, y + padding_top, z, factor_x, factor_y, enabled? ? ENABLED_COLOR : DISABLED_COLOR) if @image
42
+ end
43
+
44
+ protected
45
+ def layout
46
+ if @image
47
+ if @thumbnail
48
+ size = [@image.width, @image.height].max
49
+ rect.width = size * @factor_x
50
+ rect.height = size * @factor_y
51
+ else
52
+ rect.width = @image.width * @factor_x
53
+ rect.height = @image.height * @factor_y
54
+ end
55
+ else
56
+ rect.width = rect.height = 0
57
+ end
58
+
59
+ rect.width += padding_left + padding_right
60
+ rect.height += padding_top + padding_bottom
61
+
62
+ nil
63
+ end
64
+ end
65
+ end
@@ -1,29 +1,58 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Fidgit
4
- class Label < Element
5
- attr_accessor :color, :background_color, :border_color
6
- attr_reader :text, :icon
4
+ class Label < Composite
5
+ ICON_POSITIONS = [:top, :bottom, :left, :right]
7
6
 
8
- VALID_JUSTIFICATION = [:left, :right, :center]
7
+ attr_reader :icon_position
9
8
 
10
- def text=(value)
11
- @text = value
12
- recalc
13
- nil
9
+ attr_accessor :background_color, :border_color
10
+
11
+ def_delegators :@text, :text, :color, :font, :color=, :text=
12
+
13
+ def icon; @icon ? @icon.image : nil; end
14
+
15
+ def hit_element(x, y)
16
+ # The sub-elements should never get events.
17
+ hit?(x, y) ? self : nil
14
18
  end
15
19
 
16
- def icon=(value)
17
- @icon = value
18
- recalc
19
- nil
20
+ def icon=(icon)
21
+ raise ArgumentError.new("Icon must be a Gosu::Image") unless icon.is_a? Gosu::Image or icon.nil?
22
+
23
+ @contents.remove(@icon) if @icon.image
24
+ @icon.image = icon
25
+ position = [:left, :top].include?(icon_position) ? 0 : 1
26
+ @contents.insert(position, @icon) if @icon.image
27
+
28
+ icon
29
+ end
30
+
31
+ # Set the position of the icon, respective to the text.
32
+ def icon_position=(position)
33
+ raise ArgumentError.new("icon_position must be one of #{ICON_POSITIONS}") unless ICON_POSITIONS.include? position
34
+
35
+ @icon_position = position
36
+
37
+ case @icon_position
38
+ when :top, :bottom
39
+ @contents.instance_variable_set :@type, :fixed_columns
40
+ @contents.instance_variable_set :@num_columns, 1
41
+ when :left, :right
42
+ @contents.instance_variable_set :@type, :fixed_rows
43
+ @contents.instance_variable_set :@num_rows, 1
44
+ end
45
+
46
+ self.icon = @icon.image if @icon.image # Force the icon into the correct position.
47
+
48
+ position
20
49
  end
21
50
 
22
51
  # @param (see Element#initialize)
23
52
  # @param [String] text The string to display in the label.
24
53
  #
25
54
  # @option (see Element#initialize)
26
- # @option options [Fidgit::Thumbnail, Gosu::Image, nil] :icon (nil)
55
+ # @option options [Gosu::Image, nil] :icon (nil)
27
56
  # @option options [:left, :right, :center] :justify (:left) Text justification.
28
57
  def initialize(text, options = {})
29
58
  options = {
@@ -31,74 +60,26 @@ module Fidgit
31
60
  justify: default(:justify),
32
61
  background_color: default(:background_color),
33
62
  border_color: default(:border_color),
63
+ icon_options: {},
64
+ font_name: default(:font_name),
65
+ font_height: default(:font_height),
66
+ icon_position: default(:icon_position),
34
67
  }.merge! options
35
68
 
36
- @text = text.dup
37
- @icon = options[:icon]
38
- @color = options[:color].dup
39
-
40
- raise "Justification must be one of #{VALID_JUSTIFICATION.inspect}" unless VALID_JUSTIFICATION.include? options[:justify]
41
- @justify = options[:justify]
42
-
43
69
  super(options)
44
70
 
45
- self.text = text # Forces stuff that manipulates text to work.
46
- end
47
-
48
- def draw_foreground
49
- current_x = x + padding_left
50
- if @icon
51
- @icon.draw(current_x, y + padding_top, z)
52
- current_x += @icon.width + padding_left
53
- end
54
-
55
- unless @text.empty?
56
- case @justify
57
- when :left
58
- rel_x = 0.0
59
- center_x = current_x
60
-
61
- when :right
62
- rel_x = 1.0
63
- center_x = x + rect.width - padding_right
64
-
65
- when :center
66
- rel_x = 0.5
67
- center_x = (current_x + x + rect.width - padding_right) / 2.0
68
- end
69
-
70
- # Make text centered alongside the icon
71
- # TODO: Probably should have this as an option.
72
- center_y = y + padding_top + ((y + height - padding_bottom) - (y + padding_top)) / 2.0
73
-
74
- font.draw_rel(@text, center_x, center_y, z, rel_x, 0.5, 1, 1, @color)
71
+ # Bit of a fudge since font info is managed circularly here!
72
+ # By using a grid, we'll be able to turn it around easily (in theory).
73
+ @contents = grid num_rows: 1, padding: 0, spacing_h: spacing_h, spacing_v: spacing_v, width: options[:width], height: options[:height], z: z do |contents|
74
+ @text = TextLine.new(text, parent: contents, justify: options[:justify], color: options[:color], padding: 0, z: z,
75
+ font_name: options[:font_name], font_height: options[:font_height], align_h: :fill, align_v: :center)
75
76
  end
76
77
 
77
- nil
78
- end
79
-
80
- protected
81
- def layout
82
- if @icon
83
- if @text.empty?
84
- rect.width = [padding_left + @icon.width + padding_right, min_width].max
85
- rect.height = [padding_top + @icon.height + padding_bottom, min_height].max
86
- else
87
- # Todo: Use padding_h inside here? Probably by making this a Composite.
88
- rect.width = [padding_left + @icon.width + [padding_left + padding_right].max + font.text_width(@text) + padding_right, min_width].max
89
- rect.height = [padding_top + [@icon.height, font_size].max + padding_bottom, min_height].max
90
- end
91
- else
92
- if @text.empty?
93
- rect.width = [padding_left + padding_right, min_width].max
94
- rect.height = [padding_top + padding_bottom, min_height].max
95
- else
96
- rect.width = [padding_left + font.text_width(@text) + padding_right, min_width].max
97
- rect.height = [padding_top + font_size + padding_bottom, min_height].max
98
- end
99
- end
78
+ # Create an image frame, but don't show it unless there is an image in it.
79
+ @icon = ImageFrame.new(nil, options[:icon_options].merge(z: z, align: :center))
80
+ @icon.image = options[:icon]
100
81
 
101
- nil
82
+ self.icon_position = options[:icon_position]
102
83
  end
103
84
  end
104
85
  end
@@ -18,7 +18,6 @@ module Fidgit
18
18
  def height=(value); ; end
19
19
 
20
20
  def add(element)
21
- raise "MainPacker can only contain one packing element" unless empty?
22
21
  raise "MainPacker can only contain packing elements" unless element.is_a? Packer
23
22
  super(element)
24
23
  end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Fidgit
4
2
  class MenuPane < Composite
5
3
  # An item within the menu.
@@ -26,8 +24,9 @@ module Fidgit
26
24
 
27
25
  def draw_foreground
28
26
  super
27
+
29
28
  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)
29
+ font.draw_rel("#{@shortcut_text}", rect.right - padding_right, y + ((height - font.height) / 2).floor, z, 1, 0, 1, 1, color)
31
30
  end
32
31
 
33
32
  nil
@@ -36,7 +35,10 @@ module Fidgit
36
35
  protected
37
36
  def layout
38
37
  super
39
- rect.width += font.text_width(" #{@shortcut_text}") unless @shortcut_text.empty?
38
+
39
+ # Ignore layout request when asked before TextLine has been created.
40
+ rect.width += font.text_width(" #{@shortcut_text}") unless @shortcut_text.empty? or @text.nil?
41
+
40
42
  nil
41
43
  end
42
44
  end
@@ -56,8 +58,6 @@ module Fidgit
56
58
  end
57
59
  end
58
60
 
59
- # -------------------
60
-
61
61
  extend Forwardable
62
62
 
63
63
  def_delegators :@items, :each, :clear, :size, :[]
@@ -110,8 +110,11 @@ module Fidgit
110
110
  end
111
111
 
112
112
  def item(text, value, options = {}, &block)
113
- options[:z] = z
114
- item = Item.new(text, value, { parent: @items }.merge!(options), &block)
113
+ options = options.merge({
114
+ parent: @items,
115
+ z: z,
116
+ })
117
+ item = Item.new(text, value, options, &block)
115
118
 
116
119
  item.subscribe :left_mouse_button, method(:item_selected)
117
120
  item.subscribe :right_mouse_button, method(:item_selected)
@@ -146,7 +149,7 @@ module Fidgit
146
149
  @items.y = y + padding_top
147
150
 
148
151
  # Ensure that all items are of the same width.
149
- max_width = @items.each.to_a.map {|c| c.width }.max || 0
152
+ max_width = @items.map(&:width).max || 0
150
153
  @items.each {|c| c.rect.width = max_width }
151
154
 
152
155
  @items.recalc # Move all the items inside the packer to correct ones.
@@ -136,14 +136,14 @@ module Fidgit
136
136
 
137
137
  super(options)
138
138
 
139
- min_height = padding_left + padding_right + font_size
139
+ min_height = padding_left + padding_right + font.height
140
140
  if options[:height]
141
141
  @max_height = @min_height = [options[:height], min_height].max
142
142
  else
143
143
  @max_height = [options[:max_height], min_height].max
144
144
  @min_height = options[:min_height] ? [options[:min_height], min_height].max : min_height
145
145
  end
146
- rect.height = [padding_left + padding_right + font_size, @min_height].max
146
+ rect.height = [padding_left + padding_right + font.height, @min_height].max
147
147
 
148
148
  subscribe :left_mouse_button, method(:click_in_text)
149
149
  subscribe :right_mouse_button, method(:click_in_text)
@@ -157,7 +157,7 @@ module Fidgit
157
157
  mouse_x, mouse_y = x - (self.x + padding_left), y - (self.y + padding_top)
158
158
  @char_widths.each_with_index do |width, i|
159
159
  char_x, char_y = @caret_positions[i]
160
- if mouse_x.between?(char_x, char_x + width) and mouse_y.between?(char_y, char_y + font_size)
160
+ if mouse_x.between?(char_x, char_x + width) and mouse_y.between?(char_y, char_y + font.height)
161
161
  self.caret_position = @text_input.selection_start = i
162
162
  break
163
163
  end
@@ -210,7 +210,7 @@ module Fidgit
210
210
  char_x, char_y = @caret_positions[pos]
211
211
  char_width = @char_widths[pos]
212
212
  left, top = x + padding_left + char_x, y + padding_top + char_y
213
- draw_rect left, top, char_width, font_size, z, @selection_color
213
+ draw_rect left, top, char_width, font.height, z, @selection_color
214
214
  end
215
215
 
216
216
  # Draw text.
@@ -222,14 +222,14 @@ module Fidgit
222
222
  if focused? and ((Gosu::milliseconds / @caret_period) % 2 == 0)
223
223
  caret_x, caret_y = @caret_positions[caret_position]
224
224
  left, top = x + padding_left + caret_x, y + padding_top + caret_y
225
- draw_rect left, top, 1, font_size, z, @caret_color
225
+ draw_rect left, top, 1, font.height, z, @caret_color
226
226
  end
227
227
  end
228
228
 
229
229
  # y position of the
230
230
  protected
231
231
  def y_at_line(lines_number)
232
- lines_number * (font_size + line_spacing)
232
+ lines_number * (font.height + line_spacing)
233
233
  end
234
234
 
235
235
  protected
@@ -0,0 +1,92 @@
1
+ module Fidgit
2
+ # Used internally by the label.
3
+ class TextLine < Element
4
+ VALID_JUSTIFICATION = [:left, :right, :center]
5
+
6
+ attr_reader :color, :justify
7
+
8
+ def color=(color)
9
+ raise ArgumentError.new("Text must be a Gosu::Color") unless color.is_a? Gosu::Color
10
+
11
+ @color = color.dup
12
+
13
+ color
14
+ end
15
+
16
+ def text; @text.dup; end
17
+
18
+ def text=(text)
19
+ raise ArgumentError.new("Text must be a String") unless text.respond_to? :to_s
20
+
21
+ @text = text.to_s.dup
22
+
23
+ recalc
24
+ text
25
+ end
26
+
27
+ def justify=(justify)
28
+ raise ArgumentError.new("Justify must be one of #{VALID_JUSTIFICATION.inspect}") unless VALID_JUSTIFICATION.include? justify
29
+ @justify = justify
30
+ end
31
+
32
+ # @param (see Element#initialize)
33
+ # @param [String] text The string to display in the line of text.
34
+ #
35
+ # @option (see Element#initialize)
36
+ # @option options [:left, :right, :center] :justify (:left) Text justification.
37
+ def initialize(text, options = {})
38
+ options = {
39
+ color: default(:color),
40
+ justify: default(:justify),
41
+ }.merge! options
42
+
43
+ super(options)
44
+
45
+ self.justify = options[:justify]
46
+ self.color = options[:color]
47
+ self.text = text
48
+ end
49
+
50
+ def draw_foreground
51
+ case @justify
52
+ when :left
53
+ rel_x = 0.0
54
+ draw_x = x + padding_left
55
+
56
+ when :right
57
+ rel_x = 1.0
58
+ draw_x = x + rect.width - padding_right
59
+
60
+ when :center
61
+ rel_x = 0.5
62
+ draw_x = (x + padding_left) + (rect.width - padding_right - padding_left) / 2.0
63
+ end
64
+
65
+ font.draw_rel(@text, draw_x, y + padding_top, z, rel_x, 0, 1, 1, color)
66
+ end
67
+
68
+ def min_width
69
+ if @text.empty?
70
+ [padding_left + padding_right, super].max
71
+ else
72
+ [padding_left + font.text_width(@text) + padding_right, super].max
73
+ end
74
+ end
75
+
76
+ protected
77
+ def layout
78
+ rect.width = [min_width, max_width].min
79
+
80
+ if @text.empty?
81
+ rect.height = [[padding_top + padding_bottom, min_height].max, max_height].min
82
+ else
83
+ rect.height = [[padding_top + font.height + padding_bottom, min_height].max, max_height].min
84
+ end
85
+ end
86
+
87
+ public
88
+ def to_s
89
+ "#{super} '#{@text}'"
90
+ end
91
+ end
92
+ end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Fidgit
4
- class ToolTip < Label
4
+ class ToolTip < TextLine
5
5
  def x=(value); super(value); recalc; value; end
6
6
  def y=(value); super(value); recalc; value; end
7
7
  def hit?(x, y); false; end
@@ -143,6 +143,14 @@ module Fidgit
143
143
  super
144
144
  end
145
145
 
146
+ def write_tree
147
+ puts "=== #{self.class} ==="
148
+ indent = " "
149
+ @container.write_tree(indent)
150
+ @menu.write_tree(indent) if @menu
151
+ @tool_tip.write_tree(indent) if @tool_tip
152
+ end
153
+
146
154
  def draw
147
155
  @container.draw
148
156
  @menu.draw if @menu
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Fidgit
4
- VERSION = '0.1.5'
4
+ VERSION = '0.1.6'
5
5
  end
@@ -0,0 +1,69 @@
1
+ require_relative 'helpers/helper'
2
+ require_relative 'helpers/tex_play_helper'
3
+
4
+ require 'fidgit'
5
+
6
+ def check_thumbnail_is_square
7
+ {square: [10, 10], tall: [5, 12], wide: [6, 5]}.each_pair do |type, dimensions|
8
+ context "with a #{type} image" do
9
+ it "should be square and just large enough to contain the image" do
10
+ subject = described_class.new(Gosu::Image.create(*dimensions), thumbnail: true)
11
+ subject.width.should equal dimensions.max
12
+ subject.height.should equal dimensions.max
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ def check_image_dimensions
19
+ {square: [10, 10], tall: [5, 12], wide: [6, 5]}.each_pair do |type, dimensions|
20
+ context "with a #{type} image" do
21
+ it "should be just large enough to contain the image" do
22
+ subject = described_class.new(Gosu::Image.create(*dimensions))
23
+ subject.width.should equal dimensions.first
24
+ subject.height.should equal dimensions.last
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ module Fidgit
31
+ describe ImageFrame do
32
+ before :all do
33
+ $window = Chingu::Window.new(100, 100, false) unless $window
34
+ end
35
+
36
+ before :each do
37
+ @image = Gosu::Image.create(10, 10)
38
+ end
39
+
40
+ subject { described_class.new(@image) }
41
+
42
+ describe '#image' do
43
+ it "should have the image set" do
44
+ subject.image.should be @image
45
+ end
46
+ end
47
+
48
+ describe '#width and #height' do
49
+ check_image_dimensions
50
+ end
51
+
52
+ describe "Thumbnails" do
53
+ subject { described_class.new(@image, thumbnail: true) }
54
+
55
+ describe '#image=' do
56
+ it "should update the height and width" do
57
+ image = Gosu::Image.create(8, 2)
58
+ subject.image = image
59
+ subject.height.should equal 8
60
+ subject.width.should equal 8
61
+ end
62
+ end
63
+
64
+ describe '#width and #height' do
65
+ check_thumbnail_is_square
66
+ end
67
+ end
68
+ end
69
+ end
@@ -2,21 +2,9 @@ require_relative "helpers/helper"
2
2
 
3
3
  include Fidgit
4
4
 
5
-
6
-
7
5
  describe Label do
8
- before :each do
9
- Chingu::Window.new(10, 10, false)
10
- end
11
-
12
- after :each do
13
- $window.close
14
- end
15
-
16
- describe "#intialize" do
17
- it "should not accept a block" do
18
- ->{ Label.new( "Hello world!") { } }.should raise_error ArgumentError
19
- end
6
+ before :all do
7
+ $window = Chingu::Window.new(100, 100, false) unless $window
20
8
  end
21
9
 
22
10
  context "with default parameters" do
@@ -42,7 +30,7 @@ describe Label do
42
30
  subject.should be_enabled
43
31
  end
44
32
 
45
- it "should not have an icon" do
33
+ it "should not have an image" do
46
34
  subject.icon.should be_nil
47
35
  end
48
36
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fidgit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-06-15 00:00:00.000000000Z
12
+ date: 2011-06-17 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: gosu
16
- requirement: &23136600 !ruby/object:Gem::Requirement
16
+ requirement: &22487064 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.7.32
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *23136600
24
+ version_requirements: *22487064
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: chingu
27
- requirement: &23136228 !ruby/object:Gem::Requirement
27
+ requirement: &22486788 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.9rc5
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *23136228
35
+ version_requirements: *22486788
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: clipboard
38
- requirement: &23135832 !ruby/object:Gem::Requirement
38
+ requirement: &22486512 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.9.8
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *23135832
46
+ version_requirements: *22486512
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: ffi
49
- requirement: &23135436 !ruby/object:Gem::Requirement
49
+ requirement: &22486236 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.0.9
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *23135436
57
+ version_requirements: *22486236
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rspec
60
- requirement: &23135088 !ruby/object:Gem::Requirement
60
+ requirement: &22485960 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 2.1.0
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *23135088
68
+ version_requirements: *22485960
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: texplay
71
- requirement: &23134752 !ruby/object:Gem::Requirement
71
+ requirement: &22485684 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: 0.3.5
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *23134752
79
+ version_requirements: *22485684
80
80
  description: Fidgit is a GUI library built on Gosu/Chingu
81
81
  email:
82
82
  - bil.bagpuss@gmail.com
@@ -126,6 +126,7 @@ files:
126
126
  - lib/fidgit/elements/grid.rb
127
127
  - lib/fidgit/elements/group.rb
128
128
  - lib/fidgit/elements/horizontal.rb
129
+ - lib/fidgit/elements/image_frame.rb
129
130
  - lib/fidgit/elements/label.rb
130
131
  - lib/fidgit/elements/list.rb
131
132
  - lib/fidgit/elements/main_packer.rb
@@ -137,6 +138,7 @@ files:
137
138
  - lib/fidgit/elements/scroll_window.rb
138
139
  - lib/fidgit/elements/slider.rb
139
140
  - lib/fidgit/elements/text_area.rb
141
+ - lib/fidgit/elements/text_line.rb
140
142
  - lib/fidgit/elements/toggle_button.rb
141
143
  - lib/fidgit/elements/tool_tip.rb
142
144
  - lib/fidgit/elements/vertical.rb
@@ -152,7 +154,6 @@ files:
152
154
  - lib/fidgit/states/file_dialog.rb
153
155
  - lib/fidgit/states/gui_state.rb
154
156
  - lib/fidgit/states/message_dialog.rb
155
- - lib/fidgit/thumbnail.rb
156
157
  - lib/fidgit/version.rb
157
158
  - lib/fidgit/window.rb
158
159
  - media/images/arrow.png
@@ -161,17 +162,17 @@ files:
161
162
  - media/images/file_file.png
162
163
  - media/images/pixel.png
163
164
  - spec/fidgit/elements/helpers/helper.rb
165
+ - spec/fidgit/elements/helpers/tex_play_helper.rb
166
+ - spec/fidgit/elements/image_frame_spec.rb
164
167
  - spec/fidgit/elements/label_spec.rb
165
168
  - spec/fidgit/event_spec.rb
166
169
  - spec/fidgit/gosu_ext/color_spec.rb
167
170
  - spec/fidgit/gosu_ext/helpers/helper.rb
168
171
  - spec/fidgit/helpers/helper.rb
169
- - spec/fidgit/helpers/tex_play_helper.rb
170
172
  - spec/fidgit/history_spec.rb
171
173
  - spec/fidgit/redirector_spec.rb
172
174
  - spec/fidgit/schema_spec.rb
173
175
  - spec/fidgit/schema_test.yml
174
- - spec/fidgit/thumbnail_spec.rb
175
176
  homepage: http://github.com/Spooner/fidgit/
176
177
  licenses: []
177
178
  post_install_message:
@@ -1,29 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Fidgit
4
- # Wrapper for Gosu::Image that always pads the image out to being square.
5
- class Thumbnail
6
- DEFAULT_COLOR = Gosu::Color.rgb(255, 255, 255)
7
-
8
- attr_reader :image, :height, :width
9
-
10
- def image=(value)
11
- @image = value
12
- @height = [@image.width, @image.height].max
13
- @width = [@image.width, @image.height].max
14
-
15
- value
16
- end
17
-
18
- def initialize(image)
19
- raise ArgumentError, "image must be a Gosu::Image" unless image.is_a? Gosu::Image
20
- self.image = image
21
- end
22
-
23
- def draw(x, y, z_order, scale_x = 1, scale_y = 1, color = DEFAULT_COLOR, mode = :default)
24
- @image.draw x + (@width - @image.width) * scale_x / 2, y + (@height - @image.height) * scale_y / 2, z_order, scale_x, scale_y, color, mode
25
-
26
- nil
27
- end
28
- end
29
- end
@@ -1,50 +0,0 @@
1
- require_relative 'helpers/helper'
2
- require_relative 'helpers/tex_play_helper'
3
-
4
- require 'fidgit'
5
-
6
- def check_thumbnail_is_square(dimension)
7
- {square: [10, 10], tall: [5, 12], wide: [6, 5]}.each_pair do |type, dimensions|
8
- context "with a #{type} image" do
9
- it "should be square and just large enough to contain the image" do
10
- subject = described_class.new(Image.create(*dimensions))
11
- subject.width.should equal dimensions.max
12
- subject.height.should equal dimensions.max
13
- end
14
- end
15
- end
16
- end
17
-
18
- module Fidgit
19
- describe Thumbnail do
20
- before :all do
21
- $window = Chingu::Window.new(100, 100, false)
22
- @image = Image.create(10, 10)
23
- end
24
-
25
- subject { Thumbnail.new(@image) }
26
-
27
- describe '#image' do
28
- it "should have the image set" do
29
- subject.image.should be @image
30
- end
31
- end
32
-
33
- describe '#image=' do
34
- it "should update the height and width" do
35
- image = Image.create(8, 2)
36
- subject.image = image
37
- subject.height.should equal 8
38
- subject.width.should equal 8
39
- end
40
- end
41
-
42
- describe '#width' do
43
- check_thumbnail_is_square :width
44
- end
45
-
46
- describe '#height' do
47
- check_thumbnail_is_square :height
48
- end
49
- end
50
- end