glimmer-dsl-tk 0.0.18 → 0.0.23

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa03163d6b0577d65e67d245b810079da4ddd6aca50cde649963e9448defe1ee
4
- data.tar.gz: 3d2cadbe0dff5e003ada1938a461785b11d5899d671d12f998b0c783983fa4dc
3
+ metadata.gz: 9d722c9396a9adb7252e4fc65c283fbf923dbe0cb93e17a9d34649ea887f5e56
4
+ data.tar.gz: 20682a6aa497800f683b87fc180754a58a96362a5a286fab3754bc38edd5d084
5
5
  SHA512:
6
- metadata.gz: 6160cea03e0e6ed6e1511271cd780db176ba569b2774e9a304749e612ec242ad65d611dce0c475f29dfe3f9dce869bee8c660825a90fff0b3a0f5315cf7fbb47
7
- data.tar.gz: abc75b8c436416257770b9af8e38470bbf4ab53f448a281c6626fa56ef7617ffee4d551038fa9618b00d33cd63f9c8cf19f51b311406497e1ce99a54ba22d2f0
6
+ metadata.gz: 77c488d614a997861369fd032fc1ebc578bee01aa8367c0fd267b99442ec462769f0218c11e236533b3443558294c2ca0940c773777698f4216df85cd1179243
7
+ data.tar.gz: 521a5c5e3db695b7938fc225619779114e32c06fa2bce870de16f233597d212b3662218a101e95921733c58f4ea02764598167eaa507835bbb25855187566b6a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.0.23
4
+
5
+ - Hello, Radiobutton!
6
+ - Support `radiobutton` ensuring that sibling radio buttons share the same variable to achieve mutually exclusive selection
7
+ - Improved Hello, Checkbutton! sample to demonstrate alternate checkbutton value (half-checked state)
8
+ - Support `checkbutton` with specified `onvalue` and `offvalue` (when they do not have values 1 and 0)
9
+ - Alias `root` `title` attribute as `text` & add children attribute to widgets
10
+ - Alias `notebook` `frame` `:title` as `:text`
11
+ - Alias message_box `:title` as `:text`
12
+ - Fix reference to `Glimmer::Tk::CheckbuttonProxy` (was `Glimmer::Tk::ChecktbuttonProxy`)
13
+
14
+ ## 0.0.22
15
+
16
+ - Hello, Checkbutton!
17
+ - Support checkbutton data-binding
18
+
19
+ ## 0.0.21
20
+
21
+ - Support event bindings via `on(event) {}` syntax nestable under any widget
22
+ - Support `root` event binding: `'WM_DELETE_WINDOW'` and alias `'DELETE_WINDOW'`
23
+ - Support `root` event binding: `'OPEN_WINDOW'`
24
+ - Support `root` attribute: `background` (any color including `systemTransparent`)
25
+ - Support `root` boolean attribute: `alpha`
26
+ - Support `root` boolean attributes: `fullscreen`, `topmost`, `transparent`
27
+ - Support `root` attributes: `stackorder`, `winfo_screendepth`, `winfo_screenvisual`, `winfo_screenwidth`, `winfo_screenheight`, `winfo_pixels('li')`, `winfo_screen`, `wm_maxsize`
28
+ - Support `root` attribute: `state` (`'normal', 'iconic', 'withdrawn', 'icon', 'zoomed'`)
29
+
30
+ ## 0.0.20
31
+
32
+ - Hello, Root! sample
33
+ - Support `root` `width`, `height`, `x`, `y` attributes
34
+ - Support `root` attribute: `resizable`
35
+ - Support `root` attribute: `minsize`
36
+ - Support `root` attribute: `maxsize`
37
+ - Set minimum width/height on `root` (190 pixels)
38
+
3
39
  ## 0.0.18
4
40
 
5
41
  - Hello, Frame! sample
data/README.md CHANGED
@@ -1,4 +1,4 @@
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 Tk 0.0.18
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 Tk 0.0.23
2
2
  ## MRI Ruby Desktop Development GUI Library
3
3
  [![Gem Version](https://badge.fury.io/rb/glimmer-dsl-tk.svg)](http://badge.fury.io/rb/glimmer-dsl-tk)
4
4
  [![Ruby](https://github.com/AndyObtiva/glimmer-dsl-tk/actions/workflows/ruby.yml/badge.svg)](https://github.com/AndyObtiva/glimmer-dsl-tk/actions/workflows/ruby.yml)
@@ -83,17 +83,22 @@ Other [Glimmer](https://github.com/AndyObtiva/glimmer) DSL gems:
83
83
  - [Icon Photo](#icon-photo)
84
84
  - [The Grid Geometry Manager](#the-grid-geometry-manager)
85
85
  - [Bidirectional Data-Binding](#bidirectional-data-binding)
86
- - [General Property Data-Binding](#general-property-data-binding)
86
+ - [Label Data-Binding](#label-data-binding)
87
87
  - [Combobox Data-Binding](#combobox-data-binding)
88
88
  - [List Single Selection Data-Binding](#list-single-selection-data-binding)
89
89
  - [List Multi Selection Data-Binding](#list-multi-selection-data-binding)
90
90
  - [Entry Data-Binding](#entry-data-binding)
91
- - [Command Observer](#command-observer)
91
+ - [Checkbutton Data-Binding](#checkbutton-data-binding)
92
+ - [Radiobutton Data-Binding](#radiobutton-data-binding)
93
+ - [Command Callback](#command-callback)
92
94
  - [Gotchas](#gotchas)
93
95
  - [Samples](#samples)
94
96
  - [Hello, World!](#hello-world)
95
97
  - [Hello, Button!](#hello-button)
98
+ - [Hello, Checkbutton!](#hello-checkbutton)
99
+ - [Hello, Radiobutton!](#hello-radiobutton)
96
100
  - [Hello, Frame!](#hello-frame)
101
+ - [Hello, Root!](#hello-root)
97
102
  - [Hello, Notebook!](#hello-notebook)
98
103
  - [Hello, Label!](#hello-label)
99
104
  - [Hello, Message Box!](#hello-message-box)
@@ -119,7 +124,7 @@ Other [Glimmer](https://github.com/AndyObtiva/glimmer) DSL gems:
119
124
  For example, on the Mac, you can:
120
125
  - Install the ActiveTcl Mac package from [ActiveState.com](https://activestate.com)
121
126
  - Install [RVM](https://rvm.io/) by running `\curl -sSL https://get.rvm.io | bash -s stable` (and run `curl -sSL https://rvm.io/pkuczynski.asc | gpg --import -` if needed for mentioned security reasons)
122
- - Run: `rvm install 2.7.1 --enable-shared --enable-pthread --with-tk --with-tcl`
127
+ - Run: `rvm install 3.0.2 --enable-shared --enable-pthread --with-tk --with-tcl`
123
128
  - Run: `gem install tk -v0.4.0`
124
129
 
125
130
  Afterwards, if you open `irb`, you should be able to run `require 'tk'` successfully.
@@ -137,7 +142,7 @@ gem install glimmer-dsl-tk
137
142
 
138
143
  Add the following to `Gemfile`:
139
144
  ```
140
- gem 'glimmer-dsl-tk', '~> 0.0.18'
145
+ gem 'glimmer-dsl-tk', '~> 0.0.23'
141
146
  ```
142
147
 
143
148
  And, then run:
@@ -179,6 +184,7 @@ The Glimmer GUI DSL follows these simple concepts in mapping from Tk syntax:
179
184
  - **Widget Keyword**: Any Tk widget (e.g. `Tk::Tile::Label`) or toplevel window (e.g. `TkRoot`) may be declared by its lower-case underscored name without the namespace (e.g. `label` or `root`). This is called a keyword and is represented in the Glimmer GUI DSL by a Ruby method behind the scenes.
180
185
  - **Args**: Any keyword method may optionally take arguments surrounded by parentheses (e.g. a `frame` nested under a `notebook` may receive tab options like `frame(text: 'Users')`, which gets used behind the scenes by Tk code such as `notebook.add tab, text: 'Users'`)
181
186
  - **Content/Options Block**: Any keyword may optionally be followed by a Ruby curly-brace block containing nested widgets (content) and attributes (options). Attributes are simply Tk option keywords followed by arguments and no block (e.g. `title 'Hello, World!'` under a `root`)
187
+ - **Event Binding Block**: `on(event) {}` keyword receiving a Tk binding event name (e.g. `KeyPress` or `ComboboxSelected`). No need to surround event by `<>` as [Glimmer DSL for Tk](https://rubygems.org/gems/glimmer-dsl-tk) takes care of that automatically.
182
188
 
183
189
  Example of an app written in [Tk](https://www.tcl.tk/) imperative syntax:
184
190
 
@@ -198,6 +204,15 @@ notebook.add tab2, text: 'French'
198
204
  label2 = ::Tk::Tile::Label.new(tab2).grid
199
205
  label2.text = 'Bonjour, Univers!'
200
206
 
207
+ root.bind('KeyPress') do |event|
208
+ case event.keysym
209
+ when 'e', 'E'
210
+ notebook.select(0)
211
+ when 'f', 'F'
212
+ notebook.select(1)
213
+ end
214
+ end
215
+
201
216
  root.mainloop
202
217
  ```
203
218
 
@@ -207,7 +222,7 @@ Example of the same app written in [Glimmer](https://github.com/AndyObtiva/glimm
207
222
  root {
208
223
  title 'Hello, Notebook!'
209
224
 
210
- notebook {
225
+ @notebook = notebook {
211
226
  frame(text: 'English') {
212
227
  label {
213
228
  text 'Hello, World!'
@@ -220,6 +235,15 @@ root {
220
235
  }
221
236
  }
222
237
  }
238
+
239
+ on('KeyPress') do |event|
240
+ case event.keysym
241
+ when 'e', 'E'
242
+ @notebook.select(0)
243
+ when 'f', 'F'
244
+ @notebook.select(1)
245
+ end
246
+ end
223
247
  }.open
224
248
  ```
225
249
 
@@ -227,19 +251,53 @@ root {
227
251
 
228
252
  keyword(args) | attributes | event bindings & callbacks
229
253
  ------------- | ---------- | ---------
230
- `button` | `text`, `image` (optional keyword args: `subsample`, `zoom`, `from`, `to`, `shrink`, `compositingrule`), `compound` (`'center', 'top', 'bottom', 'left', 'right'`), `default` (`'active', 'normal'`) | `command`
254
+ `button` | `text`, `image` (optional keyword args: `subsample`, `zoom`, `from`, `to`, `shrink`, `compositingrule`), `compound` (`'center', 'top', 'bottom', 'left', 'right'`), `default` (`'active', 'normal'`) | `command {}`
255
+ `checkbutton` | `text`, `variable` (Boolean), `image` (optional keyword args: `subsample`, `zoom`, `from`, `to`, `shrink`, `compositingrule`), `compound` (`'center', 'top', 'bottom', 'left', 'right'`), `onvalue` (default: `1`), `offvalue` (default: `0`) | `command {}`
256
+ `combobox` | `state`, `text` | `'ComboboxSelected'`
231
257
  `entry` | `width`, `text` | None
232
258
  `frame(text: nil)` | `width`, `height`, `borderwidth`, `relief` (`'flat' (default), 'raised', 'sunken', 'solid', 'ridge', 'groove'`) | None
233
259
  `label` | `text`, `image` (optional keyword args: `subsample`, `zoom`, `from`, `to`, `shrink`, `compositingrule`), `compound` (`'center', 'top', 'bottom', 'left', 'right'`), `font` (`'default', 'text', 'fixed', 'menu', 'heading', 'caption', 'small_caption', 'icon', 'tooltip'`), `relief` (`'flat' (default), 'raised', 'sunken', 'solid', 'ridge', 'groove'`), `justify` (`'left', 'center', 'right'`), `foreground`, `background` | None
234
260
  `list` | `selectmode`, `selection` | None
235
261
  `message_box(type: , message: , detail: , title: , icon: , default: , parent: )` | None | None
236
262
  `notebook` | None | None
237
- `root` | `title`, `iconphoto` | None
263
+ `radiobutton` | `text`, `variable` (Boolean), `image` (optional keyword args: `subsample`, `zoom`, `from`, `to`, `shrink`, `compositingrule`), `compound` (`'center', 'top', 'bottom', 'left', 'right'`), `value` (default: `text`) | `command {}`
264
+ `root` | `title`, `iconphoto`, `background`, `alpha`, `fullscreen?`, `topmost?`, `transparent?`, `stackorder`, `winfo_screendepth`, `winfo_screenvisual`, `winfo_screenwidth`, `winfo_screenheight`, `winfo_pixels('li')`, `winfo_screen`, `wm_maxsize`, `state` (`'normal', 'iconic', 'withdrawn', 'icon', 'zoomed'`) | `'DELETE_WINDOW'`, `'OPEN_WINDOW'`
238
265
 
239
266
  #### Common Attributes
240
267
 
241
268
  - `grid`: `Hash` of `:row`, `:column`, `:padx`, `:pady`, `:sticky` (`'e', 'w', 'n', 's'` or any combination of direction letters)
242
269
 
270
+ #### Common Event Bindings
271
+
272
+ - `Activate`
273
+ - `Deactivate`
274
+ - `MouseWheel`
275
+ - `KeyPress`
276
+ - `KeyRelease`
277
+ - `ButtonPress`
278
+ - `ButtonRelease`
279
+ - `Motion`
280
+ - `Configure`
281
+ - `Map`
282
+ - `Unmap`
283
+ - `Visibility`
284
+ - `Expose`
285
+ - `Destroy`
286
+ - `FocusIn`
287
+ - `FocusOut`
288
+ - `Enter`
289
+ - `Leave`
290
+ - `Property`
291
+ - `Colormap`
292
+ - `MapRequest`
293
+ - `CirculateRequest`
294
+ - `ResizeRequest`
295
+ - `ConfigureRequest`
296
+ - `Create`
297
+ - `Gravity`
298
+ - `Reparent`
299
+ - `Circulate`
300
+
243
301
  #### Common Themed Widget States
244
302
 
245
303
  - `active?`
@@ -255,6 +313,10 @@ keyword(args) | attributes | event bindings & callbacks
255
313
 
256
314
  ### Smart Defaults and Convensions
257
315
 
316
+ #### Event Bindings
317
+
318
+ Any events that normally can be accepted by the Tk `bind` or `protocol` methods can be accepted by the `on(event) {}` listener syntax. There is no need to surround event name by `<>` as [Glimmer DSL for Tk](https://rubygems.org/gems/glimmer-dsl-tk) automatically takes care of that when needed and leaves out when not needed.
319
+
258
320
  #### Grid Layout
259
321
 
260
322
  `grid` layout is the default on most widgets (which support it).
@@ -315,7 +377,7 @@ More details can be found in the [Hello, Computed!](#hello-computed) sample belo
315
377
 
316
378
  Glimmer supports Shine syntax bidirectional data-binding via the `<=>` operator (read-write) and unidirectional data-binding via the `<=` operator (read-only), which takes a model and an attribute (the `bind` keyword may also be used as the old-style of data-binding).
317
379
 
318
- ### General Property Data-Binding
380
+ ### Label Data-Binding
319
381
 
320
382
  Example:
321
383
 
@@ -323,11 +385,11 @@ This assumes a `Person` model with a `country` attribute.
323
385
 
324
386
  ```ruby
325
387
  label {
326
- text <=> [person, :country]
388
+ text <= [person, :country]
327
389
  }
328
390
  ```
329
391
 
330
- That code binds the `textvariable` value of the `label` to the `country` property on the `person` model.
392
+ That code binds the `textvariable` value of the `label` unidirectionally (read-only) to the `country` property on the `person` model.
331
393
 
332
394
  It automatically handles all the Tk plumbing behind the scenes.
333
395
 
@@ -368,8 +430,8 @@ This assumes a `Person` model with a `country` attribute representing their curr
368
430
  }
369
431
  ```
370
432
 
371
- That code binds the `items` text of the `list` to the `country_options` property on the `person` model (data-binding attribute + "_options" by convention).
372
- It also binds the `selection` text of the `list` to the `country` property on the `person` model.
433
+ That code binds the `items` text of the `list` to the `country_options` attribute on the `person` model (data-binding attribute + "_options" by convention).
434
+ It also binds the `selection` text of the `list` to the `country` attribute on the `person` model.
373
435
 
374
436
  It automatically handles all the Tk plumbing behind the scenes.
375
437
 
@@ -389,8 +451,8 @@ This assumes a `Person` model with a `provinces` attribute representing their cu
389
451
  }
390
452
  ```
391
453
 
392
- That code binds the `items` text of the `list` to the `provinces_options` property on the `person` model (data-binding attribute + "_options" by convention).
393
- It also binds the `selection` text of the `list` to the `provinces` property on the `person` model.
454
+ That code binds the `items` text of the `list` to the `provinces_options` attribute on the `person` model (data-binding attribute + "_options" by convention).
455
+ It also binds the `selection` text of the `list` to the `provinces` attribute on the `person` model.
394
456
 
395
457
  It automatically handles all the Tk plumbing behind the scenes.
396
458
 
@@ -408,30 +470,75 @@ This assumes a `Person` model with a `country` attribute.
408
470
  }
409
471
  ```
410
472
 
411
- That code binds the `textvariable` value of the `entry` to the `country` property on the `person` model.
473
+ That code binds the `textvariable` value of the `entry` to the `country` attribute on the `person` model.
412
474
 
413
475
  It automatically handles all the Tk plumbing behind the scenes.
414
476
 
415
477
  More details can be found in the [Hello, Computed!](#hello-computed) sample below.
416
478
 
417
- ## Command Observer
479
+ ### Checkbutton Data-Binding
480
+
481
+ Example:
482
+
483
+ This assumes a `Person` model with a boolean `adult` attribute.
484
+
485
+ ```ruby
486
+ checkbutton {
487
+ variable <=> [person, :adult]
488
+ }
489
+ ```
490
+
491
+ That code binds the `variable` value of the `checkbutton` to the boolean `adult` attribute on the `person` model.
492
+
493
+ It automatically handles all the Tk plumbing behind the scenes.
494
+
495
+ If you need to display a half-checked `checkbutton`, bind to `alternate` attribute.
496
+
497
+ More details can be found in the [Hello, Checkbutton!](#hello-checkbutton) sample below.
498
+
499
+ ### Radiobutton Data-Binding
500
+
501
+ Example:
502
+
503
+ This assumes a `Person` model with boolean `male` and `female` attributes.
504
+
505
+ ```ruby
506
+ radiobutton {
507
+ text 'Male'
508
+ variable <=> [@person, :male]
509
+ }
510
+
511
+ radiobutton {
512
+ text 'Female'
513
+ variable <=> [@person, :female]
514
+ }
515
+ ```
516
+
517
+ That code binds the `variable` value of the `radiobutton` to the boolean `male` and `female` attributes on the `person` model.
518
+
519
+ It automatically handles all the Tk plumbing behind the scenes, including setting the `radiobutton` `value` (uses `text` attribute as `value`), enabling an API that works with simple booleans for each `radiobutton`.
520
+
521
+ For very rare cases, if you need to display a half-selected `radiobutton`, set `alternate` attribute as `true` when the `variable` value is `false`.
522
+
523
+ More details can be found in the [Hello, Radiobutton!](#hello-radiobutton) sample below.
524
+
525
+ ## Command Callback
418
526
 
419
- Buttons can set a `command` option to trigger when the user clicks the button. This may be done with the `command` keyword, passing in a block directly (no need for `proc` as per Tk)
527
+ `button` and `checkbutton` can set a `command` block to trigger when the user clicks the button/checkbutton. This may be done with the `command` keyword, passing in a block directly.
420
528
 
421
529
  Example:
422
530
 
423
531
  ```ruby
424
532
  button {
425
533
  text "Reset Selection"
534
+
426
535
  command {
427
536
  person.reset_country
428
537
  }
429
538
  }
430
539
  ```
431
540
 
432
- This resets the person country.
433
-
434
- More details can be found in the [Hello, Combobox!](#hello-combobox) sample below.
541
+ More details can be found in the [Hello, Button!](#hello-button) sample below.
435
542
 
436
543
  ## Gotchas
437
544
 
@@ -572,6 +679,253 @@ Glimmer app:
572
679
 
573
680
  ![glimmer dsl tk screenshot sample hello button](images/glimmer-dsl-tk-screenshot-sample-hello-button.png)
574
681
 
682
+ ### Hello, Checkbutton!
683
+
684
+ Glimmer code (from [samples/hello/hello_checkbutton.rb](samples/hello/hello_checkbutton.rb)):
685
+
686
+ ```ruby
687
+ require 'glimmer-dsl-tk'
688
+
689
+ class HelloCheckbutton
690
+ class Person
691
+ attr_accessor :skiing, :snowboarding, :snowmobiling, :snowshoeing, :snow_activities, :snow_activities_alternate
692
+
693
+ def initialize
694
+ reset_activities!
695
+ individual_observer = Glimmer::DataBinding::Observer.proc do
696
+ unless @updating_group
697
+ @updating_individual = true
698
+ if skiing && snowboarding && snowmobiling && snowshoeing
699
+ self.snow_activities = true
700
+ self.snow_activities_alternate = false
701
+ elsif skiing || snowboarding || snowmobiling || snowshoeing
702
+ self.snow_activities = true
703
+ self.snow_activities_alternate = true
704
+ else
705
+ self.snow_activities = false
706
+ self.snow_activities_alternate = false
707
+ end
708
+ @updating_individual = false
709
+ end
710
+ end
711
+ individual_observer.observe(self, :skiing)
712
+ individual_observer.observe(self, :snowboarding)
713
+ individual_observer.observe(self, :snowmobiling)
714
+ individual_observer.observe(self, :snowshoeing)
715
+
716
+ group_observer = Glimmer::DataBinding::Observer.proc do
717
+ unless @updating_individual
718
+ @updating_group = true
719
+ self.skiing = self.snow_activities
720
+ self.snowboarding = self.snow_activities
721
+ self.snowmobiling = self.snow_activities
722
+ self.snowshoeing = self.snow_activities
723
+ @updating_group = false
724
+ end
725
+ end
726
+ group_observer.observe(self, :snow_activities)
727
+ end
728
+
729
+ def reset_activities!
730
+ self.snow_activities = true
731
+ self.snow_activities_alternate = true
732
+ self.skiing = false
733
+ self.snowboarding = true
734
+ self.snowmobiling = false
735
+ self.snowshoeing = false
736
+ end
737
+ end
738
+
739
+ include Glimmer
740
+
741
+ def initialize
742
+ @person = Person.new
743
+ end
744
+
745
+ def launch
746
+ root {
747
+ title 'Hello, Checkbutton!'
748
+ background '#ececec' if OS.mac?
749
+
750
+ label {
751
+ text 'Check all snow activities you are interested in:'
752
+ font 'caption'
753
+ }
754
+
755
+ frame {
756
+ checkbutton {
757
+ text 'Snow Activities'
758
+ variable <=> [@person, :snow_activities]
759
+ alternate <=> [@person, :snow_activities_alternate] # binds half-checked state
760
+ }
761
+
762
+ frame {
763
+ checkbutton {
764
+ text 'Skiing'
765
+ variable <=> [@person, :skiing]
766
+ }
767
+
768
+ checkbutton {
769
+ text 'Snowboarding'
770
+ variable <=> [@person, :snowboarding]
771
+ }
772
+
773
+ checkbutton {
774
+ text 'Snowmobiling'
775
+ variable <=> [@person, :snowmobiling]
776
+ }
777
+
778
+ checkbutton {
779
+ text 'Snowshoeing'
780
+ variable <=> [@person, :snowshoeing]
781
+ }
782
+ }
783
+ }
784
+
785
+ button {
786
+ text 'Reset Activities'
787
+
788
+ command do
789
+ @person.reset_activities!
790
+ end
791
+ }
792
+ }.open
793
+ end
794
+ end
795
+
796
+ HelloCheckbutton.new.launch
797
+ ```
798
+
799
+ Run with [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
800
+
801
+ ```
802
+ ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_checkbutton'"
803
+ ```
804
+
805
+ Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
806
+
807
+ ```
808
+ ruby -r ./lib/glimmer-dsl-tk.rb ./samples/hello/hello_checkbutton.rb
809
+ ```
810
+
811
+ Glimmer app:
812
+
813
+ ![glimmer dsl tk screenshot sample hello checkbutton](images/glimmer-dsl-tk-screenshot-sample-hello-checkbutton.png)
814
+
815
+ ![glimmer dsl tk screenshot sample hello checkbutton](images/glimmer-dsl-tk-screenshot-sample-hello-checkbutton-all-checked.png)
816
+
817
+ ![glimmer dsl tk screenshot sample hello checkbutton](images/glimmer-dsl-tk-screenshot-sample-hello-checkbutton-none-checked.png)
818
+
819
+ ### Hello, Radiobutton!
820
+
821
+ Glimmer code (from [samples/hello/hello_radiobutton.rb](samples/hello/hello_radiobutton.rb)):
822
+
823
+ ```ruby
824
+ require 'glimmer-dsl-tk'
825
+
826
+ class HelloRadiobutton
827
+ class Person
828
+ attr_accessor :male, :female, :child, :teen, :adult, :senior
829
+
830
+ def initialize
831
+ reset!
832
+ end
833
+
834
+ def reset!
835
+ self.male = true
836
+ self.female = nil
837
+ self.child = nil
838
+ self.teen = nil
839
+ self.adult = true
840
+ self.senior = nil
841
+ end
842
+ end
843
+
844
+ include Glimmer
845
+
846
+ def initialize
847
+ @person = Person.new
848
+ end
849
+
850
+ def launch
851
+ root {
852
+ title 'Hello, Radio!'
853
+ background '#ececec' if OS.mac?
854
+
855
+ label {
856
+ text 'Gender:'
857
+ font 'caption'
858
+ }
859
+
860
+ frame {
861
+ radiobutton {
862
+ text 'Male'
863
+ variable <=> [@person, :male]
864
+ }
865
+
866
+ radiobutton {
867
+ text 'Female'
868
+ variable <=> [@person, :female]
869
+ }
870
+ }
871
+
872
+ label {
873
+ text 'Age Group:'
874
+ font 'caption'
875
+ }
876
+
877
+ frame {
878
+ radiobutton {
879
+ text 'Child'
880
+ variable <=> [@person, :child]
881
+ }
882
+
883
+ radiobutton {
884
+ text 'Teen'
885
+ variable <=> [@person, :teen]
886
+ }
887
+
888
+ radiobutton {
889
+ text 'Adult'
890
+ variable <=> [@person, :adult]
891
+ }
892
+
893
+ radiobutton {
894
+ text 'Senior'
895
+ variable <=> [@person, :senior]
896
+ }
897
+ }
898
+
899
+ button {
900
+ text 'Reset'
901
+
902
+ command do
903
+ @person.reset!
904
+ end
905
+ }
906
+ }.open
907
+ end
908
+ end
909
+
910
+ HelloRadiobutton.new.launch
911
+ ```
912
+
913
+ Run with [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
914
+
915
+ ```
916
+ ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_radiobutton'"
917
+ ```
918
+
919
+ Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
920
+
921
+ ```
922
+ ruby -r ./lib/glimmer-dsl-tk.rb ./samples/hello/hello_radiobutton.rb
923
+ ```
924
+
925
+ Glimmer app:
926
+
927
+ ![glimmer dsl tk screenshot sample hello radiobutton](images/glimmer-dsl-tk-screenshot-sample-hello-radiobutton.png)
928
+
575
929
  ### Hello, Frame!
576
930
 
577
931
  Glimmer code (from [samples/hello/hello_frame.rb](samples/hello/hello_frame.rb)):
@@ -645,6 +999,60 @@ Glimmer app:
645
999
 
646
1000
  ![glimmer dsl tk screenshot sample hello frame](images/glimmer-dsl-tk-screenshot-sample-hello-frame.png)
647
1001
 
1002
+ ### Hello, Root!
1003
+
1004
+ Glimmer code (from [samples/hello/hello_frame.rb](samples/hello/hello_frame.rb)):
1005
+
1006
+ ```ruby
1007
+ require 'glimmer-dsl-tk'
1008
+
1009
+ include Glimmer
1010
+
1011
+ root { |r|
1012
+ title 'Hello, Root!'
1013
+ iconphoto File.expand_path('../../icons/glimmer.png', __dir__)
1014
+ width 400
1015
+ height 200
1016
+ x -150
1017
+ y 300
1018
+ resizable true # same as `resizable true, true`, meaning cannot resize horizontally and vertically
1019
+ minsize 200, 100
1020
+ maxsize 600, 400
1021
+ background 'lightgrey'
1022
+ alpha 0.85 # on the mac, you can set `transparent true` as well
1023
+ topmost true
1024
+
1025
+ on('OPEN_WINDOW') do # custom event that runs right after Tk.mainloop
1026
+ message_box(parent: r, title: 'Hi', message: 'Hi')
1027
+ end
1028
+
1029
+ on('DELETE_WINDOW') do |event| # alias for WM_DELETE_WINDOW protocol event
1030
+ message_box(parent: r, title: 'Bye', message: 'Bye')
1031
+ exit(0)
1032
+ end
1033
+ }.open
1034
+ ```
1035
+
1036
+ Run with [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
1037
+
1038
+ ```
1039
+ ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_root'"
1040
+ ```
1041
+
1042
+ Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
1043
+
1044
+ ```
1045
+ ruby -r ./lib/glimmer-dsl-tk.rb ./samples/hello/hello_root.rb
1046
+ ```
1047
+
1048
+ Glimmer app:
1049
+
1050
+ ![glimmer dsl tk screenshot sample hello root hi](images/glimmer-dsl-tk-screenshot-sample-hello-root-hi.png)
1051
+
1052
+ ![glimmer dsl tk screenshot sample hello root](images/glimmer-dsl-tk-screenshot-sample-hello-root.png)
1053
+
1054
+ ![glimmer dsl tk screenshot sample hello root bye](images/glimmer-dsl-tk-screenshot-sample-hello-root-bye.png)
1055
+
648
1056
  ### Hello, Notebook!
649
1057
 
650
1058
  Glimmer code (from [samples/hello/hello_notebook.rb](samples/hello/hello_notebook.rb)):
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.18
1
+ 0.0.23
Binary file
@@ -27,7 +27,10 @@ module Glimmer
27
27
  module Tk
28
28
  class MessageBoxExpression < StaticExpression
29
29
  def interpret(parent, keyword, *args, &block)
30
- args.first[:parent] = args.first[:parent].tk if args.first.is_a?(Hash) && args.first[:parent].is_a?(Glimmer::Tk::RootProxy)
30
+ if args.first.is_a?(Hash)
31
+ args.first[:parent] = args.first[:parent].tk if args.first[:parent].is_a?(Glimmer::Tk::RootProxy)
32
+ args.first[:title] = args.first.delete(:text) if args.first.keys.include?(:text)
33
+ end
31
34
  ::Tk::messageBox(*args)
32
35
  end
33
36
  end