glimmer-dsl-opal 0.12.0 → 0.16.0

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 (33) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +22 -0
  3. data/README.md +179 -1296
  4. data/VERSION +1 -1
  5. data/app/controllers/glimmer/application_controller.rb +4 -0
  6. data/app/controllers/glimmer/image_paths_controller.rb +46 -0
  7. data/app/views/glimmer/image_paths/index.html.erb +1 -0
  8. data/{lib/glimmer-dsl-opal/samples/hello/hello_computed/contact.rb → config/routes.rb} +2 -20
  9. data/lib/glimmer-dsl-opal.rb +9 -3
  10. data/lib/glimmer-dsl-opal/ext/file.rb +25 -0
  11. data/lib/glimmer-dsl-opal/samples/elaborate/contact_manager.rb +0 -2
  12. data/lib/glimmer-dsl-opal/samples/elaborate/weather.rb +157 -0
  13. data/lib/glimmer-dsl-opal/samples/hello/hello_button.rb +7 -7
  14. data/lib/glimmer-dsl-opal/samples/hello/hello_checkbox.rb +16 -14
  15. data/lib/glimmer-dsl-opal/samples/hello/hello_checkbox_group.rb +14 -9
  16. data/lib/glimmer-dsl-opal/samples/hello/hello_combo.rb +24 -22
  17. data/lib/glimmer-dsl-opal/samples/hello/hello_computed.rb +27 -9
  18. data/lib/glimmer-dsl-opal/samples/hello/hello_custom_shell.rb +15 -11
  19. data/lib/glimmer-dsl-opal/samples/hello/hello_custom_widget.rb +1 -1
  20. data/lib/glimmer-dsl-opal/samples/hello/hello_radio.rb +18 -16
  21. data/lib/glimmer-dsl-opal/samples/hello/hello_radio_group.rb +17 -12
  22. data/lib/glimmer-dsl-opal/samples/hello/hello_table.rb +29 -21
  23. data/lib/glimmer-dsl-opal/samples/hello/hello_table/baseball_park.png +0 -0
  24. data/lib/glimmer/config.rb +11 -0
  25. data/lib/glimmer/dsl/opal/custom_widget_expression.rb +2 -2
  26. data/lib/glimmer/engine.rb +21 -0
  27. data/lib/glimmer/swt/composite_proxy.rb +34 -0
  28. data/lib/glimmer/swt/label_proxy.rb +15 -2
  29. data/lib/glimmer/swt/shell_proxy.rb +43 -0
  30. data/lib/glimmer/swt/table_item_proxy.rb +3 -0
  31. data/lib/glimmer/ui/custom_widget.rb +11 -2
  32. data/lib/net/http.rb +15 -6
  33. metadata +9 -3
@@ -19,45 +19,47 @@
19
19
  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
20
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
21
 
22
- class Person
23
- attr_accessor :country, :country_options
24
-
25
- def initialize
26
- self.country_options = ['', 'Canada', 'US', 'Mexico']
27
- reset_country
28
- end
29
-
30
- def reset_country
31
- self.country = 'Canada'
22
+ class HelloCombo
23
+ class Person
24
+ attr_accessor :country, :country_options
25
+
26
+ def initialize
27
+ self.country_options = ['', 'Canada', 'US', 'Mexico']
28
+ reset_country!
29
+ end
30
+
31
+ def reset_country!
32
+ self.country = 'Canada'
33
+ end
32
34
  end
33
- end
34
35
 
35
- class HelloCombo
36
- include Glimmer
36
+ include Glimmer::UI::CustomShell
37
37
 
38
- def launch
39
- person = Person.new
40
-
38
+ before_body {
39
+ @person = Person.new
40
+ }
41
+
42
+ body {
41
43
  shell {
42
44
  row_layout(:vertical) {
43
- pack false
45
+ fill true
44
46
  }
45
47
 
46
48
  text 'Hello, Combo!'
47
49
 
48
50
  combo(:read_only) {
49
- selection <=> [person, :country]
51
+ selection <=> [@person, :country] # also binds to country_options by convention
50
52
  }
51
53
 
52
54
  button {
53
55
  text 'Reset Selection'
54
56
 
55
57
  on_widget_selected do
56
- person.reset_country
58
+ @person.reset_country!
57
59
  end
58
60
  }
59
- }.open
60
- end
61
+ }
62
+ }
61
63
  end
62
64
 
63
- HelloCombo.new.launch
65
+ HelloCombo.launch
@@ -19,20 +19,38 @@
19
19
  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
20
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
21
 
22
- require_relative 'hello_computed/contact'
23
-
24
22
  class HelloComputed
25
- include Glimmer
23
+ class Contact
24
+ attr_accessor :first_name, :last_name, :year_of_birth
25
+
26
+ def initialize(attribute_map)
27
+ @first_name = attribute_map[:first_name]
28
+ @last_name = attribute_map[:last_name]
29
+ @year_of_birth = attribute_map[:year_of_birth]
30
+ end
31
+
32
+ def name
33
+ "#{last_name}, #{first_name}"
34
+ end
35
+
36
+ def age
37
+ Time.now.year - year_of_birth.to_i
38
+ rescue
39
+ 0
40
+ end
41
+ end
42
+
43
+ include Glimmer::UI::CustomShell
26
44
 
27
- def initialize
45
+ before_body {
28
46
  @contact = Contact.new(
29
47
  first_name: 'Barry',
30
48
  last_name: 'McKibbin',
31
49
  year_of_birth: 1985
32
50
  )
33
- end
51
+ }
34
52
 
35
- def launch
53
+ body {
36
54
  shell {
37
55
  text 'Hello, Computed!'
38
56
 
@@ -89,8 +107,8 @@ class HelloComputed
89
107
  }
90
108
  }
91
109
  }
92
- }.open
93
- end
110
+ }
111
+ }
94
112
  end
95
113
 
96
- HelloComputed.new.launch
114
+ HelloComputed.launch
@@ -24,10 +24,11 @@ require 'date'
24
24
  # This class declares an `email_shell` custom shell, aka custom window (by convention)
25
25
  # Used to view an email message
26
26
  class EmailShell
27
+ # including Glimmer::UI::CustomShell enables declaring as an `email_shell` custom widget Glimmer GUI DSL keyword
27
28
  include Glimmer::UI::CustomShell
28
29
 
29
30
  # multiple options without default values
30
- options :date, :subject, :from, :message
31
+ options :parent_shell, :date, :subject, :from, :message
31
32
 
32
33
  # single option with default value
33
34
  option :to, default: '"John Irwin" <john.irwin@example.com>'
@@ -38,7 +39,7 @@ class EmailShell
38
39
 
39
40
  body {
40
41
  # pass received swt_style through to shell to customize it (e.g. :dialog_trim for a blocking shell)
41
- shell(swt_style) {
42
+ shell(parent_shell, swt_style) {
42
43
  grid_layout(2, false)
43
44
 
44
45
  text subject
@@ -73,7 +74,7 @@ class EmailShell
73
74
 
74
75
  label {
75
76
  layout_data(:fill, :fill, true, true) {
76
- horizontal_span 2 #TODO implement
77
+ horizontal_span 2
77
78
  vertical_indent 10
78
79
  }
79
80
 
@@ -86,9 +87,8 @@ class EmailShell
86
87
  end
87
88
 
88
89
  class HelloCustomShell
89
- # including Glimmer enables the Glimmer DSL syntax, including auto-discovery of the `email_shell` custom widget
90
90
  include Glimmer
91
-
91
+
92
92
  Email = Struct.new(:date, :subject, :from, :message, keyword_init: true)
93
93
  EmailSystem = Struct.new(:emails, keyword_init: true)
94
94
 
@@ -106,7 +106,7 @@ class HelloCustomShell
106
106
  end
107
107
 
108
108
  def launch
109
- shell {
109
+ shell { |shell_proxy|
110
110
  grid_layout
111
111
 
112
112
  text 'Hello, Custom Shell!'
@@ -141,11 +141,15 @@ class HelloCustomShell
141
141
 
142
142
  on_mouse_up { |event|
143
143
  email = event.table_item.get_data
144
- Thread.new do
145
- async_exec {
146
- email_shell(date: email.date, subject: email.subject, from: email.from, message: email.message).open
147
- }
148
- end
144
+
145
+ # open a custom email shell
146
+ email_shell(
147
+ parent_shell: shell_proxy,
148
+ date: email.date,
149
+ subject: email.subject,
150
+ from: email.from,
151
+ message: email.message
152
+ ).open
149
153
  }
150
154
  }
151
155
  }.open
@@ -55,7 +55,7 @@ class GreetingLabel
55
55
  label(swt_style) {
56
56
  text "#{greeting}, #{name}!"
57
57
  font @font
58
- foreground bind(self, :color)
58
+ foreground <= [self, :color]
59
59
  }
60
60
  }
61
61
 
@@ -24,10 +24,10 @@ class HelloRadio
24
24
  attr_accessor :male, :female, :child, :teen, :adult, :senior
25
25
 
26
26
  def initialize
27
- reset
27
+ reset!
28
28
  end
29
29
 
30
- def reset
30
+ def reset!
31
31
  self.male = nil
32
32
  self.female = nil
33
33
  self.child = nil
@@ -37,11 +37,13 @@ class HelloRadio
37
37
  end
38
38
  end
39
39
 
40
- include Glimmer
40
+ include Glimmer::UI::CustomShell
41
41
 
42
- def launch
43
- person = Person.new
44
-
42
+ before_body {
43
+ @person = Person.new
44
+ }
45
+
46
+ body {
45
47
  shell {
46
48
  text 'Hello, Radio!'
47
49
  row_layout :vertical
@@ -56,12 +58,12 @@ class HelloRadio
56
58
 
57
59
  radio {
58
60
  text 'Male'
59
- selection <=> [person, :male]
61
+ selection <=> [@person, :male]
60
62
  }
61
63
 
62
64
  radio {
63
65
  text 'Female'
64
- selection <=> [person, :female]
66
+ selection <=> [@person, :female]
65
67
  }
66
68
  }
67
69
 
@@ -75,22 +77,22 @@ class HelloRadio
75
77
 
76
78
  radio {
77
79
  text 'Child'
78
- selection <=> [person, :child]
80
+ selection <=> [@person, :child]
79
81
  }
80
82
 
81
83
  radio {
82
84
  text 'Teen'
83
- selection <=> [person, :teen]
85
+ selection <=> [@person, :teen]
84
86
  }
85
87
 
86
88
  radio {
87
89
  text 'Adult'
88
- selection <=> [person, :adult]
90
+ selection <=> [@person, :adult]
89
91
  }
90
92
 
91
93
  radio {
92
94
  text 'Senior'
93
- selection <=> [person, :senior]
95
+ selection <=> [@person, :senior]
94
96
  }
95
97
  }
96
98
 
@@ -98,11 +100,11 @@ class HelloRadio
98
100
  text 'Reset'
99
101
 
100
102
  on_widget_selected do
101
- person.reset
103
+ @person.reset!
102
104
  end
103
105
  }
104
- }.open
105
- end
106
+ }
107
+ }
106
108
  end
107
109
 
108
- HelloRadio.new.launch
110
+ HelloRadio.launch
@@ -19,12 +19,15 @@
19
19
  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
20
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
21
 
22
+ # This sample demonstrates the use of a `radio_group` in Glimmer, which provides terser syntax
23
+ # than HelloRadio for representing multiple radio buttons by relying on data-binding to
24
+ # automatically spawn the `radio` widgets based on available options on the model.
22
25
  class HelloRadioGroup
23
26
  class Person
24
27
  attr_accessor :gender, :age_group
25
28
 
26
29
  def initialize
27
- reset
30
+ reset!
28
31
  end
29
32
 
30
33
  def gender_options
@@ -35,17 +38,19 @@ class HelloRadioGroup
35
38
  ['Child', 'Teen', 'Adult', 'Senior']
36
39
  end
37
40
 
38
- def reset
41
+ def reset!
39
42
  self.gender = nil
40
43
  self.age_group = 'Adult'
41
44
  end
42
45
  end
43
46
 
44
- include Glimmer
47
+ include Glimmer::UI::CustomShell
45
48
 
46
- def launch
47
- person = Person.new
48
-
49
+ before_body {
50
+ @person = Person.new
51
+ }
52
+
53
+ body {
49
54
  shell {
50
55
  text 'Hello, Radio Group!'
51
56
  row_layout :vertical
@@ -57,7 +62,7 @@ class HelloRadioGroup
57
62
 
58
63
  radio_group {
59
64
  row_layout :horizontal
60
- selection bind(person, :gender)
65
+ selection <=> [@person, :gender]
61
66
  }
62
67
 
63
68
  label {
@@ -67,18 +72,18 @@ class HelloRadioGroup
67
72
 
68
73
  radio_group {
69
74
  row_layout :horizontal
70
- selection bind(person, :age_group)
75
+ selection <=> [@person, :age_group]
71
76
  }
72
77
 
73
78
  button {
74
79
  text 'Reset'
75
80
 
76
81
  on_widget_selected do
77
- person.reset
82
+ @person.reset!
78
83
  end
79
84
  }
80
- }.open
81
- end
85
+ }
86
+ }
82
87
  end
83
88
 
84
- HelloRadioGroup.new.launch
89
+ HelloRadioGroup.launch
@@ -179,25 +179,33 @@ class HelloTable
179
179
  end
180
180
  end
181
181
 
182
- include Glimmer
183
-
184
- def launch
182
+ include Glimmer::UI::CustomShell
183
+
184
+ before_body {
185
+ Display.app_name = 'Hello, Table!'
186
+ }
187
+
188
+ body {
185
189
  shell {
186
190
  grid_layout
187
191
 
188
192
  text 'Hello, Table!'
193
+ background_image File.expand_path('hello_table/baseball_park.png', __dir__)
194
+ image File.expand_path('hello_table/baseball_park.png', __dir__)
189
195
 
190
196
  label {
191
197
  layout_data :center, :center, true, false
192
198
 
193
- text 'Baseball Playoff Schedule'
194
- font height: 30, style: :bold
199
+ text 'BASEBALL PLAYOFF SCHEDULE'
200
+ background :transparent if OS.windows?
201
+ foreground rgb(94, 107, 103)
202
+ font name: 'Optima', height: 38, style: :bold
195
203
  }
196
204
 
197
205
  combo(:read_only) {
198
206
  layout_data :center, :center, true, false
199
- selection bind(BaseballGame, :playoff_type)
200
- font height: 16
207
+ selection <=> [BaseballGame, :playoff_type]
208
+ font height: 14
201
209
  }
202
210
 
203
211
  table(:editable) { |table_proxy|
@@ -248,29 +256,29 @@ class HelloTable
248
256
  # Sort by these additional properties after handling sort by the column the user clicked
249
257
  additional_sort_properties :date, :time, :home_team, :away_team, :ballpark, :promotion
250
258
 
251
- # menu {
252
- # menu_item {
253
- # text 'Book'
254
- #
255
- # on_widget_selected {
256
- # book_selected_game
257
- # }
258
- # }
259
- # }
259
+ menu {
260
+ menu_item {
261
+ text 'Book'
262
+
263
+ on_widget_selected {
264
+ book_selected_game
265
+ }
266
+ }
267
+ }
260
268
  }
261
269
 
262
270
  button {
263
271
  text 'Book Selected Game'
264
272
  layout_data :center, :center, true, false
265
- font height: 16
266
- enabled bind(BaseballGame, :selected_game)
273
+ font height: 14
274
+ enabled <= [BaseballGame, :selected_game]
267
275
 
268
276
  on_widget_selected {
269
277
  book_selected_game
270
278
  }
271
279
  }
272
- }.open
273
- end
280
+ }
281
+ }
274
282
 
275
283
  def book_selected_game
276
284
  message_box {
@@ -280,4 +288,4 @@ class HelloTable
280
288
  end
281
289
  end
282
290
 
283
- HelloTable.new.launch
291
+ HelloTable.launch