shoes-dsl 4.0.0.pre2

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 (209) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +84 -0
  3. data/Gemfile +24 -0
  4. data/Guardfile +11 -0
  5. data/LICENSE +31 -0
  6. data/README.md +201 -0
  7. data/ext/install/Rakefile +29 -0
  8. data/ext/install/shoes.bat +9 -0
  9. data/fonts/Coolvetica.ttf +0 -0
  10. data/fonts/Lacuna.ttf +0 -0
  11. data/lib/shoes/animation.rb +56 -0
  12. data/lib/shoes/app.rb +131 -0
  13. data/lib/shoes/arc.rb +25 -0
  14. data/lib/shoes/background.rb +24 -0
  15. data/lib/shoes/border.rb +24 -0
  16. data/lib/shoes/builtin_methods.rb +77 -0
  17. data/lib/shoes/button.rb +30 -0
  18. data/lib/shoes/check_button.rb +44 -0
  19. data/lib/shoes/color.rb +385 -0
  20. data/lib/shoes/common/background_element.rb +9 -0
  21. data/lib/shoes/common/changeable.rb +34 -0
  22. data/lib/shoes/common/clickable.rb +24 -0
  23. data/lib/shoes/common/inspect.rb +14 -0
  24. data/lib/shoes/common/positioning.rb +30 -0
  25. data/lib/shoes/common/registration.rb +33 -0
  26. data/lib/shoes/common/remove.rb +10 -0
  27. data/lib/shoes/common/state.rb +18 -0
  28. data/lib/shoes/common/style.rb +152 -0
  29. data/lib/shoes/common/style_normalizer.rb +16 -0
  30. data/lib/shoes/common/ui_element.rb +11 -0
  31. data/lib/shoes/common/visibility.rb +40 -0
  32. data/lib/shoes/configuration.rb +96 -0
  33. data/lib/shoes/dialog.rb +27 -0
  34. data/lib/shoes/dimension.rb +239 -0
  35. data/lib/shoes/dimensions.rb +209 -0
  36. data/lib/shoes/download.rb +121 -0
  37. data/lib/shoes/dsl.rb +591 -0
  38. data/lib/shoes/font.rb +49 -0
  39. data/lib/shoes/gradient.rb +31 -0
  40. data/lib/shoes/image.rb +29 -0
  41. data/lib/shoes/image_pattern.rb +12 -0
  42. data/lib/shoes/input_box.rb +60 -0
  43. data/lib/shoes/internal_app.rb +219 -0
  44. data/lib/shoes/key_event.rb +17 -0
  45. data/lib/shoes/line.rb +87 -0
  46. data/lib/shoes/link.rb +59 -0
  47. data/lib/shoes/link_hover.rb +5 -0
  48. data/lib/shoes/list_box.rb +50 -0
  49. data/lib/shoes/logger.rb +66 -0
  50. data/lib/shoes/logger/ruby.rb +18 -0
  51. data/lib/shoes/mock.rb +31 -0
  52. data/lib/shoes/mock/animation.rb +8 -0
  53. data/lib/shoes/mock/app.rb +47 -0
  54. data/lib/shoes/mock/arc.rb +9 -0
  55. data/lib/shoes/mock/background.rb +10 -0
  56. data/lib/shoes/mock/border.rb +7 -0
  57. data/lib/shoes/mock/button.rb +10 -0
  58. data/lib/shoes/mock/check.rb +25 -0
  59. data/lib/shoes/mock/clickable.rb +8 -0
  60. data/lib/shoes/mock/common_methods.rb +12 -0
  61. data/lib/shoes/mock/dialog.rb +13 -0
  62. data/lib/shoes/mock/download.rb +18 -0
  63. data/lib/shoes/mock/font.rb +17 -0
  64. data/lib/shoes/mock/image.rb +13 -0
  65. data/lib/shoes/mock/image_pattern.rb +9 -0
  66. data/lib/shoes/mock/input_box.rb +30 -0
  67. data/lib/shoes/mock/keypress.rb +10 -0
  68. data/lib/shoes/mock/keyrelease.rb +10 -0
  69. data/lib/shoes/mock/line.rb +14 -0
  70. data/lib/shoes/mock/link.rb +12 -0
  71. data/lib/shoes/mock/list_box.rb +19 -0
  72. data/lib/shoes/mock/oval.rb +12 -0
  73. data/lib/shoes/mock/progress.rb +10 -0
  74. data/lib/shoes/mock/radio.rb +27 -0
  75. data/lib/shoes/mock/rect.rb +14 -0
  76. data/lib/shoes/mock/shape.rb +20 -0
  77. data/lib/shoes/mock/slot.rb +16 -0
  78. data/lib/shoes/mock/sound.rb +8 -0
  79. data/lib/shoes/mock/star.rb +14 -0
  80. data/lib/shoes/mock/text_block.rb +36 -0
  81. data/lib/shoes/mock/timer.rb +8 -0
  82. data/lib/shoes/not_implemented_error.rb +4 -0
  83. data/lib/shoes/oval.rb +20 -0
  84. data/lib/shoes/point.rb +54 -0
  85. data/lib/shoes/progress.rb +25 -0
  86. data/lib/shoes/radio.rb +16 -0
  87. data/lib/shoes/rect.rb +21 -0
  88. data/lib/shoes/renamed_delegate.rb +15 -0
  89. data/lib/shoes/shape.rb +158 -0
  90. data/lib/shoes/slot.rb +271 -0
  91. data/lib/shoes/slot_contents.rb +50 -0
  92. data/lib/shoes/sound.rb +18 -0
  93. data/lib/shoes/span.rb +16 -0
  94. data/lib/shoes/star.rb +45 -0
  95. data/lib/shoes/text.rb +24 -0
  96. data/lib/shoes/text_block.rb +143 -0
  97. data/lib/shoes/text_block_dimensions.rb +52 -0
  98. data/lib/shoes/timer.rb +12 -0
  99. data/lib/shoes/url.rb +44 -0
  100. data/lib/shoes/version.rb +3 -0
  101. data/lib/shoes/widget.rb +69 -0
  102. data/manifests/common.rb +34 -0
  103. data/manifests/shoes-dsl.rb +34 -0
  104. data/shoes-dsl.gemspec +19 -0
  105. data/spec/code_coverage.rb +14 -0
  106. data/spec/shoes/animation_spec.rb +65 -0
  107. data/spec/shoes/app_spec.rb +484 -0
  108. data/spec/shoes/arc_spec.rb +51 -0
  109. data/spec/shoes/background_spec.rb +53 -0
  110. data/spec/shoes/border_spec.rb +47 -0
  111. data/spec/shoes/builtin_methods_spec.rb +110 -0
  112. data/spec/shoes/button_spec.rb +44 -0
  113. data/spec/shoes/check_spec.rb +35 -0
  114. data/spec/shoes/cli_spec.rb +15 -0
  115. data/spec/shoes/color_spec.rb +408 -0
  116. data/spec/shoes/common/inspect_spec.rb +26 -0
  117. data/spec/shoes/common/remove_spec.rb +38 -0
  118. data/spec/shoes/common/style_normalizer_spec.rb +28 -0
  119. data/spec/shoes/common/style_spec.rb +147 -0
  120. data/spec/shoes/configuration_spec.rb +36 -0
  121. data/spec/shoes/constants_spec.rb +38 -0
  122. data/spec/shoes/dialog_spec.rb +163 -0
  123. data/spec/shoes/dimension_spec.rb +407 -0
  124. data/spec/shoes/dimensions_spec.rb +837 -0
  125. data/spec/shoes/download_spec.rb +142 -0
  126. data/spec/shoes/flow_spec.rb +133 -0
  127. data/spec/shoes/font_spec.rb +37 -0
  128. data/spec/shoes/framework_learning_spec.rb +30 -0
  129. data/spec/shoes/gradient_spec.rb +32 -0
  130. data/spec/shoes/helpers/fake_element.rb +17 -0
  131. data/spec/shoes/helpers/inspect_helpers.rb +5 -0
  132. data/spec/shoes/helpers/sample17_helper.rb +66 -0
  133. data/spec/shoes/image_spec.rb +49 -0
  134. data/spec/shoes/images/shoe.jpg +0 -0
  135. data/spec/shoes/input_box_spec.rb +80 -0
  136. data/spec/shoes/integration_spec.rb +20 -0
  137. data/spec/shoes/internal_app_spec.rb +141 -0
  138. data/spec/shoes/keypress_spec.rb +11 -0
  139. data/spec/shoes/keyrelease_spec.rb +12 -0
  140. data/spec/shoes/line_spec.rb +49 -0
  141. data/spec/shoes/link_spec.rb +105 -0
  142. data/spec/shoes/list_box_spec.rb +74 -0
  143. data/spec/shoes/logger/ruby_spec.rb +8 -0
  144. data/spec/shoes/logger_spec.rb +45 -0
  145. data/spec/shoes/oval_spec.rb +24 -0
  146. data/spec/shoes/point_spec.rb +71 -0
  147. data/spec/shoes/progress_spec.rb +54 -0
  148. data/spec/shoes/radio_spec.rb +32 -0
  149. data/spec/shoes/rect_spec.rb +39 -0
  150. data/spec/shoes/renamed_delegate_spec.rb +70 -0
  151. data/spec/shoes/shape_spec.rb +95 -0
  152. data/spec/shoes/shared_examples/button.rb +6 -0
  153. data/spec/shoes/shared_examples/changeable.rb +26 -0
  154. data/spec/shoes/shared_examples/clickable.rb +5 -0
  155. data/spec/shoes/shared_examples/common_methods.rb +35 -0
  156. data/spec/shoes/shared_examples/dimensions.rb +32 -0
  157. data/spec/shoes/shared_examples/dsl.rb +44 -0
  158. data/spec/shoes/shared_examples/dsl/animate.rb +29 -0
  159. data/spec/shoes/shared_examples/dsl/arc.rb +45 -0
  160. data/spec/shoes/shared_examples/dsl/background.rb +26 -0
  161. data/spec/shoes/shared_examples/dsl/border.rb +10 -0
  162. data/spec/shoes/shared_examples/dsl/button.rb +5 -0
  163. data/spec/shoes/shared_examples/dsl/cap.rb +6 -0
  164. data/spec/shoes/shared_examples/dsl/check.rb +11 -0
  165. data/spec/shoes/shared_examples/dsl/edit_box.rb +8 -0
  166. data/spec/shoes/shared_examples/dsl/edit_line.rb +8 -0
  167. data/spec/shoes/shared_examples/dsl/editable_element.rb +29 -0
  168. data/spec/shoes/shared_examples/dsl/fill.rb +27 -0
  169. data/spec/shoes/shared_examples/dsl/flow.rb +15 -0
  170. data/spec/shoes/shared_examples/dsl/gradient.rb +62 -0
  171. data/spec/shoes/shared_examples/dsl/image.rb +21 -0
  172. data/spec/shoes/shared_examples/dsl/line.rb +9 -0
  173. data/spec/shoes/shared_examples/dsl/nofill.rb +6 -0
  174. data/spec/shoes/shared_examples/dsl/nostroke.rb +6 -0
  175. data/spec/shoes/shared_examples/dsl/oval.rb +88 -0
  176. data/spec/shoes/shared_examples/dsl/pattern.rb +34 -0
  177. data/spec/shoes/shared_examples/dsl/progress.rb +7 -0
  178. data/spec/shoes/shared_examples/dsl/rect.rb +92 -0
  179. data/spec/shoes/shared_examples/dsl/rgb.rb +26 -0
  180. data/spec/shoes/shared_examples/dsl/shape.rb +21 -0
  181. data/spec/shoes/shared_examples/dsl/star.rb +48 -0
  182. data/spec/shoes/shared_examples/dsl/stroke.rb +30 -0
  183. data/spec/shoes/shared_examples/dsl/strokewidth.rb +19 -0
  184. data/spec/shoes/shared_examples/dsl/style.rb +32 -0
  185. data/spec/shoes/shared_examples/dsl/text_elements.rb +81 -0
  186. data/spec/shoes/shared_examples/dsl/video.rb +5 -0
  187. data/spec/shoes/shared_examples/dsl_app_context.rb +8 -0
  188. data/spec/shoes/shared_examples/hover_leave.rb +11 -0
  189. data/spec/shoes/shared_examples/parent.rb +6 -0
  190. data/spec/shoes/shared_examples/scroll.rb +41 -0
  191. data/spec/shoes/shared_examples/shared_element_method.rb +60 -0
  192. data/spec/shoes/shared_examples/slot.rb +331 -0
  193. data/spec/shoes/shared_examples/state.rb +19 -0
  194. data/spec/shoes/shared_examples/style.rb +82 -0
  195. data/spec/shoes/slot_spec.rb +130 -0
  196. data/spec/shoes/sound_spec.rb +15 -0
  197. data/spec/shoes/span_spec.rb +112 -0
  198. data/spec/shoes/spec_helper.rb +24 -0
  199. data/spec/shoes/stack_spec.rb +79 -0
  200. data/spec/shoes/star_spec.rb +31 -0
  201. data/spec/shoes/text_block_dimensions_spec.rb +75 -0
  202. data/spec/shoes/text_block_spec.rb +270 -0
  203. data/spec/shoes/url_spec.rb +68 -0
  204. data/spec/shoes/widget_spec.rb +70 -0
  205. data/spec/shoes_spec.rb +44 -0
  206. data/spec/spec_helper.rb +18 -0
  207. data/static/Shoes.icns +0 -0
  208. data/static/shoes-icon.png +0 -0
  209. metadata +354 -0
@@ -0,0 +1,9 @@
1
+ class Shoes
2
+ module Common
3
+ module BackgroundElement
4
+ def takes_up_space?
5
+ false
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,34 @@
1
+ class Shoes
2
+ module Common
3
+ # Changeable elements are elements that receive `change' events.
4
+ # These are ListBox, EditBox and EditLine. To have your code respond
5
+ # to these events, either pass a block in when creating the element,
6
+ # or call #change on the element with a block.
7
+ module Changeable
8
+ # Add an extra change event listener block
9
+ #
10
+ # @yield The block to execute on a change event
11
+ def change(&blk)
12
+ add_change_listener(blk)
13
+ end
14
+
15
+ # The GUI backend needs to call this when an actual change happens in
16
+ # the backend.
17
+ def call_change_listeners
18
+ change_listeners.each do |listener|
19
+ listener.call(self)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def change_listeners
26
+ @change_listeners ||= []
27
+ end
28
+
29
+ def add_change_listener(callable)
30
+ change_listeners << callable
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,24 @@
1
+ class Shoes
2
+ module Common
3
+ module Clickable
4
+ attr_accessor :pass_coordinates
5
+
6
+ def click(&blk)
7
+ @gui.click blk
8
+ end
9
+
10
+ def release(&blk)
11
+ @gui.release blk
12
+ end
13
+
14
+ def register_click(blk = nil)
15
+ click(&@style[:click]) if @style[:click]
16
+ click(&blk) if blk
17
+ end
18
+
19
+ def pass_coordinates?
20
+ @pass_coordinates
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ class Shoes
2
+ module Common
3
+ module Inspect
4
+ def to_s
5
+ "(#{self.class.name})"
6
+ end
7
+
8
+ # Object hex representation from https://github.com/michaeldv/awesome_print
9
+ def inspect
10
+ "(#{self.class.name}:#{"0x%08x" % (self.object_id * 2)})"
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,30 @@
1
+ class Shoes
2
+ module Common
3
+ module Positioning
4
+ # Moves an element to a specific pixel position. The element is still in the slot,
5
+ # but will no longer be stacked or flowed with the other stuff in the slot.
6
+ def move(left, top)
7
+ self.left = left
8
+ self.top = top
9
+ self
10
+ end
11
+
12
+ # NOT part of the public interface e.g. no Shoes APP should use this
13
+ # however we need it from the Slot code to position elements
14
+ def _position left, top
15
+ self.absolute_left = left
16
+ self.absolute_top = top
17
+ gui.update_position if gui && gui.respond_to?(:update_position)
18
+ end
19
+
20
+ # displace(left: a number, top: a number) » self
21
+ # Displacing an element moves it. But without changing the layout around it.
22
+ def displace(left, top)
23
+ self.displace_left = left
24
+ self.displace_top = top
25
+ gui.update_position
26
+ self
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ class Shoes
2
+ module Common
3
+ module Registration
4
+ def apps
5
+ @apps ||= []
6
+ @apps.dup
7
+ end
8
+
9
+ def register(app)
10
+ register_main_app app
11
+ apps && @apps << app
12
+ end
13
+
14
+ def unregister(app)
15
+ apps && @apps.delete(app)
16
+ end
17
+
18
+ def unregister_all
19
+ @main_app = nil
20
+ @apps = []
21
+ end
22
+
23
+ def main_app
24
+ @main_app
25
+ end
26
+
27
+ # Registers the first app as the main app
28
+ def register_main_app(app)
29
+ @main_app ||= app
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,10 @@
1
+ class Shoes
2
+ module Common
3
+ module Remove
4
+ def remove
5
+ parent.remove_child self if parent
6
+ gui.remove if gui && gui.respond_to?(:remove)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,18 @@
1
+ class Shoes
2
+ module Common
3
+ module State
4
+ def state
5
+ @state
6
+ end
7
+
8
+ def state=(value)
9
+ @state = value
10
+ @gui.enabled value.nil?
11
+ end
12
+
13
+ def state_options(opts)
14
+ self.state = opts[:state]
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,152 @@
1
+ class Shoes
2
+ module Common
3
+ # Style methods.
4
+ module Style
5
+
6
+ DEFAULT_STYLES = {
7
+ fill: Shoes::COLORS[:black],
8
+ rotate: 0,
9
+ stroke: Shoes::COLORS[:black],
10
+ strokewidth: 1
11
+ }
12
+
13
+ STYLE_GROUPS = {
14
+ art_styles: [:cap, :click, :fill, :rotate, :stroke, :strokewidth, :transform, :translate],
15
+ common_styles: [:displace_left, :displace_top, :hidden],
16
+ dimensions: [:bottom, :height, :left, :margin,
17
+ :margin_bottom, :margin_left, :margin_right,
18
+ :margin_top, :right, :top, :width],
19
+ text_block_styles: [:align, :click, :emphasis, :family, :fill, :font,
20
+ :justify, :kerning, :leading, :rise, :size, :stretch,
21
+ :strikecolor, :strikethrough, :stroke, :undercolor,
22
+ :underline, :weight, :wrap],
23
+ }
24
+
25
+ # Adds styles, or just returns current style if no argument
26
+ def style(new_styles = nil)
27
+ update_style(new_styles) if need_to_update_style?(new_styles)
28
+ update_dimensions if styles_with_dimensions?
29
+ @style
30
+ end
31
+
32
+ def style_init(arg_styles, new_styles = {})
33
+ default_element_styles = {}
34
+ default_element_styles = self.class::STYLES if defined? self.class::STYLES
35
+
36
+ create_style_hash
37
+ merge_app_styles
38
+ @style.merge!(default_element_styles)
39
+ @style.merge!(@app.element_styles[self.class]) if @app.element_styles[self.class]
40
+ @style.merge!(new_styles)
41
+ @style.merge!(arg_styles)
42
+ @style = StyleNormalizer.new.normalize(@style)
43
+ end
44
+
45
+ def create_style_hash
46
+ @style = {}
47
+ supported_styles.each do |key|
48
+ @style[key] = nil
49
+ end
50
+ end
51
+
52
+ def merge_app_styles
53
+ @app.style.each do |key, val|
54
+ @style[key] = val if self.supported_styles.include? key
55
+ end
56
+ end
57
+
58
+ module StyleWith
59
+ def style_with(*styles)
60
+ @supported_styles = []
61
+
62
+ unpack_style_groups(styles)
63
+ define_reader_methods
64
+ define_writer_methods
65
+ end
66
+
67
+ def unpack_style_groups(styles)
68
+ styles.each do |style|
69
+ if STYLE_GROUPS[style]
70
+ STYLE_GROUPS[style].each{|style| @supported_styles << style}
71
+ else
72
+ @supported_styles << style
73
+ end
74
+ end
75
+
76
+ supported_styles = @supported_styles
77
+
78
+ define_method("supported_styles") do
79
+ supported_styles
80
+ end
81
+ end
82
+
83
+ def define_reader_methods
84
+ needs_readers = @supported_styles.reject do |style|
85
+ self.method_defined?(style)
86
+ end
87
+
88
+ needs_readers.map(&:to_sym).each do |style|
89
+ define_method style do
90
+ @style[style]
91
+ end
92
+ end
93
+ end
94
+
95
+ def define_writer_methods
96
+ needs_writers = @supported_styles.reject do |style|
97
+ self.method_defined?("#{style}=")
98
+ end
99
+
100
+ needs_writers.map(&:to_sym).each do |style_key|
101
+ define_method "#{style_key}=" do |new_style|
102
+ self.send("style", style_key.to_sym => new_style)
103
+ end
104
+ end
105
+ end
106
+ end #end of StyleWith module
107
+
108
+ def self.included(klass)
109
+ klass.extend StyleWith
110
+ end
111
+
112
+ private
113
+
114
+ def update_style(new_styles)
115
+ normalized_style = StyleNormalizer.new.normalize(new_styles)
116
+ set_dimensions(new_styles)
117
+ click(&new_styles[:click]) if new_styles.has_key?(:click)
118
+ @style.merge! normalized_style
119
+ end
120
+
121
+ #if dimension is set via style, pass info on to the dimensions setter
122
+ def set_dimensions(new_styles)
123
+ new_styles.each do |key, value|
124
+ self.send("#{key}=", value) if STYLE_GROUPS[:dimensions].include?(key)
125
+ end
126
+ end
127
+
128
+ def update_dimensions #so that @style hash matches actual values
129
+ STYLE_GROUPS[:dimensions].each do |style|
130
+ @style[style] = self.send(style) if self.respond_to? style
131
+ end
132
+ end
133
+
134
+ def styles_with_dimensions?
135
+ STYLE_GROUPS[:dimensions].any? {|dimension| @style.has_key? dimension}
136
+ end
137
+
138
+ def need_to_update_style?(new_styles)
139
+ new_styles && style_changed?(new_styles)
140
+ end
141
+
142
+ # check necessary because update_style triggers a redraw in the redrawing
143
+ # aspect and we want to avoid unnecessary redraws
144
+ def style_changed?(new_styles)
145
+ new_styles.each_pair.any? do |key, value|
146
+ @style[key] != value
147
+ end
148
+ end
149
+
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,16 @@
1
+ class Shoes
2
+ module Common
3
+ class StyleNormalizer
4
+ include Color::DSLHelpers
5
+ def normalize(orig_style)
6
+ normalized_style = {}
7
+ [:fill, :stroke].each do |s|
8
+ if orig_style[s]
9
+ normalized_style[s] = pattern(orig_style[s])
10
+ end
11
+ end
12
+ orig_style.merge(normalized_style)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ class Shoes
2
+ module Common
3
+ module UIElement
4
+ include Common::Inspect
5
+ include Common::Visibility
6
+ include Common::Positioning
7
+ include Common::Remove
8
+ include DimensionsDelegations
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,40 @@
1
+ class Shoes
2
+ module Common
3
+ module Visibility
4
+ # Hides the element, so that it can't be seen. See also #show and #toggle.
5
+ def hide
6
+ @hidden = true
7
+ update_visibility
8
+ end
9
+
10
+ def hidden?
11
+ @hidden
12
+ end
13
+
14
+ alias_method :hidden, :hidden?
15
+
16
+ def visible?
17
+ !hidden?
18
+ end
19
+
20
+ # Reveals the element, if it is hidden. See also #hide and #toggle.
21
+ def show
22
+ @hidden = false
23
+ update_visibility
24
+ end
25
+
26
+ # Hides an element if it is shown. Or shows the element, if it is hidden.
27
+ # See also #hide and #show.
28
+ def toggle
29
+ @hidden = !@hidden
30
+ update_visibility
31
+ end
32
+
33
+ private
34
+ def update_visibility
35
+ gui.update_visibility
36
+ self
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,96 @@
1
+ class Shoes
2
+ class Configuration
3
+ class << self
4
+ def reset
5
+ @logger = nil
6
+ @logger_instance = nil
7
+ end
8
+
9
+ def backend
10
+ @backend ||= Shoes.load_backend(backend_name)
11
+ end
12
+
13
+ def backend_name
14
+ @backend_name ||= ENV.fetch('SHOES_BACKEND', default_backend).to_sym
15
+ end
16
+
17
+ def default_backend
18
+ if caller.any? {|path| path =~ /rspec/}
19
+ :mock
20
+ else
21
+ :swt
22
+ end
23
+ end
24
+
25
+ # The Shoes backend to use. Can only be set once.
26
+ #
27
+ # @param [Symbol] backend The backend's name
28
+ # @return [Module] The backend's root module
29
+ # @example
30
+ # Shoes::Configuration.backend = :swt # => Shoes::Swt
31
+ def backend=(name)
32
+ unless @backend.nil?
33
+ raise "Can't switch backend to Shoes::#{name.capitalize}, Shoes::#{backend_name.capitalize} backend already loaded."
34
+ end
35
+ @backend_name ||= name
36
+ end
37
+
38
+ # Finds the appropriate backend class for the given Shoes object
39
+ #
40
+ # @param [Object] shoes_object A Shoes object
41
+ # @return [Object] An appropriate backend class
42
+ # @example
43
+ # Shoes.configuration.backend_class(shoes_button) # => Shoes::Swt::Button
44
+ def backend_class(shoes_object)
45
+ class_name = shoes_object.class.name.split("::").last
46
+ raise ArgumentError, "#{shoes_object} does not have a backend class defined for #{backend}" unless self.backend.const_defined?(class_name)
47
+ self.backend.const_get(class_name)
48
+ end
49
+
50
+ # Creates an appropriate backend object, passing along additional arguments
51
+ #
52
+ # @param [Object] shoes_object A Shoes object
53
+ # @return [Object] An appropriate backend object
54
+ # @example
55
+ # Shoes.configuration.backend_for(button, args) # => <Shoes::Swt::Button:0x12345678>
56
+ def backend_for(shoes_object, *args)
57
+ backend_factory(shoes_object).call(shoes_object, *args)
58
+ end
59
+
60
+ # Experimental replacement for #backend_for
61
+ def backend_with_app_for(shoes_object, *args, &blk)
62
+ backend_factory(shoes_object).call(shoes_object, shoes_object.app.gui, *args, &blk)
63
+ end
64
+
65
+ def backend_factory(shoes_object)
66
+ klass = backend_class(shoes_object)
67
+ klass.respond_to?(:create) ? klass.method(:create) : klass.method(:new)
68
+ end
69
+
70
+ def logger=(value)
71
+ @logger = value
72
+ @logger_instance = nil
73
+ end
74
+
75
+ def logger
76
+ @logger ||= :ruby
77
+ end
78
+
79
+ def logger_instance
80
+ @logger_instance ||= Shoes::Logger.get(self.logger).new
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ def Shoes.configuration
87
+ Shoes::Configuration
88
+ end
89
+
90
+ def Shoes.backend_for(shoes_object, *args, &blk)
91
+ Shoes::Configuration.backend_with_app_for(shoes_object, *args, &blk)
92
+ end
93
+
94
+ def Shoes.backend
95
+ Shoes.configuration.backend
96
+ end