glimmer 0.6.0 → 0.7.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.
- checksums.yaml +4 -4
- data/README.markdown +212 -161
- data/RUBY_VERSION +1 -0
- data/VERSION +1 -0
- data/icons/scaffold_app.icns +0 -0
- data/lib/glimmer.rb +5 -47
- data/lib/glimmer/config.rb +35 -0
- data/lib/glimmer/css/{rule_set.rb → rule.rb} +3 -5
- data/lib/glimmer/css/style_sheet.rb +4 -5
- data/lib/glimmer/data_binding/observable_model.rb +1 -1
- data/lib/glimmer/dsl/css/dsl.rb +2 -2
- data/lib/glimmer/dsl/css/dynamic_property_expression.rb +12 -0
- data/lib/glimmer/dsl/css/property_expression.rb +3 -3
- data/lib/glimmer/dsl/css/pv_expression.rb +17 -0
- data/lib/glimmer/dsl/css/{rule_set_expression.rb → rule_expression.rb} +4 -4
- data/lib/glimmer/dsl/css/s_expression.rb +3 -3
- data/lib/glimmer/dsl/engine.rb +35 -5
- data/lib/glimmer/dsl/expression_handler.rb +3 -3
- data/lib/glimmer/dsl/swt/color_expression.rb +2 -0
- data/lib/glimmer/dsl/swt/dsl.rb +2 -0
- data/lib/glimmer/dsl/swt/tab_item_expression.rb +1 -1
- data/lib/glimmer/dsl/swt/widget_listener_expression.rb +5 -5
- data/lib/glimmer/dsl/xml/name_space_expression.rb +1 -1
- data/lib/glimmer/launcher.rb +64 -19
- data/lib/glimmer/rake_task.rb +64 -23
- data/lib/glimmer/scaffold.rb +442 -0
- data/lib/glimmer/swt/layout_data_proxy.rb +1 -1
- data/lib/glimmer/swt/layout_proxy.rb +2 -2
- data/lib/glimmer/swt/swt_proxy.rb +3 -3
- data/lib/glimmer/swt/widget_proxy.rb +5 -5
- data/lib/glimmer/ui/custom_widget.rb +3 -3
- data/lib/glimmer/xml/node.rb +1 -1
- data/lib/glimmer/xml/xml_visitor.rb +2 -2
- metadata +16 -42
- data/bin/gladiator +0 -6
- data/lib/glimmer/dsl/css/p_expression.rb +0 -25
- data/lib/glimmer/ui/video.rb +0 -289
- data/samples/gladiator.rb +0 -765
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2c1935b1d8ac63f8f79323e754e9a32a6c3ed8465db80da479a36e28f377d7a
|
4
|
+
data.tar.gz: 1b64ca831d6d2b911278abfd6156fa6267a9a88b82bc8a5a5a4bf7b35c09c403
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ccab304701eefa5bcd8560995878b2f50cf739f6ec092244b5a0bfdc686e15859f81f74c62939beaccb0efd5052a126adfe2dbde887afb13d697af7430b68f7f
|
7
|
+
data.tar.gz: 1ba3e00febd0b60e3c9105b0737c4a875c438cc450048c7cc49bc8d06a84eb0a311b3581d5c61845c3b0a17fd1ec7dbc554428d02b8d3853e048e14b3fcca9fb
|
data/README.markdown
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Glimmer 0.
|
1
|
+
# Glimmer 0.7.0 Beta (JRuby Desktop UI DSL + Data-Binding)
|
2
2
|
[](https://coveralls.io/github/AndyObtiva/glimmer?branch=master)
|
3
3
|
|
4
4
|
Glimmer is a native-UI cross-platform desktop development library written in Ruby. Glimmer's main innovation is a JRuby DSL that enables productive and efficient authoring of desktop application user-interfaces while relying on the robust Eclipse SWT library. Glimmer additionally innovates by having built-in data-binding support to greatly facilitate synchronizing the UI with domain models. As a result, that achieves true decoupling of object oriented components, enabling developers to solve business problems without worrying about UI concerns, or alternatively drive development UI-first, and then write clean business components test-first afterwards.
|
@@ -7,7 +7,7 @@ Glimmer is a native-UI cross-platform desktop development library written in Rub
|
|
7
7
|
|
8
8
|
### Hello World
|
9
9
|
|
10
|
-
Glimmer code (from `samples/hello_world.rb`):
|
10
|
+
Glimmer code (from `samples/hello/hello_world.rb`):
|
11
11
|
```ruby
|
12
12
|
include Glimmer
|
13
13
|
|
@@ -21,7 +21,7 @@ shell {
|
|
21
21
|
|
22
22
|
Run:
|
23
23
|
```
|
24
|
-
glimmer samples/hello_world.rb
|
24
|
+
glimmer samples/hello/hello_world.rb
|
25
25
|
```
|
26
26
|
|
27
27
|
Glimmer app:
|
@@ -30,7 +30,7 @@ Glimmer app:
|
|
30
30
|
|
31
31
|
### Tic Tac Toe
|
32
32
|
|
33
|
-
Glimmer code (from `samples/
|
33
|
+
Glimmer code (from `samples/elaborate/tic_tac_toe.rb`):
|
34
34
|
|
35
35
|
```ruby
|
36
36
|
# ...
|
@@ -58,7 +58,7 @@ shell {
|
|
58
58
|
Run:
|
59
59
|
|
60
60
|
```
|
61
|
-
glimmer samples/
|
61
|
+
glimmer samples/elaborate/tic_tac_toe.rb
|
62
62
|
```
|
63
63
|
|
64
64
|
Glimmer app:
|
@@ -70,7 +70,7 @@ NOTE: Glimmer is in beta mode. Please help make better by adopting for small or
|
|
70
70
|
## Table of Contents
|
71
71
|
|
72
72
|
<!-- TOC START min:1 max:3 link:true asterisk:false update:true -->
|
73
|
-
- [Glimmer 0.
|
73
|
+
- [Glimmer 0.7.0 Beta (JRuby Desktop UI DSL + Data-Binding)](#glimmer-058-beta-jruby-desktop-ui-dsl--data-binding)
|
74
74
|
- [Examples](#examples)
|
75
75
|
- [Hello World](#hello-world)
|
76
76
|
- [Tic Tac Toe](#tic-tac-toe)
|
@@ -143,9 +143,9 @@ https://www.eclipse.org/swt/faq.php
|
|
143
143
|
|
144
144
|
## Pre-requisites
|
145
145
|
|
146
|
-
|
147
|
-
|
148
|
-
|
146
|
+
- SWT 4.15 (comes included in Glimmer gem)
|
147
|
+
- JRuby 9.2.11.1 (supporting Ruby 2.5.x syntax) (find at https://www.jruby.org/download)
|
148
|
+
- Java SE Runtime Environment 7 or higher (find at https://www.oracle.com/java/technologies/javase-downloads.html)
|
149
149
|
|
150
150
|
On **Mac** and **Linux**, an easy way to obtain JRuby is through [RVM](http://rvm.io) by running:
|
151
151
|
|
@@ -163,14 +163,18 @@ Please follow these instructions to make the `glimmer` command available on your
|
|
163
163
|
|
164
164
|
Run this command to install directly:
|
165
165
|
```
|
166
|
-
jgem install glimmer -v 0.
|
166
|
+
jgem install glimmer -v 0.7.0
|
167
167
|
```
|
168
168
|
|
169
|
+
`jgem` is JRuby's version of `gem` command.
|
170
|
+
RVM allows running `gem` as an alias.
|
171
|
+
Otherwise, you may also run `jruby -S gem install ...`
|
172
|
+
|
169
173
|
### Option 2: Bundler
|
170
174
|
|
171
175
|
Add the following to `Gemfile`:
|
172
176
|
```
|
173
|
-
gem 'glimmer', '~> 0.
|
177
|
+
gem 'glimmer', '~> 0.7.0'
|
174
178
|
```
|
175
179
|
|
176
180
|
And, then run:
|
@@ -191,7 +195,7 @@ the glimmer ruby gem and SWT jar dependency.
|
|
191
195
|
|
192
196
|
Example:
|
193
197
|
```
|
194
|
-
glimmer samples/hello_world.rb
|
198
|
+
glimmer samples/hello/hello_world.rb
|
195
199
|
```
|
196
200
|
This runs the Glimmer "Hello, World!" sample.
|
197
201
|
|
@@ -199,30 +203,166 @@ If you cloned this project locally, you may run `bin/glimmer` instead.
|
|
199
203
|
|
200
204
|
Example:
|
201
205
|
```
|
202
|
-
bin/glimmer samples/hello_world.rb
|
206
|
+
bin/glimmer samples/hello/hello_world.rb
|
203
207
|
```
|
204
208
|
|
205
209
|
### Advanced Usage
|
206
210
|
|
211
|
+
Below are the full usage instructions that come up when running `glimmer` without args.
|
212
|
+
|
207
213
|
```
|
208
|
-
glimmer [--log-level=VALUE] [[ENV_VAR=VALUE]...] [[-jruby-option]...] application.rb [[application2.rb]...]
|
209
|
-
|
214
|
+
Usage: glimmer [--debug] [--log-level=VALUE] [[ENV_VAR=VALUE]...] [[-jruby-option]...] (application.rb or task[task_args]) [[application2.rb]...]
|
215
|
+
|
216
|
+
Runs Glimmer applications/tasks.
|
217
|
+
|
218
|
+
Either a single task or one or more applications may be specified.
|
219
|
+
|
220
|
+
When a task is specified, it runs via rake. Some tasks take arguments in square brackets.
|
221
|
+
|
222
|
+
Available tasks are below (you may also lookup by adding `require 'glimmer/rake_task'` in Rakefile and running rake -T):
|
223
|
+
glimmer package # Package app for distribution (generating config, jar, and native files)
|
224
|
+
glimmer package:config # Generate JAR config file
|
225
|
+
glimmer package:jar # Generate JAR file
|
226
|
+
glimmer package:native # Generate Native files (DMG/PKG/APP on the Mac)
|
227
|
+
glimmer scaffold[app_name] # Scaffold a Glimmer application directory structure to begin building a new app
|
228
|
+
glimmer scaffold:custom_shell[custom_shell_name,namespace] # Scaffold a Glimmer::UI::CustomShell subclass (represents a full window view) under app/views (namespace is optional)
|
229
|
+
glimmer scaffold:custom_widget[custom_widget_name,namespace] # Scaffold a Glimmer::UI::CustomWidget subclass (represents a part of a view) under app/views (namespace is optional)
|
230
|
+
glimmer scaffold:custom_widget_gem[custom_widget_name,namespace] # Scaffold a Glimmer::UI::CustomWidget subclass (represents a part of a view) under its own Ruby gem project (namespace is required)
|
210
231
|
|
211
|
-
|
232
|
+
When applications are specified, they are run using JRuby,
|
233
|
+
automatically preloading the glimmer Ruby gem and SWT jar dependency.
|
212
234
|
|
213
|
-
|
235
|
+
Optionally, extra Glimmer options, JRuby options and environment variables may be passed in.
|
236
|
+
|
237
|
+
Concerning Glimmer options:
|
238
|
+
- "--debug" : Displays extra debugging information and passes "--debug" to JRuby
|
239
|
+
- "--log-level=VALUE" : Sets Glimmer's Ruby logger level ("ERROR" / "WARN" / "INFO" / "DEBUG"; default is "WARN")
|
240
|
+
|
241
|
+
Example: glimmer samples/hello/hello_world.rb
|
242
|
+
|
243
|
+
This runs the Glimmer application samples/hello/hello_world.rb
|
214
244
|
```
|
215
|
-
|
245
|
+
|
246
|
+
Example (Glimmer/JRuby option specified):
|
247
|
+
```
|
248
|
+
glimmer --debug samples/hello/hello_world.rb
|
216
249
|
```
|
217
250
|
|
218
251
|
Runs Glimmer application with JRuby debug option to enable JRuby debugging.
|
219
252
|
|
220
253
|
Example (Multiple apps):
|
221
254
|
```
|
222
|
-
glimmer samples/hello_world.rb samples/hello_tab.rb
|
255
|
+
glimmer samples/hello/hello_world.rb samples/hello_tab.rb
|
256
|
+
```
|
257
|
+
|
258
|
+
Launches samples/hello/hello_world.rb and samples/hello_tab.rb at the same time, each in a separate JRuby thread.
|
259
|
+
|
260
|
+
### Scaffolding
|
261
|
+
|
262
|
+
Glimmer borrows from Rails the idea of Scaffolding, that is generating a structure for your app files that
|
263
|
+
helps you get started just like true building scaffolding helps construction workers, civil engineers, and architects.
|
264
|
+
|
265
|
+
Glimmer scaffolding goes way beyond just scaffolding the app files that Rails does. It also packages it and launches it,
|
266
|
+
getting you to a running and delivered state of an advanced "Hello, World!" Glimmer application right off the bat.
|
267
|
+
|
268
|
+
This should greatly facilitate building a new Glimmer app by helping you be productive and focus on app details while
|
269
|
+
letting Glimmer scaffolding take care of initial app file structure concerns, such as adding:
|
270
|
+
- Main application class that includes Glimmer
|
271
|
+
- Main application view that houses main window content
|
272
|
+
- View and Model directories
|
273
|
+
- Rakefile including Glimmer tasks
|
274
|
+
- Version
|
275
|
+
- License
|
276
|
+
- Icon
|
277
|
+
- Bin file for starting application
|
278
|
+
|
279
|
+
#### App
|
280
|
+
|
281
|
+
Before you start, make sure you are in a JRuby environment with Glimmer gem installed as per "Direct Install" pre-requisites.
|
282
|
+
|
283
|
+
To scaffold a Glimmer app from scratch, run the following command:
|
284
|
+
|
285
|
+
```
|
286
|
+
glimmer scaffold[AppName]
|
287
|
+
```
|
288
|
+
|
289
|
+
This will generate an advanced "Hello, World!" app, package it as a Mac native file (DMG/PKG/APP), and launch it all in one fell swoop.
|
290
|
+
|
291
|
+
Suppose you run:
|
292
|
+
|
293
|
+
```
|
294
|
+
glimmer scaffold[CarMaker]
|
295
|
+
```
|
296
|
+
|
297
|
+
You should see output like the following:
|
298
|
+
|
299
|
+
```
|
300
|
+
Created CarMaker/.ruby-version
|
301
|
+
Created CarMaker/.ruby-gemset
|
302
|
+
Created CarMaker/VERSION
|
303
|
+
Created CarMaker/LICENSE.txt
|
304
|
+
Created CarMaker/Gemfile
|
305
|
+
Created CarMaker/Rakefile
|
306
|
+
Created CarMaker/app/car_maker.rb
|
307
|
+
Created CarMaker/app/views/car_maker/app_view.rb
|
308
|
+
Created CarMaker/package/macosx/Car Maker.icns
|
309
|
+
Created CarMaker/bin/car_maker
|
310
|
+
...
|
311
|
+
```
|
312
|
+
|
313
|
+
Eventually, it will launch an advanced "Hello, World!" app window having the title of your application and a Mac icon.
|
314
|
+
|
315
|
+

|
316
|
+
|
317
|
+
#### Custom Shell
|
318
|
+
|
319
|
+
To scaffold a Glimmer custom shell (full window view) for an existing Glimmer app, run the following command:
|
320
|
+
|
321
|
+
```
|
322
|
+
glimmer scaffold:custom_shell[custom_shell_name]
|
323
|
+
```
|
324
|
+
|
325
|
+
#### Custom Widget
|
326
|
+
|
327
|
+
To scaffold a Glimmer custom widget (part of a view) for an existing Glimmer app, run the following command:
|
328
|
+
|
329
|
+
```
|
330
|
+
glimmer scaffold:custom_widget[custom_widget_name]
|
331
|
+
```
|
332
|
+
|
333
|
+
#### Custom Shell Gem
|
334
|
+
|
335
|
+
Custom shell gems are self-contained Glimmer apps as well as reusable custom shells.
|
336
|
+
|
337
|
+
To scaffold a Glimmer custom shell gem (full window view externalized into a gem) for an existing Glimmer app, run the following command:
|
338
|
+
|
339
|
+
```
|
340
|
+
glimmer scaffold:custom_shell_gem[custom_shell_name, namespace]
|
341
|
+
```
|
342
|
+
|
343
|
+
It is important to specify a namespace to avoid having your gem clash with existing gems.
|
344
|
+
|
345
|
+
The Ruby gem name will follow the convention "glimmer-cs-customwidgetname-namespace" (the 'cs' is for Custom Shell)
|
346
|
+
|
347
|
+
Only official Glimmer gems created by the Glimmer project committers will have no namespace (e.g. "glimmer-cs-gladiator" Ruby gem)
|
348
|
+
|
349
|
+
Example: [https://github.com/AndyObtiva/glimmer-cs-gladiator](https://github.com/AndyObtiva/glimmer-cs-gladiator)
|
350
|
+
|
351
|
+
#### Custom Widget Gem
|
352
|
+
|
353
|
+
To scaffold a Glimmer custom widget gem (part of a view externalized into a gem) for an existing Glimmer app, run the following command:
|
354
|
+
|
223
355
|
```
|
356
|
+
glimmer scaffold:custom_widget_gem[custom_widget_name, namespace]
|
357
|
+
```
|
358
|
+
|
359
|
+
It is important to specify a namespace to avoid having your gem clash with existing gems.
|
360
|
+
|
361
|
+
The Ruby gem name will follow the convention "glimmer-cw-customwidgetname-namespace" (the 'cw' is for Custom Widget)
|
224
362
|
|
225
|
-
|
363
|
+
Only official Glimmer gems created by the Glimmer project committers will have no namespace (e.g. "glimmer-cw-video" Ruby gem)
|
364
|
+
|
365
|
+
Example: [https://github.com/AndyObtiva/glimmer-cw-video](https://github.com/AndyObtiva/glimmer-cw-video)
|
226
366
|
|
227
367
|
## Girb (Glimmer irb) Command
|
228
368
|
|
@@ -287,7 +427,7 @@ Every **widget** is sufficiently declared by name, but may optionally be accompa
|
|
287
427
|
- SWT **style** ***argument*** wrapped by parenthesis according to [Glimmer Style Guide](#glimmer-coding-style) (see [next section](#widget-styles) for details).
|
288
428
|
- Ruby block containing **properties** (widget attributes) and **content** (nested widgets)
|
289
429
|
|
290
|
-
For example, if we were to revisit `samples/hello_world.rb` above (you may copy/paste in [`girb`](#girb-glimmer-irb-command)):
|
430
|
+
For example, if we were to revisit `samples/hello/hello_world.rb` above (you may copy/paste in [`girb`](#girb-glimmer-irb-command)):
|
291
431
|
|
292
432
|
```ruby
|
293
433
|
shell {
|
@@ -341,7 +481,7 @@ It is centered upon initial display and has a minimum width of 130 (can be re-ce
|
|
341
481
|
|
342
482
|
Check out the [samples](samples) directory for more examples.
|
343
483
|
|
344
|
-
Example from [hello_tab.rb](samples/hello_tab.rb) sample (you may copy/paste in [`girb`](#girb-glimmer-irb-command)):
|
484
|
+
Example from [hello_tab.rb](samples/hello/hello_tab.rb) sample (you may copy/paste in [`girb`](#girb-glimmer-irb-command)):
|
345
485
|
|
346
486
|

|
347
487
|
|
@@ -787,7 +927,7 @@ composite {
|
|
787
927
|
# ...
|
788
928
|
```
|
789
929
|
|
790
|
-
Here is a more sophisticated example taken from [hello_computed.rb](samples/
|
930
|
+
Here is a more sophisticated example taken from [hello_computed.rb](samples/hello/hello_computed.rb) sample:
|
791
931
|
```ruby
|
792
932
|
shell {
|
793
933
|
text "Hello Computed"
|
@@ -970,7 +1110,7 @@ This example demonstrates computed value data binding whereby the value of `name
|
|
970
1110
|
|
971
1111
|
This example demonstrates nested indexed computed value data binding whereby the value of `profiles[0].name` depends on changes to both nested `profiles[0].first_name` and `profiles[0].last_name`.
|
972
1112
|
|
973
|
-
Example from [samples/hello_combo.rb](samples/hello_combo.rb) sample (you may copy/paste in [`girb`](#girb-glimmer-irb-command)):
|
1113
|
+
Example from [samples/hello/hello_combo.rb](samples/hello_combo.rb) sample (you may copy/paste in [`girb`](#girb-glimmer-irb-command)):
|
974
1114
|
|
975
1115
|

|
976
1116
|
|
@@ -1015,7 +1155,7 @@ HelloCombo.new.launch
|
|
1015
1155
|
|
1016
1156
|
`combo` widget is data-bound to the country of a person. Note that it expects `person` object to have `:country` attribute and `:country_options` attribute containing all available countries.
|
1017
1157
|
|
1018
|
-
Example from [samples/hello_list_single_selection.rb](samples/hello_list_single_selection.rb) sample:
|
1158
|
+
Example from [samples/hello/hello_list_single_selection.rb](samples/hello_list_single_selection.rb) sample:
|
1019
1159
|
|
1020
1160
|

|
1021
1161
|
|
@@ -1039,7 +1179,7 @@ shell {
|
|
1039
1179
|
|
1040
1180
|
Nonetheless, in the next example, a multi-selection list is declared instead allowing data-binding of multiple selection values to the bindable attribute on the model.
|
1041
1181
|
|
1042
|
-
Example from [samples/hello_list_multi_selection.rb](samples/hello_list_multi_selection.rb) sample (you may copy/paste in [`girb`](#girb-glimmer-irb-command)):
|
1182
|
+
Example from [samples/hello/hello_list_multi_selection.rb](samples/hello_list_multi_selection.rb) sample (you may copy/paste in [`girb`](#girb-glimmer-irb-command)):
|
1043
1183
|
|
1044
1184
|

|
1045
1185
|
|
@@ -1139,7 +1279,7 @@ shell {
|
|
1139
1279
|
text bind(@tic_tac_toe_board[row, column], :sign)
|
1140
1280
|
enabled bind(@tic_tac_toe_board[row, column], :empty)
|
1141
1281
|
on_widget_selected {
|
1142
|
-
@tic_tac_toe_board.
|
1282
|
+
@tic_tac_toe_board.mark(row, column)
|
1143
1283
|
}
|
1144
1284
|
}
|
1145
1285
|
}
|
@@ -1148,9 +1288,9 @@ shell {
|
|
1148
1288
|
}
|
1149
1289
|
```
|
1150
1290
|
|
1151
|
-
Note that every Tic Tac Toe grid cell has its `text` and `enabled` properties data-bound to the `sign` and `empty` attributes on the `
|
1291
|
+
Note that every Tic Tac Toe grid cell has its `text` and `enabled` properties data-bound to the `sign` and `empty` attributes on the `TicTacToe::Board` model respectively.
|
1152
1292
|
|
1153
|
-
Next however, each of these Tic Tac Toe grid cells, which are clickable buttons, have an `on_widget_selected` observer, which once triggered, marks the
|
1293
|
+
Next however, each of these Tic Tac Toe grid cells, which are clickable buttons, have an `on_widget_selected` observer, which once triggered, marks the cell on the `TicTacToe::Board` to make a move.
|
1154
1294
|
|
1155
1295
|
**Regarding number 2**, you can figure out all available events by looking at the `org.eclipse.swt.SWT` API:
|
1156
1296
|
|
@@ -1221,8 +1361,8 @@ class TicTacToe
|
|
1221
1361
|
def initialize
|
1222
1362
|
# ...
|
1223
1363
|
observe(@tic_tac_toe_board, :game_status) { |game_status|
|
1224
|
-
display_win_message if game_status ==
|
1225
|
-
display_draw_message if game_status ==
|
1364
|
+
display_win_message if game_status == Board::WIN
|
1365
|
+
display_draw_message if game_status == Board::DRAW
|
1226
1366
|
}
|
1227
1367
|
end
|
1228
1368
|
# ...
|
@@ -1231,7 +1371,7 @@ end
|
|
1231
1371
|
|
1232
1372
|
Observers can be a good mechanism for displaying dialog messages in Glimmer (using SWT's `MessageBox`).
|
1233
1373
|
|
1234
|
-
Look at [`samples/tictactoe/tic_tac_toe.rb`](samples/tictactoe/tic_tac_toe.rb) for more details starting with the code included below.
|
1374
|
+
Look at [`samples/elaborate/tictactoe/tic_tac_toe.rb`](samples/tictactoe/tic_tac_toe.rb) for more details starting with the code included below.
|
1235
1375
|
|
1236
1376
|
```ruby
|
1237
1377
|
class TicTacToe
|
@@ -1241,8 +1381,8 @@ class TicTacToe
|
|
1241
1381
|
def initialize
|
1242
1382
|
# ...
|
1243
1383
|
observe(@tic_tac_toe_board, :game_status) { |game_status|
|
1244
|
-
display_win_message if game_status ==
|
1245
|
-
display_draw_message if game_status ==
|
1384
|
+
display_win_message if game_status == Board::WIN
|
1385
|
+
display_draw_message if game_status == Board::DRAW
|
1246
1386
|
}
|
1247
1387
|
end
|
1248
1388
|
|
@@ -1561,11 +1701,12 @@ Also, you may invoke `Display.setAppVersion('1.0.0')` if needed for OS app versi
|
|
1561
1701
|
#### Multi-DSL Support
|
1562
1702
|
|
1563
1703
|
Glimmer supports two other DSLs in addition to the SWT DSL; that is Glimmer XML DSL and Glimmer CSS DSL. It also allows mixing DSLs, which comes in handy when doing things like using the `browser` widget. Glimmer automatically recognizes top-level keywords in each DSL
|
1564
|
-
and switches DSLs accordingly
|
1704
|
+
and switches DSLs accordingly. Once done processing a top-level keyword, it switches back to the prior DSL automatically.
|
1565
1705
|
|
1566
1706
|
For example, the SWT DSL has the following top-level keywords:
|
1567
1707
|
- `shell`
|
1568
1708
|
- `display`
|
1709
|
+
- `color`
|
1569
1710
|
- `observe`
|
1570
1711
|
- `async_exec`
|
1571
1712
|
- `sync_exec`
|
@@ -1599,7 +1740,7 @@ puts @xml
|
|
1599
1740
|
Output:
|
1600
1741
|
|
1601
1742
|
```
|
1602
|
-
<html><head><meta name
|
1743
|
+
<html><head><meta name="viewport" content="width=device-width, initial-scale=2.0" /></head><body><h1>Hello, World!</h1></body></html>
|
1603
1744
|
```
|
1604
1745
|
|
1605
1746
|
Example (explicit XML tag / you may copy/paste in [`girb`](#girb-glimmer-irb-command)):
|
@@ -1629,7 +1770,7 @@ puts @xml
|
|
1629
1770
|
Output:
|
1630
1771
|
|
1631
1772
|
```
|
1632
|
-
<w3c:html id
|
1773
|
+
<w3c:html id="thesis" class="document"><w3c:body id="main"></w3c:body></w3c:html>
|
1633
1774
|
```
|
1634
1775
|
|
1635
1776
|
Example (XML namespaces using dot operator / you may copy/paste in [`girb`](#girb-glimmer-irb-command)):
|
@@ -1656,16 +1797,21 @@ Once done, you may call `to_s` or `to_css` to get the formatted CSS output.
|
|
1656
1797
|
|
1657
1798
|
`css` is the only top-level keyword in the Glimmer CSS DSL
|
1658
1799
|
|
1800
|
+
Selectors may be specified by `s` keyword or HTML element keyword directly (e.g. `body`)
|
1801
|
+
Rule property values may be specified by `pv` keyword or underscored property name directly (e.g. `font_size`)
|
1802
|
+
|
1659
1803
|
Example (you may copy/paste in [`girb`](#girb-glimmer-irb-command)):
|
1660
1804
|
|
1661
1805
|
```ruby
|
1662
1806
|
@css = css {
|
1663
1807
|
body {
|
1664
|
-
font_size
|
1808
|
+
font_size '1.1em'
|
1809
|
+
pv 'background', 'white'
|
1665
1810
|
}
|
1666
1811
|
|
1667
1812
|
s('body > h1') {
|
1668
1813
|
background_color :red
|
1814
|
+
pv 'font-size', '2em'
|
1669
1815
|
}
|
1670
1816
|
}
|
1671
1817
|
puts @css
|
@@ -1675,84 +1821,9 @@ puts @css
|
|
1675
1821
|
|
1676
1822
|

|
1677
1823
|
|
1678
|
-
Glimmer
|
1679
|
-
|
1680
|
-
Options (passed in an options hash as arguments to video widget):
|
1681
|
-
- `autoplay` (true [default] or false): plays video automatically as soon as loaded
|
1682
|
-
- `controls` (true [default] or false): displays controls
|
1683
|
-
- `looped` (true or false [default]): plays video in looped mode
|
1684
|
-
- `background` (Glimmer color [default: white]): sets background color just like with any other widget
|
1685
|
-
- `fit_to_width` (true [default] or false): fits video width to widget allotted width regardless of video's original size. Maintains video aspect ratio.
|
1686
|
-
- `fit_to_height` (true [default] or false): fits video height to widget allotted height regardless of video's original size. Maintains video aspect ratio.
|
1687
|
-
- `offset_x` (integer [default: 0]): offset from left border. Could be a negative number if you want to show only an area of the video. Useful when fit_to_width is false to pick an area of the video to display.
|
1688
|
-
- `offset_y` (integer [default: 0]): offset from top border. Could be a negative number if you want to show only an area of the video. Useful when fit_to_height is false to pick an area of the video to display.
|
1689
|
-
|
1690
|
-
Methods:
|
1691
|
-
- `#play`: plays video
|
1692
|
-
- `#pause`: pauses video
|
1693
|
-
- `#reload`: reloads video restarting from beginning
|
1694
|
-
- `#position`: position in seconds (and fractions)
|
1695
|
-
- `#position=`: seeks a new position in video
|
1696
|
-
- `#duration`: length of video, maximum video position possible
|
1697
|
-
- `#loaded?`: returns true when video has been initially loaded or reloaded
|
1698
|
-
- `#playing?`: returns true when video is actively playing
|
1699
|
-
- `#paused?`: returns true when video is not playing
|
1700
|
-
- `#ended?`: returns true when video has reached the end (position == duration)
|
1701
|
-
|
1702
|
-
Events (to observe):
|
1703
|
-
- `on_loaded`: invoked when video `#loaded?` becomes true
|
1704
|
-
- `on_ended`: invoked when video `#ended?` becomes true
|
1705
|
-
- `on_playing`: invoked when video `#playing?` becomes true
|
1706
|
-
- `on_paused`: invoked when video `#paused?` becomes true
|
1707
|
-
|
1708
|
-
Example ([samples/video/hello_video.rb](samples/video/hello_video.rb)):
|
1709
|
-
|
1710
|
-
```ruby
|
1711
|
-
# ...
|
1712
|
-
shell {
|
1713
|
-
video(file: video_file)
|
1714
|
-
}.open
|
1715
|
-
```
|
1716
|
-
|
1717
|
-
Example ([samples/video/hello_looped_video_with_black_background.rb](samples/video/hello_looped_video_with_black_background.rb)):
|
1718
|
-
|
1719
|
-
```ruby
|
1720
|
-
# ...
|
1721
|
-
shell {
|
1722
|
-
minimum_size 1024, 640
|
1723
|
-
video(file: video_file, looped: true, background: :black)
|
1724
|
-
}.open
|
1725
|
-
```
|
1824
|
+
Glimmer supports a [video custom widget](https://github.com/AndyObtiva/glimmer-cw-video) not in SWT.
|
1726
1825
|
|
1727
|
-
|
1728
|
-
|
1729
|
-
```ruby
|
1730
|
-
# ...
|
1731
|
-
def display_video_status(video, status)
|
1732
|
-
message_box = MessageBox.new(video.swt_widget.getShell)
|
1733
|
-
message_box.setText(status)
|
1734
|
-
message = "Video Position: #{video.position} seconds\n"
|
1735
|
-
message += "Video Duration: #{video.duration} seconds"
|
1736
|
-
message_box.setMessage(message)
|
1737
|
-
message_box.open
|
1738
|
-
end
|
1739
|
-
|
1740
|
-
@shell = shell {
|
1741
|
-
minimum_size 800, 500
|
1742
|
-
@video = video(file: video_file, background: :black) {
|
1743
|
-
on_playing {
|
1744
|
-
display_video_status(@video, 'Playing')
|
1745
|
-
}
|
1746
|
-
on_paused {
|
1747
|
-
display_video_status(@video, 'Paused')
|
1748
|
-
}
|
1749
|
-
on_ended {
|
1750
|
-
display_video_status(@video, 'Ended')
|
1751
|
-
}
|
1752
|
-
}
|
1753
|
-
}
|
1754
|
-
@shell.open
|
1755
|
-
```
|
1826
|
+
You may obtain via `glimmer-cw-video` gem.
|
1756
1827
|
|
1757
1828
|
#### Browser Widget
|
1758
1829
|
|
@@ -1822,16 +1893,13 @@ samples/launch
|
|
1822
1893
|
For "Hello, World!" type samples, check the following:
|
1823
1894
|
|
1824
1895
|
```
|
1825
|
-
glimmer samples/hello_world.rb
|
1826
|
-
glimmer samples/hello_browser.rb
|
1827
|
-
glimmer samples/hello_tab.rb
|
1828
|
-
glimmer samples/hello_combo.rb
|
1829
|
-
glimmer samples/hello_list_single_selection.rb
|
1830
|
-
glimmer samples/hello_list_multi_selection.rb
|
1831
|
-
glimmer samples/
|
1832
|
-
glimmer samples/video/hello_video.rb
|
1833
|
-
glimmer samples/video/hello_looped_video_with_black_background.rb
|
1834
|
-
glimmer samples/video/hello_video_observers.rb
|
1896
|
+
glimmer samples/hello/hello_world.rb
|
1897
|
+
glimmer samples/hello/hello_browser.rb # demonstrates browser widget
|
1898
|
+
glimmer samples/hello/hello_tab.rb # demonstrates tabs
|
1899
|
+
glimmer samples/hello/hello_combo.rb # demonstrates combo data-binding
|
1900
|
+
glimmer samples/hello/hello_list_single_selection.rb # demonstrates list single-selection data-binding
|
1901
|
+
glimmer samples/hello/hello_list_multi_selection.rb # demonstrates list multi-selection data-binding
|
1902
|
+
glimmer samples/hello/hello_computed.rb # demonstrates computed data-binding
|
1835
1903
|
```
|
1836
1904
|
|
1837
1905
|
### Elaborate Samples
|
@@ -1839,42 +1907,15 @@ glimmer samples/video/hello_video_observers.rb
|
|
1839
1907
|
For more elaborate samples, check the following:
|
1840
1908
|
|
1841
1909
|
```
|
1842
|
-
glimmer samples/login.rb # demonstrates
|
1843
|
-
glimmer samples/
|
1844
|
-
glimmer samples/
|
1845
|
-
glimmer samples/gladiator.rb # demonstrates a text editor with tree/list data-binding
|
1910
|
+
glimmer samples/elaborate/login.rb # demonstrates general data-binding
|
1911
|
+
glimmer samples/elaborate/contact_manager.rb # demonstrates table data-binding
|
1912
|
+
glimmer samples/elaborate/tic_tac_toe.rb # demonstrates a full MVC application
|
1846
1913
|
```
|
1847
1914
|
|
1848
1915
|

|
1849
1916
|
|
1850
|
-
Gladiator (short for Glimmer Editor) is
|
1851
|
-
|
1852
|
-
It currently supports the following text editing features:
|
1853
|
-
- File explorer navigation to open file
|
1854
|
-
- File lookup by name
|
1855
|
-
- Find & Replace
|
1856
|
-
- Show Line Numbers
|
1857
|
-
- Jump to Line
|
1858
|
-
- Remember last opened file, caret position, and top line
|
1859
|
-
- Autosave on focus out/quit/open new file
|
1860
|
-
- Watch open file for external changes to reflect in editor
|
1861
|
-
- Duplicate Line(s)
|
1862
|
-
- Kill Line(s)
|
1863
|
-
- Move up one line
|
1864
|
-
- Move down one line
|
1865
|
-
|
1866
|
-
Gladiator has been made available in [Glimmer's gem](https://rubygems.org/gems/glimmer) via the `gladiator` command should others find useful too.
|
1867
|
-
|
1868
|
-
If you cloned this project and followed [CONTRIBUTING.md](CONTRIBUTING.md) instructions, you may invoke via `bin/gladiator` instead.
|
1869
|
-
|
1870
|
-
Gotcha:
|
1871
|
-
|
1872
|
-
Gladiator repetitively displays a signaling error that is harmless in practice:
|
1873
|
-
```
|
1874
|
-
The signal HUP is in use by the JVM and will not work correctly on this platform
|
1875
|
-
The signal INT is in use by the JVM and will not work correctly on this platform
|
1876
|
-
The signal TERM is in use by the JVM and will not work correctly on this platform
|
1877
|
-
```
|
1917
|
+
[Gladiator](https://github.com/AndyObtiva/glimmer-cs-gladiator) (short for Glimmer Editor) is a Glimmer sample project under on-going development.
|
1918
|
+
You may check it out to learn how to build a Glimmer Custom Shell gem.
|
1878
1919
|
|
1879
1920
|
## In Production
|
1880
1921
|
|
@@ -1944,11 +1985,12 @@ https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby
|
|
1944
1985
|
|
1945
1986
|
## Logging
|
1946
1987
|
|
1947
|
-
Glimmer comes with a Ruby Logger accessible via `Glimmer.logger`
|
1988
|
+
Glimmer comes with a Ruby Logger accessible via `Glimmer::Config.logger`
|
1948
1989
|
Its level of logging defaults to `Logger::WARN`
|
1949
1990
|
It may be configured to show a different level of logging as follows:
|
1950
1991
|
```ruby
|
1951
|
-
Glimmer.
|
1992
|
+
Glimmer::Config.enable_logging
|
1993
|
+
Glimmer::Config.logger.level = Logger::DEBUG
|
1952
1994
|
```
|
1953
1995
|
This results in more verbose debugging log to `STDOUT`, which is helpful in troubleshooting Glimmer DSL syntax when needed.
|
1954
1996
|
|
@@ -2048,6 +2090,7 @@ In order to explicitly configure javapackager, Mac package attributes, or sign y
|
|
2048
2090
|
- https://docs.oracle.com/javase/8/docs/technotes/tools/unix/javapackager.html
|
2049
2091
|
- https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/self-contained-packaging.html#BCGICFDB
|
2050
2092
|
- https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/self-contained-packaging.html
|
2093
|
+
- https://developer.apple.com/library/archive/releasenotes/General/SubmittingToMacAppStore/index.html#//apple_ref/doc/uid/TP40010572-CH16-SW8
|
2051
2094
|
|
2052
2095
|
The Glimmer rake task allows passing extra options to javapackager via:
|
2053
2096
|
- `Glimmer::Packager.javapackager_extra_args="..."` in your application Rakefile
|
@@ -2056,9 +2099,13 @@ The Glimmer rake task allows passing extra options to javapackager via:
|
|
2056
2099
|
Example (Rakefile):
|
2057
2100
|
|
2058
2101
|
```ruby
|
2059
|
-
Glimmer::Package.javapackager_extra_args = '-BlicenseType="MIT" -Bmac.category="
|
2102
|
+
Glimmer::Package.javapackager_extra_args = '-BlicenseType="MIT" -Bmac.category="public.app-category.business" -Bmac.signing-key-developer-id-app="Andy Maleh"'
|
2060
2103
|
```
|
2061
2104
|
|
2105
|
+
Note that `mac.category` defaults to "public.app-category.business", but can be overridden with one of the category UTI values mentioned here:
|
2106
|
+
|
2107
|
+
https://developer.apple.com/library/archive/releasenotes/General/SubmittingToMacAppStore/index.html#//apple_ref/doc/uid/TP40010572-CH16-SW8
|
2108
|
+
|
2062
2109
|
Example (env var):
|
2063
2110
|
|
2064
2111
|
```
|
@@ -2126,7 +2173,11 @@ Glimmer::Package.javapackager_extra_args = '-srcfiles "ACME.txt" -BlicenseFile="
|
|
2126
2173
|
|
2127
2174
|
If you run `rake glimmer:package` multiple times, sometimes it leaves a mounted DMG project in your finder. Unmount before you run the command again or it might fail with an error saying: "Error: Bundler "DMG Installer" (dmg) failed to produce a bundle."
|
2128
2175
|
|
2129
|
-
By the way, keep in mind that during normal operation, it does also indicate a false-negative while completing successfully (please ignore):
|
2176
|
+
By the way, keep in mind that during normal operation, it does also indicate a false-negative while completing successfully similar to the following (please ignore):
|
2177
|
+
|
2178
|
+
```
|
2179
|
+
Exec failed with code 2 command [[/usr/bin/SetFile, -c, icnC, /var/folders/4_/g1sw__tx6mjdgyh3mky7vydc0000gp/T/fxbundler4076750801763032201/images/MathBowling/.VolumeIcon.icns] in unspecified directory
|
2180
|
+
```
|
2130
2181
|
|
2131
2182
|
## Resources
|
2132
2183
|
|