glimmer-dsl-swt 4.20.1.0 → 4.20.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -0
  3. data/README.md +12 -6
  4. data/VERSION +1 -1
  5. data/docs/reference/GLIMMER_GUI_DSL_SYNTAX.md +5 -2
  6. data/glimmer-dsl-swt.gemspec +0 -0
  7. data/lib/glimmer-dsl-swt.rb +1 -0
  8. data/lib/glimmer/data_binding/table_items_binding.rb +1 -0
  9. data/lib/glimmer/data_binding/tree_items_binding.rb +2 -2
  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 +2 -4
  14. data/lib/glimmer/dsl/swt/tree_items_data_binding_expression.rb +17 -12
  15. data/lib/glimmer/rake_task/scaffold.rb +2 -2
  16. data/lib/glimmer/swt/custom/animation.rb +6 -0
  17. data/lib/glimmer/swt/custom/checkbox_group.rb +1 -1
  18. data/lib/glimmer/swt/custom/radio_group.rb +2 -1
  19. data/lib/glimmer/swt/proxy_properties.rb +5 -5
  20. data/lib/glimmer/swt/widget_proxy.rb +3 -0
  21. data/lib/glimmer/ui/custom_shape.rb +1 -1
  22. data/lib/glimmer/ui/custom_widget.rb +1 -1
  23. data/samples/elaborate/calculator.rb +1 -1
  24. data/samples/elaborate/contact_manager.rb +2 -2
  25. data/samples/elaborate/meta_sample.rb +5 -5
  26. data/samples/elaborate/tetris.rb +2 -2
  27. data/samples/elaborate/tetris/view/bevel.rb +11 -11
  28. data/samples/elaborate/tetris/view/block.rb +1 -1
  29. data/samples/elaborate/tetris/view/high_score_dialog.rb +4 -4
  30. data/samples/elaborate/tetris/view/score_lane.rb +3 -3
  31. data/samples/elaborate/tetris/view/tetris_menu_bar.rb +9 -9
  32. data/samples/elaborate/timer.rb +8 -8
  33. data/samples/elaborate/weather.rb +8 -4
  34. data/samples/hello/hello_canvas_animation_data_binding.rb +1 -1
  35. data/samples/hello/hello_checkbox_group.rb +1 -1
  36. data/samples/hello/hello_code_text.rb +3 -3
  37. data/samples/hello/hello_computed.rb +20 -2
  38. data/samples/hello/hello_cool_bar.rb +1 -1
  39. data/samples/hello/hello_cursor.rb +1 -1
  40. data/samples/hello/hello_custom_shell.rb +17 -11
  41. data/samples/hello/hello_directory_dialog.rb +1 -1
  42. data/samples/hello/hello_radio_group.rb +2 -2
  43. data/samples/hello/hello_table.rb +1 -1
  44. data/samples/hello/hello_tool_bar.rb +1 -1
  45. data/samples/hello/hello_tree.rb +11 -11
  46. metadata +44 -26
  47. data/lib/glimmer/data_binding/shine.rb +0 -61
  48. data/samples/hello/hello_computed/contact.rb +0 -42
@@ -226,7 +226,7 @@ class MetaSampleApplication
226
226
  row_layout(:vertical) {
227
227
  fill true
228
228
  }
229
- selection bind(sample_directory, :selected_sample_name)
229
+ selection <=> [sample_directory, :selected_sample_name]
230
230
  font height: 20
231
231
  }
232
232
  }
@@ -242,7 +242,7 @@ class MetaSampleApplication
242
242
  button {
243
243
  text 'Launch'
244
244
  font height: 25
245
- enabled bind(SampleDirectory, 'selected_sample.launchable')
245
+ enabled <= [SampleDirectory, 'selected_sample.launchable']
246
246
 
247
247
  on_widget_selected {
248
248
  begin
@@ -255,7 +255,7 @@ class MetaSampleApplication
255
255
  button {
256
256
  text 'Reset'
257
257
  font height: 25
258
- enabled bind(SampleDirectory, 'selected_sample.editable')
258
+ enabled <= [SampleDirectory, 'selected_sample.editable']
259
259
 
260
260
  on_widget_selected {
261
261
  SampleDirectory.selected_sample.reset_code!
@@ -277,8 +277,8 @@ class MetaSampleApplication
277
277
  line_numbers {
278
278
  background :white
279
279
  }
280
- text bind(SampleDirectory, 'selected_sample.code', read_only: true)
281
- editable bind(SampleDirectory, 'selected_sample.editable')
280
+ text <=> [SampleDirectory, 'selected_sample.code']
281
+ editable <= [SampleDirectory, 'selected_sample.editable']
282
282
  left_margin 7
283
283
  right_margin 7
284
284
  }
@@ -102,14 +102,14 @@ class Tetris
102
102
  }
103
103
 
104
104
  after_body {
105
- @game_over_observer = observe(@game, :game_over) do |game_over|
105
+ observe(@game, :game_over) do |game_over|
106
106
  if game_over
107
107
  show_high_score_dialog
108
108
  else
109
109
  start_moving_tetrominos_down
110
110
  end
111
111
  end
112
- @show_high_scores_observer = observe(@game, :show_high_scores) do |show_high_scores|
112
+ observe(@game, :show_high_scores) do |show_high_scores|
113
113
  if show_high_scores
114
114
  show_high_score_dialog
115
115
  else
@@ -35,44 +35,44 @@ class Tetris
35
35
 
36
36
  body {
37
37
  rectangle(x, y, size, size) {
38
- background bind(self, :base_color)
38
+ background <= [self, :base_color]
39
39
  polygon(0, 0, size, 0, size - bevel_pixel_size, bevel_pixel_size, bevel_pixel_size, bevel_pixel_size) {
40
- background bind(self, :base_color) { |color_value|
40
+ background <= [self, :base_color, on_read: ->(color_value) {
41
41
  unless color_value.nil?
42
42
  color = color(color_value)
43
43
  rgb(color.red + 4*BEVEL_CONSTANT, color.green + 4*BEVEL_CONSTANT, color.blue + 4*BEVEL_CONSTANT)
44
44
  end
45
- }
45
+ }]
46
46
  }
47
47
  polygon(size, 0, size - bevel_pixel_size, bevel_pixel_size, size - bevel_pixel_size, size - bevel_pixel_size, size, size) {
48
- background bind(self, :base_color) { |color_value|
48
+ background <= [self, :base_color, on_read: ->(color_value) {
49
49
  unless color_value.nil?
50
50
  color = color(color_value)
51
51
  rgb(color.red - BEVEL_CONSTANT, color.green - BEVEL_CONSTANT, color.blue - BEVEL_CONSTANT)
52
52
  end
53
- }
53
+ }]
54
54
  }
55
55
  polygon(size, size, 0, size, bevel_pixel_size, size - bevel_pixel_size, size - bevel_pixel_size, size - bevel_pixel_size) {
56
- background bind(self, :base_color) { |color_value|
56
+ background <= [self, :base_color, on_read: ->(color_value) {
57
57
  unless color_value.nil?
58
58
  color = color(color_value)
59
59
  rgb(color.red - 2*BEVEL_CONSTANT, color.green - 2*BEVEL_CONSTANT, color.blue - 2*BEVEL_CONSTANT)
60
60
  end
61
- }
61
+ }]
62
62
  }
63
63
  polygon(0, 0, 0, size, bevel_pixel_size, size - bevel_pixel_size, bevel_pixel_size, bevel_pixel_size) {
64
- background bind(self, :base_color) { |color_value|
64
+ background <= [self, :base_color, on_read: ->(color_value) {
65
65
  unless color_value.nil?
66
66
  color = color(color_value)
67
67
  rgb(color.red - BEVEL_CONSTANT, color.green - BEVEL_CONSTANT, color.blue - BEVEL_CONSTANT)
68
68
  end
69
- }
69
+ }]
70
70
  }
71
71
  rectangle(0, 0, size, size) {
72
- foreground bind(self, :base_color) { |color_value|
72
+ foreground <= [self, :base_color, on_read: ->(color_value) {
73
73
  # use gray instead of white for the border
74
74
  color_value == Model::Block::COLOR_CLEAR ? :gray : color_value
75
- }
75
+ }]
76
76
  }
77
77
  }
78
78
  }
@@ -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
  }
@@ -40,12 +40,12 @@ class Tetris
40
40
  type :vertical
41
41
  center true
42
42
  }
43
- text 'Tetris'
43
+ text 'Glimmer Tetris'
44
44
 
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
@@ -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
 
@@ -49,7 +49,7 @@ class HelloAnimationDataBinding
49
49
  selection <=> [self, :delay_time, on_read: ->(v) {(BigDecimal(v.to_s)*1000).to_f}, on_write: ->(v) {(BigDecimal(v.to_s)/1000).to_f}]
50
50
  }
51
51
  animation {
52
- every bind(self, :delay_time)
52
+ every <= [self, :delay_time]
53
53
 
54
54
  frame { |index|
55
55
  background rgb(index%100, index%100 + 100, index%55 + 200)
@@ -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
  }