glimmer 0.7.0 → 0.7.1
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 +28 -15
- data/VERSION +1 -1
- data/bin/girb +4 -0
- data/bin/girb_runner.rb +10 -0
- data/lib/glimmer/data_binding/observable.rb +5 -0
- data/lib/glimmer/dsl/engine.rb +9 -4
- data/lib/glimmer/dsl/swt/shell_expression.rb +5 -0
- data/lib/glimmer/scaffold.rb +1 -1
- data/lib/glimmer/swt/shell_proxy.rb +8 -0
- data/lib/glimmer/swt/widget_proxy.rb +8 -1
- metadata +12 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31b586dfb4cb23af36ebd26ad97a46625fe122c64d9725b237c8f88f0c72ce71
|
4
|
+
data.tar.gz: 14ff7f5996588c4261cf4d102d5ffca28fc59cef5bd151d07c273038efae3da5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6eb266dffd64ba21842038fd272c06a3342f3399b5729d178b966b9543dfdbb9eb45eea079782d0db205e68cc9b63a5a0a4222a9d77c9f5df2cacc01126fed51
|
7
|
+
data.tar.gz: 123a861f812ac0e4ee2e4c802255ff017c2459a65de79cb52863897a0b017fc8037d9b57eb8e041dc75005d68ee4a3835b07a7cd03f87c30f524c5fef67717ca
|
data/README.markdown
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
# Glimmer 0.7.
|
1
|
+
# Glimmer 0.7.1 Beta (JRuby Desktop UI DSL + Data-Binding)
|
2
|
+
[](http://badge.fury.io/rb/glimmer)
|
2
3
|
[](https://coveralls.io/github/AndyObtiva/glimmer?branch=master)
|
3
4
|
|
4
5
|
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.
|
@@ -45,7 +46,7 @@ shell {
|
|
45
46
|
text bind(@tic_tac_toe_board[row, column], :sign)
|
46
47
|
enabled bind(@tic_tac_toe_board[row, column], :empty)
|
47
48
|
on_widget_selected {
|
48
|
-
@tic_tac_toe_board.
|
49
|
+
@tic_tac_toe_board.mark(row, column)
|
49
50
|
}
|
50
51
|
}
|
51
52
|
}
|
@@ -70,7 +71,7 @@ NOTE: Glimmer is in beta mode. Please help make better by adopting for small or
|
|
70
71
|
## Table of Contents
|
71
72
|
|
72
73
|
<!-- TOC START min:1 max:3 link:true asterisk:false update:true -->
|
73
|
-
- [Glimmer 0.7.
|
74
|
+
- [Glimmer 0.7.1 Beta (JRuby Desktop UI DSL + Data-Binding)](#glimmer-058-beta-jruby-desktop-ui-dsl--data-binding)
|
74
75
|
- [Examples](#examples)
|
75
76
|
- [Hello World](#hello-world)
|
76
77
|
- [Tic Tac Toe](#tic-tac-toe)
|
@@ -163,7 +164,7 @@ Please follow these instructions to make the `glimmer` command available on your
|
|
163
164
|
|
164
165
|
Run this command to install directly:
|
165
166
|
```
|
166
|
-
jgem install glimmer -v 0.7.
|
167
|
+
jgem install glimmer -v 0.7.1
|
167
168
|
```
|
168
169
|
|
169
170
|
`jgem` is JRuby's version of `gem` command.
|
@@ -174,7 +175,7 @@ Otherwise, you may also run `jruby -S gem install ...`
|
|
174
175
|
|
175
176
|
Add the following to `Gemfile`:
|
176
177
|
```
|
177
|
-
gem 'glimmer', '~> 0.7.
|
178
|
+
gem 'glimmer', '~> 0.7.1'
|
178
179
|
```
|
179
180
|
|
180
181
|
And, then run:
|
@@ -226,6 +227,7 @@ glimmer package:jar # Generate JAR
|
|
226
227
|
glimmer package:native # Generate Native files (DMG/PKG/APP on the Mac)
|
227
228
|
glimmer scaffold[app_name] # Scaffold a Glimmer application directory structure to begin building a new app
|
228
229
|
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)
|
230
|
+
glimmer scaffold:custom_shell_gem[custom_widget_name,namespace] # Scaffold a Glimmer::UI::CustomShell subclass (represents a full window view) under its own Ruby gem project (namespace is required)
|
229
231
|
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
232
|
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)
|
231
233
|
|
@@ -234,13 +236,13 @@ automatically preloading the glimmer Ruby gem and SWT jar dependency.
|
|
234
236
|
|
235
237
|
Optionally, extra Glimmer options, JRuby options and environment variables may be passed in.
|
236
238
|
|
237
|
-
|
239
|
+
Glimmer options:
|
238
240
|
- "--debug" : Displays extra debugging information and passes "--debug" to JRuby
|
239
241
|
- "--log-level=VALUE" : Sets Glimmer's Ruby logger level ("ERROR" / "WARN" / "INFO" / "DEBUG"; default is "WARN")
|
240
242
|
|
241
|
-
Example: glimmer samples/
|
243
|
+
Example: glimmer samples/hello_world.rb
|
242
244
|
|
243
|
-
This runs the Glimmer application samples/
|
245
|
+
This runs the Glimmer application samples/hello_world.rb
|
244
246
|
```
|
245
247
|
|
246
248
|
Example (Glimmer/JRuby option specified):
|
@@ -262,7 +264,7 @@ Launches samples/hello/hello_world.rb and samples/hello_tab.rb at the same time,
|
|
262
264
|
Glimmer borrows from Rails the idea of Scaffolding, that is generating a structure for your app files that
|
263
265
|
helps you get started just like true building scaffolding helps construction workers, civil engineers, and architects.
|
264
266
|
|
265
|
-
Glimmer scaffolding goes
|
267
|
+
Glimmer scaffolding goes beyond just scaffolding the app files that Rails does. It also packages it and launches it,
|
266
268
|
getting you to a running and delivered state of an advanced "Hello, World!" Glimmer application right off the bat.
|
267
269
|
|
268
270
|
This should greatly facilitate building a new Glimmer app by helping you be productive and focus on app details while
|
@@ -276,6 +278,8 @@ letting Glimmer scaffolding take care of initial app file structure concerns, su
|
|
276
278
|
- Icon
|
277
279
|
- Bin file for starting application
|
278
280
|
|
281
|
+
NOTE: Scaffolding currently supports Mac packaging only at the moment.
|
282
|
+
|
279
283
|
#### App
|
280
284
|
|
281
285
|
Before you start, make sure you are in a JRuby environment with Glimmer gem installed as per "Direct Install" pre-requisites.
|
@@ -344,7 +348,7 @@ It is important to specify a namespace to avoid having your gem clash with exist
|
|
344
348
|
|
345
349
|
The Ruby gem name will follow the convention "glimmer-cs-customwidgetname-namespace" (the 'cs' is for Custom Shell)
|
346
350
|
|
347
|
-
Only official Glimmer gems created by the Glimmer project committers will have no namespace (e.g.
|
351
|
+
Only official Glimmer gems created by the Glimmer project committers will have no namespace (e.g. [glimmer-cs-gladiator](https://rubygems.org/gems/glimmer-cs-gladiator) Ruby gem)
|
348
352
|
|
349
353
|
Example: [https://github.com/AndyObtiva/glimmer-cs-gladiator](https://github.com/AndyObtiva/glimmer-cs-gladiator)
|
350
354
|
|
@@ -360,7 +364,7 @@ It is important to specify a namespace to avoid having your gem clash with exist
|
|
360
364
|
|
361
365
|
The Ruby gem name will follow the convention "glimmer-cw-customwidgetname-namespace" (the 'cw' is for Custom Widget)
|
362
366
|
|
363
|
-
Only official Glimmer gems created by the Glimmer project committers will have no namespace (e.g.
|
367
|
+
Only official Glimmer gems created by the Glimmer project committers will have no namespace (e.g. [glimmer-cw-video](https://rubygems.org/gems/glimmer-cw-video) Ruby gem)
|
364
368
|
|
365
369
|
Example: [https://github.com/AndyObtiva/glimmer-cw-video](https://github.com/AndyObtiva/glimmer-cw-video)
|
366
370
|
|
@@ -424,7 +428,7 @@ In Glimmer DSL, widgets are declared with lowercase underscored names mirroring
|
|
424
428
|
- `list` instantiates `org.eclipse.swt.widgets.List`
|
425
429
|
|
426
430
|
Every **widget** is sufficiently declared by name, but may optionally be accompanied with:
|
427
|
-
- SWT **style** ***argument*** wrapped by parenthesis according to [Glimmer Style Guide](#glimmer-
|
431
|
+
- SWT **style** ***argument*** wrapped by parenthesis according to [Glimmer Style Guide](#glimmer-style-guide) (see [next section](#widget-styles) for details).
|
428
432
|
- Ruby block containing **properties** (widget attributes) and **content** (nested widgets)
|
429
433
|
|
430
434
|
For example, if we were to revisit `samples/hello/hello_world.rb` above (you may copy/paste in [`girb`](#girb-glimmer-irb-command)):
|
@@ -451,7 +455,7 @@ Note that `shell` instantiates the outer shell **widget**, in other words, the w
|
|
451
455
|
# ...
|
452
456
|
```
|
453
457
|
|
454
|
-
The first line declares a **property** called `text`, which sets the title of the shell (window) to `"Glimmer"`. **Properties** always have ***arguments*** (not wrapped by parenthesis according to [Glimmer Style Guide](#glimmer-
|
458
|
+
The first line declares a **property** called `text`, which sets the title of the shell (window) to `"Glimmer"`. **Properties** always have ***arguments*** (not wrapped by parenthesis according to [Glimmer Style Guide](#glimmer-style-guide)), such as the text `"Glimmer"` in this case, and do **NOT** have a ***block*** (this distinguishes them from **widget** declarations).
|
455
459
|
|
456
460
|
The second line declares the `label` **widget**, which is followed by a Ruby **content** ***block*** that contains its `text` **property** with value `"Hello, World!"`
|
457
461
|
|
@@ -690,7 +694,7 @@ SWT widgets receive `SWT` styles in their constructor as per this guide:
|
|
690
694
|
|
691
695
|
https://wiki.eclipse.org/SWT_Widget_Style_Bits
|
692
696
|
|
693
|
-
Glimmer DSL facilitates that by passing symbols representing `SWT` constants as widget method arguments (i.e. inside widget `()` parentheses according to [Glimmer Style Guide](#glimmer-
|
697
|
+
Glimmer DSL facilitates that by passing symbols representing `SWT` constants as widget method arguments (i.e. inside widget `()` parentheses according to [Glimmer Style Guide](#glimmer-style-guide). See example below) in lower case version (e.g. `SWT::MULTI` becomes `:multi`).
|
694
698
|
|
695
699
|
These styles customize widget look, feel, and behavior.
|
696
700
|
|
@@ -1817,6 +1821,15 @@ Example (you may copy/paste in [`girb`](#girb-glimmer-irb-command)):
|
|
1817
1821
|
puts @css
|
1818
1822
|
```
|
1819
1823
|
|
1824
|
+
##### Listing / Enabling / Disabling DSLs
|
1825
|
+
|
1826
|
+
Glimmer provides a number of methods on Glimmer::DSL::Engine to configure DSL support or inquire about it:
|
1827
|
+
- `Glimmer::DSL::Engine.dsls`: Lists available Glimmer DSLs
|
1828
|
+
- `Glimmer::DSL::Engine.disable_dsl(dsl_name)`: Disables a specific DSL. Useful when there is no need for certain DSLs in a certain application.
|
1829
|
+
- `Glimmer::DSL::Engine.disabled_dsls': Lists disabled DSLs
|
1830
|
+
- `Glimmer::DSL::Engine.enable_dsl(dsl_name)`: Re-enables disabled DSL
|
1831
|
+
- `Glimmer::DSL::Engine.enabled_dsls=(dsl_names)`: Disables all DSLs except the ones specified.
|
1832
|
+
|
1820
1833
|
#### Video Widget
|
1821
1834
|
|
1822
1835
|

|
@@ -1968,7 +1981,7 @@ For example, after imports, `org.eclipse.swt.graphics.Color` can be referenced b
|
|
1968
1981
|
Nonetheless, you can disable automatic import if needed via this Glimmer configuration option:
|
1969
1982
|
|
1970
1983
|
```ruby
|
1971
|
-
Glimmer.import_swt_packages = false
|
1984
|
+
Glimmer::Config.import_swt_packages = false
|
1972
1985
|
```
|
1973
1986
|
|
1974
1987
|
To import SWT Java packages manually instead, you have 2 options:
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.7.
|
1
|
+
0.7.1
|
data/bin/girb
CHANGED
data/bin/girb_runner.rb
CHANGED
@@ -1,3 +1,13 @@
|
|
1
1
|
require 'puts_debuggerer'
|
2
2
|
|
3
3
|
include Glimmer
|
4
|
+
|
5
|
+
# Hijack Shell#start_event_loop default behavior to ensure disposing a display upon closing a shell inside girb
|
6
|
+
|
7
|
+
Glimmer::SWT::ShellProxy.class_eval do
|
8
|
+
alias start_event_loop_original start_event_loop
|
9
|
+
def start_event_loop
|
10
|
+
start_event_loop_original
|
11
|
+
Glimmer::SWT::DisplayProxy.instance.dispose
|
12
|
+
end
|
13
|
+
end
|
@@ -11,6 +11,11 @@ module Glimmer
|
|
11
11
|
def remove_observer(observer, property_or_properties=nil)
|
12
12
|
raise Error, 'Not implemented!'
|
13
13
|
end
|
14
|
+
|
15
|
+
# Overriding inspect to avoid printing very long observer hierarchies
|
16
|
+
def inspect
|
17
|
+
"#<#{self.class.name}:0x#{self.hash.to_s(16)}>"
|
18
|
+
end
|
14
19
|
end
|
15
20
|
end
|
16
21
|
end
|
data/lib/glimmer/dsl/engine.rb
CHANGED
@@ -49,7 +49,9 @@ module Glimmer
|
|
49
49
|
|
50
50
|
# Resets Glimmer's engine activity and configuration. Useful in rspec before or after blocks in tests.
|
51
51
|
def reset
|
52
|
-
|
52
|
+
parent_stacks.values.each do |a_parent_stack|
|
53
|
+
a_parent_stack.clear
|
54
|
+
end
|
53
55
|
dsl_stack.clear
|
54
56
|
disabled_dsls.clear
|
55
57
|
end
|
@@ -96,7 +98,8 @@ module Glimmer
|
|
96
98
|
if retrieved_static_expression.nil? && Glimmer::DSL::Engine.dsl && (static_expression_dsl.nil? || !Glimmer::DSL::Engine.static_expressions[keyword][static_expression_dsl].is_a?(TopLevelExpression))
|
97
99
|
begin
|
98
100
|
return Glimmer::DSL::Engine.interpret(keyword, *args, &block)
|
99
|
-
rescue => e
|
101
|
+
rescue => e
|
102
|
+
Glimmer::DSL::Engine.reset
|
100
103
|
raise e if static_expression_dsl.nil?
|
101
104
|
end
|
102
105
|
end
|
@@ -113,7 +116,8 @@ module Glimmer
|
|
113
116
|
end
|
114
117
|
end
|
115
118
|
rescue => e
|
116
|
-
|
119
|
+
# Glimmer::DSL::Engine.dsl_stack.pop
|
120
|
+
Glimmer::DSL::Engine.reset
|
117
121
|
raise e
|
118
122
|
end
|
119
123
|
end
|
@@ -138,7 +142,8 @@ module Glimmer
|
|
138
142
|
dsl_stack.pop
|
139
143
|
end
|
140
144
|
rescue => e
|
141
|
-
|
145
|
+
# dsl_stack.pop
|
146
|
+
reset
|
142
147
|
raise e
|
143
148
|
end
|
144
149
|
|
@@ -9,6 +9,11 @@ module Glimmer
|
|
9
9
|
class ShellExpression < StaticExpression
|
10
10
|
include TopLevelExpression
|
11
11
|
include ParentExpression
|
12
|
+
|
13
|
+
def can_interpret?(parent, keyword, *args, &block)
|
14
|
+
keyword == 'shell' and
|
15
|
+
(parent.nil? or parent.is_a?(Glimmer::SWT::ShellProxy))
|
16
|
+
end
|
12
17
|
|
13
18
|
def interpret(parent, keyword, *args, &block)
|
14
19
|
args = [parent] + args unless parent.nil?
|
data/lib/glimmer/scaffold.rb
CHANGED
@@ -328,7 +328,7 @@ class Scaffold
|
|
328
328
|
def spec_helper_file
|
329
329
|
content = File.read('spec/spec_helper.rb')
|
330
330
|
lines = content.split("\n")
|
331
|
-
require_line_index = lines.index(lines.detect {|l| l.include?(
|
331
|
+
require_line_index = lines.index(lines.detect {|l| l.include?(current_dir_name) })
|
332
332
|
lines[require_line_index...require_line_index] = [
|
333
333
|
"require 'bundler/setup'",
|
334
334
|
'Bundler.require(:default, :development)',
|
@@ -39,6 +39,14 @@ module Glimmer
|
|
39
39
|
@display ||= @swt_widget.getDisplay
|
40
40
|
@swt_widget.setLayout(FillLayout.new)
|
41
41
|
@swt_widget.setMinimumSize(WIDTH_MIN, HEIGHT_MIN)
|
42
|
+
on_event_show do
|
43
|
+
Thread.new do
|
44
|
+
sleep(0.25)
|
45
|
+
async_exec do
|
46
|
+
@swt_widget.setActive
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
42
50
|
end
|
43
51
|
|
44
52
|
# Centers shell within monitor it is in
|
@@ -172,6 +172,13 @@ module Glimmer
|
|
172
172
|
}
|
173
173
|
end
|
174
174
|
},
|
175
|
+
Java::OrgEclipseSwtWidgets::MenuItem => {
|
176
|
+
:selection => proc do |observer|
|
177
|
+
on_widget_selected { |selection_event|
|
178
|
+
observer.call(@swt_widget.getSelection)
|
179
|
+
}
|
180
|
+
end
|
181
|
+
},
|
175
182
|
Java::OrgEclipseSwtWidgets::Spinner => {
|
176
183
|
:selection => proc do |observer|
|
177
184
|
on_widget_selected { |selection_event|
|
@@ -231,7 +238,7 @@ module Glimmer
|
|
231
238
|
def add_observer(observer, property_name)
|
232
239
|
property_listener_installers = @swt_widget.class.ancestors.map {|ancestor| widget_property_listener_installers[ancestor]}.compact
|
233
240
|
widget_listener_installers = property_listener_installers.map{|installer| installer[property_name.to_s.to_sym]}.compact if !property_listener_installers.empty?
|
234
|
-
widget_listener_installers.each do |widget_listener_installer|
|
241
|
+
widget_listener_installers.to_a.each do |widget_listener_installer|
|
235
242
|
widget_listener_installer.call(observer)
|
236
243
|
end
|
237
244
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glimmer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- AndyMaleh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-05-
|
11
|
+
date: 2020-05-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -111,24 +111,24 @@ dependencies:
|
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
requirement: !ruby/object:Gem::Requirement
|
113
113
|
requirements:
|
114
|
-
- -
|
114
|
+
- - '='
|
115
115
|
- !ruby/object:Gem::Version
|
116
|
-
version:
|
117
|
-
name:
|
118
|
-
type: :
|
116
|
+
version: 6.2.1
|
117
|
+
name: rdoc
|
118
|
+
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - '='
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
124
|
+
version: 6.2.1
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
requirement: !ruby/object:Gem::Requirement
|
127
127
|
requirements:
|
128
128
|
- - "~>"
|
129
129
|
- !ruby/object:Gem::Version
|
130
130
|
version: 3.5.0
|
131
|
-
name: rspec
|
131
|
+
name: rspec-mocks
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -141,15 +141,15 @@ dependencies:
|
|
141
141
|
requirements:
|
142
142
|
- - "~>"
|
143
143
|
- !ruby/object:Gem::Version
|
144
|
-
version:
|
145
|
-
name:
|
144
|
+
version: 3.5.0
|
145
|
+
name: rspec
|
146
146
|
type: :development
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
150
|
- - "~>"
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version:
|
152
|
+
version: 3.5.0
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
requirement: !ruby/object:Gem::Requirement
|
155
155
|
requirements:
|