shoes-core 4.0.0.pre3

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 (219) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +31 -0
  3. data/README.md +8 -0
  4. data/Rakefile +1 -0
  5. data/bin/shoes +62 -0
  6. data/bin/shoes-guard +8 -0
  7. data/bin/shoes-picker +6 -0
  8. data/bin/shoes-stub +62 -0
  9. data/ext/install/Rakefile +29 -0
  10. data/ext/install/shoes.bat +15 -0
  11. data/fonts/Coolvetica.ttf +0 -0
  12. data/fonts/Lacuna.ttf +0 -0
  13. data/lib/rubygems_plugin.rb +24 -0
  14. data/lib/shoes.rb +1 -0
  15. data/lib/shoes/animation.rb +56 -0
  16. data/lib/shoes/app.rb +130 -0
  17. data/lib/shoes/arc.rb +25 -0
  18. data/lib/shoes/background.rb +20 -0
  19. data/lib/shoes/border.rb +20 -0
  20. data/lib/shoes/builtin_methods.rb +76 -0
  21. data/lib/shoes/button.rb +29 -0
  22. data/lib/shoes/check_button.rb +41 -0
  23. data/lib/shoes/color.rb +387 -0
  24. data/lib/shoes/common/background_element.rb +9 -0
  25. data/lib/shoes/common/changeable.rb +34 -0
  26. data/lib/shoes/common/clickable.rb +24 -0
  27. data/lib/shoes/common/inspect.rb +14 -0
  28. data/lib/shoes/common/positioning.rb +30 -0
  29. data/lib/shoes/common/registration.rb +31 -0
  30. data/lib/shoes/common/remove.rb +10 -0
  31. data/lib/shoes/common/state.rb +16 -0
  32. data/lib/shoes/common/style.rb +160 -0
  33. data/lib/shoes/common/style_normalizer.rb +16 -0
  34. data/lib/shoes/common/ui_element.rb +11 -0
  35. data/lib/shoes/common/visibility.rb +41 -0
  36. data/lib/shoes/configuration.rb +96 -0
  37. data/lib/shoes/core.rb +1 -0
  38. data/lib/shoes/core/version.rb +5 -0
  39. data/lib/shoes/dialog.rb +56 -0
  40. data/lib/shoes/dimension.rb +269 -0
  41. data/lib/shoes/dimensions.rb +203 -0
  42. data/lib/shoes/download.rb +130 -0
  43. data/lib/shoes/dsl.rb +656 -0
  44. data/lib/shoes/file_not_found_error.rb +4 -0
  45. data/lib/shoes/font.rb +50 -0
  46. data/lib/shoes/gradient.rb +31 -0
  47. data/lib/shoes/image.rb +53 -0
  48. data/lib/shoes/image_pattern.rb +12 -0
  49. data/lib/shoes/input_box.rb +59 -0
  50. data/lib/shoes/internal_app.rb +230 -0
  51. data/lib/shoes/key_event.rb +17 -0
  52. data/lib/shoes/line.rb +84 -0
  53. data/lib/shoes/link.rb +57 -0
  54. data/lib/shoes/link_hover.rb +5 -0
  55. data/lib/shoes/list_box.rb +50 -0
  56. data/lib/shoes/logger.rb +65 -0
  57. data/lib/shoes/logger/ruby.rb +16 -0
  58. data/lib/shoes/mock.rb +33 -0
  59. data/lib/shoes/mock/animation.rb +8 -0
  60. data/lib/shoes/mock/app.rb +49 -0
  61. data/lib/shoes/mock/arc.rb +9 -0
  62. data/lib/shoes/mock/background.rb +10 -0
  63. data/lib/shoes/mock/border.rb +7 -0
  64. data/lib/shoes/mock/button.rb +22 -0
  65. data/lib/shoes/mock/check.rb +24 -0
  66. data/lib/shoes/mock/clickable.rb +8 -0
  67. data/lib/shoes/mock/common_methods.rb +12 -0
  68. data/lib/shoes/mock/dialog.rb +13 -0
  69. data/lib/shoes/mock/download.rb +16 -0
  70. data/lib/shoes/mock/font.rb +15 -0
  71. data/lib/shoes/mock/image.rb +13 -0
  72. data/lib/shoes/mock/image_pattern.rb +8 -0
  73. data/lib/shoes/mock/input_box.rb +30 -0
  74. data/lib/shoes/mock/keypress.rb +11 -0
  75. data/lib/shoes/mock/keyrelease.rb +11 -0
  76. data/lib/shoes/mock/line.rb +14 -0
  77. data/lib/shoes/mock/link.rb +11 -0
  78. data/lib/shoes/mock/list_box.rb +19 -0
  79. data/lib/shoes/mock/oval.rb +11 -0
  80. data/lib/shoes/mock/packager.rb +13 -0
  81. data/lib/shoes/mock/progress.rb +10 -0
  82. data/lib/shoes/mock/radio.rb +27 -0
  83. data/lib/shoes/mock/rect.rb +14 -0
  84. data/lib/shoes/mock/shape.rb +20 -0
  85. data/lib/shoes/mock/slot.rb +16 -0
  86. data/lib/shoes/mock/sound.rb +8 -0
  87. data/lib/shoes/mock/star.rb +14 -0
  88. data/lib/shoes/mock/text_block.rb +36 -0
  89. data/lib/shoes/mock/timer.rb +8 -0
  90. data/lib/shoes/not_implemented_error.rb +4 -0
  91. data/lib/shoes/oval.rb +20 -0
  92. data/lib/shoes/packager.rb +26 -0
  93. data/lib/shoes/point.rb +54 -0
  94. data/lib/shoes/progress.rb +25 -0
  95. data/lib/shoes/radio.rb +15 -0
  96. data/lib/shoes/rect.rb +21 -0
  97. data/lib/shoes/renamed_delegate.rb +15 -0
  98. data/lib/shoes/shape.rb +159 -0
  99. data/lib/shoes/slot.rb +276 -0
  100. data/lib/shoes/slot_contents.rb +51 -0
  101. data/lib/shoes/sound.rb +18 -0
  102. data/lib/shoes/span.rb +16 -0
  103. data/lib/shoes/star.rb +50 -0
  104. data/lib/shoes/text.rb +24 -0
  105. data/lib/shoes/text_block.rb +142 -0
  106. data/lib/shoes/text_block_dimensions.rb +51 -0
  107. data/lib/shoes/timer.rb +14 -0
  108. data/lib/shoes/ui/cli.rb +67 -0
  109. data/lib/shoes/ui/picker.rb +47 -0
  110. data/lib/shoes/url.rb +44 -0
  111. data/lib/shoes/version.rb +3 -0
  112. data/lib/shoes/widget.rb +67 -0
  113. data/shoes-core.gemspec +22 -0
  114. data/spec/shoes/animation_spec.rb +71 -0
  115. data/spec/shoes/app_spec.rb +484 -0
  116. data/spec/shoes/arc_spec.rb +51 -0
  117. data/spec/shoes/background_spec.rb +47 -0
  118. data/spec/shoes/border_spec.rb +46 -0
  119. data/spec/shoes/builtin_methods_spec.rb +110 -0
  120. data/spec/shoes/button_spec.rb +44 -0
  121. data/spec/shoes/check_spec.rb +35 -0
  122. data/spec/shoes/color_spec.rb +408 -0
  123. data/spec/shoes/common/inspect_spec.rb +26 -0
  124. data/spec/shoes/common/remove_spec.rb +38 -0
  125. data/spec/shoes/common/style_normalizer_spec.rb +28 -0
  126. data/spec/shoes/common/style_spec.rb +147 -0
  127. data/spec/shoes/configuration_spec.rb +36 -0
  128. data/spec/shoes/constants_spec.rb +38 -0
  129. data/spec/shoes/dialog_spec.rb +171 -0
  130. data/spec/shoes/dimension_spec.rb +433 -0
  131. data/spec/shoes/dimensions_spec.rb +837 -0
  132. data/spec/shoes/download_spec.rb +146 -0
  133. data/spec/shoes/flow_spec.rb +133 -0
  134. data/spec/shoes/font_spec.rb +37 -0
  135. data/spec/shoes/framework_learning_spec.rb +30 -0
  136. data/spec/shoes/gradient_spec.rb +32 -0
  137. data/spec/shoes/helpers/fake_element.rb +17 -0
  138. data/spec/shoes/helpers/inspect_helpers.rb +5 -0
  139. data/spec/shoes/helpers/sample17_helper.rb +66 -0
  140. data/spec/shoes/image_spec.rb +68 -0
  141. data/spec/shoes/images/shoe.jpg +0 -0
  142. data/spec/shoes/input_box_spec.rb +80 -0
  143. data/spec/shoes/integration_spec.rb +20 -0
  144. data/spec/shoes/internal_app_spec.rb +141 -0
  145. data/spec/shoes/keypress_spec.rb +11 -0
  146. data/spec/shoes/keyrelease_spec.rb +12 -0
  147. data/spec/shoes/line_spec.rb +87 -0
  148. data/spec/shoes/link_spec.rb +118 -0
  149. data/spec/shoes/list_box_spec.rb +74 -0
  150. data/spec/shoes/logger/ruby_spec.rb +8 -0
  151. data/spec/shoes/logger_spec.rb +45 -0
  152. data/spec/shoes/oval_spec.rb +24 -0
  153. data/spec/shoes/packager_spec.rb +25 -0
  154. data/spec/shoes/point_spec.rb +71 -0
  155. data/spec/shoes/progress_spec.rb +54 -0
  156. data/spec/shoes/radio_spec.rb +32 -0
  157. data/spec/shoes/rect_spec.rb +39 -0
  158. data/spec/shoes/renamed_delegate_spec.rb +70 -0
  159. data/spec/shoes/shape_spec.rb +106 -0
  160. data/spec/shoes/shared_examples/button.rb +6 -0
  161. data/spec/shoes/shared_examples/changeable.rb +26 -0
  162. data/spec/shoes/shared_examples/clickable.rb +5 -0
  163. data/spec/shoes/shared_examples/common_methods.rb +35 -0
  164. data/spec/shoes/shared_examples/dimensions.rb +32 -0
  165. data/spec/shoes/shared_examples/dsl.rb +44 -0
  166. data/spec/shoes/shared_examples/dsl/animate.rb +29 -0
  167. data/spec/shoes/shared_examples/dsl/arc.rb +45 -0
  168. data/spec/shoes/shared_examples/dsl/background.rb +26 -0
  169. data/spec/shoes/shared_examples/dsl/border.rb +10 -0
  170. data/spec/shoes/shared_examples/dsl/button.rb +5 -0
  171. data/spec/shoes/shared_examples/dsl/cap.rb +6 -0
  172. data/spec/shoes/shared_examples/dsl/check.rb +11 -0
  173. data/spec/shoes/shared_examples/dsl/edit_box.rb +8 -0
  174. data/spec/shoes/shared_examples/dsl/edit_line.rb +8 -0
  175. data/spec/shoes/shared_examples/dsl/editable_element.rb +29 -0
  176. data/spec/shoes/shared_examples/dsl/fill.rb +27 -0
  177. data/spec/shoes/shared_examples/dsl/flow.rb +15 -0
  178. data/spec/shoes/shared_examples/dsl/gradient.rb +62 -0
  179. data/spec/shoes/shared_examples/dsl/image.rb +21 -0
  180. data/spec/shoes/shared_examples/dsl/line.rb +9 -0
  181. data/spec/shoes/shared_examples/dsl/nofill.rb +6 -0
  182. data/spec/shoes/shared_examples/dsl/nostroke.rb +6 -0
  183. data/spec/shoes/shared_examples/dsl/oval.rb +88 -0
  184. data/spec/shoes/shared_examples/dsl/pattern.rb +34 -0
  185. data/spec/shoes/shared_examples/dsl/progress.rb +7 -0
  186. data/spec/shoes/shared_examples/dsl/rect.rb +92 -0
  187. data/spec/shoes/shared_examples/dsl/rgb.rb +26 -0
  188. data/spec/shoes/shared_examples/dsl/shape.rb +57 -0
  189. data/spec/shoes/shared_examples/dsl/star.rb +111 -0
  190. data/spec/shoes/shared_examples/dsl/stroke.rb +30 -0
  191. data/spec/shoes/shared_examples/dsl/strokewidth.rb +19 -0
  192. data/spec/shoes/shared_examples/dsl/style.rb +32 -0
  193. data/spec/shoes/shared_examples/dsl/text_elements.rb +81 -0
  194. data/spec/shoes/shared_examples/dsl/video.rb +5 -0
  195. data/spec/shoes/shared_examples/dsl_app_context.rb +8 -0
  196. data/spec/shoes/shared_examples/hover_leave.rb +11 -0
  197. data/spec/shoes/shared_examples/parent.rb +6 -0
  198. data/spec/shoes/shared_examples/scroll.rb +41 -0
  199. data/spec/shoes/shared_examples/shared_element_method.rb +60 -0
  200. data/spec/shoes/shared_examples/slot.rb +394 -0
  201. data/spec/shoes/shared_examples/state.rb +19 -0
  202. data/spec/shoes/shared_examples/style.rb +82 -0
  203. data/spec/shoes/slot_spec.rb +186 -0
  204. data/spec/shoes/sound_spec.rb +15 -0
  205. data/spec/shoes/span_spec.rb +112 -0
  206. data/spec/shoes/spec_helper.rb +24 -0
  207. data/spec/shoes/stack_spec.rb +79 -0
  208. data/spec/shoes/star_spec.rb +48 -0
  209. data/spec/shoes/text_block_dimensions_spec.rb +75 -0
  210. data/spec/shoes/text_block_spec.rb +270 -0
  211. data/spec/shoes/url_spec.rb +68 -0
  212. data/spec/shoes/widget_spec.rb +70 -0
  213. data/spec/shoes_spec.rb +44 -0
  214. data/spec/spec_helper.rb +19 -0
  215. data/static/downloading.png +0 -0
  216. data/static/shoes-icon-blue.png +0 -0
  217. data/static/shoes-icon-brown.png +0 -0
  218. data/static/shoes-icon.png +0 -0
  219. metadata +366 -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' % (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,31 @@
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
+ attr_reader :main_app
24
+
25
+ # Registers the first app as the main app
26
+ def register_main_app(app)
27
+ @main_app ||= app
28
+ end
29
+ end
30
+ end
31
+ 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,16 @@
1
+ class Shoes
2
+ module Common
3
+ module State
4
+ attr_reader :state
5
+
6
+ def state=(value)
7
+ @state = value
8
+ @gui.enabled value.nil?
9
+ end
10
+
11
+ def state_options(opts)
12
+ self.state = opts[:state]
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,160 @@
1
+ # The general Style module handles the many optional styles that may be passed
2
+ # to shoes elements upon creates as well as the fact that they can later on be
3
+ # altered through the #style method.
4
+ #
5
+ # Relies upon:
6
+ # @app - a reference to the Shoes applications
7
+ class Shoes
8
+ module Common
9
+ module Style
10
+ DEFAULT_STYLES = {
11
+ fill: Shoes::COLORS[:black],
12
+ rotate: 0,
13
+ stroke: Shoes::COLORS[:black],
14
+ strokewidth: 1
15
+ }
16
+
17
+ STYLE_GROUPS = {
18
+ art_styles: [:cap, :click, :fill, :rotate, :stroke, :strokewidth, :transform, :translate],
19
+ common_styles: [:displace_left, :displace_top, :hidden],
20
+ dimensions: [:bottom, :height, :left, :margin,
21
+ :margin_bottom, :margin_left, :margin_right,
22
+ :margin_top, :right, :top, :width],
23
+ text_block_styles: [:align, :click, :emphasis, :family, :fill, :font,
24
+ :justify, :kerning, :leading, :rise, :size, :stretch,
25
+ :strikecolor, :strikethrough, :stroke, :undercolor,
26
+ :underline, :weight, :wrap],
27
+ }
28
+
29
+ # Adds styles, or just returns current style if no argument
30
+ def style(new_styles = nil)
31
+ update_style(new_styles) if need_to_update_style?(new_styles)
32
+ update_dimensions if styles_with_dimensions?
33
+ @style
34
+ end
35
+
36
+ def style_init(arg_styles, new_styles = {})
37
+ default_element_styles = {}
38
+ default_element_styles = self.class::STYLES if defined? self.class::STYLES
39
+
40
+ create_style_hash
41
+ merge_app_styles
42
+ @style.merge!(default_element_styles)
43
+ @style.merge!(@app.element_styles[self.class]) if @app.element_styles[self.class]
44
+ @style.merge!(new_styles)
45
+ @style.merge!(arg_styles)
46
+ @style = StyleNormalizer.new.normalize(@style)
47
+ end
48
+
49
+ def create_style_hash
50
+ @style = {}
51
+ supported_styles.each do |key|
52
+ @style[key] = nil
53
+ end
54
+ end
55
+
56
+ def merge_app_styles
57
+ @app.style.each do |key, val|
58
+ @style[key] = val if supported_styles.include? key
59
+ end
60
+ end
61
+
62
+ module StyleWith
63
+ def style_with(*styles)
64
+ @supported_styles = []
65
+
66
+ unpack_style_groups(styles)
67
+ define_reader_methods
68
+ define_writer_methods
69
+ end
70
+
71
+ def unpack_style_groups(styles)
72
+ styles.each do |style|
73
+ if STYLE_GROUPS[style]
74
+ STYLE_GROUPS[style].each { |group_style| support_style group_style }
75
+ else
76
+ support_style style
77
+ end
78
+ end
79
+
80
+ supported_styles = @supported_styles
81
+
82
+ define_method("supported_styles") do
83
+ supported_styles
84
+ end
85
+ end
86
+
87
+ def define_reader_methods
88
+ needs_readers = @supported_styles.reject do |style|
89
+ self.method_defined?(style)
90
+ end
91
+
92
+ needs_readers.map(&:to_sym).each do |style|
93
+ define_method style do
94
+ @style[style]
95
+ end
96
+ end
97
+ end
98
+
99
+ def define_writer_methods
100
+ needs_writers = @supported_styles.reject do |style|
101
+ self.method_defined?("#{style}=")
102
+ end
103
+
104
+ needs_writers.map(&:to_sym).each do |style_key|
105
+ define_method "#{style_key}=" do |new_style|
106
+ send("style", style_key.to_sym => new_style)
107
+ end
108
+ end
109
+ end
110
+
111
+ private
112
+ def support_style group_style
113
+ @supported_styles << group_style
114
+ end
115
+ end # end of StyleWith module
116
+
117
+ def self.included(klass)
118
+ klass.extend StyleWith
119
+ end
120
+
121
+ private
122
+
123
+ def update_style(new_styles)
124
+ normalized_style = StyleNormalizer.new.normalize(new_styles)
125
+ set_dimensions(new_styles)
126
+ click(&new_styles[:click]) if new_styles.key?(:click)
127
+ @style.merge! normalized_style
128
+ end
129
+
130
+ # if dimension is set via style, pass info on to the dimensions setter
131
+ def set_dimensions(new_styles)
132
+ new_styles.each do |key, value|
133
+ send("#{key}=", value) if STYLE_GROUPS[:dimensions].include?(key)
134
+ end
135
+ end
136
+
137
+ def update_dimensions # so that @style hash matches actual values
138
+ STYLE_GROUPS[:dimensions].each do |style|
139
+ @style[style] = send(style) if self.respond_to? style
140
+ end
141
+ end
142
+
143
+ def styles_with_dimensions?
144
+ STYLE_GROUPS[:dimensions].any? { |dimension| @style.key? dimension }
145
+ end
146
+
147
+ def need_to_update_style?(new_styles)
148
+ new_styles && style_changed?(new_styles)
149
+ end
150
+
151
+ # check necessary because update_style triggers a redraw in the redrawing
152
+ # aspect and we want to avoid unnecessary redraws
153
+ def style_changed?(new_styles)
154
+ new_styles.each_pair.any? do |key, value|
155
+ @style[key] != value
156
+ end
157
+ end
158
+ end
159
+ end
160
+ 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,41 @@
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
+
35
+ def update_visibility
36
+ gui.update_visibility
37
+ self
38
+ end
39
+ end
40
+ end
41
+ 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
+ fail "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
+ 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)
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(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