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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bcbcba9d1c9969a08d30f3f2afef20d02ecc677e
4
- data.tar.gz: 4c455368fa53653c7d1fb16e029625b8175ebcc0
3
+ metadata.gz: 84a2c73e863ae6a5e1d2c53484822830719a8e3e
4
+ data.tar.gz: e26555a20033558b5618a6be1821ce73ec0dbf1d
5
5
  SHA512:
6
- metadata.gz: dee92066957d08625a5b0f785aa480d7596a4a33b1096a4a5203bcf83b36890c68215bd69cc82a7f748d233fa4766caace13944e8c0b1b9dddcdee2e17778dda
7
- data.tar.gz: 5c231e8b80f0c5c0f93b1a4d44cf1702155b188c4fbc0c51e95137838689aeddd4043c24e9f66cbea0bbe00db58884f2f1ccc720867ab12f595ebb7e6ff1b294
6
+ metadata.gz: 775fbfd5702df09c69a035c02502f1c8db234eef54aaa7f9e72fe46f6fac2af59c698e7d40f86bf9d61ec6dfbc6fd49b2d14fb643a8a473f86fb598aeeb227f0
7
+ data.tar.gz: b4568bcb40bcc3e4c3e67b63d90b9d70f85905aba5ed0450add252ee22da124b6c4d64e847f81245636ac8d2c5de4a70b5c28fb0c93cd35f43b89ad2f41b61d9
data/bin/shoes CHANGED
@@ -59,4 +59,4 @@ then
59
59
  fi
60
60
 
61
61
  BACKEND_COMMAND=$(cat $BACKEND_FILE)
62
- $BACKEND_COMMAND $@
62
+ SHOES_BIN_DIR=$SCRIPTPATH $BACKEND_COMMAND $@
data/bin/shoes-picker CHANGED
@@ -3,4 +3,8 @@ lib_directory = File.expand_path('../../lib', __FILE__)
3
3
  $LOAD_PATH << lib_directory
4
4
 
5
5
  require 'shoes/ui/picker'
6
- Shoes::UI::Picker.new.run
6
+
7
+ # On Windows getting odd paths with trailing double-quote
8
+ bin_dir = ARGV[0].gsub('"', '')
9
+
10
+ Shoes::UI::Picker.new.run(bin_dir)
data/bin/shoes-stub CHANGED
@@ -59,4 +59,4 @@ then
59
59
  fi
60
60
 
61
61
  BACKEND_COMMAND=$(cat $BACKEND_FILE)
62
- $BACKEND_COMMAND $@
62
+ SHOES_BIN_DIR=$SCRIPTPATH $BACKEND_COMMAND $@
@@ -10,6 +10,8 @@ if not exist !bin_dir!\shoes-backend (
10
10
  jruby --1.9 !bin_dir!\shoes-picker !bin_dir!
11
11
  )
12
12
 
13
+ set shoes_bin_dir=!bin_dir!
13
14
  set /p command=<!bin_dir!/shoes-backend
15
+
14
16
  call !command! %*
15
17
  endlocal
@@ -4,7 +4,7 @@ require 'fileutils'
4
4
  # See ext/install/Rakefile for why this cleanup is our responsibility.
5
5
  # Decide if user uninstalled executables based on our actual Ruby script.
6
6
  Gem.post_uninstall do |gem|
7
- uninstalling_shoes = gem.spec.name == "shoes"
7
+ uninstalling_shoes = gem.spec.name == "shoes-core"
8
8
  missing_executable = !File.exist?(File.join(Gem.bindir, "shoes-picker")) &&
9
9
  !File.exist?(File.join(Gem.bindir, "shoes-picker.bat"))
10
10
 
@@ -19,6 +19,6 @@ Gem.post_uninstall do |gem|
19
19
  # Everybody potentially has a generated backend file in their bin
20
20
  puts "Removing shoes-backend"
21
21
  backend = File.join(Gem.bindir, "shoes-backend")
22
- FileUtils.rm(backend) if File.exists?(backend)
22
+ FileUtils.rm(backend) if File.exist?(backend)
23
23
  end
24
24
  end
data/lib/shoes/app.rb CHANGED
@@ -29,6 +29,7 @@ class Shoes
29
29
  include DSL
30
30
  include BuiltinMethods
31
31
  include Common::Inspect
32
+ extend Forwardable
32
33
 
33
34
  # Instantiates a new Shoes app.
34
35
  #
@@ -60,38 +61,26 @@ class Shoes
60
61
  self.class.new(options, &block)
61
62
  end
62
63
 
63
- def close
64
- quit
65
- end
66
-
67
64
  def quit
68
65
  Shoes.unregister self
69
66
  @__app__.quit
70
67
  end
71
68
 
69
+ alias_method :close, :quit
70
+
72
71
  def parent
73
72
  @__app__.current_slot.parent
74
73
  end
75
74
 
76
- %w(
75
+ delegated_to_internal_app = %w(
77
76
  width height owner started? location left top absolute_left
78
77
  absolute_top click release clear fullscreen fullscreen=
79
- contents wait_until_closed
80
- ).each do |method|
81
- define_method method do |*args, &block|
82
- @__app__.public_send method, *args, &block
83
- end
84
- end
85
-
86
- alias_method :fullscreen?, :fullscreen
78
+ contents wait_until_closed gui
79
+ )
87
80
 
88
- def to_s
89
- super.insert(-2, " \"#{@__app__.app_title}\"")
90
- end
81
+ def_delegators :@__app__, *delegated_to_internal_app
91
82
 
92
- def inspect
93
- super.insert(-2, " \"#{@__app__.app_title}\")")
94
- end
83
+ alias_method :fullscreen?, :fullscreen
95
84
 
96
85
  def eval_with_additional_context(context, &blk)
97
86
  @__additional_context__ = context
@@ -108,6 +97,16 @@ class Shoes
108
97
  end
109
98
  end
110
99
 
100
+ private
101
+
102
+ def inspect_details
103
+ " \"#{@__app__.app_title}\""
104
+ end
105
+
106
+ def to_s_details
107
+ inspect_details
108
+ end
109
+
111
110
  DELEGATE_BLACKLIST = [:parent, :app]
112
111
 
113
112
  # class definitions are evaluated top to bottom, want to have all of them
data/lib/shoes/arc.rb CHANGED
@@ -1,21 +1,21 @@
1
1
  class Shoes
2
2
  class Arc
3
3
  include Common::UIElement
4
+ include Common::Fill
5
+ include Common::Stroke
4
6
  include Common::Style
5
7
  include Common::Clickable
6
8
 
7
- attr_reader :app, :parent, :dimensions, :gui
8
9
  style_with :angle1, :angle2, :art_styles, :center, :common_styles, :dimensions, :radius, :wedge
9
10
  STYLES = { wedge: false }
10
11
 
11
- def initialize(app, parent, left, top, width, height, angle1, angle2, styles = {}, blk = nil)
12
- @app = app
13
- @parent = parent
14
- style_init styles, angle1: angle1, angle2: angle2
12
+ def before_initialize(styles, left, top, width, height, angle1, angle2)
13
+ styles[:angle1] = angle1
14
+ styles[:angle2] = angle2
15
+ end
16
+
17
+ def create_dimensions(left, top, width, height, angle1, angle2)
15
18
  @dimensions = Dimensions.new parent, left, top, width, height, @style
16
- @parent.add_child self
17
- @gui = Shoes.backend_for self
18
- register_click blk
19
19
  end
20
20
 
21
21
  def wedge?
@@ -2,19 +2,15 @@ class Shoes
2
2
  class Background
3
3
  include Common::UIElement
4
4
  include Common::BackgroundElement
5
+ include Common::Fill
6
+ include Common::Stroke
5
7
  include Common::Style
6
8
 
7
- attr_reader :app, :parent, :dimensions, :gui
8
9
  style_with :angle, :common_styles, :curve, :dimensions, :fill
9
10
  STYLES = { angle: 0, curve: 0 }
10
11
 
11
- def initialize(app, parent, color, styles = {})
12
- @app = app
13
- @parent = parent
14
- style_init styles, fill: color
15
- @dimensions = ParentDimensions.new parent, @style
16
- @parent.add_child self
17
- @gui = Shoes.backend_for self
12
+ def before_initialize(styles, color)
13
+ styles[:fill] = color
18
14
  end
19
15
  end
20
16
  end
data/lib/shoes/border.rb CHANGED
@@ -2,19 +2,15 @@ class Shoes
2
2
  class Border
3
3
  include Common::UIElement
4
4
  include Common::BackgroundElement
5
+ include Common::Fill
6
+ include Common::Stroke
5
7
  include Common::Style
6
8
 
7
- attr_reader :app, :parent, :dimensions, :gui
8
9
  style_with :angle, :common_styles, :curve, :dimensions, :stroke, :strokewidth
9
10
  STYLES = { angle: 0, curve: 0 }
10
11
 
11
- def initialize(app, parent, color, styles = {})
12
- @app = app
13
- @parent = parent
14
- style_init styles, stroke: color
15
- @dimensions = ParentDimensions.new parent, @style
16
- @parent.add_child self
17
- @gui = Shoes.backend_for self
12
+ def before_initialize(styles, color)
13
+ styles[:stroke] = color
18
14
  end
19
15
  end
20
16
  end
@@ -44,7 +44,7 @@ class Shoes
44
44
  end
45
45
 
46
46
  def ask_save_file
47
- Shoes::Dialog.new.dialog_chooser 'Save File...'
47
+ Shoes::Dialog.new.dialog_chooser 'Save File...', false, :save
48
48
  end
49
49
 
50
50
  def ask_open_folder
@@ -52,7 +52,7 @@ class Shoes
52
52
  end
53
53
 
54
54
  def ask_save_folder
55
- Shoes::Dialog.new.dialog_chooser 'Save Folder...', :folder
55
+ Shoes::Dialog.new.dialog_chooser 'Save Folder...', :folder, :save
56
56
  end
57
57
 
58
58
  def ask(msg, args = {})
data/lib/shoes/button.rb CHANGED
@@ -4,17 +4,10 @@ class Shoes
4
4
  include Common::Style
5
5
  include Common::Clickable
6
6
 
7
- attr_reader :app, :parent, :dimensions, :gui
8
7
  style_with :click, :common_styles, :dimensions, :state, :text
9
8
 
10
- def initialize(app, parent, text, styles = {}, blk = nil)
11
- @app = app
12
- @parent = parent
13
- style_init styles, text: text
14
- @dimensions = Dimensions.new parent, @style
15
- @parent.add_child self
16
- @gui = Shoes.configuration.backend_for self, @parent.gui
17
- register_click blk
9
+ def before_initialize(styles, text)
10
+ styles[:text] = text || 'Button'
18
11
  end
19
12
 
20
13
  def focus
@@ -4,18 +4,6 @@ class Shoes
4
4
  include Common::Style
5
5
  include Common::Clickable
6
6
 
7
- attr_reader :app, :parent, :dimensions, :gui
8
-
9
- def initialize(app, parent, styles = {}, blk = nil)
10
- @app = app
11
- @parent = parent
12
- style_init styles
13
- @dimensions = Dimensions.new parent, @style
14
- @parent.add_child self
15
- @gui = Shoes.configuration.backend_for self, @parent.gui
16
- register_click blk
17
- end
18
-
19
7
  def checked?
20
8
  @gui.checked?
21
9
  end
data/lib/shoes/color.rb CHANGED
@@ -60,7 +60,6 @@ EOS
60
60
  end
61
61
 
62
62
  def <=>(other)
63
- raise_class_mismatch_error(other) unless other.is_a?(self.class)
64
63
  if same_base_color?(other)
65
64
  @alpha <=> other.alpha
66
65
  else
@@ -79,12 +78,12 @@ EOS
79
78
  "rgb(#{red}, #{green}, #{blue})"
80
79
  end
81
80
 
82
- def inspect
83
- super.insert(-2, " #{self} alpha:#{@alpha}")
84
- end
85
-
86
81
  private
87
82
 
83
+ def inspect_details
84
+ " #{self} alpha:#{@alpha}"
85
+ end
86
+
88
87
  def normalize_rgb(value)
89
88
  rgb = value.is_a?(Fixnum) ? value : (255 * value).round
90
89
  return 255 if rgb > 255
@@ -92,17 +91,12 @@ EOS
92
91
  rgb
93
92
  end
94
93
 
95
- def raise_class_mismatch_error(other)
96
- fail ArgumentError,
97
- "can't compare #{self.class.name} with #{other.class.name}"
98
- end
99
-
100
94
  def same_base_color?(other)
101
95
  @red == other.red && @green == other.green && @blue == other.blue
102
96
  end
103
97
 
104
98
  def less_or_greater_than(other)
105
- own_sum = @red + @green + @blue
99
+ own_sum = @red + @green + @blue
106
100
  other_sum = other.red + other.green + other.blue
107
101
  if own_sum > other_sum
108
102
  1
@@ -111,6 +105,7 @@ EOS
111
105
  end
112
106
  end
113
107
 
108
+
114
109
  class HexConverter
115
110
  def initialize(hex)
116
111
  @hex = validate(hex) || fail(ArgumentError, "Bad hex color: #{hex}")
@@ -145,16 +140,16 @@ EOS
145
140
  if args.length == 1
146
141
  arg = args.first
147
142
  case arg
148
- when String
149
- image_file?(arg) ? image_pattern(arg) : color(arg)
150
- when Shoes::Color
151
- color arg
152
- when Range, Shoes::Gradient
153
- gradient(arg)
154
- when Shoes::ImagePattern
155
- arg
156
- else
157
- fail ArgumentError, "Bad pattern: #{arg.inspect}"
143
+ when String
144
+ image_file?(arg) ? image_pattern(arg) : color(arg)
145
+ when Shoes::Color
146
+ color arg
147
+ when Range, Shoes::Gradient
148
+ gradient(arg)
149
+ when Shoes::ImagePattern
150
+ arg
151
+ else
152
+ fail ArgumentError, "Bad pattern: #{arg.inspect}"
158
153
  end
159
154
  else
160
155
  gradient(*args)
@@ -186,20 +181,20 @@ EOS
186
181
  # @param [Range<String>] range min color to max color
187
182
  def gradient(*args)
188
183
  case args.length
189
- when 1
190
- arg = args[0]
191
- case arg
192
- when Gradient
193
- min, max = arg.color1, arg.color2
194
- when Range
195
- min, max = arg.first, arg.last
196
- else
197
- fail ArgumentError, "Can't make gradient out of #{arg.inspect}"
198
- end
199
- when 2
200
- min, max = args[0], args[1]
184
+ when 1
185
+ arg = args[0]
186
+ case arg
187
+ when Gradient
188
+ min, max = arg.color1, arg.color2
189
+ when Range
190
+ min, max = arg.first, arg.last
201
191
  else
202
- fail ArgumentError, "Wrong number of arguments (#{args.length} for 1 or 2)"
192
+ fail ArgumentError, "Can't make gradient out of #{arg.inspect}"
193
+ end
194
+ when 2
195
+ min, max = args[0], args[1]
196
+ else
197
+ fail ArgumentError, "Wrong number of arguments (#{args.length} for 1 or 2)"
203
198
  end
204
199
  Shoes::Gradient.new(color(min), color(max))
205
200
  end
@@ -1,6 +1,10 @@
1
1
  class Shoes
2
2
  module Common
3
3
  module BackgroundElement
4
+ def create_dimensions(*_)
5
+ @dimensions = ParentDimensions.new @parent, @style
6
+ end
7
+
4
8
  def takes_up_space?
5
9
  false
6
10
  end
@@ -0,0 +1,9 @@
1
+ class Shoes
2
+ module Common
3
+ module Fill
4
+ def update_fill
5
+ gui.update_fill
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,59 @@
1
+ class Shoes
2
+ module Common
3
+ module Initialization
4
+ attr_reader :app, :parent, :dimensions, :gui
5
+
6
+ def initialize(app, parent, *args)
7
+ blk = args.pop if args.last.is_a?(Proc) || args.last.nil?
8
+ styles = args.last.is_a?(Hash) ? args.pop : {}
9
+
10
+ before_initialize(styles, *args)
11
+
12
+ @app = app
13
+ @parent = parent
14
+
15
+ style_init(styles)
16
+ create_dimensions(*args)
17
+ update_dimensions if styles_with_dimensions?
18
+
19
+ @parent.add_child self
20
+ @gui = Shoes.backend_for self
21
+
22
+ handle_block(blk)
23
+ update_visibility
24
+
25
+ after_initialize(*args)
26
+ end
27
+
28
+ # Set the dimensions for the element. Defaults to using the Dimensions
29
+ # class, but is expected to be overridden in other types (art elements,
30
+ # text blocks) that require different dimensioning.
31
+ def create_dimensions(*_)
32
+ @dimensions = Dimensions.new @parent, @style
33
+ end
34
+
35
+ # This method will get called with the incoming styles hash and the
36
+ # other arguments passed to initialize.
37
+ #
38
+ # It is intended for performing any additions to the styles hash before
39
+ # that gets sent on to style_init.
40
+ def before_initialize(_styles, *_)
41
+ end
42
+
43
+ # This method handles the block passed in at creation of the DSL element.
44
+ # By default it will treat things as clickable, and assumes the
45
+ # necessary methods are there.
46
+ #
47
+ # Override if DSL element uses that block for something else (i.e. slot)
48
+ def handle_block(blk)
49
+ return unless blk
50
+ register_click blk
51
+ end
52
+
53
+ # Final method called in initialize. Intended for any final setup after
54
+ # the rest of the object has been set up fully.
55
+ def after_initialize(*_)
56
+ end
57
+ end
58
+ end
59
+ end
@@ -2,12 +2,30 @@ class Shoes
2
2
  module Common
3
3
  module Inspect
4
4
  def to_s
5
- "(#{self.class.name})"
5
+ "(#{self.class.name}#{to_s_details})"
6
6
  end
7
7
 
8
8
  # Object hex representation from https://github.com/michaeldv/awesome_print
9
+ # Example:
10
+ # (Shoes::App:0x01234abc "Hello")
9
11
  def inspect
10
- "(#{self.class.name}:#{'0x%08x' % (object_id * 2)})"
12
+ "(#{self.class.name}:#{hexy_object_id}#{inspect_details})"
13
+ end
14
+
15
+ private
16
+
17
+ # Additional details to include in the inspect representation.
18
+ def inspect_details
19
+ ''
20
+ end
21
+
22
+ # Additional details to include in the to_s representation.
23
+ def to_s_details
24
+ ''
25
+ end
26
+
27
+ def hexy_object_id
28
+ sprintf('0x%08x', object_id * 2)
11
29
  end
12
30
  end
13
31
  end
@@ -0,0 +1,10 @@
1
+ class Shoes
2
+ module Common
3
+ module Rotate
4
+ # By default no one can rotate. Have to enable in particular classes.
5
+ def needs_rotate?
6
+ false
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ class Shoes
2
+ module Common
3
+ module Stroke
4
+ def update_stroke
5
+ gui.update_stroke
6
+ end
7
+ end
8
+ end
9
+ end
@@ -8,7 +8,6 @@ class Shoes
8
8
  module Common
9
9
  module Style
10
10
  DEFAULT_STYLES = {
11
- fill: Shoes::COLORS[:black],
12
11
  rotate: 0,
13
12
  stroke: Shoes::COLORS[:black],
14
13
  strokewidth: 1
@@ -29,17 +28,15 @@ class Shoes
29
28
  # Adds styles, or just returns current style if no argument
30
29
  def style(new_styles = nil)
31
30
  update_style(new_styles) if need_to_update_style?(new_styles)
32
- update_dimensions if styles_with_dimensions?
33
31
  @style
34
32
  end
35
33
 
36
34
  def style_init(arg_styles, new_styles = {})
37
35
  default_element_styles = {}
38
- default_element_styles = self.class::STYLES if defined? self.class::STYLES
39
-
36
+ default_element_styles = self.class::STYLES if defined?(self.class::STYLES)
40
37
  create_style_hash
41
- merge_app_styles
42
38
  @style.merge!(default_element_styles)
39
+ merge_app_styles
43
40
  @style.merge!(@app.element_styles[self.class]) if @app.element_styles[self.class]
44
41
  @style.merge!(new_styles)
45
42
  @style.merge!(arg_styles)
@@ -109,7 +106,8 @@ class Shoes
109
106
  end
110
107
 
111
108
  private
112
- def support_style group_style
109
+
110
+ def support_style(group_style)
113
111
  @supported_styles << group_style
114
112
  end
115
113
  end # end of StyleWith module
@@ -123,6 +121,8 @@ class Shoes
123
121
  def update_style(new_styles)
124
122
  normalized_style = StyleNormalizer.new.normalize(new_styles)
125
123
  set_dimensions(new_styles)
124
+ set_visibility(new_styles)
125
+ set_coloring(new_styles)
126
126
  click(&new_styles[:click]) if new_styles.key?(:click)
127
127
  @style.merge! normalized_style
128
128
  end
@@ -134,9 +134,23 @@ class Shoes
134
134
  end
135
135
  end
136
136
 
137
+ def set_visibility(new_styles)
138
+ return unless new_styles.include?(:hidden)
139
+ @style[:hidden] = new_styles[:hidden]
140
+ update_visibility
141
+ end
142
+
143
+ def set_coloring(new_styles)
144
+ update_fill if new_styles.include?(:fill)
145
+ update_stroke if new_styles.include?(:stroke)
146
+ end
147
+
137
148
  def update_dimensions # so that @style hash matches actual values
138
149
  STYLE_GROUPS[:dimensions].each do |style|
139
- @style[style] = send(style) if self.respond_to? style
150
+ if self.respond_to?(style)
151
+ value = send(style)
152
+ @style[style] = value if value
153
+ end
140
154
  end
141
155
  end
142
156
 
@@ -5,9 +5,7 @@ class Shoes
5
5
  def normalize(orig_style)
6
6
  normalized_style = {}
7
7
  [:fill, :stroke].each do |s|
8
- if orig_style[s]
9
- normalized_style[s] = pattern(orig_style[s])
10
- end
8
+ normalized_style[s] = pattern(orig_style[s]) if orig_style[s]
11
9
  end
12
10
  orig_style.merge(normalized_style)
13
11
  end
@@ -1,11 +1,21 @@
1
1
  class Shoes
2
2
  module Common
3
3
  module UIElement
4
+ include Common::Initialization
4
5
  include Common::Inspect
5
6
  include Common::Visibility
6
7
  include Common::Positioning
7
8
  include Common::Remove
9
+ include Common::Rotate
8
10
  include DimensionsDelegations
11
+
12
+ # Expected to be overridden by pulling in Common::Fill or Common::Stroke
13
+ # if element needs to actually notify GUI classes of colors changes.
14
+ def update_fill
15
+ end
16
+
17
+ def update_stroke
18
+ end
9
19
  end
10
20
  end
11
21
  end
@@ -3,12 +3,12 @@ class Shoes
3
3
  module Visibility
4
4
  # Hides the element, so that it can't be seen. See also #show and #toggle.
5
5
  def hide
6
- @hidden = true
6
+ style[:hidden] = true
7
7
  update_visibility
8
8
  end
9
9
 
10
10
  def hidden?
11
- @hidden
11
+ style[:hidden]
12
12
  end
13
13
 
14
14
  alias_method :hidden, :hidden?
@@ -19,14 +19,14 @@ class Shoes
19
19
 
20
20
  # Reveals the element, if it is hidden. See also #hide and #toggle.
21
21
  def show
22
- @hidden = false
22
+ style[:hidden] = false
23
23
  update_visibility
24
24
  end
25
25
 
26
26
  # Hides an element if it is shown. Or shows the element, if it is hidden.
27
27
  # See also #hide and #show.
28
28
  def toggle
29
- @hidden = !@hidden
29
+ style[:hidden] = !style[:hidden]
30
30
  update_visibility
31
31
  end
32
32
 
@@ -43,8 +43,10 @@ class Shoes
43
43
  # Shoes.configuration.backend_class(shoes_button) # => Shoes::Swt::Button
44
44
  def backend_class(shoes_object)
45
45
  class_name = shoes_object.class.name.split("::").last
46
- fail ArgumentError, "#{shoes_object} does not have a backend class defined for #{backend}" unless backend.const_defined?(class_name)
47
- backend.const_get(class_name)
46
+ # Lookup with false to not consult modules higher in the chain Object
47
+ # because Shoes::Swt.const_defined? 'Range' => true
48
+ fail ArgumentError, "#{shoes_object} does not have a backend class defined for #{backend}" unless backend.const_defined?(class_name, false)
49
+ backend.const_get(class_name, false)
48
50
  end
49
51
 
50
52
  # Creates an appropriate backend object, passing along additional arguments