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,49 @@
1
+ class Shoes
2
+ FONT_DIR = DIR + "/fonts/"
3
+
4
+ module Font
5
+ FONT_TYPES = "{ttf,ttc,otf,fnt,fon,bdf,pcf,snf,mmm,pfb,pfm}"
6
+ @loaded_fonts = {}
7
+
8
+ class << self
9
+ attr_reader :loaded_fonts
10
+
11
+ def font_paths_from_dir(path)
12
+ font_paths = []
13
+ Dir.glob(path + "**/*." + FONT_TYPES).each do |font_path|
14
+ font_paths << font_path
15
+ end
16
+ font_paths
17
+ end
18
+
19
+ def add_font(path)
20
+ Shoes.backend::Font.add_font(path)
21
+ end
22
+
23
+ def add_font_to_fonts(path)
24
+ name = font_name(path)
25
+ Shoes::FONTS << name
26
+ name
27
+ end
28
+
29
+ def initial_fonts
30
+ Shoes.backend::Font.initial_fonts
31
+ end
32
+
33
+ private
34
+ def font_name(path)
35
+ remove_file_ext(parse_filename_from_path(path))
36
+ end
37
+
38
+ def parse_filename_from_path(file_path)
39
+ Pathname.new(file_path).basename.to_s
40
+ end
41
+
42
+ def remove_file_ext(file_name)
43
+ file_name.chomp(File.extname(file_name))
44
+ end
45
+ end
46
+ end
47
+
48
+ FONTS = []
49
+ end
@@ -0,0 +1,31 @@
1
+ class Shoes
2
+ class Gradient
3
+ include Common::Inspect
4
+ include Comparable
5
+
6
+ def initialize(color1, color2, alpha = Shoes::Color::OPAQUE)
7
+ @color1, @color2 = color1, color2
8
+ @alpha = alpha
9
+ end
10
+
11
+ attr_reader :alpha, :color1, :color2
12
+
13
+ def inspect
14
+ super.insert(-2, " #{color1}->#{color2}")
15
+ end
16
+
17
+ def <=>(other) #arbitrarily compare 1st non-equal color
18
+ raise_class_mismatch_error(other) unless other.is_a?(self.class)
19
+ if @color1 == other.color1
20
+ @color2 <=> other.color2
21
+ else
22
+ @color1 <=> other.color1
23
+ end
24
+ end
25
+
26
+ def raise_class_mismatch_error other
27
+ raise ArgumentError,
28
+ "can't compare #{self.class.name} with #{other.class.name}"
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,29 @@
1
+ class Shoes
2
+ class Image
3
+ include Common::UIElement
4
+ include Common::Style
5
+ include Common::Clickable
6
+
7
+ attr_reader :app, :parent, :dimensions, :gui
8
+ style_with :art_styles, :common_styles, :dimensions, :file_path
9
+
10
+ def initialize(app, parent, file_path, styles = {}, blk = nil)
11
+ @app = app
12
+ @parent = parent
13
+ style_init styles, file_path: file_path
14
+ @dimensions = Dimensions.new parent, @style
15
+ @parent.add_child self
16
+ @gui = Shoes.configuration.backend_for self, @parent.gui
17
+ register_click blk
18
+ end
19
+
20
+ def path
21
+ @style[:file_path]
22
+ end
23
+
24
+ def path=(path)
25
+ style(file_path: path)
26
+ @gui.update_image
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,12 @@
1
+ class Shoes
2
+ class ImagePattern
3
+ include Common::Inspect
4
+
5
+ def initialize path
6
+ @path = path
7
+ @gui = Shoes.configuration.backend_for(self)
8
+ end
9
+
10
+ attr_reader :gui, :path
11
+ end
12
+ end
@@ -0,0 +1,60 @@
1
+ class Shoes
2
+ class InputBox
3
+ include Common::UIElement
4
+ include Common::Style
5
+ include Common::Changeable
6
+
7
+ attr_reader :app, :parent, :dimensions, :gui
8
+
9
+ def initialize(app, parent, text, styles = {}, blk = nil)
10
+ @app = app
11
+ @parent = parent
12
+ style_init styles, text: text.to_s
13
+ @dimensions = Dimensions.new parent, @style
14
+ @parent.add_child self
15
+ @gui = Shoes.configuration.backend_for self, @parent.gui
16
+ change &blk if blk
17
+ end
18
+
19
+ def state=(value)
20
+ style(state: value)
21
+ @gui.enabled value.nil?
22
+ end
23
+
24
+ def focus
25
+ @gui.focus
26
+ end
27
+
28
+ def text
29
+ @gui.text
30
+ end
31
+
32
+ def text=(value)
33
+ style(text: value.to_s)
34
+ @gui.text = value.to_s
35
+ end
36
+
37
+ def highlight_text(start_index, final_index)
38
+ @gui.highlight_text(start_index, final_index)
39
+ end
40
+
41
+ def caret_to(index)
42
+ @gui.caret_to(index)
43
+ end
44
+ end
45
+
46
+ class EditBox < InputBox
47
+ style_with :change, :common_styles, :dimensions, :text, :state
48
+ STYLES = { width: 200, height: 108, text: '' }
49
+ end
50
+
51
+ class EditLine < InputBox
52
+ style_with :change, :common_styles, :dimensions, :text, :secret, :state
53
+ STYLES = { width: 200, height: 28, text: '' }
54
+
55
+ def secret?
56
+ self.secret
57
+ end
58
+ end
59
+
60
+ end
@@ -0,0 +1,219 @@
1
+ class Shoes
2
+ # This is the representation of the app that is used internally by Shoes
3
+ # objects. It is *NOT* the app object that a user interacts with in a
4
+ # Shoes.app block. The user facing App object is...the App object.
5
+ #
6
+ # The InternalApp object is responsible for maintaining the state of the App
7
+ # and providing the bulk of the functionality, leaving the App a relatively
8
+ # blank slate for users to bend to their will.
9
+ class InternalApp
10
+ include Common::Style
11
+ include Common::Clickable
12
+ include DimensionsDelegations
13
+
14
+ extend Forwardable
15
+
16
+ DEFAULT_OPTIONS = { :width => 600,
17
+ :height => 500,
18
+ :title => "Shoes 4",
19
+ :resizable => true,
20
+ :background => Shoes::COLORS.fetch(:shoes_background) }.freeze
21
+
22
+ def initialize(app, opts, &blk)
23
+ @app = app
24
+ @blk = blk
25
+ set_attributes_from_options(opts)
26
+ set_initial_attributes
27
+ end
28
+
29
+ def setup_gui
30
+ @gui = Shoes.configuration.backend::App.new self
31
+
32
+ self.current_slot = create_top_slot
33
+ execution_blk = create_execution_block(blk)
34
+ eval_block execution_blk
35
+
36
+ setup_global_keypresses
37
+ register_console_keypress
38
+ end
39
+
40
+ attr_reader :gui, :top_slot, :app, :dimensions,
41
+ :mouse_motion, :owner, :element_styles, :resize_callbacks
42
+ attr_accessor :elements, :current_slot, :opts, :blk, :mouse_button,
43
+ :mouse_pos, :mouse_hover_controls, :resizable, :app_title,
44
+ :width, :height, :start_as_fullscreen, :location
45
+
46
+ def_delegators :@app, :eval_with_additional_context
47
+
48
+ def clear(&blk)
49
+ current_slot.clear &blk
50
+ end
51
+
52
+ def contents
53
+ top_slot.contents
54
+ end
55
+
56
+ def width
57
+ started? ? gui.width : @dimensions.width
58
+ end
59
+
60
+ def height
61
+ started? ? gui.height : @dimensions.height
62
+ end
63
+
64
+ def font(path = Shoes::DEFAULT_TEXTBLOCK_FONT)
65
+ app.font path
66
+ end
67
+
68
+ def started?
69
+ gui && gui.started?
70
+ end
71
+
72
+ def add_child(child)
73
+ # No-op. The top_slot needs this method, but we already hold an explicit
74
+ # reference to the top_slot, so we don't need to add it as a child. Other
75
+ # elements should be added as children of the top_slot.
76
+ end
77
+
78
+ def default_styles
79
+ Common::Style::DEFAULT_STYLES.clone
80
+ end
81
+
82
+ def in_bounds?(x, y)
83
+ true
84
+ end
85
+
86
+ def fullscreen=(state)
87
+ gui.fullscreen = state
88
+ end
89
+
90
+ def fullscreen
91
+ gui.fullscreen
92
+ end
93
+
94
+ alias_method :start_as_fullscreen?, :start_as_fullscreen
95
+
96
+ def add_mouse_hover_control(element)
97
+ unless mouse_hover_controls.include? element
98
+ mouse_hover_controls << element
99
+ end
100
+ end
101
+
102
+ def open_gui
103
+ gui.open
104
+ end
105
+
106
+ def quit
107
+ @gui.quit
108
+ end
109
+
110
+ def scroll_top
111
+ gui.scroll_top
112
+ end
113
+
114
+ def scroll_top=(n)
115
+ gui.scroll_top = n
116
+ end
117
+
118
+ def clipboard
119
+ gui.clipboard
120
+ end
121
+
122
+ def clipboard=(str)
123
+ gui.clipboard = str
124
+ end
125
+
126
+ def download(url, opts, &block)
127
+ app.download url, opts, &block
128
+ end
129
+
130
+ def textcursor(line_height)
131
+ app.line(0, 0, 0, line_height, hidden: true)
132
+ end
133
+
134
+ def execute_block(blk)
135
+ app.instance_eval &blk
136
+ end
137
+
138
+ def gutter
139
+ gui.gutter
140
+ end
141
+
142
+ def add_resize_callback(blk)
143
+ @resize_callbacks << blk
144
+ end
145
+
146
+ def inspect
147
+ super.insert(-2, " \"#{@app_title}\" #{@dimensions.inspect})")
148
+ end
149
+
150
+ def self.global_keypresses
151
+ @global_keypresses ||= {}
152
+ end
153
+
154
+ def self.add_global_keypress(key, &blk)
155
+ self.global_keypresses[key] = blk
156
+ end
157
+
158
+ private
159
+ def create_top_slot
160
+ @top_slot = Flow.new self, self, width: width, height: height
161
+ end
162
+
163
+ def eval_block(execution_blk)
164
+ @top_slot.append &execution_blk
165
+ end
166
+
167
+ def create_execution_block(blk)
168
+ if blk
169
+ execution_blk = Proc.new do
170
+ execute_block blk
171
+ end
172
+ elsif Shoes::URL.urls.keys.any? { |page| page.match '/' }
173
+ execution_blk = Proc.new do
174
+ app.visit '/'
175
+ end
176
+ else
177
+ execution_blk = nil
178
+ end
179
+ execution_blk
180
+ end
181
+
182
+ def set_initial_attributes
183
+ @style = default_styles
184
+ @element_styles = {}
185
+ @mouse_motion = []
186
+ @mouse_button = 0
187
+ @mouse_pos = [0, 0]
188
+ @mouse_hover_controls = []
189
+ @resize_callbacks = []
190
+ @pass_coordinates = true
191
+ end
192
+
193
+ def set_attributes_from_options(opts)
194
+ opts = DEFAULT_OPTIONS.merge(opts)
195
+
196
+ @app_title = opts[:title]
197
+ @resizable = opts[:resizable]
198
+ @start_as_fullscreen = opts[:fullscreen]
199
+ @opts = opts
200
+ @owner = opts[:owner]
201
+ @dimensions = AbsoluteDimensions.new opts
202
+ self.absolute_left = 0
203
+ self.absolute_top = 0
204
+ end
205
+
206
+ def setup_global_keypresses
207
+ @app.keypress do |key|
208
+ blk = self.class.global_keypresses[key]
209
+ @app.instance_eval(&blk) unless blk.nil?
210
+ end
211
+ end
212
+
213
+ def register_console_keypress
214
+ self.class.add_global_keypress(:"alt_/") do
215
+ Logger.setup
216
+ end
217
+ end
218
+ end
219
+ end
@@ -0,0 +1,17 @@
1
+ class Shoes
2
+ class KeyEvent
3
+ def initialize(app, &blk)
4
+ @app = app
5
+ @gui = Shoes.backend_for self, &blk
6
+ end
7
+
8
+ attr_reader :app
9
+
10
+ def remove
11
+ @gui.remove
12
+ end
13
+ end
14
+
15
+ class Keypress < KeyEvent ; end
16
+ class Keyrelease < KeyEvent ; end
17
+ end
@@ -0,0 +1,87 @@
1
+ class Shoes
2
+ class Line
3
+ include Common::UIElement
4
+ include Common::Style
5
+ include Common::Clickable
6
+
7
+ attr_reader :app, :parent, :dimensions, :gui, :point_a, :point_b
8
+
9
+ style_with :angle, :art_styles, :dimensions, :x2, :y2
10
+ STYLES = {angle: 0}
11
+
12
+ def initialize(app, parent, point_a, point_b, styles = {}, blk = nil)
13
+ @app = app
14
+ @parent = parent
15
+ @point_a = point_a
16
+ @point_b = point_b
17
+
18
+ style_init styles, x2: point_b.x, y2: point_b.y
19
+ enclosing_box_of_line
20
+
21
+ @parent.add_child self
22
+ @gui = Shoes.backend_for self
23
+ register_click blk
24
+ end
25
+
26
+ def update_style(new_styles)
27
+ super
28
+ enclosing_box_of_line
29
+ end
30
+
31
+ def left=(val)
32
+ @point_a.x < @point_b.x ? set_point_a(:x, val) : set_point_b(:x, val)
33
+ end
34
+
35
+ def right=(val)
36
+ @point_a.x > @point_b.x ? set_point_a(:x, val) : set_point_b(:x, val)
37
+ end
38
+
39
+ def top=(val)
40
+ @point_a.y < @point_b.y ? set_point_a(:y, val) : set_point_b(:y, val)
41
+ end
42
+
43
+ def bottom=(val)
44
+ @point_a.y > @point_b.y ? set_point_a(:y, val) : set_point_b(:y, val)
45
+ end
46
+
47
+ def x2=(val)
48
+ set_point_b(:x, val)
49
+ end
50
+
51
+ def y2=(val)
52
+ set_point_b(:y, val)
53
+ end
54
+
55
+ private
56
+
57
+ def set_point_a(which, val)
58
+ @point_a.x = val if which == :x
59
+ @point_a.y = val if which == :y
60
+ enclosing_box_of_line
61
+ end
62
+
63
+ def set_point_b(which, val)
64
+ @point_b.x = val if which == :x
65
+ @point_b.y = val if which == :y
66
+ style(x2: val) if which == :x
67
+ style(y2: val) if which == :y
68
+ enclosing_box_of_line
69
+ end
70
+
71
+ def enclosing_box_of_line
72
+ left = @point_a.left(@point_b)
73
+ top = @point_a.top(@point_b)
74
+ width = @point_a.width(@point_b)
75
+ height = @point_a.height(@point_b)
76
+ right = left + width
77
+ bottom = top + height
78
+
79
+ @dimensions = AbsoluteDimensions.new left: left,
80
+ top: top,
81
+ right: right,
82
+ bottom: bottom,
83
+ width: width,
84
+ height: height
85
+ end
86
+ end
87
+ end