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,18 @@
1
+ class Shoes
2
+ class Sound
3
+ include Common::Inspect
4
+
5
+ def initialize(parent, filepath, opts={}, &blk)
6
+ @parent = parent
7
+ @filepath = filepath
8
+
9
+ @gui = Shoes.configuration.backend_for(self)
10
+ end
11
+
12
+ attr_reader :gui, :filepath, :parent
13
+
14
+ def play
15
+ @gui.play
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ class Shoes
2
+ class Span < Text
3
+ def initialize(texts, styles={})
4
+ @style = styles
5
+ super texts, styles.delete(:color)
6
+ end
7
+
8
+ def style
9
+ if @parent_text && @parent_text.respond_to?(:style)
10
+ @parent_text.style.merge(@style)
11
+ else
12
+ @style
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,45 @@
1
+ class Shoes
2
+ class Star
3
+ include Common::UIElement
4
+ include Common::Style
5
+ include Common::Clickable
6
+
7
+ attr_reader :app, :parent, :dimensions, :gui
8
+ style_with :angle, :art_styles,:common_styles, :dimensions, :inner, :outer, :points
9
+ STYLES = {angle: 0}
10
+
11
+ def initialize(app, parent, left, top, points, outer, inner, styles = {}, blk = nil)
12
+ @app = app
13
+ @parent = parent
14
+
15
+ # Careful not to turn Fixnum to Float, lest Dimensions make you relative!
16
+ width = outer*2
17
+
18
+ # Ignore calculated height on Dimensions--will force to match width
19
+ @dimensions = AbsoluteDimensions.new left, top, width, 0
20
+ @dimensions.height = @dimensions.width
21
+
22
+ # Calculate the inner dimensions, which might be relative too
23
+ inner_dimensions = AbsoluteDimensions.new 0, 0, inner*2, 0
24
+
25
+ # Get actual outer/inner from the dimension to handle relative values
26
+ outer = @dimensions.width / 2
27
+ inner = inner_dimensions.width / 2
28
+
29
+ # Now set style using adjust outer and inner
30
+ style_init(styles, inner: inner, outer: outer, points: points)
31
+
32
+ @parent.add_child self
33
+ @gui = Shoes.backend_for self
34
+
35
+ register_click blk
36
+ end
37
+
38
+ def in_bounds?(x, y)
39
+ dx = width / 2.0
40
+ dy = height / 2.0
41
+ left - dx <= x and x <= right - dx and top - dy <= y and y <= bottom - dy
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,24 @@
1
+ class Shoes
2
+ class Text
3
+ include Common::Inspect
4
+
5
+ attr_reader :to_s, :texts, :color
6
+ attr_accessor :parent_text, :text_block
7
+
8
+ def initialize(texts, color=nil)
9
+ @texts = texts
10
+ @color = color
11
+ @to_s = @texts.map(&:to_s).join
12
+ @parent_text = nil
13
+ @text_block = nil
14
+ end
15
+
16
+ def app
17
+ @parent_text.app
18
+ end
19
+
20
+ def inspect
21
+ super.insert(-2, %Q| "#{to_s}"|)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,143 @@
1
+ class Shoes
2
+ CENTER = "center".freeze
3
+ DEFAULT_TEXTBLOCK_FONT = "Arial"
4
+
5
+ class TextBlock
6
+ include Common::UIElement
7
+ include Common::Style
8
+ include Common::Clickable
9
+ include TextBlockDimensionsDelegations
10
+
11
+ attr_reader :gui, :parent, :text, :contents, :app, :text_styles, :dimensions
12
+ attr_accessor :cursor, :textcursor
13
+ style_with :common_styles, :dimensions, :text_block_styles
14
+ STYLES = {font: "Arial"} # used in TextBlock specs only
15
+
16
+ def initialize(app, parent, text, styles = {})
17
+ @parent = parent
18
+ @app = app
19
+ style_init styles
20
+ @dimensions = TextBlockDimensions.new parent, @style
21
+ handle_styles @style
22
+ @gui = Shoes.backend_for self
23
+ @parent.add_child self
24
+
25
+ # Important to use accessor and do this after the backend exists!
26
+ self.text = Array(text)
27
+
28
+ register_click
29
+ end
30
+
31
+ def in_bounds?(*args)
32
+ @gui.in_bounds?(*args)
33
+ end
34
+
35
+ def text=(*texts)
36
+ replace *texts[0]
37
+ end
38
+
39
+ def replace(*texts)
40
+ # Order here matters as well--backend#replace shouldn't rely on DSL state
41
+ # but the texts that it's passed if it needs information at this point.
42
+ @gui.replace *texts
43
+
44
+ @text = texts.map(&:to_s).join
45
+ @contents = texts
46
+ @text_styles = gather_text_styles(self, texts)
47
+ end
48
+
49
+ def to_s
50
+ self.text
51
+ end
52
+
53
+ def contents_alignment(current_position=nil)
54
+ @gui.contents_alignment(current_position)
55
+ end
56
+
57
+ def adjust_current_position(current_position)
58
+ @gui.adjust_current_position(current_position)
59
+ end
60
+
61
+ def textcursor(line_height = 0)
62
+ @textcursor ||= app.textcursor(line_height)
63
+ end
64
+
65
+ def has_textcursor?
66
+ @textcursor
67
+ end
68
+
69
+ def centered?
70
+ style[:align] == CENTER
71
+ end
72
+
73
+ def links
74
+ return [] unless @contents
75
+
76
+ @contents.select do |element|
77
+ element.is_a?(Shoes::Link)
78
+ end
79
+ end
80
+
81
+ private
82
+
83
+ def gather_text_styles(parent_text, texts, styles={}, start_point=0)
84
+ texts.each do |text|
85
+ if text.is_a? Shoes::Text
86
+ text.text_block = self
87
+ text.parent_text = parent_text
88
+ end_point = start_point + text.to_s.length - 1
89
+
90
+ # If our endpoint is before our start, it's an empty string. We treat
91
+ # those specially with the (0...0) range that has an empty count.
92
+ if end_point < start_point
93
+ range = (0...0)
94
+ else
95
+ range = start_point..end_point
96
+ end
97
+
98
+ styles[range] ||= []
99
+ styles[range] << text
100
+ gather_text_styles(text, text.texts, styles, start_point)
101
+ end
102
+ start_point += text.to_s.length
103
+ end
104
+ styles
105
+ end
106
+
107
+ def handle_styles(style)
108
+ parse_font_style style[:font] if style[:font] #if is needed for the specs
109
+ end
110
+
111
+ def parse_font_style(type)
112
+ size_regex = /(\d+)(\s*px)?/
113
+ style_regex = /none|bold|normal|oblique|italic/i # TODO: add more
114
+
115
+ font_family = type.gsub(style_regex,'').gsub(size_regex,'').
116
+ split(',').map { |x| x.strip.gsub(/["]/,'') }
117
+
118
+ @style[:font] = font_family.first unless (font_family.size == 1 and
119
+ font_family[0] == "") or font_family.size == 0
120
+
121
+ fsize = size_regex.match(type)
122
+ @style[:size] = fsize[1].to_i unless fsize.nil?
123
+
124
+ # TODO: Style options
125
+ end
126
+ end
127
+
128
+ {
129
+ "Banner" => { size: 48 },
130
+ "Title" => { size: 34 },
131
+ "Subtitle" => { size: 26 },
132
+ "Tagline" => { size: 18 },
133
+ "Caption" => { size: 14 },
134
+ "Para" => { size: 12 },
135
+ "Inscription" => { size: 10 }
136
+ }.each do |name, styles|
137
+ clazz = Class.new(TextBlock) do
138
+ self.const_set("STYLES", { font: "Arial", fill: nil }.merge(styles))
139
+ end
140
+ Shoes.const_set(name, clazz)
141
+ end
142
+
143
+ end
@@ -0,0 +1,52 @@
1
+ class Shoes
2
+ # We take over a bunch of the absolute_* measurements since the jagged
3
+ # shape of a flowed TextBlock doesn't follow the usual rules for dimensions
4
+ # when we get to positioning (which is the main use of these values).
5
+ class TextBlockDimensions < Dimensions
6
+ attr_writer :absolute_right, :absolute_bottom,
7
+ :calculated_width, :calculated_height
8
+
9
+ def absolute_right
10
+ @absolute_right || super
11
+ end
12
+
13
+ def absolute_bottom
14
+ @absolute_bottom || super
15
+ end
16
+
17
+ # It might seem weird these reverse from above, but if explicit sizes get
18
+ # reported verbatim, while boundaries are set by text fitting.
19
+ def width
20
+ super || @calculated_width
21
+ end
22
+
23
+ def height
24
+ super || @calculated_height
25
+ end
26
+
27
+ # Since we flow, try to fit in almost any space
28
+ def fitting_width
29
+ 10
30
+ end
31
+
32
+ # This is the width the text block initially wants to try and fit into.
33
+ def desired_width(containing=containing_width)
34
+ parent.absolute_left + containing - self.absolute_left
35
+ end
36
+
37
+ # If an explicit width's set, use that when asking how much space we need.
38
+ # If not, we look to the parent.
39
+ def containing_width
40
+ element_width || parent.element_width
41
+ end
42
+ end
43
+
44
+ module TextBlockDimensionsDelegations
45
+ extend Forwardable
46
+
47
+ DELEGATED_METHODS = TextBlockDimensions.public_instance_methods(false)
48
+
49
+ def_delegators :dimensions, *DELEGATED_METHODS
50
+ end
51
+
52
+ end
@@ -0,0 +1,12 @@
1
+ class Shoes
2
+ class Timer
3
+ include Common::Inspect
4
+
5
+ def initialize app, n=1000, &blk
6
+ @app, @n, @blk = app, n, blk
7
+ @gui = Shoes.configuration.backend_for(self, @app.gui, @blk)
8
+ end
9
+
10
+ attr_reader :n, :gui
11
+ end
12
+ end
@@ -0,0 +1,44 @@
1
+ class Shoes
2
+
3
+ # Backwards compatibility, kind of likely to be removed
4
+ def self.inherited(base_class)
5
+ base_class.send :include, URL #include is private, therefore send
6
+ end
7
+
8
+ module URL
9
+ attr_accessor :app
10
+
11
+ Shoes::App.subscribe_to_dsl_methods self
12
+
13
+ def self.included(base_class)
14
+ base_class.extend URLDefiner
15
+ end
16
+
17
+ def self.urls
18
+ @urls ||= {}
19
+ end
20
+ end
21
+
22
+ module URLDefiner
23
+ def url(page, method)
24
+ page = convert_page_to_regex(page)
25
+ url_class = self
26
+
27
+ Shoes::URL.urls[page] = proc do |app, arg|
28
+ new_url_instance = url_class.new
29
+ new_url_instance.app = app
30
+
31
+ if arg
32
+ new_url_instance.send(method, arg)
33
+ else
34
+ new_url_instance.send method
35
+ end
36
+ end
37
+ end
38
+
39
+ private
40
+ def convert_page_to_regex(page)
41
+ /^#{page}$/
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,3 @@
1
+ class Shoes
2
+ VERSION = "4.0.0.pre2"
3
+ end
@@ -0,0 +1,69 @@
1
+ class Shoes
2
+ # This is the superclass for creating custom Shoes widgets.
3
+ #
4
+ # To use, inherit from {Shoes::Widget}. You get a few magical effects:
5
+ #
6
+ # * When you inherit from {Shoes::Widget}, you get a method in your Apps to
7
+ # create your widgets. The method is lower- and snake-cased. It returns
8
+ # an instance of your widget class.
9
+ # * Your widgets delegate missing methods to their app object. This
10
+ # allows you to use the Shoes DSL within your widgets.
11
+ #
12
+ # @example
13
+ # class SayHello < Shoes::Widget
14
+ # def initialize word
15
+ # para "Hello #{word}", stroke: green, size: 80
16
+ # end
17
+ # end
18
+ #
19
+ # Shoes.app do
20
+ # say_hello 'Shoes'
21
+ # end
22
+ #
23
+ class Widget
24
+ include Common::Inspect
25
+
26
+ Shoes::App.subscribe_to_dsl_methods self
27
+
28
+ attr_accessor :parent
29
+ attr_writer :app
30
+
31
+ class << self
32
+ attr_accessor :app
33
+ end
34
+
35
+ # lookup a bit more complicated as during initialize we do
36
+ # not have @app yet...
37
+ def app
38
+ @app || self.class.app
39
+ end
40
+
41
+ def self.inherited(klass, &blk)
42
+ dsl_method = dsl_method_name(klass)
43
+ Shoes::App.new_dsl_method(dsl_method) do |*args, &blk|
44
+ # we set app 2 times because widgets execute most of their code
45
+ # straight in initialize. I dunno if there is a good way of setting
46
+ # an @app instance variable before initialize is executed. We could
47
+ # hand it over in #initialize but that would break the interface
48
+ # and people would have to set it themselves or make sure to call
49
+ # super so for not it's like this.
50
+ # Setting the ref on the instance is important as we might have
51
+ # instances of the same widget in different Shoes::Apps so each one
52
+ # needs to save the reference to the one it was started with
53
+ klass.app = self
54
+ widget_instance = klass.new(*args, &blk)
55
+ widget_instance.app = self
56
+ widget_instance.parent = @__app__.current_slot
57
+ widget_instance
58
+ end
59
+ end
60
+
61
+
62
+ private
63
+ def self.dsl_method_name(klass)
64
+ klass.to_s[/(^|::)(\w+)$/, 2].
65
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
66
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').downcase
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,34 @@
1
+ require 'rake/file_list'
2
+
3
+ module ShoesManifestReport
4
+ def report
5
+ puts "Manifest of #{gem_name} gem"
6
+ puts
7
+ puts "files"
8
+ puts "-----"
9
+ puts files.sort.join("\n")
10
+ puts
11
+ puts "test_files"
12
+ puts "----------"
13
+ puts test_files.sort.join("\n")
14
+ puts
15
+ puts "#{files.length} files, #{test_files.length} test_files"
16
+ end
17
+ end
18
+
19
+ class ShoesCommonManifest
20
+ def self.files
21
+ Rake::FileList[%w(
22
+ CHANGELOG
23
+ Gemfile
24
+ Guardfile
25
+ LICENSE
26
+ README.md
27
+ manifests/common.rb
28
+ )]
29
+ end
30
+
31
+ def self.test_files
32
+ []
33
+ end
34
+ end