fidgit 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
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