glimmer 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Coverage Status](https://coveralls.io/repos/github/AndyObtiva/glimmer/badge.svg?branch=master)](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
|
+
![Glimmer Scaffold App](images/glimmer-scaffolding-app.png)
|
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
|
![Hello Tab 1](images/glimmer-hello-tab1.png)
|
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
|
![Hello Combo](images/glimmer-hello-combo.png)
|
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
|
![Hello List Single Selection](images/glimmer-hello-list-single-selection.png)
|
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
|
![Hello List Multi Selection](images/glimmer-hello-list-multi-selection.png)
|
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
|
![Video Widget](images/glimmer-video-widget.png)
|
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
|
![Gladiator](images/glimmer-gladiator.png)
|
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
|
|