glimmer-dsl-tk 0.0.35 → 0.0.39
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +35 -0
- data/README.md +473 -22
- data/VERSION +1 -1
- data/glimmer-dsl-tk.gemspec +0 -0
- data/lib/glimmer/dsl/tk/widget_expression.rb +1 -1
- data/lib/glimmer/tk/menu_item_proxy.rb +202 -0
- data/lib/glimmer/tk/menu_proxy.rb +88 -0
- data/lib/glimmer/tk/root_proxy.rb +1 -16
- data/lib/glimmer/tk/text_proxy.rb +18 -18
- data/lib/glimmer/tk/toplevel_proxy.rb +40 -0
- data/lib/glimmer/tk/widget_proxy.rb +18 -8
- data/lib/glimmer-dsl-tk.rb +12 -0
- data/samples/hello/hello_button.rb +1 -1
- data/samples/hello/hello_checkbutton.rb +1 -1
- data/samples/hello/hello_menu_bar.rb +260 -0
- data/samples/hello/hello_text.rb +5 -5
- data/samples/hello/hello_toplevel.rb +178 -0
- metadata +6 -2
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.
|
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.39
|
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)
|
@@ -57,7 +57,7 @@ Other [Glimmer](https://github.com/AndyObtiva/glimmer) DSL gems:
|
|
57
57
|
- [glimmer-dsl-swt](https://github.com/AndyObtiva/glimmer-dsl-swt): Glimmer DSL for SWT (JRuby Desktop Development GUI Framework)
|
58
58
|
- [glimmer-dsl-opal](https://github.com/AndyObtiva/glimmer-dsl-opal): Glimmer DSL for Opal (Pure Ruby Web GUI and Auto-Webifier of Desktop Apps)
|
59
59
|
- [glimmer-dsl-libui](https://github.com/AndyObtiva/glimmer-dsl-libui): Glimmer DSL for LibUI (Prerequisite-Free Ruby Desktop Development GUI Library)
|
60
|
-
- [glimmer-dsl-gtk](https://github.com/AndyObtiva/glimmer-dsl-gtk): Ruby-GNOME Desktop Development GUI Library
|
60
|
+
- [glimmer-dsl-gtk](https://github.com/AndyObtiva/glimmer-dsl-gtk): Glimmer DSL for GTK (Ruby-GNOME Desktop Development GUI Library)
|
61
61
|
- [glimmer-dsl-xml](https://github.com/AndyObtiva/glimmer-dsl-xml): Glimmer DSL for XML (& HTML)
|
62
62
|
- [glimmer-dsl-css](https://github.com/AndyObtiva/glimmer-dsl-css): Glimmer DSL for CSS (Cascading Style Sheets)
|
63
63
|
|
@@ -82,8 +82,10 @@ Other [Glimmer](https://github.com/AndyObtiva/glimmer) DSL gems:
|
|
82
82
|
- [Image Attribute](#image-attribute)
|
83
83
|
- [Frame Padding](#frame-padding)
|
84
84
|
- [Notebook Frame](#notebook-frame)
|
85
|
+
- [Menu Item Accelerator](#menu-item-accelerator)
|
85
86
|
- [Icon Photo](#icon-photo)
|
86
87
|
- [Root Background](#root-background)
|
88
|
+
- [Toplevel Mac Style](#toplevel-mac-style)
|
87
89
|
- [Text Defaults](#text-defaults)
|
88
90
|
- [The Grid Geometry Manager](#the-grid-geometry-manager)
|
89
91
|
- [Data-Binding](#data-binding)
|
@@ -105,6 +107,7 @@ Other [Glimmer](https://github.com/AndyObtiva/glimmer) DSL gems:
|
|
105
107
|
- [Hello, Radiobutton!](#hello-radiobutton)
|
106
108
|
- [Hello, Frame!](#hello-frame)
|
107
109
|
- [Hello, Root!](#hello-root)
|
110
|
+
- [Hello, Toplevel!](#hello-toplevel)
|
108
111
|
- [Hello, Notebook!](#hello-notebook)
|
109
112
|
- [Hello, Label!](#hello-label)
|
110
113
|
- [Hello, Message Box!](#hello-message-box)
|
@@ -118,10 +121,12 @@ Other [Glimmer](https://github.com/AndyObtiva/glimmer) DSL gems:
|
|
118
121
|
- [Hello, Drag and Drop!](#hello-drag-and-drop)
|
119
122
|
- [Hello, Built-in Dialog!](#hello-built-in-dialog)
|
120
123
|
- [Hello, Separator!](#hello-separator)
|
124
|
+
- [Hello, Menu Bar!](#hello-menu-bar)
|
121
125
|
- [Applications](#applications)
|
122
126
|
- [Glimmer Tk Calculator](#glimmer-tk-calculator)
|
123
127
|
- [Y3network Ruby UI](#y3network-ruby-ui)
|
124
128
|
- [CryptoPunks GUI](#cryptopunks-gui)
|
129
|
+
- [Circule](#circule)
|
125
130
|
- [Process](#process)
|
126
131
|
- [Resources](#resources)
|
127
132
|
- [Help](#help)
|
@@ -144,6 +149,13 @@ For example, on the Mac, you can:
|
|
144
149
|
- Run: `rvm install 3.0.2 --enable-shared --enable-pthread --with-tk --with-tcl`
|
145
150
|
- Run: `gem install tk -v0.4.0`
|
146
151
|
|
152
|
+
For example, on Windows, you can follow the [instructions over here](https://tkdocs.com/tutorial/install.html), specifically the following:
|
153
|
+
- Install Ruby+Devkit (including MSYS/MINGW toolchains) through Windows Installer: https://rubyinstaller.org/downloads/
|
154
|
+
- Install the ActiveTcl Windows package from [ActiveState.com](https://activestate.com)
|
155
|
+
- Follow this instruction: "First, Ruby needs to find the tcl86t.dll and tk86t.dll shared libraries. These are located in C:\ActiveTcl\bin. Make a copy of them somewhere Ruby can find them, e.g. C:\Ruby26\bin."
|
156
|
+
- Setup environment variables TCL_LIBRARY=C:\ActiveTcl\lib\tcl8.6 & TK_LIBRARY=C:\ActiveTcl\lib\tk8.6
|
157
|
+
- Run: `gem install tk -v0.4.0`
|
158
|
+
|
147
159
|
Afterwards, if you open `irb`, you should be able to run `require 'tk'` successfully.
|
148
160
|
|
149
161
|
## Setup
|
@@ -159,7 +171,7 @@ gem install glimmer-dsl-tk
|
|
159
171
|
|
160
172
|
Add the following to `Gemfile`:
|
161
173
|
```
|
162
|
-
gem 'glimmer-dsl-tk', '~> 0.0.
|
174
|
+
gem 'glimmer-dsl-tk', '~> 0.0.39'
|
163
175
|
```
|
164
176
|
|
165
177
|
And, then run:
|
@@ -283,10 +295,13 @@ keyword(args) | attributes | event bindings & callbacks
|
|
283
295
|
`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
|
284
296
|
`list` | `selectmode`, `selection` | None
|
285
297
|
`message_box(type: , message: , detail: , title: , icon: , default: , parent: )` | None | None
|
298
|
+
`menu(label: nil) (label is nil if nested under root/toplevel for menu bar)` | None | None
|
299
|
+
`menu_item(style = :command, label: , underline: )` (style also can be `:radiobutton`, `:checkbutton`, `:separator`, `:about`, `:preferences`, `:quit`, `:help`) | `state`, `accelerator`, `selection` & `variable` (if `:radiobutton` or `:checkbutton`), `image`, `compound` | `command`
|
286
300
|
`notebook` | None | None
|
287
301
|
`radiobutton` | `text`, `variable` (Boolean), `image` (optional keyword args: `subsample`, `zoom`, `from`, `to`, `shrink`, `compositingrule`), `compound` (`'center', 'top', 'bottom', 'left', 'right'`), `value` (default: `text`) | `command {}`
|
288
|
-
`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'`
|
302
|
+
`root` | `title`, `iconphoto`, `background`, `alpha`, `escapable`, `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'`
|
289
303
|
`separator` | `orient` (`'horizontal' (default) or 'vertical'`) | None
|
304
|
+
`toplevel` | `title`, `iconphoto`, `background`, `alpha`, `escapable`, `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'`
|
290
305
|
`text` | `value`, [many more attributes](https://tcl.tk/man/tcl8.6/TkCmd/text.htm#M116) | `'modified'`, `'selection'`, `'insert_mark_moved'` (alias: `'insert_mark_move', 'InsertMarkMove', 'InsertMarkMoved'`)
|
291
306
|
|
292
307
|
Options for `get_open_file` and `get_multiple_open_file` include:
|
@@ -350,12 +365,12 @@ The `text` widget is enhanced by [Glimmer DSL for Tk](https://rubygems.org/gems/
|
|
350
365
|
- `add_font_format(region_start, region_end, font_option, value)`
|
351
366
|
- `remove_font_format(region_start, region_end, font_option, value)`
|
352
367
|
- `toggle_font_format(region_start, region_end, font_option, value)`
|
353
|
-
- `add_selection_format(option, value, no_selection_default: :insert_word)`: adds format to selection. If there is no selection, then applies format to current insert mark word.
|
354
|
-
- `remove_selection_format(option, value, no_selection_default: :insert_word)`
|
355
|
-
- `toggle_selection_format(option, value, no_selection_default: :insert_word)`: toggles format on selection. If there is no selection, then toggles format on current insert mark word.
|
356
|
-
- `add_selection_font_format(font_option, value, no_selection_default: :insert_word)`
|
357
|
-
- `remove_selection_font_format(font_option, value, no_selection_default: :insert_word)`
|
358
|
-
- `toggle_selection_font_format(font_option, value, no_selection_default: :insert_word)`
|
368
|
+
- `add_selection_format(option, value, no_selection_default: :insert_word, focus: true)`: adds format to selection. If there is no selection, then applies format to current insert mark word.
|
369
|
+
- `remove_selection_format(option, value, no_selection_default: :insert_word, focus: true)`
|
370
|
+
- `toggle_selection_format(option, value, no_selection_default: :insert_word, focus: true)`: toggles format on selection. If there is no selection, then toggles format on current insert mark word.
|
371
|
+
- `add_selection_font_format(font_option, value, no_selection_default: :insert_word, focus: true)`
|
372
|
+
- `remove_selection_font_format(font_option, value, no_selection_default: :insert_word, focus: true)`
|
373
|
+
- `toggle_selection_font_format(font_option, value, no_selection_default: :insert_word, focus: true)`
|
359
374
|
- `text#insert_image(text_index, *image_args)`: inserts image into `text` `value` content at `text_index` location (e.g. `'insert'`)
|
360
375
|
- `text#get_open_file_to_insert_image(text_index = 'insert')`: opens a file dialog to select one of the available image formats and then inserts image into `text` `value` content
|
361
376
|
|
@@ -364,6 +379,9 @@ The `:no_selection_default` keyword arg to `*_selection_*` methods determines wh
|
|
364
379
|
- `:insert_letter`: current letter for insert mark
|
365
380
|
- `:none`: no behavior when no selection is in place
|
366
381
|
|
382
|
+
The `:focus` keyword arg defaults to `true` to indicate that the `text` widget should automatically grab focus after formatting modification.
|
383
|
+
Also, the `:focus` keyword arg can have an integer value representing number of milliseconds after which to grab focus once the formatting modification is done. This helps in special situations like when making the formatting modification from a combobox, which takes a while before relinquishing focus, so adding `100` millisecond delay helps ensure the `text` widget grabs focus after modification. Check [Hello, Text!](#hello-text) for an example of that.
|
384
|
+
|
367
385
|
Available options:
|
368
386
|
|
369
387
|
- `background`
|
@@ -451,6 +469,10 @@ Frames have a padding of `15` all around by default to produce more user-friendl
|
|
451
469
|
|
452
470
|
When nesting `frame` under `notebook`, you can pass a `:text` keyword argument to indicate the tab title.
|
453
471
|
|
472
|
+
#### Menu Item Accelerator
|
473
|
+
|
474
|
+
`menu_item` `accelerator` is automatically bound to the `command` set inside `menu_item` content (no need to do manual binding as per [Tk docs](https://tkdocs.com/tutorial/menus.html)).
|
475
|
+
|
454
476
|
#### Icon Photo
|
455
477
|
|
456
478
|
The `iconphoto` attribute on `root` is set to the Glimmer icon by default if no icon photo is supplied.
|
@@ -479,6 +501,20 @@ root {
|
|
479
501
|
|
480
502
|
`root` `background` color attribute is automatically set to `'#ececec'` on the Mac to avoid having a non-native-looking light-colored background.
|
481
503
|
|
504
|
+
#### Toplevel Mac Style
|
505
|
+
|
506
|
+
Mac has special support for mac styles in Tk `toplevel` via the `mac_style` attribute, which can receive 1 to 2 arguments. `mac_style`'s first argument (`mac_class`) and second argument (`mac_attribute_list`) can be chosen from this page:
|
507
|
+
|
508
|
+
https://wiki.tcl-lang.org/page/MacWindowStyle
|
509
|
+
|
510
|
+
Behind the scenes, `mac_style` automatically calls out to:
|
511
|
+
|
512
|
+
```ruby
|
513
|
+
Tk.tk_call("::tk::unsupported::MacWindowStyle", "style", tk_toplevel_widget, mac_class, mac_attribute_list)
|
514
|
+
```
|
515
|
+
|
516
|
+
More details can be found at the [Hello, Toplevel!](#hello-toplevel) sample.
|
517
|
+
|
482
518
|
#### Text Defaults
|
483
519
|
|
484
520
|
`text` widget has these defaults:
|
@@ -1333,7 +1369,7 @@ Glimmer app:
|
|
1333
1369
|
|
1334
1370
|
### Hello, Root!
|
1335
1371
|
|
1336
|
-
Glimmer code (from [samples/hello/
|
1372
|
+
Glimmer code (from [samples/hello/hello_root.rb](samples/hello/hello_root.rb)):
|
1337
1373
|
|
1338
1374
|
```ruby
|
1339
1375
|
require 'glimmer-dsl-tk'
|
@@ -1385,6 +1421,208 @@ Glimmer app:
|
|
1385
1421
|
|
1386
1422
|
![glimmer dsl tk screenshot sample hello root bye](images/glimmer-dsl-tk-screenshot-sample-hello-root-bye.png)
|
1387
1423
|
|
1424
|
+
### Hello, Toplevel!
|
1425
|
+
|
1426
|
+
`toplevel` widgets represent windows nested under `root`, which can be modeless (custom windows) or modal (dialogs that take the focus away from the owning window behind them until closed).
|
1427
|
+
|
1428
|
+
Mac has special support for mac styles in Tk `toplevel` via the `mac_style` attribute, which can receive 1 to 2 arguments. `mac_style`'s first argument (`mac_class`) and second argument (`mac_attribute_list`) can be chosen from this page:
|
1429
|
+
|
1430
|
+
https://wiki.tcl-lang.org/page/MacWindowStyle
|
1431
|
+
|
1432
|
+
Glimmer code (from [samples/hello/hello_toplevel.rb](samples/hello/hello_toplevel.rb)):
|
1433
|
+
|
1434
|
+
```ruby
|
1435
|
+
require 'glimmer-dsl-tk'
|
1436
|
+
|
1437
|
+
include Glimmer
|
1438
|
+
|
1439
|
+
def toplevel_content
|
1440
|
+
frame {
|
1441
|
+
label {
|
1442
|
+
text "This is a fully custom toplevel, meaning you can add any widgets here!\nYou can press the ESCAPE button on the keyboard to close."
|
1443
|
+
}
|
1444
|
+
separator
|
1445
|
+
checkbutton {
|
1446
|
+
text 'This is a checkbutton'
|
1447
|
+
}
|
1448
|
+
radiobutton {
|
1449
|
+
text 'This is a radiobutton'
|
1450
|
+
}
|
1451
|
+
}
|
1452
|
+
end
|
1453
|
+
|
1454
|
+
root { |root_window|
|
1455
|
+
title 'Hello, Toplevel!'
|
1456
|
+
|
1457
|
+
button {
|
1458
|
+
text 'Nested Window'
|
1459
|
+
|
1460
|
+
on('command') do
|
1461
|
+
toplevel(root_window) {
|
1462
|
+
title 'Custom Window'
|
1463
|
+
escapable true
|
1464
|
+
x 150
|
1465
|
+
y 180
|
1466
|
+
width 500
|
1467
|
+
height 200
|
1468
|
+
minsize 500, 100
|
1469
|
+
maxsize 1000, 300
|
1470
|
+
|
1471
|
+
toplevel_content
|
1472
|
+
}
|
1473
|
+
end
|
1474
|
+
}
|
1475
|
+
|
1476
|
+
button {
|
1477
|
+
text 'Transparent Window'
|
1478
|
+
|
1479
|
+
on('command') do
|
1480
|
+
toplevel(root_window) {
|
1481
|
+
title 'Transparent Window'
|
1482
|
+
escapable true
|
1483
|
+
alpha 0.85
|
1484
|
+
width 250
|
1485
|
+
height 100
|
1486
|
+
resizable false, false # not resizable horizontally or vertically
|
1487
|
+
|
1488
|
+
frame {
|
1489
|
+
label {
|
1490
|
+
text "This is a transparent window\nYou can hit ESCAPE to close."
|
1491
|
+
anchor 'center'
|
1492
|
+
}
|
1493
|
+
}
|
1494
|
+
}
|
1495
|
+
end
|
1496
|
+
}
|
1497
|
+
|
1498
|
+
button {
|
1499
|
+
text 'Fullscreen Window'
|
1500
|
+
|
1501
|
+
on('command') do
|
1502
|
+
toplevel(root_window) {
|
1503
|
+
title 'Fullscreen Window'
|
1504
|
+
escapable true
|
1505
|
+
fullscreen true
|
1506
|
+
|
1507
|
+
frame {
|
1508
|
+
label {
|
1509
|
+
text "This is a fullscreen window\nYou can hit ESCAPE to close."
|
1510
|
+
anchor 'center'
|
1511
|
+
}
|
1512
|
+
}
|
1513
|
+
}
|
1514
|
+
end
|
1515
|
+
}
|
1516
|
+
|
1517
|
+
if OS.mac?
|
1518
|
+
# Mac has special support for mac styles in Tk `toplevel`
|
1519
|
+
# `mac_style` first argument (`mac_class`) and second argument (`mac_attribute_list`) can be chosen from this page: https://wiki.tcl-lang.org/page/MacWindowStyle
|
1520
|
+
|
1521
|
+
button {
|
1522
|
+
text 'Mac Plain (No-Button-Modeless) Window'
|
1523
|
+
|
1524
|
+
on('command') do
|
1525
|
+
toplevel(root_window) { |t|
|
1526
|
+
title 'Mac Plain (No-Button-Modeless) Window'
|
1527
|
+
escapable true
|
1528
|
+
mac_style 'plain'
|
1529
|
+
|
1530
|
+
toplevel_content
|
1531
|
+
}
|
1532
|
+
end
|
1533
|
+
}
|
1534
|
+
|
1535
|
+
button {
|
1536
|
+
text 'Mac Floating (Close-Button-Modeless) Window'
|
1537
|
+
|
1538
|
+
on('command') do
|
1539
|
+
toplevel(root_window) { |t|
|
1540
|
+
title 'Mac Floating (Close-Button-Modeless) Window'
|
1541
|
+
escapable true
|
1542
|
+
mac_style 'floating'
|
1543
|
+
|
1544
|
+
toplevel_content
|
1545
|
+
}
|
1546
|
+
end
|
1547
|
+
}
|
1548
|
+
|
1549
|
+
button {
|
1550
|
+
text 'Mac Document (All-Button-Modeless) Window'
|
1551
|
+
|
1552
|
+
on('command') do
|
1553
|
+
toplevel(root_window) { |t|
|
1554
|
+
title 'Mac Document (All-Button-Modeless) Window'
|
1555
|
+
escapable true
|
1556
|
+
mac_style 'document'
|
1557
|
+
|
1558
|
+
toplevel_content
|
1559
|
+
}
|
1560
|
+
end
|
1561
|
+
}
|
1562
|
+
|
1563
|
+
button {
|
1564
|
+
text 'Mac Utility (Close-Button-Modal) Dialog'
|
1565
|
+
|
1566
|
+
on('command') do
|
1567
|
+
toplevel(root_window) { |t|
|
1568
|
+
title 'Mac Utility (Close-Button-Modal) Dialog'
|
1569
|
+
escapable true
|
1570
|
+
mac_style 'utility'
|
1571
|
+
|
1572
|
+
toplevel_content
|
1573
|
+
}
|
1574
|
+
end
|
1575
|
+
}
|
1576
|
+
|
1577
|
+
button {
|
1578
|
+
text 'Mac Utility with Attribute List (All-Button-Modal) Dialog'
|
1579
|
+
|
1580
|
+
on('command') do
|
1581
|
+
toplevel(root_window) { |t|
|
1582
|
+
title 'Mac Utility with Attribute List (All-Button-Modal) Dialog'
|
1583
|
+
escapable true
|
1584
|
+
mac_style 'utility', 'closeBox collapseBox resizable horizontalZoom verticalZoom sideTitlebar'
|
1585
|
+
|
1586
|
+
toplevel_content
|
1587
|
+
}
|
1588
|
+
end
|
1589
|
+
}
|
1590
|
+
end
|
1591
|
+
}.open
|
1592
|
+
```
|
1593
|
+
|
1594
|
+
Run with [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
1595
|
+
|
1596
|
+
```
|
1597
|
+
ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_toplevel'"
|
1598
|
+
```
|
1599
|
+
|
1600
|
+
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
1601
|
+
|
1602
|
+
```
|
1603
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_toplevel.rb
|
1604
|
+
```
|
1605
|
+
|
1606
|
+
Glimmer app:
|
1607
|
+
|
1608
|
+
![glimmer dsl tk screenshot sample hello toplevel 1](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel.png)
|
1609
|
+
|
1610
|
+
![glimmer dsl tk screenshot sample hello toplevel 2](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel-custom-window.png)
|
1611
|
+
|
1612
|
+
![glimmer dsl tk screenshot sample hello toplevel 3](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel-transparent-window.png)
|
1613
|
+
|
1614
|
+
![glimmer dsl tk screenshot sample hello toplevel 4](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel-fullscreen-window.png)
|
1615
|
+
|
1616
|
+
![glimmer dsl tk screenshot sample hello toplevel 5](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel-mac-plain-window.png)
|
1617
|
+
|
1618
|
+
![glimmer dsl tk screenshot sample hello toplevel 6](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel-mac-floating-window.png)
|
1619
|
+
|
1620
|
+
![glimmer dsl tk screenshot sample hello toplevel 7](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel-mac-document-window.png)
|
1621
|
+
|
1622
|
+
![glimmer dsl tk screenshot sample hello toplevel 8](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel-mac-utility-window.png)
|
1623
|
+
|
1624
|
+
![glimmer dsl tk screenshot sample hello toplevel 9](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel-mac-utility-with-attribute-list-window.png)
|
1625
|
+
|
1388
1626
|
### Hello, Notebook!
|
1389
1627
|
|
1390
1628
|
Glimmer code (from [samples/hello/hello_notebook.rb](samples/hello/hello_notebook.rb)):
|
@@ -1972,28 +2210,28 @@ class HelloText
|
|
1972
2210
|
|
1973
2211
|
column_index = -1
|
1974
2212
|
|
1975
|
-
combobox {
|
2213
|
+
combobox { |cb|
|
1976
2214
|
grid row: 1, column: column_index += 1, column_weight: 1
|
1977
2215
|
readonly true
|
1978
|
-
text <=> [self, :font_family, after_write: ->(value) { @text.toggle_selection_font_format('family', value == FONT_FAMILY_PROMPT ? 'Courier New' : value) }]
|
2216
|
+
text <=> [self, :font_family, after_write: ->(value) { @text.toggle_selection_font_format('family', value == FONT_FAMILY_PROMPT ? 'Courier New' : value, focus: 100) }]
|
1979
2217
|
}
|
1980
2218
|
|
1981
2219
|
combobox {
|
1982
2220
|
grid row: 1, column: column_index += 1, column_weight: 1
|
1983
2221
|
readonly true
|
1984
|
-
text <=> [self, :font_size, after_write: ->(value) { @text.toggle_selection_font_format('size', value == FONT_SIZE_PROMPT ? 13 : value) }]
|
2222
|
+
text <=> [self, :font_size, after_write: ->(value) { @text.toggle_selection_font_format('size', value == FONT_SIZE_PROMPT ? 13 : value, focus: 100) }]
|
1985
2223
|
}
|
1986
2224
|
|
1987
2225
|
combobox {
|
1988
2226
|
grid row: 1, column: column_index += 1, column_weight: 1
|
1989
2227
|
readonly true
|
1990
|
-
text <=> [self, :foreground, after_write: ->(value) { @text.add_selection_format('foreground', value == FOREGROUND_PROMPT ? 'black' : value) }]
|
2228
|
+
text <=> [self, :foreground, after_write: ->(value) { @text.add_selection_format('foreground', value == FOREGROUND_PROMPT ? 'black' : value, focus: 100) }]
|
1991
2229
|
}
|
1992
2230
|
|
1993
2231
|
combobox {
|
1994
2232
|
grid row: 1, column: column_index += 1, column_weight: 1
|
1995
2233
|
readonly true
|
1996
|
-
text <=> [self, :background, after_write: ->(value) { @text.add_selection_format('background', value == BACKGROUND_PROMPT ? 'white' : value) }]
|
2234
|
+
text <=> [self, :background, after_write: ->(value) { @text.add_selection_format('background', value == BACKGROUND_PROMPT ? 'white' : value, focus: 100) }]
|
1997
2235
|
}
|
1998
2236
|
|
1999
2237
|
separator {
|
@@ -2149,10 +2387,6 @@ class HelloText
|
|
2149
2387
|
undo true
|
2150
2388
|
value <=> [self, :document]
|
2151
2389
|
|
2152
|
-
on('KeyPress') do |event|
|
2153
|
-
show_find_dialog if (event.keysym == 'f') && ((OS.mac? && event.state == 8) || (!OS.mac? && event.state == 4))
|
2154
|
-
end
|
2155
|
-
|
2156
2390
|
on('InsertMarkMoved') do
|
2157
2391
|
self.font_family = @text.applied_font_format_value('family')
|
2158
2392
|
self.font_size = @text.applied_font_format_value('size')
|
@@ -2165,6 +2399,10 @@ class HelloText
|
|
2165
2399
|
@justify_center_button.default = @text.applied_format_value('justify') == 'center' ? 'active' : 'normal'
|
2166
2400
|
@justify_right_button.default = @text.applied_format_value('justify') == 'right' ? 'active' : 'normal'
|
2167
2401
|
end
|
2402
|
+
|
2403
|
+
on('KeyPress') do |event|
|
2404
|
+
show_find_dialog if (event.keysym == 'f') && ((OS.mac? && event.state == 8) || (!OS.mac? && event.state == 4))
|
2405
|
+
end
|
2168
2406
|
}
|
2169
2407
|
}
|
2170
2408
|
@root.open
|
@@ -2699,6 +2937,211 @@ Glimmer app:
|
|
2699
2937
|
|
2700
2938
|
![glimmer dsl tk screenshot sample hello separator](images/glimmer-dsl-tk-screenshot-sample-hello-separator.png)
|
2701
2939
|
|
2940
|
+
### Hello, Menu Bar!
|
2941
|
+
|
2942
|
+
Glimmer code (from [samples/hello/hello_menu_bar.rb](samples/hello/hello_menu_bar.rb)):
|
2943
|
+
|
2944
|
+
```ruby
|
2945
|
+
require 'glimmer-dsl-tk'
|
2946
|
+
|
2947
|
+
include Glimmer
|
2948
|
+
|
2949
|
+
COLORS = [:white, :red, :yellow, :green, :blue, :magenta, :gray, :black]
|
2950
|
+
|
2951
|
+
Tk::Tile::Style.theme_use "classic" # this enables setting background on label just for demo purposes
|
2952
|
+
|
2953
|
+
root { |r|
|
2954
|
+
title 'Hello, Menu Bar!'
|
2955
|
+
|
2956
|
+
@label = label {
|
2957
|
+
grid row_weight: 1, column_weight: 1
|
2958
|
+
text 'Check Out The Menu Bar Above!'
|
2959
|
+
font size: 50
|
2960
|
+
anchor 'center'
|
2961
|
+
}
|
2962
|
+
|
2963
|
+
menu {
|
2964
|
+
menu(label: 'File', underline: 0) {
|
2965
|
+
menu_item(label: 'New', underline: 0) {
|
2966
|
+
accelerator 'Command+N'
|
2967
|
+
|
2968
|
+
on('command') do
|
2969
|
+
message_box(parent: r, title: 'New', message: 'New file created.')
|
2970
|
+
end
|
2971
|
+
}
|
2972
|
+
menu_item(label: 'Open...', underline: 0) {
|
2973
|
+
accelerator 'Command+O'
|
2974
|
+
|
2975
|
+
on('command') do
|
2976
|
+
message_box(parent: r, title: 'Open', message: 'Opening File...')
|
2977
|
+
end
|
2978
|
+
}
|
2979
|
+
menu(label: 'Open Recent', underline: 5) {
|
2980
|
+
menu_item(label: 'File 1') {
|
2981
|
+
on('command') do
|
2982
|
+
message_box(parent: r, title: 'File 1', message: 'File 1 Contents')
|
2983
|
+
end
|
2984
|
+
}
|
2985
|
+
menu_item(label: 'File 2') {
|
2986
|
+
on('command') do
|
2987
|
+
message_box(parent: r, title: 'File 2', message: 'File 2 Contents')
|
2988
|
+
end
|
2989
|
+
}
|
2990
|
+
}
|
2991
|
+
menu_item(:separator)
|
2992
|
+
menu_item(label: 'Exit', underline: 1) {
|
2993
|
+
on('command') do
|
2994
|
+
exit(0)
|
2995
|
+
end
|
2996
|
+
}
|
2997
|
+
}
|
2998
|
+
menu(label: 'Edit', underline: 0) {
|
2999
|
+
menu_item(label: 'Cut', underline: 2) {
|
3000
|
+
accelerator 'Command+X'
|
3001
|
+
}
|
3002
|
+
menu_item(label: 'Copy', underline: 0) {
|
3003
|
+
accelerator 'Command+C'
|
3004
|
+
}
|
3005
|
+
menu_item(label: 'Paste', underline: 0) {
|
3006
|
+
accelerator 'Command+V'
|
3007
|
+
}
|
3008
|
+
}
|
3009
|
+
menu(label: 'Options', underline: 0) {
|
3010
|
+
menu_item(:checkbutton, label: 'Enabled', underline: 0) {
|
3011
|
+
on('command') do
|
3012
|
+
@select_one_menu.children.each { |menu_item| menu_item.state = menu_item.state == 'disabled' ? 'normal' : 'disabled' }
|
3013
|
+
@select_multiple_menu.children.each { |menu_item| menu_item.state = menu_item.state == 'disabled' ? 'normal' : 'disabled' }
|
3014
|
+
end
|
3015
|
+
}
|
3016
|
+
@select_one_menu = menu(label: 'Select One', underline: 0) {
|
3017
|
+
menu_item(:radiobutton, label: 'Option 1') {
|
3018
|
+
state 'disabled'
|
3019
|
+
}
|
3020
|
+
menu_item(:radiobutton, label: 'Option 2') {
|
3021
|
+
state 'disabled'
|
3022
|
+
}
|
3023
|
+
menu_item(:radiobutton, label: 'Option 3') {
|
3024
|
+
state 'disabled'
|
3025
|
+
}
|
3026
|
+
}
|
3027
|
+
@select_multiple_menu = menu(label: 'Select Multiple', underline: 0) {
|
3028
|
+
menu_item(:checkbutton, label: 'Option 4') {
|
3029
|
+
state 'disabled'
|
3030
|
+
}
|
3031
|
+
menu_item(:checkbutton, label: 'Option 5') {
|
3032
|
+
state 'disabled'
|
3033
|
+
}
|
3034
|
+
menu_item(:checkbutton, label: 'Option 6') {
|
3035
|
+
state 'disabled'
|
3036
|
+
}
|
3037
|
+
}
|
3038
|
+
}
|
3039
|
+
menu(label: 'Format', underline: 0) {
|
3040
|
+
menu(label: 'Background Color', underline: 0) {
|
3041
|
+
COLORS.each { |color_style|
|
3042
|
+
menu_item(:radiobutton, label: color_style.to_s.split('_').map(&:capitalize).join(' ')) {
|
3043
|
+
on('command') do
|
3044
|
+
@label.background = color_style
|
3045
|
+
end
|
3046
|
+
}
|
3047
|
+
}
|
3048
|
+
}
|
3049
|
+
menu(label: 'Foreground Color', underline: 11) {
|
3050
|
+
COLORS.each { |color_style|
|
3051
|
+
menu_item(:radiobutton, label: color_style.to_s.split('_').map(&:capitalize).join(' ')) {
|
3052
|
+
on('command') do
|
3053
|
+
@label.foreground = color_style
|
3054
|
+
end
|
3055
|
+
}
|
3056
|
+
}
|
3057
|
+
}
|
3058
|
+
}
|
3059
|
+
menu(label: 'View', underline: 0) {
|
3060
|
+
menu_item(:radiobutton, label: 'Small', underline: 0) {
|
3061
|
+
accelerator 'Command+S'
|
3062
|
+
|
3063
|
+
on('command') do
|
3064
|
+
@label.font = {size: 25}
|
3065
|
+
end
|
3066
|
+
}
|
3067
|
+
menu_item(:radiobutton, label: 'Medium', underline: 0) {
|
3068
|
+
accelerator 'Command+M'
|
3069
|
+
selection true
|
3070
|
+
|
3071
|
+
on('command') do
|
3072
|
+
@label.font = {size: 50}
|
3073
|
+
end
|
3074
|
+
}
|
3075
|
+
menu_item(:radiobutton, label: 'Large', underline: 0) {
|
3076
|
+
accelerator 'Command+L'
|
3077
|
+
|
3078
|
+
on('command') do
|
3079
|
+
@label.font = {size: 75}
|
3080
|
+
end
|
3081
|
+
}
|
3082
|
+
}
|
3083
|
+
menu(label: 'Help', underline: 0) {
|
3084
|
+
menu_item(label: 'Manual', underline: 0) {
|
3085
|
+
accelerator 'Command+Shift+M'
|
3086
|
+
|
3087
|
+
on('command') do
|
3088
|
+
message_box(parent: r, title: 'Manual', message: 'Manual Contents')
|
3089
|
+
end
|
3090
|
+
}
|
3091
|
+
menu_item(label: 'Tutorial', underline: 0) {
|
3092
|
+
accelerator 'Command+Shift+T'
|
3093
|
+
|
3094
|
+
on('command') do
|
3095
|
+
message_box(parent: r, title: 'Tutorial', message: 'Tutorial Contents')
|
3096
|
+
end
|
3097
|
+
}
|
3098
|
+
menu_item(:separator)
|
3099
|
+
menu_item(label: 'Report an Issue...', underline: 0) {
|
3100
|
+
on('command') do
|
3101
|
+
message_box(parent: r, title: 'Report an Issue', message: 'Reporting an issue...')
|
3102
|
+
end
|
3103
|
+
}
|
3104
|
+
}
|
3105
|
+
}
|
3106
|
+
}.open
|
3107
|
+
```
|
3108
|
+
|
3109
|
+
Run with [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
3110
|
+
|
3111
|
+
```
|
3112
|
+
ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_menu_bar'"
|
3113
|
+
```
|
3114
|
+
|
3115
|
+
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
3116
|
+
|
3117
|
+
```
|
3118
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_menu_bar.rb
|
3119
|
+
```
|
3120
|
+
|
3121
|
+
Glimmer app:
|
3122
|
+
|
3123
|
+
![glimmer dsl tk screenshot sample hello menu-bar](images/glimmer-dsl-tk-screenshot-sample-hello-menu-bar.png)
|
3124
|
+
|
3125
|
+
![glimmer dsl tk screenshot sample hello menu-bar](images/glimmer-dsl-tk-screenshot-sample-hello-menu-bar-application.png)
|
3126
|
+
|
3127
|
+
![glimmer dsl tk screenshot sample hello menu-bar](images/glimmer-dsl-tk-screenshot-sample-hello-menu-bar-file.png)
|
3128
|
+
|
3129
|
+
![glimmer dsl tk screenshot sample hello menu-bar](images/glimmer-dsl-tk-screenshot-sample-hello-menu-bar-edit.png)
|
3130
|
+
|
3131
|
+
![glimmer dsl tk screenshot sample hello menu-bar](images/glimmer-dsl-tk-screenshot-sample-hello-menu-bar-options.png)
|
3132
|
+
|
3133
|
+
![glimmer dsl tk screenshot sample hello menu-bar](images/glimmer-dsl-tk-screenshot-sample-hello-menu-bar-language.png)
|
3134
|
+
|
3135
|
+
![glimmer dsl tk screenshot sample hello menu-bar](images/glimmer-dsl-tk-screenshot-sample-hello-menu-bar-language-name.png)
|
3136
|
+
|
3137
|
+
![glimmer dsl tk screenshot sample hello menu-bar](images/glimmer-dsl-tk-screenshot-sample-hello-menu-bar-window.png)
|
3138
|
+
|
3139
|
+
![glimmer dsl tk screenshot sample hello menu-bar](images/glimmer-dsl-tk-screenshot-sample-hello-menu-bar-format.png)
|
3140
|
+
|
3141
|
+
![glimmer dsl tk screenshot sample hello menu-bar](images/glimmer-dsl-tk-screenshot-sample-hello-menu-bar-view.png)
|
3142
|
+
|
3143
|
+
![glimmer dsl tk screenshot sample hello menu-bar](images/glimmer-dsl-tk-screenshot-sample-hello-menu-bar-help.png)
|
3144
|
+
|
2702
3145
|
## Applications
|
2703
3146
|
|
2704
3147
|
### Glimmer Tk Calculator
|
@@ -2717,9 +3160,17 @@ https://github.com/ancorgs/y3network-ruby-ui
|
|
2717
3160
|
|
2718
3161
|
This is a Graphical User Interface for the famous [cryptopunks Ruby gem](https://github.com/cryptopunksnotdead/cryptopunks/tree/master/cryptopunks).
|
2719
3162
|
|
2720
|
-
https://github.com/
|
3163
|
+
https://github.com/cryptopunksnotdead/cryptopunks-gui
|
3164
|
+
|
3165
|
+
![CryptoPunks GUI Screenshot](https://raw.githubusercontent.com/cryptopunksnotdead/cryptopunks-gui/master/screenshots/cryptopunks-gui-screenshot.png)
|
3166
|
+
|
3167
|
+
### Circule
|
3168
|
+
|
3169
|
+
Generate an icon of overlapping circles derived from a hash.
|
3170
|
+
|
3171
|
+
https://gitlab.com/fjc/circule
|
2721
3172
|
|
2722
|
-
|
3173
|
+
[Demo Video](https://gitlab.com/fjc/circule/-/raw/master/circule-demo.mp4)
|
2723
3174
|
|
2724
3175
|
## Process
|
2725
3176
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.39
|
data/glimmer-dsl-tk.gemspec
CHANGED
Binary file
|
@@ -33,7 +33,7 @@ module Glimmer
|
|
33
33
|
|
34
34
|
def can_interpret?(parent, keyword, *args, &block)
|
35
35
|
!EXCLUDED_KEYWORDS.include?(keyword) and
|
36
|
-
Glimmer::Tk::WidgetProxy.widget_exists?(keyword)
|
36
|
+
Glimmer::Tk::WidgetProxy.widget_exists?(keyword) and
|
37
37
|
(parent.respond_to?(:tk) or args.first.respond_to?(:tk))
|
38
38
|
end
|
39
39
|
|