glimmer-dsl-swt 4.20.2.1 → 4.20.4.2

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +20 -0
  3. data/README.md +6 -6
  4. data/VERSION +1 -1
  5. data/docs/reference/GLIMMER_GUI_DSL_SYNTAX.md +5 -2
  6. data/docs/reference/GLIMMER_SAMPLES.md +23 -0
  7. data/glimmer-dsl-swt.gemspec +0 -0
  8. data/lib/glimmer-dsl-swt.rb +1 -0
  9. data/lib/glimmer/data_binding/table_items_binding.rb +1 -0
  10. data/lib/glimmer/dsl/swt/bind_expression.rb +5 -25
  11. data/lib/glimmer/dsl/swt/custom_widget_expression.rb +1 -1
  12. data/lib/glimmer/dsl/swt/radio_group_selection_data_binding_expression.rb +1 -1
  13. data/lib/glimmer/dsl/swt/shine_data_binding_expression.rb +0 -2
  14. data/lib/glimmer/rake_task/scaffold.rb +2 -2
  15. data/lib/glimmer/swt/custom/checkbox_group.rb +1 -1
  16. data/lib/glimmer/swt/custom/radio_group.rb +2 -1
  17. data/lib/glimmer/swt/proxy_properties.rb +5 -5
  18. data/lib/glimmer/swt/widget_proxy.rb +3 -0
  19. data/lib/glimmer/ui/custom_shape.rb +1 -1
  20. data/lib/glimmer/ui/custom_widget.rb +1 -1
  21. data/samples/elaborate/calculator.rb +1 -1
  22. data/samples/elaborate/contact_manager.rb +1 -1
  23. data/samples/elaborate/meta_sample.rb +5 -5
  24. data/samples/elaborate/tetris/view/bevel.rb +11 -11
  25. data/samples/elaborate/tetris/view/block.rb +1 -1
  26. data/samples/elaborate/tetris/view/high_score_dialog.rb +3 -3
  27. data/samples/elaborate/tetris/view/score_lane.rb +3 -3
  28. data/samples/elaborate/tetris/view/tetris_menu_bar.rb +9 -9
  29. data/samples/elaborate/timer.rb +9 -9
  30. data/samples/elaborate/weather.rb +8 -4
  31. data/samples/hello/hello_c_tab.rb +9 -9
  32. data/samples/hello/hello_checkbox_group.rb +1 -1
  33. data/samples/hello/hello_code_text.rb +3 -3
  34. data/samples/hello/hello_computed.rb +20 -2
  35. data/samples/hello/hello_cool_bar.rb +1 -1
  36. data/samples/hello/hello_cursor.rb +1 -1
  37. data/samples/hello/hello_custom_shell.rb +17 -11
  38. data/samples/hello/hello_directory_dialog.rb +1 -1
  39. data/samples/hello/hello_label.rb +194 -0
  40. data/samples/hello/hello_radio_group.rb +2 -2
  41. data/samples/hello/hello_table.rb +1 -1
  42. data/samples/hello/hello_tool_bar.rb +1 -1
  43. data/samples/hello/{hello_c_tab → images}/denmark.png +0 -0
  44. data/samples/hello/{hello_c_tab → images}/finland.png +0 -0
  45. data/samples/hello/{hello_c_tab → images}/france.png +0 -0
  46. data/samples/hello/{hello_c_tab → images}/germany.png +0 -0
  47. data/samples/hello/{hello_c_tab → images}/italy.png +0 -0
  48. data/samples/hello/{hello_c_tab → images}/mexico.png +0 -0
  49. data/samples/hello/{hello_c_tab → images}/netherlands.png +0 -0
  50. data/samples/hello/{hello_c_tab → images}/norway.png +0 -0
  51. data/samples/hello/{hello_c_tab → images}/usa.png +0 -0
  52. metadata +54 -36
  53. data/lib/glimmer/data_binding/shine.rb +0 -63
  54. data/samples/elaborate/timer/alarm1.wav +0 -0
  55. data/samples/hello/hello_computed/contact.rb +0 -42
@@ -31,7 +31,7 @@ class Tetris
31
31
  body {
32
32
  canvas { |canvas_proxy|
33
33
  bevel(size: block_size) {
34
- base_color bind(game_playfield[row][column], :color)
34
+ base_color <= [game_playfield[row][column], :color]
35
35
  }
36
36
  }
37
37
  }
@@ -45,7 +45,7 @@ class Tetris
45
45
  tetris_menu_bar(game: game)
46
46
 
47
47
  label(:center) {
48
- text bind(game, :game_over) {|game_over| game_over ? 'Game Over!' : 'High Scores'}
48
+ text <= [game, :game_over, on_read: ->(game_over) { game_over ? 'Game Over!' : 'High Scores' }]
49
49
  font name: FONT_NAME, height: FONT_TITLE_HEIGHT, style: FONT_TITLE_STYLE
50
50
  }
51
51
  @high_score_table = table {
@@ -66,13 +66,13 @@ class Tetris
66
66
  text 'Level'
67
67
  }
68
68
 
69
- items bind(game, :high_scores, read_only_sort: true), column_properties(:name, :score, :lines, :level)
69
+ items <=> [game, :high_scores, read_only_sort: true, column_properties: [:name, :score, :lines, :level]]
70
70
  }
71
71
  composite {
72
72
  row_layout :horizontal
73
73
 
74
74
  @play_close_button = button {
75
- text bind(game, :game_over) {|game_over| game_over ? 'Play Again?' : 'Close'}
75
+ text <= [game, :game_over, on_read: ->(game_over) { game_over ? 'Play Again?' : 'Close'}]
76
76
  focus true # initial focus
77
77
 
78
78
  on_widget_selected {
@@ -55,7 +55,7 @@ class Tetris
55
55
  font name: @font_name, height: @font_height, style: FONT_TITLE_STYLE
56
56
  }
57
57
  label(:center) {
58
- text bind(game, :score)
58
+ text <= [game, :score]
59
59
  font height: @font_height
60
60
  }
61
61
 
@@ -66,7 +66,7 @@ class Tetris
66
66
  font name: @font_name, height: @font_height, style: FONT_TITLE_STYLE
67
67
  }
68
68
  label(:center) {
69
- text bind(game, :lines)
69
+ text <= [game, :lines]
70
70
  font height: @font_height
71
71
  }
72
72
 
@@ -77,7 +77,7 @@ class Tetris
77
77
  font name: @font_name, height: @font_height, style: FONT_TITLE_STYLE
78
78
  }
79
79
  label(:center) {
80
- text bind(game, :level)
80
+ text <= [game, :level]
81
81
  font height: @font_height
82
82
  }
83
83
  }
@@ -35,7 +35,7 @@ class Tetris
35
35
 
36
36
  menu_item {
37
37
  text '&Start'
38
- enabled bind(game, :game_over)
38
+ enabled <= [game, :game_over]
39
39
  accelerator COMMAND_KEY, :s
40
40
 
41
41
  on_widget_selected {
@@ -45,9 +45,9 @@ class Tetris
45
45
  menu_item(:check) {
46
46
  text '&Pause'
47
47
  accelerator COMMAND_KEY, :p
48
- enabled bind(game, :game_over, on_read: :!) {|value| value && !game.show_high_scores}
49
- enabled bind(game, :show_high_scores, on_read: :!) {|value| value && !game.game_over}
50
- selection bind(game, :paused)
48
+ enabled <= [game, :game_over, on_read: ->(value) { value && !game.show_high_scores }]
49
+ enabled <= [game, :show_high_scores, on_read: ->(value) { value && !game.game_over }]
50
+ selection <=> [game, :paused]
51
51
  }
52
52
  menu_item {
53
53
  text '&Restart'
@@ -76,7 +76,7 @@ class Tetris
76
76
  menu_item(:check) {
77
77
  text '&Show'
78
78
  accelerator COMMAND_KEY, :shift, :h
79
- selection bind(game, :show_high_scores)
79
+ selection <=> [game, :show_high_scores]
80
80
  }
81
81
  menu_item {
82
82
  text '&Clear'
@@ -94,24 +94,24 @@ class Tetris
94
94
  menu_item(:check) {
95
95
  text '&Beeping'
96
96
  accelerator COMMAND_KEY, :b
97
- selection bind(game, :beeping)
97
+ selection <=> [game, :beeping]
98
98
  }
99
99
  menu {
100
100
  text 'Up Arrow'
101
101
  menu_item(:radio) {
102
102
  text '&Instant Down'
103
103
  accelerator COMMAND_KEY, :shift, :i
104
- selection bind(game, :instant_down_on_up, computed_by: :up_arrow_action)
104
+ selection <=> [game, :instant_down_on_up, computed_by: :up_arrow_action]
105
105
  }
106
106
  menu_item(:radio) {
107
107
  text 'Rotate &Right'
108
108
  accelerator COMMAND_KEY, :shift, :r
109
- selection bind(game, :rotate_right_on_up, computed_by: :up_arrow_action)
109
+ selection <=> [game, :rotate_right_on_up, computed_by: :up_arrow_action]
110
110
  }
111
111
  menu_item(:radio) {
112
112
  text 'Rotate &Left'
113
113
  accelerator COMMAND_KEY, :shift, :l
114
- selection bind(game, :rotate_left_on_up, computed_by: :up_arrow_action)
114
+ selection <=> [game, :rotate_left_on_up, computed_by: :up_arrow_action]
115
115
  }
116
116
  }
117
117
  } # end of menu
@@ -6,7 +6,7 @@ class Timer
6
6
 
7
7
  import 'javax.sound.sampled'
8
8
 
9
- FILE_SOUND_ALARM = File.expand_path(File.join('timer', 'alarm1.wav'), __dir__)
9
+ FILE_SOUND_ALARM = File.expand_path(File.join('timer', 'sounds', 'alarm1.wav'), __dir__)
10
10
  COMMAND_KEY = OS.mac? ? :command : :ctrl
11
11
 
12
12
  ## Add options like the following to configure CustomShell by outside consumers
@@ -84,7 +84,7 @@ class Timer
84
84
  menu_item {
85
85
  text '&Start'
86
86
  accelerator COMMAND_KEY, 's'
87
- enabled bind(self, :countdown, on_read: :!)
87
+ enabled <= [self, :countdown, on_read: :!]
88
88
 
89
89
  on_widget_selected {
90
90
  start_countdown
@@ -92,7 +92,7 @@ class Timer
92
92
  }
93
93
  menu_item {
94
94
  text 'St&op'
95
- enabled bind(self, :countdown)
95
+ enabled <= [self, :countdown]
96
96
  accelerator COMMAND_KEY, 'o'
97
97
 
98
98
  on_widget_selected {
@@ -148,8 +148,8 @@ class Timer
148
148
  text_limit 2
149
149
  digits 0
150
150
  maximum 59
151
- selection bind(self, :min)
152
- enabled bind(self, :countdown, on_read: :!)
151
+ selection <=> [self, :min]
152
+ enabled <= [self, :countdown, on_read: :!]
153
153
  on_widget_default_selected {
154
154
  start_countdown
155
155
  }
@@ -162,8 +162,8 @@ class Timer
162
162
  text_limit 2
163
163
  digits 0
164
164
  maximum 59
165
- selection bind(self, :sec)
166
- enabled bind(self, :countdown, on_read: :!)
165
+ selection <=> [self, :sec]
166
+ enabled <= [self, :countdown, on_read: :!]
167
167
  on_widget_default_selected {
168
168
  start_countdown
169
169
  }
@@ -179,7 +179,7 @@ class Timer
179
179
  }
180
180
  @start_button = button {
181
181
  text '&Start'
182
- enabled bind(self, :countdown, on_read: :!)
182
+ enabled <= [self, :countdown, on_read: :!]
183
183
  on_widget_selected {
184
184
  start_countdown
185
185
  }
@@ -189,7 +189,7 @@ class Timer
189
189
  }
190
190
  @stop_button = button {
191
191
  text 'St&op'
192
- enabled bind(self, :countdown)
192
+ enabled <= [self, :countdown]
193
193
  on_widget_selected {
194
194
  stop_countdown
195
195
  }
@@ -29,6 +29,7 @@ class Weather
29
29
 
30
30
  DEFAULT_FONT_HEIGHT = 30
31
31
  DEFAULT_FOREGROUND = :white
32
+ DEFAULT_BACKGROUND = rgb(135, 176, 235)
32
33
 
33
34
  attr_accessor :city, :temp, :temp_min, :temp_max, :feels_like, :humidity
34
35
 
@@ -54,7 +55,7 @@ class Weather
54
55
 
55
56
  text 'Glimmer Weather'
56
57
  minimum_size 400, 300
57
- background rgb(135, 176, 235)
58
+ background DEFAULT_BACKGROUND
58
59
 
59
60
  text {
60
61
  layout_data(:center, :center, true, true)
@@ -78,7 +79,7 @@ class Weather
78
79
  grid_layout 2, false
79
80
 
80
81
  text temp_unit
81
- background :transparent
82
+ background DEFAULT_BACKGROUND
82
83
 
83
84
  rectangle(0, 0, [:default, -2], [:default, -2], 15, 15) {
84
85
  foreground DEFAULT_FOREGROUND
@@ -128,8 +129,8 @@ class Weather
128
129
  @weather_mutex.synchronize do
129
130
  self.weather_data = JSON.parse(Net::HTTP.get('api.openweathermap.org', "/data/2.5/weather?q=#{city}&appid=1d16d70a9aec3570b5cbd27e6b421330"))
130
131
  end
131
- rescue
132
- # No Op
132
+ rescue => e
133
+ Glimmer::Config.logger.error "Unable to fetch weather due to error: #{e.full_message}"
133
134
  end
134
135
 
135
136
  def weather_data=(data)
@@ -148,14 +149,17 @@ class Weather
148
149
  end
149
150
 
150
151
  def kelvin_to_celsius(kelvin)
152
+ return nil if kelvin.nil?
151
153
  kelvin - 273.15
152
154
  end
153
155
 
154
156
  def celsius_to_fahrenheit(celsius)
157
+ return nil if celsius.nil?
155
158
  (celsius * 9 / 5 ) + 32
156
159
  end
157
160
 
158
161
  def kelvin_to_fahrenheit(kelvin)
162
+ return nil if kelvin.nil?
159
163
  celsius_to_fahrenheit(kelvin_to_celsius(kelvin))
160
164
  end
161
165
 
@@ -44,7 +44,7 @@ class HelloCTab
44
44
  foreground :blue
45
45
  selection_foreground :dark_blue
46
46
  font name: 'Times New Roman', height: 30, style: [:bold, :italic]
47
- image File.expand_path('hello_c_tab/usa.png', __dir__)
47
+ image File.expand_path('images/usa.png', __dir__)
48
48
 
49
49
  label {
50
50
  text 'Hello, World!'
@@ -58,7 +58,7 @@ class HelloCTab
58
58
  foreground :blue
59
59
  selection_foreground :dark_blue
60
60
  font name: 'Times New Roman', height: 30, style: [:bold, :italic]
61
- image File.expand_path('hello_c_tab/france.png', __dir__)
61
+ image File.expand_path('images/france.png', __dir__)
62
62
 
63
63
  label {
64
64
  text 'Bonjour, Univers!'
@@ -72,7 +72,7 @@ class HelloCTab
72
72
  foreground :blue
73
73
  selection_foreground :dark_blue
74
74
  font name: 'Times New Roman', height: 30, style: [:bold, :italic]
75
- image File.expand_path('hello_c_tab/mexico.png', __dir__)
75
+ image File.expand_path('images/mexico.png', __dir__)
76
76
 
77
77
  label {
78
78
  text 'Hola, Mundo!'
@@ -86,7 +86,7 @@ class HelloCTab
86
86
  foreground :blue
87
87
  selection_foreground :dark_blue
88
88
  font name: 'Times New Roman', height: 30, style: [:bold, :italic]
89
- image File.expand_path('hello_c_tab/germany.png', __dir__)
89
+ image File.expand_path('images/germany.png', __dir__)
90
90
 
91
91
  label {
92
92
  text 'Hallo, Welt!'
@@ -100,7 +100,7 @@ class HelloCTab
100
100
  foreground :blue
101
101
  selection_foreground :dark_blue
102
102
  font name: 'Times New Roman', height: 30, style: [:bold, :italic]
103
- image File.expand_path('hello_c_tab/italy.png', __dir__)
103
+ image File.expand_path('images/italy.png', __dir__)
104
104
 
105
105
  label {
106
106
  text 'Ciao, Mondo!'
@@ -114,7 +114,7 @@ class HelloCTab
114
114
  foreground :blue
115
115
  selection_foreground :dark_blue
116
116
  font name: 'Times New Roman', height: 30, style: [:bold, :italic]
117
- image File.expand_path('hello_c_tab/netherlands.png', __dir__)
117
+ image File.expand_path('images/netherlands.png', __dir__)
118
118
 
119
119
  label {
120
120
  text 'Hallo, Wereld!'
@@ -128,7 +128,7 @@ class HelloCTab
128
128
  foreground :blue
129
129
  selection_foreground :dark_blue
130
130
  font name: 'Times New Roman', height: 30, style: [:bold, :italic]
131
- image File.expand_path('hello_c_tab/denmark.png', __dir__)
131
+ image File.expand_path('images/denmark.png', __dir__)
132
132
 
133
133
  label {
134
134
  text 'Hej, Verden!'
@@ -142,7 +142,7 @@ class HelloCTab
142
142
  foreground :blue
143
143
  selection_foreground :dark_blue
144
144
  font name: 'Times New Roman', height: 30, style: [:bold, :italic]
145
- image File.expand_path('hello_c_tab/finland.png', __dir__)
145
+ image File.expand_path('images/finland.png', __dir__)
146
146
 
147
147
  label {
148
148
  text 'Hei, Maailma!'
@@ -156,7 +156,7 @@ class HelloCTab
156
156
  foreground :blue
157
157
  selection_foreground :dark_blue
158
158
  font name: 'Times New Roman', height: 30, style: [:bold, :italic]
159
- image File.expand_path('hello_c_tab/norway.png', __dir__)
159
+ image File.expand_path('images/norway.png', __dir__)
160
160
 
161
161
  label {
162
162
  text 'Hei, Verden!'
@@ -58,7 +58,7 @@ class HelloCheckboxGroup
58
58
  }
59
59
 
60
60
  checkbox_group {
61
- selection bind(@person, :activities)
61
+ selection <=> [@person, :activities]
62
62
  }
63
63
 
64
64
  button {
@@ -85,7 +85,7 @@ class HelloCodeText
85
85
  fill_layout
86
86
  text 'Ruby (glimmer theme)'
87
87
  code_text(language: 'ruby', theme: 'glimmer', lines: true) {
88
- text bind(self, :ruby_code)
88
+ text <=> [self, :ruby_code]
89
89
  }
90
90
  }
91
91
  tab_item {
@@ -101,14 +101,14 @@ class HelloCodeText
101
101
  line_numbers {
102
102
  background :white
103
103
  }
104
- text bind(self, :js_code)
104
+ text <=> [self, :js_code]
105
105
  }
106
106
  }
107
107
  tab_item {
108
108
  fill_layout
109
109
  text 'HTML (github theme)'
110
110
  code_text(language: 'html', theme: 'github') { # default is lines: false
111
- text bind(self, :html_code)
111
+ text <=> [self, :html_code]
112
112
  }
113
113
  }
114
114
  }
@@ -21,9 +21,27 @@
21
21
 
22
22
  require 'glimmer-dsl-swt'
23
23
 
24
- require_relative 'hello_computed/contact'
25
-
26
24
  class HelloComputed
25
+ class Contact
26
+ attr_accessor :first_name, :last_name, :year_of_birth
27
+
28
+ def initialize(attribute_map)
29
+ @first_name = attribute_map[:first_name]
30
+ @last_name = attribute_map[:last_name]
31
+ @year_of_birth = attribute_map[:year_of_birth]
32
+ end
33
+
34
+ def name
35
+ "#{last_name}, #{first_name}"
36
+ end
37
+
38
+ def age
39
+ Time.now.year - year_of_birth.to_i
40
+ rescue
41
+ 0
42
+ end
43
+ end
44
+
27
45
  include Glimmer::UI::CustomShell
28
46
 
29
47
  before_body {
@@ -73,7 +73,7 @@ class HelloCoolBar
73
73
  }
74
74
  # a combo can be nested in a tool_bar (it auto-generates a tool_item for itself behind the scenes)
75
75
  combo {
76
- selection bind(self, :font_size)
76
+ selection <=> [self, :font_size]
77
77
  }
78
78
  }
79
79
  }
@@ -51,7 +51,7 @@ class HelloCursor
51
51
  }
52
52
  radio_group {
53
53
  grid_layout 5, true
54
- selection bind(self, :selected_cursor)
54
+ selection <=> [self, :selected_cursor]
55
55
  }
56
56
  }
57
57
  }
@@ -88,12 +88,10 @@ class EmailShell
88
88
  end
89
89
 
90
90
  class HelloCustomShell
91
- include Glimmer::UI::CustomShell
92
-
93
91
  Email = Struct.new(:date, :subject, :from, :message, keyword_init: true)
94
92
  EmailSystem = Struct.new(:emails, keyword_init: true)
95
93
 
96
- before_body {
94
+ def initialize
97
95
  @email_system = EmailSystem.new(
98
96
  emails: [
99
97
  Email.new(date: DateTime.new(2029, 10, 22, 11, 3, 0).strftime('%F %I:%M %p'), subject: '3rd Week Report', from: '"Dianne Tux" <dianne.tux@example.com>', message: "Hello,\n\nI was wondering if you'd like to go over the weekly report sometime this afternoon.\n\nDianne"),
@@ -104,10 +102,10 @@ class HelloCustomShell
104
102
  Email.new(date: DateTime.new(2029, 10, 2, 10, 34, 0).strftime('%F %I:%M %p'), subject: 'Glimmer Upgrade v98.0', from: '"Robert McGabbins" <robert.mcgabbins@example.com>', message: "Team,\n\nWe are upgrading to Glimmer version 98.0.\n\nEveryone pull the latest code!\n\nRegards,\n\nRobert McGabbins"),
105
103
  ]
106
104
  )
107
- }
105
+ end
108
106
 
109
- body {
110
- shell {
107
+ def launch
108
+ shell { |shell_proxy|
111
109
  grid_layout
112
110
 
113
111
  text 'Hello, Custom Shell!'
@@ -138,15 +136,23 @@ class HelloCustomShell
138
136
  width 360
139
137
  }
140
138
 
141
- items <= [@email_system, :emails, column_properties: [:date, :subject, :from]]
139
+ items <=> [@email_system, :emails, column_properties: [:date, :subject, :from]]
142
140
 
143
141
  on_mouse_up { |event|
144
142
  email = event.table_item.get_data
145
- email_shell(parent_shell: self, date: email.date, subject: email.subject, from: email.from, message: email.message).open
143
+
144
+ # open a custom email shell
145
+ email_shell(
146
+ parent_shell: shell_proxy,
147
+ date: email.date,
148
+ subject: email.subject,
149
+ from: email.from,
150
+ message: email.message
151
+ ).open
146
152
  }
147
153
  }
148
- }
149
- }
154
+ }.open
155
+ end
150
156
  end
151
157
 
152
- HelloCustomShell.launch
158
+ HelloCustomShell.new.launch