glimmer-dsl-wx 0.0.7 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/LICENSE.txt +1 -1
- data/README.md +309 -35
- data/VERSION +1 -1
- data/bin/girb +1 -1
- data/bin/girb_runner.rb +1 -1
- data/glimmer-dsl-wx.gemspec +0 -0
- data/lib/glimmer/dsl/wx/about_box_expression.rb +1 -1
- data/lib/glimmer/dsl/wx/bind_expression.rb +16 -16
- data/lib/glimmer/dsl/wx/control_expression.rb +1 -1
- data/lib/glimmer/dsl/wx/data_binding_expression.rb +25 -25
- data/lib/glimmer/dsl/wx/dsl.rb +4 -7
- data/lib/glimmer/dsl/wx/listener_expression.rb +1 -1
- data/lib/glimmer/dsl/wx/observe_expression.rb +1 -1
- data/lib/glimmer/dsl/wx/operation_expression.rb +23 -27
- data/lib/glimmer/dsl/wx/property_expression.rb +10 -3
- data/lib/glimmer/dsl/wx/shine_data_binding_expression.rb +23 -22
- data/lib/glimmer/dsl/wx/sizer_addable_expression.rb +1 -1
- data/lib/glimmer/dsl/wx/sizer_args_expression.rb +1 -1
- data/lib/glimmer/dsl/wx/sizer_expression.rb +1 -1
- data/lib/glimmer/wx/control_proxy/frame_proxy.rb +1 -1
- data/lib/glimmer/wx/control_proxy/slider_proxy.rb +55 -0
- data/lib/glimmer/wx/control_proxy/spin_ctrl_double_proxy.rb +41 -0
- data/lib/glimmer/wx/control_proxy/spin_ctrl_proxy.rb +41 -0
- data/lib/glimmer/wx/control_proxy/text_ctrl_proxy.rb +39 -0
- data/lib/glimmer/wx/control_proxy.rb +3 -3
- data/lib/glimmer/wx/data_bindable.rb +1 -1
- data/lib/glimmer/wx/parent.rb +1 -1
- data/lib/glimmer/wx/sizer_proxy.rb +1 -1
- data/lib/glimmer-dsl-wx.rb +1 -1
- data/samples/hello/hello_button.rb +1 -1
- data/samples/hello/hello_button2.rb +1 -1
- data/samples/hello/hello_data_binding.rb +126 -0
- data/samples/hello/hello_sizer.rb +7 -7
- data/samples/hello/hello_world.rb +1 -1
- data/samples/hello/hello_world2.rb +1 -1
- data/samples/minimal/nothing.rb +1 -1
- metadata +19 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 29fe9921216dd94b4784192eebb73db6125697148b8c617f05f41dc919b55f59
|
4
|
+
data.tar.gz: 1b1299da11273e591436920f6c3dd3d495f6b9941602144f5968ba79ffc1623a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94a29ba03eb985c4ef98abc95e60734d711f2282322d0b4b0bed0bf9e78f947f91c2c45636ae21fcd73bfbc5b7ca89e3b5477c562312166193562c6a3f15ef76
|
7
|
+
data.tar.gz: 4c6b627cc677c733d921d860d1e8b466ff21d8eaac654f3e7f530067939a5fb0bb7d7bf095a35d6b15da26f93402a2d55d46fbfa3219d71868c45b2f8dde2fd3
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.1.0
|
4
|
+
|
5
|
+
- Upgrade to wxruby3 1.0.0
|
6
|
+
- Upgrade to glimmer 2.7.7
|
7
|
+
- Support control operations (methods) in the DSL
|
8
|
+
- Improve detection of property setter methods on controls when invoking from DSL
|
9
|
+
- Support property unidirectional data-binding for all controls
|
10
|
+
- Support property bidirectional data-binding for text_ctrl
|
11
|
+
- Support property bidirectional data-binding for spin_ctrl
|
12
|
+
- Support property bidirectional data-binding for spin_ctrl_double
|
13
|
+
- Support property bidirectional data-binding for slider
|
14
|
+
- Hello, Data-Binding! Sample
|
15
|
+
|
3
16
|
## 0.0.7
|
4
17
|
|
5
18
|
- Sizer addable support (e.g. supporting `growable_col(1, 1)`, using `add_growable_col(1, 1)` method in wxruby3 API)
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
-
# [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for WX 0.0
|
1
|
+
# [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for WX 0.1.0
|
2
2
|
## wxWidgets Ruby Desktop Development GUI Library
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/glimmer-dsl-wx.svg)](https://badge.fury.io/rb/glimmer-dsl-wx)
|
4
4
|
[![Join the chat at https://gitter.im/AndyObtiva/glimmer](https://badges.gitter.im/AndyObtiva/glimmer.svg)](https://gitter.im/AndyObtiva/glimmer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
5
5
|
|
6
6
|
[Glimmer](https://github.com/AndyObtiva/glimmer) DSL for [WX](https://www.wxwidgets.org/) is an [MRI Ruby](https://www.ruby-lang.org) desktop development GUI (Graphical User Interface) library for the cross-platform native widget [wxWidgets](https://www.wxwidgets.org/) GUI toolkit. It provides a Glimmer GUI DSL on top of the [wxruby3](https://github.com/mcorino/wxRuby3) binding.
|
7
7
|
|
8
|
+
![Hello, Data-Binding!](/screenshots/glimmer-dsl-wx-sample-hello-data-binding.gif?raw=true)
|
9
|
+
|
8
10
|
[Glimmer DSL for WX](https://rubygems.org/gems/glimmer-dsl-wx) aims to provide a DSL similar to the [Glimmer DSL for SWT](https://github.com/AndyObtiva/glimmer-dsl-swt) to enable more productive desktop development in Ruby with:
|
9
11
|
- [Declarative DSL syntax](#glimmer-gui-dsl-concepts) that visually maps to the GUI control hierarchy
|
10
12
|
- [Convention over configuration](#smart-defaults-and-conventions) via smart defaults and automation of low-level details
|
@@ -24,7 +26,7 @@ include Glimmer
|
|
24
26
|
frame(title: 'Hello, World!')
|
25
27
|
```
|
26
28
|
|
27
|
-
![Hello, World!](
|
29
|
+
![Hello, World!](/screenshots/glimmer-dsl-wx-sample-hello-world.png?raw=true)
|
28
30
|
|
29
31
|
**Hello Button!**
|
30
32
|
|
@@ -54,35 +56,25 @@ frame { |main_frame|
|
|
54
56
|
}
|
55
57
|
```
|
56
58
|
|
57
|
-
![Hello, Button!](
|
58
|
-
|
59
|
-
![Hello, Button! Clicked](
|
60
|
-
|
61
|
-
|
62
|
-
DSL | Platforms | Native? | Vector Graphics? | Pros | Cons | Prereqs
|
63
|
-
----|-----------|---------|------------------|------|------|--------
|
64
|
-
[Glimmer DSL for SWT (JRuby Desktop Development GUI Framework)](https://github.com/AndyObtiva/glimmer-dsl-swt) | Mac / Windows / Linux | Yes | Yes (Canvas Shape DSL) | Very Mature / Scaffolding / Native Executable Packaging / Custom Widgets | Slow JRuby Startup Time / Heavy Memory Footprint | Java / JRuby
|
65
|
-
[Glimmer DSL for Opal (Pure Ruby Web GUI and Auto-Webifier of Desktop Apps)](https://github.com/AndyObtiva/glimmer-dsl-opal) | All Web Browsers | No | Yes (Canvas Shape DSL) | Simpler than All JavaScript Technologies / Auto-Webify Desktop Apps | Setup Process / Only Rails 5 Support for Now | Rails
|
66
|
-
[Glimmer DSL for LibUI (Prerequisite-Free Ruby Desktop Development GUI Library)](https://github.com/AndyObtiva/glimmer-dsl-libui) | Mac / Windows / Linux | Yes | Yes (Area API) | Fast Startup Time / Light Memory Footprint | LibUI is an Incomplete Mid-Alpha Only | None Other Than MRI Ruby
|
67
|
-
[Glimmer DSL for Tk (Ruby Tk Desktop Development GUI Library)](https://github.com/AndyObtiva/glimmer-dsl-tk) | Mac / Windows / Linux | Some Native-Themed Widgets (Not Truly Native) | Yes (Canvas) | Fast Startup Time / Light Memory Footprint | Complicated Setup / Widgets Do Not Look Truly Native, Espcially on Linux | ActiveTcl / MRI Ruby
|
68
|
-
[Glimmer DSL for GTK (Ruby-GNOME Desktop Development GUI Library)](https://github.com/AndyObtiva/glimmer-dsl-gtk) | Mac / Windows / Linux | Only on Linux | Yes (Cairo) | Complete Access to GNOME Features on Linux (Forte) | Not Native on Mac and Windows | None Other Than MRI Ruby on Linux / Brew Packages on Mac / MSYS & MING Toolchains on Windows / MRI Ruby
|
69
|
-
[Glimmer DSL for FX (FOX Toolkit Ruby Desktop Development GUI Library)](https://github.com/AndyObtiva/glimmer-dsl-fx) | Mac (requires XQuartz) / Windows / Linux | No | Yes (Canvas) | No Prerequisites on Windows (Forte Since Binaries Are Included Out of The Box) | Widgets Do Not Look Native / Mac Usage Obtrusively Starts XQuartz | None Other Than MRI Ruby on Windows / XQuarts on Mac / MRI Ruby
|
70
|
-
[Glimmer DSL for WX (wxWidgets Ruby Desktop Development GUI Library)](https://github.com/AndyObtiva/glimmer-dsl-wx) | Mac / Windows / Linux | Yes | Yes | Fast Startup Time / Light Memory Footprint | wxruby3 is still beta and does not support Mac yet | wxWidgets library, Doxygen, and other prereqs
|
71
|
-
[Glimmer DSL for JFX (JRuby JavaFX Desktop Development GUI Library)](https://github.com/AndyObtiva/glimmer-dsl-jfx) | Mac / Windows / Linux | No | Yes (javafx.scene.shape and javafx.scene.canvas) | Rich in Custom Widgets | Slow JRuby Startup Time / Heavy Memory Footprint / Widgets Do Not Look Native | Java / JRuby / JavaFX SDK
|
72
|
-
[Glimmer DSL for Swing (JRuby Swing Desktop Development GUI Library)](https://github.com/AndyObtiva/glimmer-dsl-swing) | Mac / Windows / Linux | No | Yes (Java2D) | Very Mature | Slow JRuby Startup Time / Heavy Memory Footprint / Widgets Do Not Look Native | Java / JRuby
|
73
|
-
[Glimmer DSL for XML (& HTML)](https://github.com/AndyObtiva/glimmer-dsl-xml) | All Web Browsers | No | Yes (SVG) | Programmable / Lighter-weight Than Actual XML | XML Elements Are Sometimes Not Well-Named (Many Types of Input) | None
|
74
|
-
[Glimmer DSL for CSS](https://github.com/AndyObtiva/glimmer-dsl-css) | All Web Browsers | No | Yes | Programmable | CSS Is Over-Engineered / Too Many Features To Learn | None
|
59
|
+
![Hello, Button!](/screenshots/glimmer-dsl-wx-sample-hello-button.png?raw=true)
|
60
|
+
|
61
|
+
![Hello, Button! Clicked](/screenshots/glimmer-dsl-wx-sample-hello-button-clicked.png?raw=true)
|
62
|
+
|
63
|
+
Learn more about the differences between various [Glimmer](https://github.com/AndyObtiva/glimmer) DSLs by looking at the **[Glimmer DSL Comparison Table](https://github.com/AndyObtiva/glimmer#glimmer-dsl-comparison-table)**.
|
75
64
|
|
76
65
|
## Table of Contents
|
77
66
|
|
78
67
|
- [Glimmer DSL for WX](#)
|
79
68
|
- [Setup](#setup)
|
69
|
+
- [Usage](#usage)
|
80
70
|
- [GIRB (Glimmer IRB)](#girb-glimmer-irb)
|
81
71
|
- [Smart Defaults and Conventions](#smart-defaults-and-conventions)
|
82
72
|
- [Samples](#samples)
|
83
73
|
- [Hello, World!](#hello-world)
|
84
74
|
- [Hello, Button!](#hello-button)
|
85
75
|
- [Hello, Sizer!](#hello-sizer)
|
76
|
+
- [Hello, Data-Binding!](#hello-data-binding)
|
77
|
+
- [Coming From wxruby3](#coming-from-wxruby3)
|
86
78
|
- [Process](#process)
|
87
79
|
- [Resources](#resources)
|
88
80
|
- [Help](#help)
|
@@ -108,7 +100,7 @@ gem install glimmer-dsl-wx
|
|
108
100
|
Or install via Bundler `Gemfile`:
|
109
101
|
|
110
102
|
```ruby
|
111
|
-
gem 'glimmer-dsl-wx', '~> 0.0
|
103
|
+
gem 'glimmer-dsl-wx', '~> 0.1.0'
|
112
104
|
```
|
113
105
|
|
114
106
|
Test that installation worked by running a sample:
|
@@ -123,6 +115,127 @@ If you cloned project, test by running a sample locally:
|
|
123
115
|
ruby -r ./lib/glimmer-dsl-wx.rb samples/hello/hello_world.rb
|
124
116
|
```
|
125
117
|
|
118
|
+
## Usage
|
119
|
+
|
120
|
+
To use [glimmer-dsl-wx](https://rubygems.org/gems/glimmer-dsl-wx):
|
121
|
+
1. Add `require 'glimmer-dsl-wx'` at the top of the Ruby file (this will automatically `require 'wxruby3'` too)
|
122
|
+
2. Add `include Glimmer` into the top-level main object for testing or into an actual class for serious application usage.
|
123
|
+
3. Write GUI DSL code beginning with `frame` to build a window first and then nest other controls/sizers within it.
|
124
|
+
|
125
|
+
Example:
|
126
|
+
|
127
|
+
```ruby
|
128
|
+
require 'glimmer-dsl-wx'
|
129
|
+
|
130
|
+
include Glimmer
|
131
|
+
|
132
|
+
frame { |main_frame|
|
133
|
+
title 'Hello, Button!'
|
134
|
+
|
135
|
+
h_box_sizer {
|
136
|
+
button {
|
137
|
+
sizer_args 0, Wx::RIGHT, 10
|
138
|
+
label 'Click To Find Who Built This!'
|
139
|
+
|
140
|
+
on_button do
|
141
|
+
message_dialog(
|
142
|
+
"The Glimmer DSL for WX Team",
|
143
|
+
"Greeting",
|
144
|
+
Wx::OK | Wx::ICON_INFORMATION
|
145
|
+
).show_modal
|
146
|
+
end
|
147
|
+
}
|
148
|
+
}
|
149
|
+
}
|
150
|
+
```
|
151
|
+
|
152
|
+
![Hello, Button!](/screenshots/glimmer-dsl-wx-sample-hello-button.png?raw=true)
|
153
|
+
|
154
|
+
Glimmer DSL for WX follows these simple concepts in mapping from wxruby3 syntax to Glimmer GUI DSL syntax:
|
155
|
+
|
156
|
+
**Keyword(args)**: wxruby3 controls/sizers may be declared by lower-case underscored name. For example, `Frame` becomes `frame`. `HBoxSizer` becomes `h_box_sizer`. And, they receive the same arguments as the wxruby3 class constructor. For example, `Frame.new(title: 'Hello')` becomes `frame(title: 'Hello')`.
|
157
|
+
|
158
|
+
**Content Block** (Properties/Listeners/Controls): Any keyword may be optionally followed by a declarative Ruby curly-brace multi-line content block containing properties (attributes), listeners, and/or nested controls/sizers.
|
159
|
+
|
160
|
+
Example:
|
161
|
+
|
162
|
+
```ruby
|
163
|
+
frame(title: 'Hello, Button') {
|
164
|
+
h_box_sizer {
|
165
|
+
button(label: 'Click To Find Who Built This!')
|
166
|
+
}
|
167
|
+
}
|
168
|
+
```
|
169
|
+
|
170
|
+
Content block optionally receives one arg representing the control or sizer it represents.
|
171
|
+
|
172
|
+
Example:
|
173
|
+
|
174
|
+
```ruby
|
175
|
+
frame(title: 'Hello, Button!') { |main_frame|
|
176
|
+
h_box_sizer {
|
177
|
+
button {
|
178
|
+
sizer_args 0, Wx::RIGHT, 10
|
179
|
+
label 'Click To Find Who Built This!'
|
180
|
+
|
181
|
+
on_button do
|
182
|
+
about_box(
|
183
|
+
name: main_frame.title,
|
184
|
+
version: Wx::WXRUBY_VERSION,
|
185
|
+
description: "This is the Hello, Button! sample",
|
186
|
+
developers: ['The Glimmer DSL for WX Development Team']
|
187
|
+
)
|
188
|
+
end
|
189
|
+
}
|
190
|
+
}
|
191
|
+
}
|
192
|
+
```
|
193
|
+
|
194
|
+
**Property**: Control properties may be declared inside keyword blocks with lower-case underscored name followed by property value args (e.g. `title "Hello"` inside `frame`). Behind the scenes, properties correspond to `control.property=` methods like `frame.title=`.
|
195
|
+
|
196
|
+
Controls and sizers (objects that organize controls within certain layouts) could accept a special `sizer_args` property, which takes the arguments normally passed to the `sizer.add` method. For example, `sizer_args 0, Wx::RIGHT, 10` translates to `sizer.add(control, 0, Wx::Right, 10)` behind the scenes.
|
197
|
+
|
198
|
+
**Listener**: Control listeners may be declared inside keyword blocks with listener lower-case underscored name beginning with `on_` followed by event name (translates to `frame.evt_#{event_name}` like `frame.evt_button` for the click of a button) and receiving required block handler (always followed by a `do; end` style block to signify imperative Model logic vs declarative View control/sizer nesting).
|
199
|
+
|
200
|
+
Example:
|
201
|
+
|
202
|
+
```ruby
|
203
|
+
button('click') {
|
204
|
+
on_clicked do
|
205
|
+
puts 'clicked'
|
206
|
+
end
|
207
|
+
}
|
208
|
+
```
|
209
|
+
|
210
|
+
Optionally, the listener block can receive an arg representing the control.
|
211
|
+
|
212
|
+
```ruby
|
213
|
+
...
|
214
|
+
button {
|
215
|
+
sizer_args 0, Wx::RIGHT, 10
|
216
|
+
label 'Click To Find Who Built This!'
|
217
|
+
|
218
|
+
on_button do
|
219
|
+
# Do work!
|
220
|
+
end
|
221
|
+
}
|
222
|
+
...
|
223
|
+
```
|
224
|
+
|
225
|
+
Behind the scenes, listeners correspond to `frame.evt_#{event_name}` methods. So, for `on_button`, the event name is `button`, and that translates to `frame.evt_button(button, &listener)` behind the scenes.
|
226
|
+
|
227
|
+
**Operation**: Controls have methods that invoke certain operations on them. For example, `message_dialog` has a `#show_modal` method that shows the message dialog GUI.
|
228
|
+
|
229
|
+
```ruby
|
230
|
+
...
|
231
|
+
message_dialog(
|
232
|
+
"The Glimmer DSL for WX Team",
|
233
|
+
"Greeting",
|
234
|
+
Wx::OK | Wx::ICON_INFORMATION
|
235
|
+
).show_modal
|
236
|
+
...
|
237
|
+
```
|
238
|
+
|
126
239
|
## GIRB (Glimmer IRB)
|
127
240
|
|
128
241
|
You can run the `girb` command (`bin/girb` if you cloned the project locally) to do some quick and dirty experimentation and learning:
|
@@ -142,7 +255,7 @@ This gives you `irb` with the `glimmer-dsl-wx` gem loaded and the `Glimmer` modu
|
|
142
255
|
|
143
256
|
### Hello, World!
|
144
257
|
|
145
|
-
![Hello, World!](
|
258
|
+
![Hello, World!](/screenshots/glimmer-dsl-wx-sample-hello-world.png?raw=true)
|
146
259
|
|
147
260
|
```ruby
|
148
261
|
require 'glimmer-dsl-wx'
|
@@ -166,9 +279,9 @@ frame {
|
|
166
279
|
|
167
280
|
### Hello Button!
|
168
281
|
|
169
|
-
![Hello, Button!](
|
282
|
+
![Hello, Button!](/screenshots/glimmer-dsl-wx-sample-hello-button.png?raw=true)
|
170
283
|
|
171
|
-
![Hello, Button! Clicked](
|
284
|
+
![Hello, Button! Clicked](/screenshots/glimmer-dsl-wx-sample-hello-button-clicked.png?raw=true)
|
172
285
|
|
173
286
|
```ruby
|
174
287
|
require 'glimmer-dsl-wx'
|
@@ -223,9 +336,9 @@ frame { |main_frame|
|
|
223
336
|
|
224
337
|
### Hello Sizer!
|
225
338
|
|
226
|
-
![Hello, Sizer!](
|
339
|
+
![Hello, Sizer!](/screenshots/glimmer-dsl-wx-sample-hello-sizer.png?raw=true)
|
227
340
|
|
228
|
-
![Hello, Sizer! Clicked](
|
341
|
+
![Hello, Sizer! Clicked](/screenshots/glimmer-dsl-wx-sample-hello-sizer-clicked.png?raw=true)
|
229
342
|
|
230
343
|
```ruby
|
231
344
|
require 'glimmer-dsl-wx'
|
@@ -246,7 +359,7 @@ frame { |main_frame|
|
|
246
359
|
on_button do
|
247
360
|
message_dialog(
|
248
361
|
"Hello",
|
249
|
-
"Greeting",
|
362
|
+
"Greeting 1",
|
250
363
|
Wx::OK | Wx::ICON_INFORMATION
|
251
364
|
).show_modal
|
252
365
|
end
|
@@ -261,7 +374,7 @@ frame { |main_frame|
|
|
261
374
|
on_button do
|
262
375
|
message_dialog(
|
263
376
|
"Howdy",
|
264
|
-
"Greeting",
|
377
|
+
"Greeting 2",
|
265
378
|
Wx::OK | Wx::ICON_INFORMATION
|
266
379
|
).show_modal
|
267
380
|
end
|
@@ -276,7 +389,7 @@ frame { |main_frame|
|
|
276
389
|
on_button do
|
277
390
|
message_dialog(
|
278
391
|
"Hi",
|
279
|
-
"Greeting",
|
392
|
+
"Greeting 3",
|
280
393
|
Wx::OK | Wx::ICON_INFORMATION
|
281
394
|
).show_modal
|
282
395
|
end
|
@@ -293,7 +406,7 @@ frame { |main_frame|
|
|
293
406
|
on_button do
|
294
407
|
message_dialog(
|
295
408
|
"Ciao",
|
296
|
-
"Greeting",
|
409
|
+
"Greeting 4",
|
297
410
|
Wx::OK | Wx::ICON_INFORMATION
|
298
411
|
).show_modal
|
299
412
|
end
|
@@ -308,7 +421,7 @@ frame { |main_frame|
|
|
308
421
|
on_button do
|
309
422
|
message_dialog(
|
310
423
|
"Aloha",
|
311
|
-
"Greeting",
|
424
|
+
"Greeting 5",
|
312
425
|
Wx::OK | Wx::ICON_INFORMATION
|
313
426
|
).show_modal
|
314
427
|
end
|
@@ -323,7 +436,7 @@ frame { |main_frame|
|
|
323
436
|
on_button do
|
324
437
|
message_dialog(
|
325
438
|
"Salut",
|
326
|
-
"Greeting",
|
439
|
+
"Greeting 6",
|
327
440
|
Wx::OK | Wx::ICON_INFORMATION
|
328
441
|
).show_modal
|
329
442
|
end
|
@@ -333,6 +446,165 @@ frame { |main_frame|
|
|
333
446
|
}
|
334
447
|
```
|
335
448
|
|
449
|
+
### Hello Data-Binding!
|
450
|
+
|
451
|
+
Glimmer DSL for WX supports data-binding via `<=` for unidirectional data-binding and `<=>` for bidirectional data-binding.
|
452
|
+
|
453
|
+
![Hello, Data-Binding!](/screenshots/glimmer-dsl-wx-sample-hello-data-binding.gif?raw=true)
|
454
|
+
|
455
|
+
```ruby
|
456
|
+
require 'glimmer-dsl-wx'
|
457
|
+
|
458
|
+
class Donor
|
459
|
+
DONATION_AMOUNT_MIN = 0
|
460
|
+
DONATION_AMOUNT_MAX = 100
|
461
|
+
DONATION_AMOUNT_DEFAULT = 50
|
462
|
+
|
463
|
+
attr_accessor :first_name, :last_name, :donation_amount
|
464
|
+
|
465
|
+
def initialize
|
466
|
+
@last_name = @first_name = ''
|
467
|
+
@donation_amount = DONATION_AMOUNT_DEFAULT
|
468
|
+
end
|
469
|
+
|
470
|
+
def full_name
|
471
|
+
full_name_parts = [first_name, last_name]
|
472
|
+
full_name_string = full_name_parts.join(' ').strip
|
473
|
+
if full_name_string.empty?
|
474
|
+
'Anonymous'
|
475
|
+
else
|
476
|
+
full_name_string
|
477
|
+
end
|
478
|
+
end
|
479
|
+
|
480
|
+
def summary
|
481
|
+
"#{full_name} donated $#{donation_amount}"
|
482
|
+
end
|
483
|
+
end
|
484
|
+
|
485
|
+
donor = Donor.new
|
486
|
+
|
487
|
+
include Glimmer
|
488
|
+
|
489
|
+
frame(title: 'Hello, Data-Binding!') { |window|
|
490
|
+
panel {
|
491
|
+
v_box_sizer {
|
492
|
+
h_box_sizer {
|
493
|
+
sizer_args 0, Wx::DOWN, 10
|
494
|
+
|
495
|
+
static_text(label: 'First Name:') {
|
496
|
+
sizer_args 0, Wx::RIGHT, 10
|
497
|
+
}
|
498
|
+
text_ctrl {
|
499
|
+
sizer_args 0, Wx::RIGHT, 10
|
500
|
+
# data-bind donor.first_name to text_ctrl.value bidirectionally,
|
501
|
+
# ensuring changes to either attribute update the other attribute
|
502
|
+
value <=> [donor, :first_name]
|
503
|
+
}
|
504
|
+
}
|
505
|
+
|
506
|
+
h_box_sizer {
|
507
|
+
sizer_args 0, Wx::DOWN, 10
|
508
|
+
|
509
|
+
static_text(label: 'Last Name:') {
|
510
|
+
sizer_args 0, Wx::RIGHT, 10
|
511
|
+
}
|
512
|
+
text_ctrl {
|
513
|
+
sizer_args 0, Wx::RIGHT, 10
|
514
|
+
# data-bind donor.last_name to text_ctrl.value bidirectionally,
|
515
|
+
# ensuring changes to either attribute update the other attribute
|
516
|
+
value <=> [donor, :last_name]
|
517
|
+
}
|
518
|
+
}
|
519
|
+
|
520
|
+
h_box_sizer {
|
521
|
+
sizer_args 0, Wx::DOWN, 10
|
522
|
+
|
523
|
+
static_text(label: 'Donation Amount: $') {
|
524
|
+
sizer_args 0, Wx::RIGHT, 1
|
525
|
+
}
|
526
|
+
spin_ctrl {
|
527
|
+
sizer_args 0, Wx::RIGHT, 10
|
528
|
+
range Donor::DONATION_AMOUNT_MIN, Donor::DONATION_AMOUNT_MAX
|
529
|
+
# data-bind donor.donation_amount to spin_ctrl.value bidirectionally,
|
530
|
+
# ensuring changes to either attribute update the other attribute
|
531
|
+
value <=> [donor, :donation_amount]
|
532
|
+
}
|
533
|
+
}
|
534
|
+
|
535
|
+
h_box_sizer {
|
536
|
+
sizer_args 0, Wx::DOWN, 10
|
537
|
+
|
538
|
+
slider {
|
539
|
+
sizer_args 0, Wx::RIGHT, 10
|
540
|
+
range Donor::DONATION_AMOUNT_MIN, Donor::DONATION_AMOUNT_MAX
|
541
|
+
# data-bind donor.first_name to spinner.value bidirectionally,
|
542
|
+
# ensuring changes to either attribute update the other attribute
|
543
|
+
value <=> [donor, :donation_amount]
|
544
|
+
}
|
545
|
+
}
|
546
|
+
|
547
|
+
h_box_sizer {
|
548
|
+
sizer_args 0, Wx::DOWN, 10
|
549
|
+
|
550
|
+
static_text(label: '') {
|
551
|
+
sizer_args 0, Wx::RIGHT, 10
|
552
|
+
# data-bind donor.summary to static_text.label unidirectionally,
|
553
|
+
# with computed data-binding from donor summary dependencies: first_name, last_name, and donation_amount
|
554
|
+
# ensuring changes to donor.summary or any of its dependencies update static_text.label
|
555
|
+
label <= [donor, :summary, computed_by: [:first_name, :last_name, :donation_amount]]
|
556
|
+
}
|
557
|
+
}
|
558
|
+
}
|
559
|
+
}
|
560
|
+
}
|
561
|
+
```
|
562
|
+
|
563
|
+
## Coming From wxruby3
|
564
|
+
|
565
|
+
If you would like to translate wxruby3 code into Glimmer DSL for WX code, read the [Usage](#usage) section to understand how Glimmer GUI DSL syntax works, and then check out the example below, which is written in both wxruby3 and Glimmer DSL for WX.
|
566
|
+
|
567
|
+
Example written in wxruby3:
|
568
|
+
|
569
|
+
```ruby
|
570
|
+
require 'wx'
|
571
|
+
|
572
|
+
class TheFrame < Wx::Frame
|
573
|
+
def initialize(title)
|
574
|
+
super(nil, title: title)
|
575
|
+
panel = Wx::Panel.new(self)
|
576
|
+
button = Wx::Button.new(panel, label: 'Click me')
|
577
|
+
button.evt_button(Wx::ID_ANY) { Wx.message_box('Hello. Thanks for clicking me!', 'Hello Button sample') }
|
578
|
+
end
|
579
|
+
end
|
580
|
+
|
581
|
+
Wx::App.run { TheFrame.new('Hello world!').show }
|
582
|
+
```
|
583
|
+
|
584
|
+
![Hello_Button](https://raw.githubusercontent.com/mcorino/wxRuby3/master/assets/hello_button.png)
|
585
|
+
![Hello_Button_Clicked](https://raw.githubusercontent.com/mcorino/wxRuby3/master/assets/hello_button_clicked.png)
|
586
|
+
|
587
|
+
Example re-written in Glimmer DSL for WX:
|
588
|
+
|
589
|
+
```ruby
|
590
|
+
require 'glimmer-dsl-wx'
|
591
|
+
|
592
|
+
include Glimmer
|
593
|
+
|
594
|
+
frame(title: 'Hello world!') {
|
595
|
+
panel {
|
596
|
+
button(label: 'Click me') {
|
597
|
+
on_button do
|
598
|
+
Wx.message_box('Hello. Thanks for clicking me!', 'Hello Button sample')
|
599
|
+
end
|
600
|
+
}
|
601
|
+
}
|
602
|
+
}
|
603
|
+
```
|
604
|
+
|
605
|
+
![Hello_Button](https://raw.githubusercontent.com/mcorino/wxRuby3/master/assets/hello_button.png)
|
606
|
+
![Hello_Button_Clicked](https://raw.githubusercontent.com/mcorino/wxRuby3/master/assets/hello_button_clicked.png)
|
607
|
+
|
336
608
|
## Process
|
337
609
|
|
338
610
|
[Glimmer Process](https://github.com/AndyObtiva/glimmer/blob/master/PROCESS.md)
|
@@ -340,8 +612,10 @@ frame { |main_frame|
|
|
340
612
|
## Resources
|
341
613
|
|
342
614
|
- [Code Master Blog](https://andymaleh.blogspot.com)
|
343
|
-
- [wxruby3 Bindings](https://github.com/mcorino/wxRuby3)
|
344
|
-
- [wxWidgets GUI Toolkit](https://www.wxwidgets.org/)
|
615
|
+
- [wxruby3 Bindings](https://github.com/mcorino/wxRuby3) (used by Glimmer DSL for WX)
|
616
|
+
- [wxWidgets GUI Toolkit](https://www.wxwidgets.org/) (used by Glimmer DSL for WX)
|
617
|
+
- [wxWidgets Controls](https://docs.wxwidgets.org/3.0/group__group__class__ctrl.html)
|
618
|
+
- [wxWidgets Sizers](https://docs.wxwidgets.org/3.0/overview_sizer.html)
|
345
619
|
|
346
620
|
## Help
|
347
621
|
|
@@ -393,7 +667,7 @@ Note that the latest development sometimes takes place in the [development](http
|
|
393
667
|
|
394
668
|
[MIT](LICENSE.txt)
|
395
669
|
|
396
|
-
Copyright (c) 2023 Andy Maleh
|
670
|
+
Copyright (c) 2023-2024 Andy Maleh
|
397
671
|
|
398
672
|
--
|
399
673
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/bin/girb
CHANGED
data/bin/girb_runner.rb
CHANGED
data/glimmer-dsl-wx.gemspec
CHANGED
Binary file
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2023 Andy Maleh
|
1
|
+
# Copyright (c) 2023-2024 Andy Maleh
|
2
2
|
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
# a copy of this software and associated documentation files (the
|
@@ -19,18 +19,18 @@
|
|
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
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
22
|
+
require 'glimmer/dsl/static_expression'
|
23
|
+
require 'glimmer/dsl/bind_expression'
|
24
|
+
|
25
|
+
module Glimmer
|
26
|
+
module DSL
|
27
|
+
module Wx
|
28
|
+
# Responsible for setting up the return value of the bind keyword (command symbol)
|
29
|
+
# as a ModelBinding. It is then used by another command handler like
|
30
|
+
# DataBindingExpression
|
31
|
+
class BindExpression < StaticExpression
|
32
|
+
include Glimmer::DSL::BindExpression
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2023 Andy Maleh
|
1
|
+
# Copyright (c) 2023-2024 Andy Maleh
|
2
2
|
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
# a copy of this software and associated documentation files (the
|
@@ -19,27 +19,27 @@
|
|
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
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
22
|
+
require 'glimmer/dsl/expression'
|
23
|
+
require 'glimmer/data_binding/model_binding'
|
24
|
+
|
25
|
+
module Glimmer
|
26
|
+
module DSL
|
27
|
+
module Wx
|
28
|
+
# Responsible for wiring data-binding
|
29
|
+
# Depends on BindExpression
|
30
|
+
class DataBindingExpression < Expression
|
31
|
+
def can_interpret?(parent, keyword, *args, &block)
|
32
|
+
args.size == 1 and
|
33
|
+
args[0].is_a?(DataBinding::ModelBinding) and
|
34
|
+
parent.respond_to?(:data_bind)
|
35
|
+
end
|
36
|
+
|
37
|
+
def interpret(parent, keyword, *args, &block)
|
38
|
+
property = keyword
|
39
|
+
model_binding = args[0]
|
40
|
+
parent.data_bind(property, model_binding)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/glimmer/dsl/wx/dsl.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2023 Andy Maleh
|
1
|
+
# Copyright (c) 2023-2024 Andy Maleh
|
2
2
|
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
# a copy of this software and associated documentation files (the
|
@@ -35,18 +35,15 @@ module Glimmer
|
|
35
35
|
module Wx
|
36
36
|
Engine.add_dynamic_expressions(
|
37
37
|
Wx,
|
38
|
-
# listener
|
39
|
-
# data_binding
|
40
|
-
# shine_data_binding
|
41
|
-
# property
|
42
|
-
# operation
|
43
|
-
# control
|
44
38
|
%w[
|
45
39
|
listener
|
40
|
+
data_binding
|
41
|
+
shine_data_binding
|
46
42
|
sizer_args
|
47
43
|
sizer_addable
|
48
44
|
sizer
|
49
45
|
property
|
46
|
+
operation
|
50
47
|
control
|
51
48
|
]
|
52
49
|
)
|