shoes-core 4.0.0.pre3 → 4.0.0.pre4

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.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/bin/shoes +1 -1
  3. data/bin/shoes-picker +5 -1
  4. data/bin/shoes-stub +1 -1
  5. data/ext/install/shoes.bat +2 -0
  6. data/lib/rubygems_plugin.rb +2 -2
  7. data/lib/shoes/app.rb +18 -19
  8. data/lib/shoes/arc.rb +8 -8
  9. data/lib/shoes/background.rb +4 -8
  10. data/lib/shoes/border.rb +4 -8
  11. data/lib/shoes/builtin_methods.rb +2 -2
  12. data/lib/shoes/button.rb +2 -9
  13. data/lib/shoes/check_button.rb +0 -12
  14. data/lib/shoes/color.rb +29 -34
  15. data/lib/shoes/common/background_element.rb +4 -0
  16. data/lib/shoes/common/fill.rb +9 -0
  17. data/lib/shoes/common/initialization.rb +59 -0
  18. data/lib/shoes/common/inspect.rb +20 -2
  19. data/lib/shoes/common/rotate.rb +10 -0
  20. data/lib/shoes/common/stroke.rb +9 -0
  21. data/lib/shoes/common/style.rb +21 -7
  22. data/lib/shoes/common/style_normalizer.rb +1 -3
  23. data/lib/shoes/common/ui_element.rb +10 -0
  24. data/lib/shoes/common/visibility.rb +4 -4
  25. data/lib/shoes/configuration.rb +4 -2
  26. data/lib/shoes/core/version.rb +1 -1
  27. data/lib/shoes/dialog.rb +2 -2
  28. data/lib/shoes/dimension.rb +78 -68
  29. data/lib/shoes/dimensions.rb +22 -10
  30. data/lib/shoes/download.rb +26 -10
  31. data/lib/shoes/dsl.rb +32 -51
  32. data/lib/shoes/gradient.rb +6 -13
  33. data/lib/shoes/image.rb +4 -9
  34. data/lib/shoes/input_box.rb +6 -9
  35. data/lib/shoes/internal_app.rb +16 -36
  36. data/lib/shoes/line.rb +29 -10
  37. data/lib/shoes/link.rb +13 -2
  38. data/lib/shoes/list_box.rb +33 -11
  39. data/lib/shoes/logger.rb +12 -13
  40. data/lib/shoes/mock/arc.rb +2 -0
  41. data/lib/shoes/mock/common_methods.rb +9 -0
  42. data/lib/shoes/mock/shape.rb +1 -1
  43. data/lib/shoes/mock/slot.rb +1 -0
  44. data/lib/shoes/oval.rb +13 -8
  45. data/lib/shoes/packager.rb +7 -1
  46. data/lib/shoes/point.rb +26 -3
  47. data/lib/shoes/progress.rb +6 -8
  48. data/lib/shoes/rect.rb +14 -10
  49. data/lib/shoes/shape.rb +28 -14
  50. data/lib/shoes/slot.rb +33 -24
  51. data/lib/shoes/slot_contents.rb +4 -4
  52. data/lib/shoes/star.rb +7 -16
  53. data/lib/shoes/text.rb +5 -3
  54. data/lib/shoes/text_block.rb +17 -16
  55. data/lib/shoes/text_block_dimensions.rb +1 -1
  56. data/lib/shoes/ui/cli.rb +12 -3
  57. data/lib/shoes/ui/picker.rb +64 -19
  58. data/lib/shoes/version.rb +1 -1
  59. data/shoes-core.gemspec +2 -2
  60. data/spec/shoes/animation_spec.rb +1 -1
  61. data/spec/shoes/app_spec.rb +4 -23
  62. data/spec/shoes/color_spec.rb +16 -1
  63. data/spec/shoes/common/style_normalizer_spec.rb +3 -3
  64. data/spec/shoes/common/style_spec.rb +42 -5
  65. data/spec/shoes/dimension_spec.rb +5 -7
  66. data/spec/shoes/dimensions_spec.rb +7 -7
  67. data/spec/shoes/download_spec.rb +49 -8
  68. data/spec/shoes/flow_spec.rb +1 -1
  69. data/spec/shoes/helpers/fake_element.rb +7 -0
  70. data/spec/shoes/helpers/sample17_helper.rb +3 -3
  71. data/spec/shoes/integration_spec.rb +1 -1
  72. data/spec/shoes/internal_app_spec.rb +8 -0
  73. data/spec/shoes/line_spec.rb +35 -3
  74. data/spec/shoes/link_spec.rb +24 -12
  75. data/spec/shoes/list_box_spec.rb +14 -2
  76. data/spec/shoes/point_spec.rb +28 -0
  77. data/spec/shoes/renamed_delegate_spec.rb +2 -2
  78. data/spec/shoes/shape_spec.rb +15 -2
  79. data/spec/shoes/shared_examples/changeable.rb +1 -1
  80. data/spec/shoes/shared_examples/common_methods.rb +1 -1
  81. data/spec/shoes/shared_examples/dsl/style.rb +1 -1
  82. data/spec/shoes/shared_examples/dsl/text_elements.rb +3 -3
  83. data/spec/shoes/shared_examples/dsl/video.rb +1 -1
  84. data/spec/shoes/shared_examples/dsl_app_context.rb +0 -1
  85. data/spec/shoes/shared_examples/parent.rb +1 -1
  86. data/spec/shoes/shared_examples/slot.rb +11 -5
  87. data/spec/shoes/shared_examples/state.rb +2 -2
  88. data/spec/shoes/shared_examples/style.rb +1 -1
  89. data/spec/shoes/spec_helper.rb +1 -1
  90. data/spec/shoes/text_block_spec.rb +20 -3
  91. data/spec/shoes/ui/picker_spec.rb +70 -0
  92. metadata +8 -2
@@ -1,5 +1,5 @@
1
1
  class Shoes
2
2
  module Core
3
- VERSION = "4.0.0.pre3"
3
+ VERSION = "4.0.0.pre4"
4
4
  end
5
5
  end
data/lib/shoes/dialog.rb CHANGED
@@ -12,8 +12,8 @@ class Shoes
12
12
  @gui.confirm msg
13
13
  end
14
14
 
15
- def dialog_chooser(title, folder = false)
16
- @gui.dialog_chooser title, folder
15
+ def dialog_chooser(title, folder = false, style = :open)
16
+ @gui.dialog_chooser title, folder, style
17
17
  end
18
18
 
19
19
  def ask(msg, args)
@@ -16,6 +16,7 @@ class Shoes
16
16
  def initialize(parent = nil, start_as_center = false)
17
17
  @parent = parent
18
18
  @start_as_center = start_as_center
19
+ @combined_margins = 0
19
20
  end
20
21
 
21
22
  def start
@@ -31,15 +32,19 @@ class Shoes
31
32
  def extent
32
33
  result = @extent
33
34
  if @parent
34
- result = calculate_relative(result) if is_relative?(result)
35
- result = calculate_negative(result) if is_negative?(result)
35
+ result = calculate_relative(result) if @extent_relative
36
+ result = calculate_negative(result) if @extent_negative
36
37
  end
37
38
  result
38
39
  end
39
40
 
40
41
  def extent=(value)
41
42
  @extent = value
42
- @extent = parse_from_string @extent if is_string? @extent
43
+ @extent = parse_from_string @extent if string? @extent
44
+
45
+ @extent_relative = relative?(@extent)
46
+ @extent_negative = negative?(@extent)
47
+
43
48
  @extent
44
49
  end
45
50
 
@@ -53,7 +58,7 @@ class Shoes
53
58
  if my_extent.nil?
54
59
  nil
55
60
  else
56
- extent - (margin_start + margin_end)
61
+ my_extent - @combined_margins
57
62
  end
58
63
  end
59
64
 
@@ -100,35 +105,64 @@ class Shoes
100
105
  # getter... reason being that for ParentDimensions we need to be able to
101
106
  # figure out if a value has been modified or if we should consult the
102
107
  # parent value - see ParentDimension implementation
103
- [:margin_start, :margin_end, :displace_start].each do |method|
104
- define_method method do
105
- instance_variable_name = '@' + method.to_s
106
- value = instance_variable_get(instance_variable_name) || 0
107
- value = calculate_relative value if is_relative? value
108
- value
109
- end
108
+ def margin_start
109
+ value_factoring_in_relative(@margin_start, @margin_start_relative)
110
110
  end
111
111
 
112
- def self.define_int_parsing_writer(name)
113
- define_method "#{name}=" do |value|
114
- instance_variable_set("@#{name}", parse_int_value(value))
115
- end
112
+ def margin_end
113
+ value_factoring_in_relative(@margin_end, @margin_end_relative)
114
+ end
115
+
116
+ def displace_start
117
+ value_factoring_in_relative(@displace_start, @displace_start_relative)
116
118
  end
117
119
 
118
- %w(start end margin_start margin_end displace_start).each do |method|
119
- define_int_parsing_writer method
120
+ def value_factoring_in_relative(value, relative)
121
+ value ||= 0
122
+ value = calculate_relative value if relative
123
+ value
124
+ end
125
+
126
+ def start=(value)
127
+ @start_relative = relative?(value)
128
+ @start = parse_int_value(value)
129
+ end
130
+
131
+ def end=(value)
132
+ @end = parse_int_value(value)
133
+ end
134
+
135
+ def margin_start=(value)
136
+ @margin_start_relative = relative?(value)
137
+ @margin_start = parse_int_value(value)
138
+
139
+ @combined_margins = margin_start + margin_end
140
+ @margin_start
141
+ end
142
+
143
+ def margin_end=(value)
144
+ @margin_end_relative = relative?(value)
145
+ @margin_end = parse_int_value(value)
146
+
147
+ @combined_margins = margin_start + margin_end
148
+ @margin_end
149
+ end
150
+
151
+ def displace_start=(value)
152
+ @displace_start_relative = relative?(value)
153
+ @displace_start = parse_int_value(value)
120
154
  end
121
155
 
122
156
  private
123
157
 
124
158
  def basic_start_value
125
159
  value = @start
126
- value = calculate_relative value if is_relative?(value)
160
+ value = calculate_relative value if @start_relative
127
161
  value = report_relative_to_parent_start if value.nil?
128
162
  value
129
163
  end
130
164
 
131
- def is_relative?(result)
165
+ def relative?(result)
132
166
  # as the value is relative to the parent values bigger than one don't
133
167
  # make much sense and are problematic. E.g. through calculations users
134
168
  # might end up with values like 5.14 meaning 5 pixel which would get
@@ -142,11 +176,11 @@ class Shoes
142
176
  (result * @parent.element_extent).to_i
143
177
  end
144
178
 
145
- def is_string?(result)
179
+ def string?(result)
146
180
  result.is_a?(String)
147
181
  end
148
182
 
149
- def is_negative?(result)
183
+ def negative?(result)
150
184
  result && result < 0
151
185
  end
152
186
 
@@ -158,23 +192,13 @@ class Shoes
158
192
 
159
193
  def parse_from_string(result)
160
194
  match = result.gsub(/\s+/, "").match(PERCENT_REGEX)
161
- if match
162
- match[1].to_f / 100.0
163
- elsif valid_integer_string?(result)
164
- int_from_string(result)
165
- else
166
- nil
167
- end
195
+ return match[1].to_f / 100.0 if match
196
+ int_from_string(result) if valid_integer_string?(result)
168
197
  end
169
198
 
170
199
  def parse_int_value(input)
171
- if input.is_a?(Integer) || input.is_a?(Float)
172
- input
173
- elsif valid_integer_string?(input)
174
- int_from_string(input)
175
- else
176
- nil
177
- end
200
+ return input if input.is_a?(Integer) || input.is_a?(Float)
201
+ int_from_string(input) if valid_integer_string?(input)
178
202
  end
179
203
 
180
204
  def int_from_string(result)
@@ -188,19 +212,19 @@ class Shoes
188
212
  end
189
213
 
190
214
  def report_relative_to_parent_start
191
- if element_start && parent && parent.element_start
192
- element_start - parent.element_start
193
- else
194
- nil
195
- end
215
+ element_start - parent.element_start if start_exists?
196
216
  end
197
217
 
198
218
  def report_relative_to_parent_end
199
- if element_end && parent && parent.element_end
200
- parent.element_end - element_end
201
- else
202
- nil
203
- end
219
+ parent.element_end - element_end if end_exists?
220
+ end
221
+
222
+ def end_exists?
223
+ element_end && parent && parent.element_end
224
+ end
225
+
226
+ def start_exists?
227
+ element_start && parent && parent.element_start
204
228
  end
205
229
 
206
230
  def start_as_center?
@@ -208,26 +232,17 @@ class Shoes
208
232
  end
209
233
 
210
234
  def adjust_start_for_center(value)
211
- my_extent = extent
212
- if my_extent && my_extent > 0
213
- value - my_extent / 2
214
- else
215
- nil
216
- end
235
+ value - extent / 2 if extent && extent > 0
217
236
  end
218
237
  end
219
238
 
220
239
  class ParentDimension < Dimension
221
- SIMPLE_DELEGATE_METHODS = [:absolute_start, :start]
222
-
223
- SIMPLE_DELEGATE_METHODS.each do |method|
224
- define_method method do
225
- if value_modified? method
226
- super
227
- else
228
- parent.public_send(method)
229
- end
230
- end
240
+ def absolute_start
241
+ @absolute_start ? super : parent.absolute_start
242
+ end
243
+
244
+ def start
245
+ @start ? super : parent.start
231
246
  end
232
247
 
233
248
  def extent
@@ -248,11 +263,11 @@ class Shoes
248
263
  #
249
264
  # To get our extent respecting the parent's margins, it's our absolute
250
265
  # start, minus parent's element end (so we don't blow past the margin)
251
- extent_in_parent = parent.element_end - self.absolute_start - PIXEL_COUNTING_ADJUSTMENT
266
+ parent.element_end - absolute_start - PIXEL_COUNTING_ADJUSTMENT
252
267
  else
253
268
  # If we hit this, then the extent in parent isn't available and will be
254
269
  # ignored by the min call below
255
- extent_in_parent = Float::INFINITY
270
+ Float::INFINITY
256
271
  end
257
272
  end
258
273
 
@@ -260,10 +275,5 @@ class Shoes
260
275
  def raw_extent(original_value)
261
276
  original_value || parent.extent
262
277
  end
263
-
264
- def value_modified?(method)
265
- instance_variable = ('@' + method.to_s).to_sym
266
- instance_variable_get(instance_variable)
267
- end
268
278
  end
269
279
  end
@@ -95,14 +95,6 @@ class Shoes
95
95
  true
96
96
  end
97
97
 
98
- def inspect
99
- nothing = '_'
100
- super.insert(-2,
101
- " relative:#{Point.new left, top}->#{Point.new right, bottom}" \
102
- " absolute:#{Point.new absolute_left, absolute_top}->#{Point.new absolute_right, absolute_bottom}" \
103
- " #{width || nothing}x#{height || nothing}")
104
- end
105
-
106
98
  def self.setup_delegations
107
99
  methods_to_rename = Dimension.public_instance_methods false
108
100
  renamed_delegate_to :x_dimension, methods_to_rename, 'start' => 'left',
@@ -117,6 +109,13 @@ class Shoes
117
109
 
118
110
  private
119
111
 
112
+ def inspect_details
113
+ nothing = '_'
114
+ " relative:#{Point.new left, top}->#{Point.new right, bottom}" \
115
+ " absolute:#{Point.new absolute_left, absolute_top}->#{Point.new absolute_right, absolute_bottom}" \
116
+ " #{width || nothing}x#{height || nothing}"
117
+ end
118
+
120
119
  def hash_as_argument?(left)
121
120
  left.respond_to? :fetch
122
121
  end
@@ -185,10 +184,23 @@ class Shoes
185
184
  extend Forwardable
186
185
 
187
186
  UNDELEGATED_METHODS = [:to_s]
188
- DELEGATED_METHODS = Dimensions.public_instance_methods(false) - UNDELEGATED_METHODS
187
+ CANDIDATE_METHODS = Dimensions.public_instance_methods(false) - UNDELEGATED_METHODS
188
+
189
+ WRITER_METHODS = CANDIDATE_METHODS.select { |meth| meth.to_s.end_with?("=") }
190
+ DELEGATED_METHODS = CANDIDATE_METHODS - WRITER_METHODS
189
191
 
190
192
  def_delegators :dimensions, *DELEGATED_METHODS
191
193
 
194
+ # For performance reasons, it's critical to write out dimension values to
195
+ # the styles hash directly when they change, so do that here.
196
+ WRITER_METHODS.each do |meth|
197
+ key = meth.to_s.sub("=", "").to_sym
198
+ define_method(meth) do |value|
199
+ @style[key] = value if @style
200
+ self.dimensions.send(meth, value)
201
+ end
202
+ end
203
+
192
204
  def adjust_current_position(*_)
193
205
  # no-op by default for almost all elements
194
206
  end
@@ -198,6 +210,6 @@ class Shoes
198
210
  module BackendDimensionsDelegations
199
211
  extend Forwardable
200
212
 
201
- def_delegators :dsl, *DimensionsDelegations::DELEGATED_METHODS
213
+ def_delegators :dsl, *DimensionsDelegations::CANDIDATE_METHODS
202
214
  end
203
215
  end
@@ -31,6 +31,7 @@ class Shoes
31
31
  @blk = slot.create_bound_block(blk)
32
32
  @progress_blk = slot.create_bound_block(@opts[:progress])
33
33
  @finish_blk = slot.create_bound_block(@opts[:finish])
34
+ @error_blk = slot.create_bound_block(@opts[:error] || default_error_proc)
34
35
  end
35
36
 
36
37
  def start
@@ -51,6 +52,7 @@ class Shoes
51
52
  end
52
53
 
53
54
  def percent
55
+ return 0 if @transferred.nil? || @content_length.nil?
54
56
  @transferred * 100 / @content_length
55
57
  end
56
58
 
@@ -68,20 +70,34 @@ class Shoes
68
70
  def start_download
69
71
  require 'open-uri'
70
72
  @thread = Thread.new do
71
- uri_opts = {}
72
- uri_opts[:content_length_proc] = content_length_proc
73
- uri_opts[:progress_proc] = progress_proc if @progress_blk
74
-
75
- open @url, uri_opts do |download_data|
76
- @response.body = download_data.read
77
- @response.status = download_data.status
78
- @response.headers = download_data.meta
79
- save_to_file(@opts[:save]) if @opts[:save]
80
- finish_download download_data
73
+ begin
74
+ uri_opts = {}
75
+ uri_opts[:content_length_proc] = content_length_proc
76
+ uri_opts[:progress_proc] = progress_proc if @progress_blk
77
+
78
+ open @url, uri_opts do |download_data|
79
+ @response.body = download_data.read
80
+ @response.status = download_data.status
81
+ @response.headers = download_data.meta
82
+ save_to_file(@opts[:save]) if @opts[:save]
83
+ finish_download download_data
84
+ end
85
+ rescue SocketError => e
86
+ Shoes.logger.error e
87
+ rescue => e
88
+ eval_block(@error_blk, e)
81
89
  end
82
90
  end
83
91
  end
84
92
 
93
+ def default_error_proc
94
+ lambda do |exception|
95
+ Shoes.logger.error "Failure downloading #{@url}. To handle this yourself, pass `:error` option to the download call."
96
+ Shoes.logger.error exception.message
97
+ Shoes.logger.error exception.backtrace.join("\n\t")
98
+ end
99
+ end
100
+
85
101
  def content_length_proc
86
102
  lambda do |content_length|
87
103
  download_started(content_length)
data/lib/shoes/dsl.rb CHANGED
@@ -77,9 +77,13 @@ require 'shoes/color'
77
77
  require 'shoes/common/background_element'
78
78
  require 'shoes/common/changeable'
79
79
  require 'shoes/common/clickable'
80
+ require 'shoes/common/fill'
81
+ require 'shoes/common/initialization'
80
82
  require 'shoes/common/positioning'
81
83
  require 'shoes/common/remove'
84
+ require 'shoes/common/rotate'
82
85
  require 'shoes/common/state'
86
+ require 'shoes/common/stroke'
83
87
  require 'shoes/common/style'
84
88
  require 'shoes/common/style_normalizer'
85
89
  require 'shoes/common/visibility'
@@ -245,7 +249,7 @@ class Shoes
245
249
  create Shoes::Stack, opts, blk
246
250
  end
247
251
 
248
- def button(text = 'Button', opts = {}, &blk)
252
+ def button(text = nil, opts = {}, &blk)
249
253
  create Shoes::Button, text, opts, blk
250
254
  end
251
255
 
@@ -347,30 +351,20 @@ class Shoes
347
351
  # @option styles [Integer] height (0) the height
348
352
  # @option styles [Integer] top (0) the y-coordinate of the top-left corner
349
353
  # @option styles [Boolean] center (false) is (left, top) the center of the oval
354
+ OVAL_ALLOWED_ARG_SIZES = [0, 3, 4]
350
355
  def oval(*opts, &blk)
351
356
  oval_style = pop_style(opts)
352
357
  oval_style = style_normalizer.normalize(oval_style)
353
- case opts.length
354
- when 3
355
- left, top, width = opts
356
- height = width
357
- when 4
358
- left, top, width, height = opts
359
- when 0
360
- left = oval_style[:left] || 0
361
- top = oval_style[:top] || 0
362
- width = oval_style[:diameter] || oval_style[:width] ||
363
- (oval_style[:radius] || 0) * 2
364
- height = oval_style[:height] || width
365
- else
366
- message = <<EOS
358
+
359
+ left, top, width, height = opts
360
+
361
+ message = <<EOS
367
362
  Wrong number of arguments. Must be one of:
368
363
  - oval(left, top, diameter, [opts])
369
364
  - oval(left, top, width, height, [opts])
370
365
  - oval(styles)
371
366
  EOS
372
- fail ArgumentError, message
373
- end
367
+ fail ArgumentError, message unless OVAL_ALLOWED_ARG_SIZES.include? opts.size
374
368
  create Shoes::Oval, left, top, width, height, oval_style, blk
375
369
  end
376
370
 
@@ -396,58 +390,45 @@ EOS
396
390
  # @option styles [Integer] height (0) the height
397
391
  # @option styles [Integer] top (0) the y-coordinate of the top-left corner
398
392
  # @option styles [Boolean] center (false) is (left, top) the center of the rectangle?
393
+ RECT_ALLOWED_ARG_SIZES = [0, 3, 4, 5]
399
394
  def rect(*args, &blk)
400
395
  opts = style_normalizer.normalize pop_style(args)
401
- case args.length
402
- when 3
403
- left, top, width = args
404
- height = width
405
- opts[:curve] ||= 0
406
- when 4
407
- left, top, width, height = args
408
- opts[:curve] ||= 0
409
- when 5
410
- left, top, width, height, opts[:curve] = args
411
- when 0
412
- left = opts[:left] || 0
413
- top = opts[:top] || 0
414
- width = opts[:width] || 0
415
- height = opts[:height] || width
416
- opts[:curve] ||= 0
417
- else
418
- message = <<EOS
396
+
397
+ left, top, width, height, curve = args
398
+ opts[:curve] = curve if curve
399
+
400
+ message = <<EOS
419
401
  Wrong number of arguments. Must be one of:
420
402
  - rect(left, top, side, [opts])
421
403
  - rect(left, top, width, height, [opts])
422
404
  - rect(left, top, width, height, curve, [opts])
423
405
  - rect(styles)
424
406
  EOS
425
- fail ArgumentError, message
426
- end
407
+ fail ArgumentError, message unless RECT_ALLOWED_ARG_SIZES.include? args.size
427
408
  create Shoes::Rect, left, top, width, height, style.merge(opts), blk
428
409
  end
429
410
 
430
411
  # Creates a new Shoes::Star object
431
412
  #
432
- # @overload shape(left, top, styles, &block)
413
+ # @overload star(left, top, styles, &block)
433
414
  # Creates a star at (left, top) with the given style
434
415
  # @param [Integer] left the x-coordinate of the top-left corner
435
416
  # @param [Integer] top the y-coordinate of the top-left corner
436
417
  # @param [Hash] styles optional, additional styling for the element
437
- # @overload shape(left, top, points, styles, &block)
418
+ # @overload star(left, top, points, styles, &block)
438
419
  # Creates a star at (left, top) with the given style
439
420
  # @param [Integer] left the x-coordinate of the top-left corner
440
421
  # @param [Integer] top the y-coordinate of the top-left corner
441
422
  # @param [Integer] points count of points on the star
442
423
  # @param [Hash] styles optional, additional styling for the element
443
- # @overload shape(left, top, points, outer, styles, &block)
424
+ # @overload star(left, top, points, outer, styles, &block)
444
425
  # Creates a star at (left, top) with the given style
445
426
  # @param [Integer] left the x-coordinate of the top-left corner
446
427
  # @param [Integer] top the y-coordinate of the top-left corner
447
428
  # @param [Integer] points count of points on the star
448
429
  # @param [Integer] outer outer radius of star
449
430
  # @param [Hash] styles optional, additional styling for the element
450
- # @overload shape(left, top, points, outer, inner, styles, &block)
431
+ # @overload star(left, top, points, outer, inner, styles, &block)
451
432
  # Creates a star at (left, top) with the given style
452
433
  # @param [Integer] left the x-coordinate of the top-left corner
453
434
  # @param [Integer] top the y-coordinate of the top-left corner
@@ -488,6 +469,7 @@ EOS
488
469
  # Creates a shape at (0, 0)
489
470
  # @option styles [Integer] left (0) the x-coordinate of the top-left corner
490
471
  # @option styles [Integer] top (0) the y-coordinate of the top-left corner
472
+ SHAPE_ALLOWED_ARG_SIZES = [0, 2]
491
473
  def shape(*args, &blk)
492
474
  opts = style_normalizer.normalize pop_style(args)
493
475
  opts[:left], opts[:top] = args if args.length == 2
@@ -498,7 +480,7 @@ Wrong number of arguments. Must be one of:
498
480
  - shape(left, top, [opts])
499
481
  - shape(styles)
500
482
  EOS
501
- fail ArgumentError, message unless [0, 2].include? args.length
483
+ fail ArgumentError, message unless SHAPE_ALLOWED_ARG_SIZES.include? args.length
502
484
  create Shoes::Shape, style.merge(opts), blk
503
485
  end
504
486
 
@@ -507,13 +489,13 @@ EOS
507
489
  OTHER_APP_STYLES = [:cap, :rotate, :strokewidth, :transform, :translate]
508
490
 
509
491
  PATTERN_APP_STYLES.each do |style|
510
- define_method style.to_s do |val|
492
+ define_method style do |val|
511
493
  @__app__.style[style] = pattern(val)
512
494
  end
513
495
  end
514
496
 
515
497
  OTHER_APP_STYLES.each do |style|
516
- define_method style.to_s do |val|
498
+ define_method style do |val|
517
499
  @__app__.style[style] = val
518
500
  end
519
501
  end
@@ -607,13 +589,12 @@ EOS
607
589
  def visit(url)
608
590
  match_data = nil
609
591
  url_data = Shoes::URL.urls.find { |page, _| match_data = page.match url }
610
- if url_data
611
- action_proc = url_data[1]
612
- url_argument = match_data[1]
613
- clear do
614
- @__app__.location = url
615
- action_proc.call self, url_argument
616
- end
592
+ return unless url_data
593
+ action_proc = url_data[1]
594
+ url_argument = match_data[1]
595
+ clear do
596
+ @__app__.location = url
597
+ action_proc.call self, url_argument
617
598
  end
618
599
  end
619
600
 
@@ -10,22 +10,15 @@ class Shoes
10
10
 
11
11
  attr_reader :alpha, :color1, :color2
12
12
 
13
- def inspect
14
- super.insert(-2, " #{color1}->#{color2}")
15
- end
16
-
17
13
  def <=>(other) # arbitrarily compare 1st non-equal color
18
- raise_class_mismatch_error(other) unless other.is_a?(self.class)
19
- if @color1 == other.color1
20
- @color2 <=> other.color2
21
- else
22
- @color1 <=> other.color1
23
- end
14
+ return unless other.is_a?(self.class)
15
+ [color1, color2] <=> [other.color1, other.color2]
24
16
  end
25
17
 
26
- def raise_class_mismatch_error(other)
27
- fail ArgumentError,
28
- "can't compare #{self.class.name} with #{other.class.name}"
18
+ private
19
+
20
+ def inspect_details
21
+ " #{color1}->#{color2}"
29
22
  end
30
23
  end
31
24
  end
data/lib/shoes/image.rb CHANGED
@@ -6,17 +6,12 @@ class Shoes
6
6
 
7
7
  BINARY_ENCODING = Encoding.find('binary')
8
8
 
9
- attr_reader :app, :parent, :dimensions, :gui
10
9
  style_with :art_styles, :common_styles, :dimensions, :file_path
11
10
 
12
- def initialize(app, parent, file_path_or_data, styles = {}, blk = nil)
13
- @app = app
14
- @parent = parent
15
- style_init styles, file_path: normalized_source(file_path_or_data)
16
- @dimensions = Dimensions.new parent, @style
17
- @parent.add_child self
18
- @gui = Shoes.configuration.backend_for self, @parent.gui
19
- register_click blk
11
+ STYLES = { fill: Shoes::COLORS[:black] }
12
+
13
+ def before_initialize(styles, file_path_or_data)
14
+ styles[:file_path] = normalized_source(file_path_or_data)
20
15
  end
21
16
 
22
17
  def path
@@ -4,16 +4,13 @@ class Shoes
4
4
  include Common::Style
5
5
  include Common::Changeable
6
6
 
7
- attr_reader :app, :parent, :dimensions, :gui
8
-
9
- def initialize(app, parent, text, styles = {}, blk = nil)
10
- @app = app
11
- @parent = parent
12
- style_init styles, text: text.to_s
13
- @dimensions = Dimensions.new parent, @style
14
- @parent.add_child self
15
- @gui = Shoes.configuration.backend_for self, @parent.gui
7
+ def before_initialize(styles, text)
8
+ styles[:text] = text.to_s
9
+ end
10
+
11
+ def handle_block(blk)
16
12
  change(&blk) if blk
13
+ update_visibility
17
14
  end
18
15
 
19
16
  def state=(value)