glimmer-dsl-opal 0.16.1 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -2
  3. data/README.md +158 -4
  4. data/VERSION +1 -1
  5. data/lib/cgi.rb +14 -0
  6. data/lib/glimmer-dsl-opal.rb +1 -0
  7. data/lib/glimmer-dsl-opal/samples/hello/hello_arrow.rb +65 -0
  8. data/lib/glimmer-dsl-opal/samples/hello/hello_c_combo.rb +67 -0
  9. data/lib/glimmer-dsl-opal/samples/hello/hello_c_tab.rb +172 -0
  10. data/lib/glimmer-dsl-opal/samples/hello/hello_layout.rb +241 -0
  11. data/lib/glimmer-dsl-opal/samples/hello/hello_tab.rb +10 -8
  12. data/lib/glimmer-dsl-opal/samples/hello/images/denmark.png +0 -0
  13. data/lib/glimmer-dsl-opal/samples/hello/images/finland.png +0 -0
  14. data/lib/glimmer-dsl-opal/samples/hello/images/france.png +0 -0
  15. data/lib/glimmer-dsl-opal/samples/hello/images/germany.png +0 -0
  16. data/lib/glimmer-dsl-opal/samples/hello/images/italy.png +0 -0
  17. data/lib/glimmer-dsl-opal/samples/hello/images/mexico.png +0 -0
  18. data/lib/glimmer-dsl-opal/samples/hello/images/netherlands.png +0 -0
  19. data/lib/glimmer-dsl-opal/samples/hello/images/norway.png +0 -0
  20. data/lib/glimmer-dsl-opal/samples/hello/images/usa.png +0 -0
  21. data/lib/glimmer/dsl/opal/menu_expression.rb +3 -0
  22. data/lib/glimmer/swt/arrow_proxy.rb +42 -0
  23. data/lib/glimmer/swt/button_proxy.rb +36 -1
  24. data/lib/glimmer/swt/c_combo_proxy.rb +51 -0
  25. data/lib/glimmer/swt/c_tab_folder_proxy.rb +43 -0
  26. data/lib/glimmer/swt/c_tab_item_proxy.rb +96 -0
  27. data/lib/glimmer/swt/combo_proxy.rb +3 -0
  28. data/lib/glimmer/swt/fill_layout_proxy.rb +9 -3
  29. data/lib/glimmer/swt/grid_layout_proxy.rb +33 -1
  30. data/lib/glimmer/swt/label_proxy.rb +2 -2
  31. data/lib/glimmer/swt/menu_proxy.rb +17 -1
  32. data/lib/glimmer/swt/row_layout_proxy.rb +33 -2
  33. data/lib/glimmer/swt/shell_proxy.rb +4 -0
  34. data/lib/glimmer/swt/tab_folder_proxy.rb +12 -10
  35. data/lib/glimmer/swt/tab_item_proxy.rb +52 -4
  36. data/lib/glimmer/swt/widget_proxy.rb +53 -12
  37. metadata +20 -2
@@ -24,6 +24,14 @@ module Glimmer
24
24
  margin-left: auto;
25
25
  margin-right: auto;
26
26
  }
27
+
28
+ .row-layout-wrap {
29
+ flex-wrap: wrap;
30
+ }
31
+
32
+ .row-layout-justify {
33
+ justify-content: space-around;
34
+ }
27
35
 
28
36
  .row-layout-horizontal {
29
37
  flex-direction: row;
@@ -42,13 +50,14 @@ module Glimmer
42
50
  }
43
51
  CSS
44
52
 
45
- attr_reader :type, :fill, :margin_width, :margin_height, :margin_top, :margin_right, :margin_bottom, :margin_left, :spacing, :pack, :center
53
+ attr_reader :type, :margin_width, :margin_height, :margin_top, :margin_right, :margin_bottom, :margin_left, :spacing, :pack, :center, :wrap, :justify
46
54
 
47
55
  def initialize(parent, args)
48
56
  super(parent, args)
49
57
  @parent.dom_element.add_class('row-layout')
50
58
  self.type = args.first || :horizontal
51
59
  self.pack = true
60
+ self.wrap = true
52
61
  end
53
62
 
54
63
  def type=(value)
@@ -79,9 +88,13 @@ module Glimmer
79
88
  end
80
89
  end
81
90
 
91
+ def fill
92
+ !pack
93
+ end
94
+
82
95
  def fill=(value)
83
96
  # TODO verify this is a correct implementation and interpretation of RowLayout in SWT
84
- self.pack(!value)
97
+ self.pack = !value
85
98
  end
86
99
 
87
100
  def center=(center_value)
@@ -94,6 +107,24 @@ module Glimmer
94
107
  end
95
108
  end
96
109
 
110
+ def wrap=(wrap_value)
111
+ @wrap = wrap_value
112
+ if @wrap
113
+ parent.dom_element.add_class("row-layout-wrap")
114
+ else
115
+ parent.dom_element.remove_class("row-layout-wrap")
116
+ end
117
+ end
118
+
119
+ def justify=(justify_value)
120
+ @justify = justify_value
121
+ if @justify
122
+ parent.dom_element.add_class("row-layout-justify")
123
+ else
124
+ parent.dom_element.remove_class("row-layout-justify")
125
+ end
126
+ end
127
+
97
128
  def margin_width=(pixels)
98
129
  @margin_width = pixels
99
130
  # Using padding for width since margin-right isn't getting respected with width 100%
@@ -76,6 +76,10 @@ module Glimmer
76
76
  DisplayProxy.instance.shells << self
77
77
  end
78
78
 
79
+ def post_add_content
80
+ `$( document ).tooltip()`
81
+ end
82
+
79
83
  def element
80
84
  'div'
81
85
  end
@@ -26,8 +26,8 @@ module Glimmer
26
26
  class TabFolderProxy < WidgetProxy
27
27
  STYLE = <<~CSS
28
28
  .tabs .tab.selected {
29
- background: rgb(80, 116, 211);
30
- color: white;
29
+ background: white;
30
+ color: black;
31
31
  }
32
32
  .tabs .tab {
33
33
  background-color: inherit;
@@ -38,6 +38,14 @@ module Glimmer
38
38
  padding: 14px 16px;
39
39
  transition: 0.3s;
40
40
  font-size: 17px;
41
+ text-decoration: none;
42
+ }
43
+ .tabs .tab:hover {
44
+ color: black
45
+ }
46
+ .tabs .tab > * {
47
+ display: inline-block;
48
+ vertical-align: middle;
41
49
  }
42
50
  .tabs {
43
51
  overflow: hidden;
@@ -46,16 +54,10 @@ module Glimmer
46
54
  }
47
55
  CSS
48
56
 
49
- attr_reader :tabs
50
-
51
- def initialize(parent, args, block)
52
- super(parent, args, block)
53
- @tabs = []
54
- end
55
-
56
57
  def post_initialize_child(child)
57
58
  unless @children.include?(child)
58
59
  @children << child
60
+ child.closeable = true if @closeable_children
59
61
  tabs_dom_element.append(child.tab_dom)
60
62
  child.render
61
63
  end
@@ -85,7 +87,7 @@ module Glimmer
85
87
  tab_folder_id = id
86
88
  tab_folder_id_style = css
87
89
  @dom ||= html {
88
- div(id: tab_folder_id, style: tab_folder_id_style, class: 'tab-folder') {
90
+ div(id: tab_folder_id, style: tab_folder_id_style, class: name) {
89
91
  div(id: tabs_id, class: 'tabs')
90
92
  }
91
93
  }.to_s
@@ -1,10 +1,31 @@
1
+ # Copyright (c) 2020-2021 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
+
1
22
  require 'glimmer/swt/composite_proxy'
2
23
 
3
24
  module Glimmer
4
25
  module SWT
5
26
  class TabItemProxy < CompositeProxy
6
27
  include Glimmer
7
- attr_reader :text, :content_visible
28
+ attr_reader :text, :content_visible, :tool_tip_text, :image
8
29
 
9
30
  def initialize(parent, args, block)
10
31
  super(parent, args, block)
@@ -30,7 +51,33 @@ module Glimmer
30
51
 
31
52
  def text=(value)
32
53
  @text = value
33
- tab_dom_element.html(@text)
54
+ tab_dom_element.find('span').html(@text)
55
+ end
56
+
57
+ def image=(value)
58
+ @image = value
59
+ if @image.is_a?(String)
60
+ tab_dom_element.find('img').attr('src', @image)
61
+ tab_dom_element.find('img').css('padding-right', '5px')
62
+ end
63
+ end
64
+
65
+ def tool_tip_text=(value)
66
+ @tool_tip_text = value
67
+ tab_dom_element.attr('title', @tool_tip_text) if !@tool_tip_text.to_s.empty?
68
+ end
69
+
70
+ def dispose
71
+ tab_index = parent.children.to_a.index(self)
72
+ tab_dom_element.remove
73
+ super
74
+ if @content_visible
75
+ @content_visible = false
76
+ parent.hide_all_tab_content
77
+ tab_to_show = parent.children.to_a[tab_index]
78
+ tab_to_show ||= parent.children.to_a[tab_index - 1]
79
+ tab_to_show&.show
80
+ end
34
81
  end
35
82
 
36
83
  def selector
@@ -64,8 +111,9 @@ module Glimmer
64
111
  # This contains the clickable tab area with tab names
65
112
  def tab_dom
66
113
  @tab_dom ||= html {
67
- button(id: tab_id, class: "tab") {
68
- @text
114
+ a(href: '#', id: tab_id, class: "tab") {
115
+ img {}
116
+ span { @text }
69
117
  }
70
118
  }.to_s
71
119
  end
@@ -31,8 +31,8 @@ module Glimmer
31
31
  include Glimmer
32
32
  include PropertyOwner
33
33
 
34
- attr_reader :parent, :args, :path, :children, :enabled, :foreground, :background, :font, :focus, :disposed?, :rendered, :menu_requested
35
- attr_accessor :menu
34
+ attr_reader :parent, :args, :path, :children, :enabled, :foreground, :background, :font, :focus, :disposed?, :rendered
35
+ attr_accessor :menu, :menu_requested, :menu_x, :menu_y
36
36
  alias isDisposed disposed?
37
37
  alias is_disposed disposed?
38
38
  alias rendered? rendered
@@ -112,6 +112,7 @@ module Glimmer
112
112
  @parent = parent
113
113
  @args = args
114
114
  @block = block
115
+ # TODO consider changing children to an array (why is it a Set if order matters?)
115
116
  @children = Set.new # TODO consider moving to composite
116
117
  @enabled = true
117
118
  @data = {}
@@ -133,17 +134,16 @@ module Glimmer
133
134
  # Executes at the closing of a parent widget curly braces after all children/properties have been added/set
134
135
  def post_add_content
135
136
  if !menu.nil? && !is_a?(MenuProxy) && !is_a?(MenuItemProxy)
136
- on_mouse_down { |mouse_event|
137
+ # TODO consider in the future retaining listener registrations to deregister on unsetting of the menu
138
+ on_mouse_move do |mouse_event|
139
+ self.menu_x = mouse_event.x
140
+ self.menu_y = mouse_event.y
141
+ end
142
+ on_mouse_down do |mouse_event|
137
143
  if mouse_event.button == 3 # right-click
138
- @menu_requested = true
139
- dom_element.css('position', 'relative')
140
- menu&.render
141
- menu.dom_element.css('position', 'absolute')
142
- menu.dom_element.css('left', mouse_event.x - parent.get_layout&.margin_width.to_i) # TODO - parent.get_layout&.margin_left.to_i)
143
- menu.dom_element.css('top', mouse_event.y - parent.get_layout&.margin_height.to_i - 5) # TODO - parent.get_layout&.margin_top.to_i)
144
- @menu_requested = false
144
+ menu.visible = true
145
145
  end
146
- }
146
+ end
147
147
  end
148
148
  end
149
149
 
@@ -321,10 +321,12 @@ module Glimmer
321
321
  end
322
322
 
323
323
  def default_observation_request_to_event_mapping
324
+ myself = self
324
325
  mouse_event_handler = -> (event_listener) {
325
326
  -> (event) {
326
327
  # TODO generalize this solution to all widgets that support key presses
327
328
  # TODO support event.location once DOM3 is supported by opal-jquery
329
+ event.define_singleton_method(:widget) {myself}
328
330
  event.define_singleton_method(:button, &event.method(:which))
329
331
  event.define_singleton_method(:count) {1} # TODO support double-click count of 2 in the future by using ondblclick
330
332
  event.define_singleton_method(:x, &event.method(:page_x))
@@ -345,6 +347,31 @@ module Glimmer
345
347
  # event.prevent
346
348
  # event.stop
347
349
  # event.stop_immediate
350
+ # end
351
+ }
352
+ }
353
+ mouse_move_event_handler = -> (event_listener) {
354
+ -> (event) {
355
+ # TODO generalize this solution to all widgets that support key presses
356
+ # TODO support event.location once DOM3 is supported by opal-jquery
357
+ event.define_singleton_method(:widget) {myself}
358
+ event.define_singleton_method(:button, &event.method(:which))
359
+ event.define_singleton_method(:count) {1} # TODO support double-click count of 2 in the future by using ondblclick
360
+ event.define_singleton_method(:x, &event.method(:page_x))
361
+ event.define_singleton_method(:y, &event.method(:page_y))
362
+ doit = true
363
+ event.define_singleton_method(:doit=) do |value|
364
+ doit = value
365
+ end
366
+ event.define_singleton_method(:doit) { doit }
367
+
368
+ event_listener.call(event)
369
+
370
+ # TODO Imlement doit properly for all different kinds of events
371
+ # unless doit
372
+ # event.prevent
373
+ # event.stop
374
+ # event.stop_immediate
348
375
  # end
349
376
  }
350
377
  }
@@ -352,6 +379,7 @@ module Glimmer
352
379
  -> (event) {
353
380
  # TODO generalize this solution to all widgets that support key presses
354
381
  # TODO support event.location once DOM3 is supported by opal-jquery
382
+ event.define_singleton_method(:widget) {myself}
355
383
  event.define_singleton_method(:button, &event.method(:which))
356
384
  event.define_singleton_method(:count) {1} # TODO support double-click count of 2 in the future by using ondblclick
357
385
  event.define_singleton_method(:x, &event.method(:page_x))
@@ -366,7 +394,6 @@ module Glimmer
366
394
  event.prevent
367
395
  event_listener.call(event)
368
396
  end
369
-
370
397
  # TODO Imlement doit properly for all different kinds of events
371
398
  # unless doit
372
399
  # event.prevent
@@ -382,6 +409,12 @@ module Glimmer
382
409
  'on_focus_lost' => {
383
410
  event: 'blur',
384
411
  },
412
+ 'on_mouse_move' => [
413
+ {
414
+ event: 'mousemove',
415
+ event_handler: mouse_move_event_handler,
416
+ },
417
+ ],
385
418
  'on_mouse_up' => [
386
419
  {
387
420
  event: 'mouseup',
@@ -428,6 +461,7 @@ module Glimmer
428
461
  -> (event) {
429
462
  # TODO generalize this solution to all widgets that support key presses
430
463
  # TODO support event.location once DOM3 is supported by opal-jquery
464
+ event.define_singleton_method(:widget) {myself}
431
465
  event.define_singleton_method(:keyCode) {event.which}
432
466
  event.define_singleton_method(:key_code, &event.method(:keyCode))
433
467
  event.define_singleton_method(:character) {event.which.chr}
@@ -464,6 +498,7 @@ module Glimmer
464
498
  -> (event) {
465
499
  # TODO generalize this solution to all widgets that support key presses
466
500
  # TODO support event.location once DOM3 is supported by opal-jquery
501
+ event.define_singleton_method(:widget) {myself}
467
502
  event.define_singleton_method(:keyCode) {event.which}
468
503
  event.define_singleton_method(:key_code, &event.method(:keyCode))
469
504
  event.define_singleton_method(:character) {event.which.chr}
@@ -500,6 +535,7 @@ module Glimmer
500
535
  -> (event) {
501
536
  # TODO generalize this solution to all widgets that support key presses
502
537
  # TODO support event.location once DOM3 is supported by opal-jquery
538
+ event.define_singleton_method(:widget) {myself}
503
539
  event.define_singleton_method(:keyCode) {event.which}
504
540
  event.define_singleton_method(:key_code, &event.method(:keyCode))
505
541
  event.define_singleton_method(:character) {event.which.chr}
@@ -536,6 +572,7 @@ module Glimmer
536
572
  -> (event) {
537
573
  # TODO generalize this solution to all widgets that support key presses
538
574
  # TODO support event.location once DOM3 is supported by opal-jquery
575
+ event.define_singleton_method(:widget) {myself}
539
576
  event.define_singleton_method(:keyCode) {event.which}
540
577
  event.define_singleton_method(:key_code, &event.method(:keyCode))
541
578
  event.define_singleton_method(:character) {event.which.chr}
@@ -924,7 +961,9 @@ end
924
961
  require 'glimmer/swt/display_proxy'
925
962
  require 'glimmer/swt/browser_proxy'
926
963
  require 'glimmer/swt/button_proxy'
964
+ require 'glimmer/swt/arrow_proxy'
927
965
  require 'glimmer/swt/combo_proxy'
966
+ require 'glimmer/swt/c_combo_proxy'
928
967
  require 'glimmer/swt/checkbox_proxy'
929
968
  require 'glimmer/swt/composite_proxy'
930
969
  require 'glimmer/swt/dialog_proxy'
@@ -937,6 +976,8 @@ require 'glimmer/swt/menu_proxy'
937
976
  require 'glimmer/swt/radio_proxy'
938
977
  require 'glimmer/swt/tab_folder_proxy'
939
978
  require 'glimmer/swt/tab_item_proxy'
979
+ require 'glimmer/swt/c_tab_folder_proxy'
980
+ require 'glimmer/swt/c_tab_item_proxy'
940
981
  require 'glimmer/swt/table_column_proxy'
941
982
  require 'glimmer/swt/table_item_proxy'
942
983
  require 'glimmer/swt/table_proxy'
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.16.1
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - AndyMaleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-12 00:00:00.000000000 Z
11
+ date: 2021-08-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: glimmer
@@ -267,6 +267,7 @@ files:
267
267
  - app/controllers/glimmer/image_paths_controller.rb
268
268
  - app/views/glimmer/image_paths/index.html.erb
269
269
  - config/routes.rb
270
+ - lib/cgi.rb
270
271
  - lib/display.rb
271
272
  - lib/glimmer-dsl-opal.rb
272
273
  - lib/glimmer-dsl-opal/ext/class.rb
@@ -283,8 +284,11 @@ files:
283
284
  - lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/board.rb
284
285
  - lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/cell.rb
285
286
  - lib/glimmer-dsl-opal/samples/elaborate/weather.rb
287
+ - lib/glimmer-dsl-opal/samples/hello/hello_arrow.rb
286
288
  - lib/glimmer-dsl-opal/samples/hello/hello_browser.rb
287
289
  - lib/glimmer-dsl-opal/samples/hello/hello_button.rb
290
+ - lib/glimmer-dsl-opal/samples/hello/hello_c_combo.rb
291
+ - lib/glimmer-dsl-opal/samples/hello/hello_c_tab.rb
288
292
  - lib/glimmer-dsl-opal/samples/hello/hello_checkbox.rb
289
293
  - lib/glimmer-dsl-opal/samples/hello/hello_checkbox_group.rb
290
294
  - lib/glimmer-dsl-opal/samples/hello/hello_combo.rb
@@ -295,6 +299,7 @@ files:
295
299
  - lib/glimmer-dsl-opal/samples/hello/hello_date_time.rb
296
300
  - lib/glimmer-dsl-opal/samples/hello/hello_dialog.rb
297
301
  - lib/glimmer-dsl-opal/samples/hello/hello_group.rb
302
+ - lib/glimmer-dsl-opal/samples/hello/hello_layout.rb
298
303
  - lib/glimmer-dsl-opal/samples/hello/hello_list_multi_selection.rb
299
304
  - lib/glimmer-dsl-opal/samples/hello/hello_list_single_selection.rb
300
305
  - lib/glimmer-dsl-opal/samples/hello/hello_menu_bar.rb
@@ -306,6 +311,15 @@ files:
306
311
  - lib/glimmer-dsl-opal/samples/hello/hello_table.rb
307
312
  - lib/glimmer-dsl-opal/samples/hello/hello_table/baseball_park.png
308
313
  - lib/glimmer-dsl-opal/samples/hello/hello_world.rb
314
+ - lib/glimmer-dsl-opal/samples/hello/images/denmark.png
315
+ - lib/glimmer-dsl-opal/samples/hello/images/finland.png
316
+ - lib/glimmer-dsl-opal/samples/hello/images/france.png
317
+ - lib/glimmer-dsl-opal/samples/hello/images/germany.png
318
+ - lib/glimmer-dsl-opal/samples/hello/images/italy.png
319
+ - lib/glimmer-dsl-opal/samples/hello/images/mexico.png
320
+ - lib/glimmer-dsl-opal/samples/hello/images/netherlands.png
321
+ - lib/glimmer-dsl-opal/samples/hello/images/norway.png
322
+ - lib/glimmer-dsl-opal/samples/hello/images/usa.png
309
323
  - lib/glimmer-dsl-opal/vendor/jquery-ui-timepicker/GPL-LICENSE.txt
310
324
  - lib/glimmer-dsl-opal/vendor/jquery-ui-timepicker/MIT-LICENSE.txt
311
325
  - lib/glimmer-dsl-opal/vendor/jquery-ui-timepicker/jquery.ui.timepicker.css
@@ -368,8 +382,12 @@ files:
368
382
  - lib/glimmer/dsl/opal/widget_listener_expression.rb
369
383
  - lib/glimmer/engine.rb
370
384
  - lib/glimmer/swt.rb
385
+ - lib/glimmer/swt/arrow_proxy.rb
371
386
  - lib/glimmer/swt/browser_proxy.rb
372
387
  - lib/glimmer/swt/button_proxy.rb
388
+ - lib/glimmer/swt/c_combo_proxy.rb
389
+ - lib/glimmer/swt/c_tab_folder_proxy.rb
390
+ - lib/glimmer/swt/c_tab_item_proxy.rb
373
391
  - lib/glimmer/swt/checkbox_proxy.rb
374
392
  - lib/glimmer/swt/color_proxy.rb
375
393
  - lib/glimmer/swt/combo_proxy.rb