glimmer-dsl-opal 0.7.0 → 0.7.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +41 -0
  3. data/README.md +290 -53
  4. data/VERSION +1 -1
  5. data/lib/display.rb +31 -0
  6. data/lib/file.rb +29 -0
  7. data/lib/glimmer-dsl-opal.rb +30 -1
  8. data/lib/glimmer-dsl-opal/ext/date.rb +1 -1
  9. data/lib/glimmer-dsl-opal/ext/struct.rb +37 -0
  10. data/lib/glimmer-dsl-opal/samples/elaborate/contact_manager.rb +50 -23
  11. data/lib/glimmer-dsl-opal/samples/elaborate/login.rb +22 -5
  12. data/lib/glimmer-dsl-opal/samples/hello/hello_browser.rb +1 -1
  13. data/lib/glimmer-dsl-opal/samples/hello/hello_button.rb +46 -0
  14. data/lib/glimmer-dsl-opal/samples/hello/hello_custom_shell.rb +7 -7
  15. data/lib/glimmer-dsl-opal/samples/hello/hello_table.rb +5 -5
  16. data/lib/glimmer-dsl-swt.rb +20 -35
  17. data/lib/glimmer/data_binding/table_items_binding.rb +6 -4
  18. data/lib/glimmer/dsl/opal/custom_widget_expression.rb +6 -0
  19. data/lib/glimmer/dsl/opal/widget_expression.rb +6 -2
  20. data/lib/glimmer/swt/combo_proxy.rb +40 -1
  21. data/lib/glimmer/swt/composite_proxy.rb +5 -1
  22. data/lib/glimmer/swt/control_editor.rb +54 -0
  23. data/lib/glimmer/swt/date_time_proxy.rb +66 -1
  24. data/lib/glimmer/swt/font_proxy.rb +4 -4
  25. data/lib/glimmer/swt/grid_layout_proxy.rb +20 -12
  26. data/lib/glimmer/swt/label_proxy.rb +11 -3
  27. data/lib/glimmer/swt/layout_data_proxy.rb +10 -7
  28. data/lib/glimmer/swt/layout_proxy.rb +1 -1
  29. data/lib/glimmer/swt/message_box_proxy.rb +2 -10
  30. data/lib/glimmer/swt/table_column_proxy.rb +9 -0
  31. data/lib/glimmer/swt/table_editor.rb +65 -0
  32. data/lib/glimmer/swt/table_item_proxy.rb +36 -0
  33. data/lib/glimmer/swt/table_proxy.rb +375 -17
  34. data/lib/glimmer/swt/text_proxy.rb +1 -1
  35. data/lib/glimmer/swt/widget_proxy.rb +99 -21
  36. data/lib/glimmer/ui/custom_shell.rb +9 -7
  37. data/lib/os.rb +36 -0
  38. metadata +25 -3
@@ -72,7 +72,7 @@ module Glimmer
72
72
  doit
73
73
  }
74
74
  }
75
- }
75
+ },
76
76
  }
77
77
  end
78
78
 
@@ -29,7 +29,10 @@ module Glimmer
29
29
  include Glimmer
30
30
  include PropertyOwner
31
31
 
32
- attr_reader :parent, :args, :path, :children, :enabled, :foreground, :background, :font, :focus
32
+ attr_reader :parent, :args, :path, :children, :enabled, :foreground, :background, :font, :focus, :disposed?, :rendered
33
+ alias isDisposed disposed?
34
+ alias is_disposed disposed?
35
+ alias rendered? rendered
33
36
 
34
37
  class << self
35
38
  # Factory Method that translates a Glimmer DSL keyword into a WidgetProxy object
@@ -103,6 +106,7 @@ module Glimmer
103
106
  @block = block
104
107
  @children = Set.new # TODO consider moving to composite
105
108
  @enabled = true
109
+ @data = {}
106
110
  DEFAULT_INITIALIZERS[self.class.underscored_widget_name(self)]&.call(self)
107
111
  @parent.post_initialize_child(self) # TODO rename to post_initialize_child to be closer to glimmer-dsl-swt terminology
108
112
  end
@@ -113,17 +117,52 @@ module Glimmer
113
117
  child.render
114
118
  end
115
119
 
120
+ # Executes for the parent of a child that just got disposed
121
+ def post_dispose_child(child)
122
+ @children&.delete(child)
123
+ end
124
+
116
125
  # Executes at the closing of a parent widget curly braces after all children/properties have been added/set
117
126
  def post_add_content
118
127
  # No Op by default
119
128
  end
120
129
 
130
+ def set_data(key=nil, value)
131
+ @data[key] = value
132
+ end
133
+ alias setData set_data
134
+ alias data= set_data
135
+
136
+ def get_data(key=nil)
137
+ @data[key]
138
+ end
139
+ alias getData get_data
140
+ alias data get_data
141
+
121
142
  def css_classes
122
143
  dom_element.attr('class').to_s.split
123
144
  end
124
145
 
125
146
  def dispose
147
+ remove_all_listeners
126
148
  Document.find(path).remove
149
+ parent&.post_dispose_child(self)
150
+ # TODO fire on_widget_disposed listener
151
+ @disposed = true
152
+ end
153
+
154
+ def remove_all_listeners
155
+ effective_observation_request_to_event_mapping.keys.each do |keyword|
156
+ effective_observation_request_to_event_mapping[keyword].to_collection.each do |mapping|
157
+ observation_requests[keyword].to_a.each do |event_listener|
158
+ event = mapping[:event]
159
+ event_handler = mapping[:event_handler]
160
+ event_element_css_selector = mapping[:event_element_css_selector]
161
+ the_listener_dom_element = event_element_css_selector ? Element[event_element_css_selector] : listener_dom_element
162
+ the_listener_dom_element.off(event)
163
+ end
164
+ end
165
+ end
127
166
  end
128
167
 
129
168
  def path
@@ -172,31 +211,52 @@ module Glimmer
172
211
  @parent.path
173
212
  end
174
213
 
175
- def render
214
+ def parent_dom_element
215
+ Document.find(parent_path)
216
+ end
217
+
218
+ def render(custom_parent_dom_element = nil)
219
+ the_parent_dom_element = custom_parent_dom_element || parent_dom_element
176
220
  old_element = dom_element
177
221
  brand_new = @dom.nil? || old_element.empty?
178
- build_dom
222
+ build_dom(!custom_parent_dom_element) # TODO handle custom parent layout by passing parent instead of parent dom element
179
223
  if brand_new
180
- Document.find(parent_path).append(@dom)
224
+ the_parent_dom_element.append(@dom)
181
225
  else
182
226
  old_element.replace_with(@dom)
183
227
  end
184
- @observation_requests&.clone&.each do |keyword, event_listener_set|
228
+ observation_requests&.clone&.each do |keyword, event_listener_set|
185
229
  event_listener_set.each do |event_listener|
186
- @observation_requests[keyword].delete(event_listener)
230
+ observation_requests[keyword].delete(event_listener) # TODO look into the implications of this and if it's needed.
187
231
  handle_observation_request(keyword, &event_listener)
188
232
  end
189
233
  end
190
234
  children.each do |child|
191
235
  child.render
192
236
  end
237
+ @rendered = true
238
+ content_on_render_blocks.each { |content_block| content(&content_block) }
193
239
  end
194
240
  alias redraw render
195
241
 
196
- def build_dom
242
+ def content_on_render_blocks
243
+ @content_on_render_blocks ||= []
244
+ end
245
+
246
+ def add_content_on_render(&content_block)
247
+ if rendered?
248
+ content_block.call
249
+ else
250
+ content_on_render_blocks << content_block
251
+ end
252
+ end
253
+
254
+ def build_dom(layout=true)
255
+ # TODO consider passing parent element instead and having table item include a table cell widget only for opal
197
256
  @dom = nil
198
257
  @dom = dom
199
258
  @dom = @parent.layout.dom(@dom) if @parent.respond_to?(:layout) && @parent.layout
259
+ @dom
200
260
  end
201
261
 
202
262
  def content(&block)
@@ -208,6 +268,21 @@ module Glimmer
208
268
  {}
209
269
  end
210
270
 
271
+ def effective_observation_request_to_event_mapping
272
+ default_observation_request_to_event_mapping.merge(observation_request_to_event_mapping)
273
+ end
274
+
275
+ def default_observation_request_to_event_mapping
276
+ {
277
+ 'on_focus_gained' => {
278
+ event: 'focus',
279
+ },
280
+ 'on_focus_lost' => {
281
+ event: 'blur',
282
+ },
283
+ }
284
+ end
285
+
211
286
  def name
212
287
  self.class.name.split('::').last.underscore.sub(/_proxy$/, '').gsub('_', '-')
213
288
  end
@@ -271,10 +346,6 @@ module Glimmer
271
346
  element
272
347
  end
273
348
 
274
- def parent_dom_element
275
- Document.find(parent_path)
276
- end
277
-
278
349
  def listener_path
279
350
  path
280
351
  end
@@ -296,14 +367,17 @@ module Glimmer
296
367
  end
297
368
  end
298
369
 
299
- def handle_observation_request(keyword, &event_listener)
300
- return unless observation_request_to_event_mapping.keys.include?(keyword)
370
+ def observation_requests
301
371
  @observation_requests ||= {}
302
- @observation_requests[keyword] ||= Set.new
372
+ end
373
+
374
+ def handle_observation_request(keyword, &event_listener)
375
+ return unless effective_observation_request_to_event_mapping.keys.include?(keyword)
303
376
  event = nil
304
377
  delegate = nil
305
- [observation_request_to_event_mapping[keyword]].flatten.each do |mapping|
306
- @observation_requests[keyword] << event_listener
378
+ effective_observation_request_to_event_mapping[keyword].to_collection.each do |mapping|
379
+ observation_requests[keyword] ||= Set.new
380
+ observation_requests[keyword] << event_listener
307
381
  event = mapping[:event]
308
382
  event_handler = mapping[:event_handler]
309
383
  event_element_css_selector = mapping[:event_element_css_selector]
@@ -334,6 +408,14 @@ module Glimmer
334
408
  super(attribute_name, *args) # PropertyOwner
335
409
  end
336
410
 
411
+ def method_missing(method, *args, &block)
412
+ if method.to_s.start_with?('on_')
413
+ handle_observation_request(method, &block)
414
+ else
415
+ super(method, *args, &block)
416
+ end
417
+ end
418
+
337
419
  def apply_property_type_converters(attribute_name, args)
338
420
  if args.count == 1
339
421
  value = args.first
@@ -491,11 +573,7 @@ module Glimmer
491
573
  TableProxy => {
492
574
  :selection => lambda do |observer|
493
575
  on_widget_selected { |selection_event|
494
- if has_style?(:multi)
495
- observer.call(selection.map(&:get_data))
496
- else
497
- observer.call(selection.first&.get_data)
498
- end
576
+ observer.call(selection_event.table_item.get_data) # TODO ensure selection doesn't conflict with editing
499
577
  }
500
578
  end,
501
579
  },
@@ -1,5 +1,5 @@
1
1
  # Copyright (c) 2020 Andy Maleh
2
- #
2
+ #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining
4
4
  # a copy of this software and associated documentation files (the
5
5
  # "Software"), to deal in the Software without restriction, including
@@ -7,10 +7,10 @@
7
7
  # distribute, sublicense, and/or sell copies of the Software, and to
8
8
  # permit persons to whom the Software is furnished to do so, subject to
9
9
  # the following conditions:
10
- #
10
+ #
11
11
  # The above copyright notice and this permission notice shall be
12
12
  # included in all copies or substantial portions of the Software.
13
- #
13
+ #
14
14
  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
15
  # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
16
  # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -31,8 +31,10 @@ module Glimmer
31
31
  class << self
32
32
  def included(klass)
33
33
  klass.extend(CustomWidget::ClassMethods)
34
- klass.include(Glimmer)
34
+ klass.include(Glimmer)
35
35
  Glimmer::UI::CustomWidget.add_custom_widget_namespaces_for(klass)
36
+ keyword = klass.name.split(':').last.underscore
37
+ `localStorage[#{keyword}] = #{$LOADED_FEATURES.last}`
36
38
  end
37
39
 
38
40
  def request_parameter_string
@@ -44,12 +46,12 @@ module Glimmer
44
46
  end
45
47
 
46
48
  def requested_and_not_handled?
47
- requested? && !request_parameter_string.include?('custom_shell_handled=true')
48
- end
49
+ requested? && !request_parameter_string.include?('custom_shell_handled=true')
50
+ end
49
51
 
50
52
  def requested?
51
53
  request_parameter_string.include?('custom_shell=')
52
- end
54
+ end
53
55
  end
54
56
 
55
57
  def initialize(parent, args, options, &content)
@@ -0,0 +1,36 @@
1
+ # Copyright (c) 2020 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ class OS
23
+ class << self
24
+ def windows?
25
+ # No Op in Opal
26
+ end
27
+
28
+ def mac?
29
+ # No Op in Opal
30
+ end
31
+
32
+ def linux?
33
+ # No Op in Opal
34
+ end
35
+ end
36
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glimmer-dsl-opal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - AndyMaleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-02 00:00:00.000000000 Z
11
+ date: 2020-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: glimmer
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 1.2.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: to_collection
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 2.0.1
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 2.0.1
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: puts_debuggerer
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -196,7 +210,8 @@ dependencies:
196
210
  - - "~>"
197
211
  - !ruby/object:Gem::Version
198
212
  version: 0.4.4
199
- description: Glimmer DSL for Opal (Web GUI Adapter for Desktop Apps)
213
+ description: Glimmer DSL for Opal (Pure Ruby Web GUI and Auto-Webifier of Desktop
214
+ Apps Running via Opal on Rails)
200
215
  email: andy.am@gmail.com
201
216
  executables: []
202
217
  extensions: []
@@ -222,9 +237,12 @@ files:
222
237
  - app/assets/stylesheets/glimmer/jquery-ui.structure.css
223
238
  - app/assets/stylesheets/glimmer/jquery-ui.theme.css
224
239
  - app/assets/stylesheets/glimmer/jquery.ui.timepicker.css
240
+ - lib/display.rb
241
+ - lib/file.rb
225
242
  - lib/glimmer-dsl-opal.rb
226
243
  - lib/glimmer-dsl-opal/ext/date.rb
227
244
  - lib/glimmer-dsl-opal/ext/exception.rb
245
+ - lib/glimmer-dsl-opal/ext/struct.rb
228
246
  - lib/glimmer-dsl-opal/samples/elaborate/contact_manager.rb
229
247
  - lib/glimmer-dsl-opal/samples/elaborate/contact_manager/contact.rb
230
248
  - lib/glimmer-dsl-opal/samples/elaborate/contact_manager/contact_manager_presenter.rb
@@ -234,6 +252,7 @@ files:
234
252
  - lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/board.rb
235
253
  - lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/cell.rb
236
254
  - lib/glimmer-dsl-opal/samples/hello/hello_browser.rb
255
+ - lib/glimmer-dsl-opal/samples/hello/hello_button.rb
237
256
  - lib/glimmer-dsl-opal/samples/hello/hello_checkbox.rb
238
257
  - lib/glimmer-dsl-opal/samples/hello/hello_checkbox_group.rb
239
258
  - lib/glimmer-dsl-opal/samples/hello/hello_combo.rb
@@ -311,6 +330,7 @@ files:
311
330
  - lib/glimmer/swt/color_proxy.rb
312
331
  - lib/glimmer/swt/combo_proxy.rb
313
332
  - lib/glimmer/swt/composite_proxy.rb
333
+ - lib/glimmer/swt/control_editor.rb
314
334
  - lib/glimmer/swt/custom/checkbox_group.rb
315
335
  - lib/glimmer/swt/custom/radio_group.rb
316
336
  - lib/glimmer/swt/date_time_proxy.rb
@@ -338,6 +358,7 @@ files:
338
358
  - lib/glimmer/swt/tab_folder_proxy.rb
339
359
  - lib/glimmer/swt/tab_item_proxy.rb
340
360
  - lib/glimmer/swt/table_column_proxy.rb
361
+ - lib/glimmer/swt/table_editor.rb
341
362
  - lib/glimmer/swt/table_item_proxy.rb
342
363
  - lib/glimmer/swt/table_proxy.rb
343
364
  - lib/glimmer/swt/text_proxy.rb
@@ -346,6 +367,7 @@ files:
346
367
  - lib/glimmer/ui/custom_widget.rb
347
368
  - lib/glimmer/util/proc_tracker.rb
348
369
  - lib/net/http.rb
370
+ - lib/os.rb
349
371
  - lib/uri.rb
350
372
  homepage: http://github.com/AndyObtiva/glimmer-dsl-opal
351
373
  licenses: