glimmer-dsl-tk 0.0.32 → 0.0.36
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +33 -0
- data/README.md +347 -51
- data/VERSION +1 -1
- data/bin/girb_runner.rb +1 -1
- data/glimmer-dsl-tk.gemspec +0 -0
- data/lib/glimmer/dsl/tk/widget_expression.rb +1 -1
- data/lib/glimmer/tk/entry_proxy.rb +1 -1
- data/lib/glimmer/tk/root_proxy.rb +1 -0
- data/lib/glimmer/tk/text_proxy.rb +117 -33
- data/lib/glimmer/tk/toplevel_proxy.rb +24 -0
- data/lib/glimmer/tk/widget_proxy.rb +8 -2
- data/samples/elaborate/meta_sample.rb +1 -1
- data/samples/hello/hello_checkbutton.rb +1 -1
- data/samples/hello/hello_text.rb +47 -38
- data/samples/hello/hello_toplevel.rb +178 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 808f3c088481b9a8feedbccfcab17a2b37046493141bcce5677871f90e28046e
|
4
|
+
data.tar.gz: 1f433efd48c50a6b95f61cf8bae8617c44d8bbdfe9ee8b68e4c7d0bc868e5028
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e0e8067624c6493dbd33bd151b885da42e04a443ef702a65abd10578c47ae22fc12f19d114ce2c345aa9bfc57c3332fa90a6ec758b7606ad62a354363b8fa27
|
7
|
+
data.tar.gz: c29b2b44399613bd15df154ee9986807ae121fcef57ff37448014ef36cc825fe6aa80e7ae28cee02d77cbdf15893ff82ea06390ca8e46394ccd6abffdeafb21a
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,38 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.0.36
|
4
|
+
|
5
|
+
- Hello, Toplevel! (Custom Window and Custom Dialog)
|
6
|
+
- Support `mac_style` attribute under `toplevel`
|
7
|
+
- Support registering multiple general event listeners on widgets (previously, later event listener registrations replaced former ones)
|
8
|
+
- Support `escapable true` property under `root` and `toplevel` to close on hitting ESCAPE button
|
9
|
+
|
10
|
+
## 0.0.35
|
11
|
+
|
12
|
+
- Improved Meta-Sample by utilizing Ruby from `RbConfig.ruby`
|
13
|
+
- Improved girb_runner.rb to be more platform independent
|
14
|
+
- Fixed `text` widget binding of standard bind events (e.g. `'KeyPress'` or `'ButtonPress'`)
|
15
|
+
- Fixed Hello, Text! issue with not being able to bring up Find Dialog once all text is deleted and new text is entered
|
16
|
+
- Fixed undo/redo issue
|
17
|
+
|
18
|
+
## 0.0.34
|
19
|
+
|
20
|
+
- When applying a `text` selection format without having a selection, have it apply to current insert mark word
|
21
|
+
- Support registering multiple general event listeners on `text` widget (previously, later event listener registrations replaced former ones)
|
22
|
+
- Implement `:no_selection_default` option of `:insert_word`, `insert_letter`, or `none` for `text` selection formatting methods (`add_selection_format`, `remove_selection_format`, `toggle_selection_format`, `add_selection_font_format`, `remove_selection_font_format`, `toggle_selection_font_format`)
|
23
|
+
- Make sure to only allow `text` undo/redo when there are changes to be undoed/redoed
|
24
|
+
- Fix issue with Hello, Text! Find Dialog not coming up with keyboard shortcut (e.g. CMD+F) anymore
|
25
|
+
- Fix issue with Hello, Text! whereby after applying background, and foreground to a selection, you cannot apply bold, italic, or underline for the same selection (or font-size or font-family)
|
26
|
+
|
27
|
+
## 0.0.33
|
28
|
+
|
29
|
+
- Support `text` widget `InsertMarkMoved` listener event to track insert mark movement (or aliases `InsertMarkMove`, `insert_mark_move`, `insert_mark_moved`, all case-insensitive)
|
30
|
+
- Support `entry` widget `changed` and `modified` listener event aliases for `change` event
|
31
|
+
- Autodiscover format options when moving cursor in `text` widget (auto-derive from applied tags and widget font) and show in top Hello, Text! toolbar comboboxes and buttons
|
32
|
+
- Fix issue with encountering error 'NoMethodError: undefined method "size" for' when launching Hello, Text!, performing Select-All (CMD+A or CONTROL+A) and then attempting to Bold all the text.
|
33
|
+
- Fix issue in Hello, Text! whereby bolding a small region of text affects the font of the following region of text till the end of the document
|
34
|
+
- Fix issue in Hello, Text! where if all text is copied and then pasted multiple times, the `text` widget loses its keyboard/mouse listeners and CMD+F does not work anymore to bring Find dialog
|
35
|
+
|
3
36
|
## 0.0.32
|
4
37
|
|
5
38
|
- Hello, Text! Find Dialog toolbar button
|
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.36
|
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)
|
@@ -55,8 +55,9 @@ NOTE: Glimmer DSL for Tk is currently in early alpha mode (incomplete). Please h
|
|
55
55
|
|
56
56
|
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
|
-
- [glimmer-dsl-libui](https://github.com/AndyObtiva/glimmer-dsl-libui): Glimmer DSL for LibUI (Prerequisite-Free Ruby Desktop Development GUI Library)
|
59
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
|
+
- [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
61
|
- [glimmer-dsl-xml](https://github.com/AndyObtiva/glimmer-dsl-xml): Glimmer DSL for XML (& HTML)
|
61
62
|
- [glimmer-dsl-css](https://github.com/AndyObtiva/glimmer-dsl-css): Glimmer DSL for CSS (Cascading Style Sheets)
|
62
63
|
|
@@ -83,6 +84,7 @@ Other [Glimmer](https://github.com/AndyObtiva/glimmer) DSL gems:
|
|
83
84
|
- [Notebook Frame](#notebook-frame)
|
84
85
|
- [Icon Photo](#icon-photo)
|
85
86
|
- [Root Background](#root-background)
|
87
|
+
- [Toplevel Mac Style](#toplevel-mac-style)
|
86
88
|
- [Text Defaults](#text-defaults)
|
87
89
|
- [The Grid Geometry Manager](#the-grid-geometry-manager)
|
88
90
|
- [Data-Binding](#data-binding)
|
@@ -104,6 +106,7 @@ Other [Glimmer](https://github.com/AndyObtiva/glimmer) DSL gems:
|
|
104
106
|
- [Hello, Radiobutton!](#hello-radiobutton)
|
105
107
|
- [Hello, Frame!](#hello-frame)
|
106
108
|
- [Hello, Root!](#hello-root)
|
109
|
+
- [Hello, Toplevel!](#hello-toplevel)
|
107
110
|
- [Hello, Notebook!](#hello-notebook)
|
108
111
|
- [Hello, Label!](#hello-label)
|
109
112
|
- [Hello, Message Box!](#hello-message-box)
|
@@ -158,7 +161,7 @@ gem install glimmer-dsl-tk
|
|
158
161
|
|
159
162
|
Add the following to `Gemfile`:
|
160
163
|
```
|
161
|
-
gem 'glimmer-dsl-tk', '~> 0.0.
|
164
|
+
gem 'glimmer-dsl-tk', '~> 0.0.36'
|
162
165
|
```
|
163
166
|
|
164
167
|
And, then run:
|
@@ -273,7 +276,7 @@ keyword(args) | attributes | event bindings & callbacks
|
|
273
276
|
`choose_directory(options = nil)` | None | None
|
274
277
|
`choose_font(options = nil) {|font| ... }` | None | None
|
275
278
|
`combobox` | `state`, `text` | `'ComboboxSelected'`
|
276
|
-
`entry` | `width`, `text`, `validate`, `show` (`'none', 'focus', 'focusin', 'focusout', 'key', or 'all'`) | `'validate'`, `'invalid'`, `'change'
|
279
|
+
`entry` | `width`, `text`, `validate`, `show` (`'none', 'focus', 'focusin', 'focusout', 'key', or 'all'`) | `'validate'`, `'invalid'`, `'change'` (alias: `'changed'`), `validatecommand {}`, `invalidcommand {}`
|
277
280
|
`get_multiple_open_file(options = nil)` | None | None
|
278
281
|
`get_open_file(options = nil)` | None | None
|
279
282
|
`get_save_file(options = nil)` | None | None
|
@@ -286,7 +289,7 @@ keyword(args) | attributes | event bindings & callbacks
|
|
286
289
|
`radiobutton` | `text`, `variable` (Boolean), `image` (optional keyword args: `subsample`, `zoom`, `from`, `to`, `shrink`, `compositingrule`), `compound` (`'center', 'top', 'bottom', 'left', 'right'`), `value` (default: `text`) | `command {}`
|
287
290
|
`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'`
|
288
291
|
`separator` | `orient` (`'horizontal' (default) or 'vertical'`) | None
|
289
|
-
`text` | `value`, [many more attributes](https://tcl.tk/man/tcl8.6/TkCmd/text.htm#M116) | `'modified'`, `'selection'`
|
292
|
+
`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'`)
|
290
293
|
|
291
294
|
Options for `get_open_file` and `get_multiple_open_file` include:
|
292
295
|
- `filetypes`: `Hash` of `'Group Name' => '.ext'` entries (e.g. `filetypes: {'PNG Images' => '.png'}`
|
@@ -349,15 +352,20 @@ The `text` widget is enhanced by [Glimmer DSL for Tk](https://rubygems.org/gems/
|
|
349
352
|
- `add_font_format(region_start, region_end, font_option, value)`
|
350
353
|
- `remove_font_format(region_start, region_end, font_option, value)`
|
351
354
|
- `toggle_font_format(region_start, region_end, font_option, value)`
|
352
|
-
- `add_selection_format(
|
353
|
-
- `remove_selection_format(
|
354
|
-
- `toggle_selection_format(
|
355
|
-
- `add_selection_font_format(
|
356
|
-
- `remove_selection_font_format(
|
357
|
-
- `toggle_selection_font_format(
|
355
|
+
- `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.
|
356
|
+
- `remove_selection_format(option, value, no_selection_default: :insert_word)`
|
357
|
+
- `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.
|
358
|
+
- `add_selection_font_format(font_option, value, no_selection_default: :insert_word)`
|
359
|
+
- `remove_selection_font_format(font_option, value, no_selection_default: :insert_word)`
|
360
|
+
- `toggle_selection_font_format(font_option, value, no_selection_default: :insert_word)`
|
358
361
|
- `text#insert_image(text_index, *image_args)`: inserts image into `text` `value` content at `text_index` location (e.g. `'insert'`)
|
359
362
|
- `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
|
360
363
|
|
364
|
+
The `:no_selection_default` keyword arg to `*_selection_*` methods determines what region to cover when no explicit selection is set:
|
365
|
+
- `:insert_word`: current word for insert mark
|
366
|
+
- `:insert_letter`: current letter for insert mark
|
367
|
+
- `:none`: no behavior when no selection is in place
|
368
|
+
|
361
369
|
Available options:
|
362
370
|
|
363
371
|
- `background`
|
@@ -473,6 +481,20 @@ root {
|
|
473
481
|
|
474
482
|
`root` `background` color attribute is automatically set to `'#ececec'` on the Mac to avoid having a non-native-looking light-colored background.
|
475
483
|
|
484
|
+
#### Toplevel Mac Style
|
485
|
+
|
486
|
+
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:
|
487
|
+
|
488
|
+
https://wiki.tcl-lang.org/page/MacWindowStyle
|
489
|
+
|
490
|
+
Behind the scenes, `mac_style` automatically calls out to:
|
491
|
+
|
492
|
+
```ruby
|
493
|
+
Tk.tk_call("::tk::unsupported::MacWindowStyle", "style", tk_toplevel_widget, mac_class, mac_attribute_list)
|
494
|
+
```
|
495
|
+
|
496
|
+
More details can be found at the [Hello, Toplevel!](#hello-toplevel) sample.
|
497
|
+
|
476
498
|
#### Text Defaults
|
477
499
|
|
478
500
|
`text` widget has these defaults:
|
@@ -1327,7 +1349,7 @@ Glimmer app:
|
|
1327
1349
|
|
1328
1350
|
### Hello, Root!
|
1329
1351
|
|
1330
|
-
Glimmer code (from [samples/hello/
|
1352
|
+
Glimmer code (from [samples/hello/hello_root.rb](samples/hello/hello_root.rb)):
|
1331
1353
|
|
1332
1354
|
```ruby
|
1333
1355
|
require 'glimmer-dsl-tk'
|
@@ -1379,6 +1401,208 @@ Glimmer app:
|
|
1379
1401
|
|
1380
1402
|
![glimmer dsl tk screenshot sample hello root bye](images/glimmer-dsl-tk-screenshot-sample-hello-root-bye.png)
|
1381
1403
|
|
1404
|
+
### Hello, Toplevel!
|
1405
|
+
|
1406
|
+
`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).
|
1407
|
+
|
1408
|
+
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:
|
1409
|
+
|
1410
|
+
https://wiki.tcl-lang.org/page/MacWindowStyle
|
1411
|
+
|
1412
|
+
Glimmer code (from [samples/hello/hello_toplevel.rb](samples/hello/hello_toplevel.rb)):
|
1413
|
+
|
1414
|
+
```ruby
|
1415
|
+
require 'glimmer-dsl-tk'
|
1416
|
+
|
1417
|
+
include Glimmer
|
1418
|
+
|
1419
|
+
def toplevel_content
|
1420
|
+
frame {
|
1421
|
+
label {
|
1422
|
+
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."
|
1423
|
+
}
|
1424
|
+
separator
|
1425
|
+
checkbutton {
|
1426
|
+
text 'This is a checkbutton'
|
1427
|
+
}
|
1428
|
+
radiobutton {
|
1429
|
+
text 'This is a radiobutton'
|
1430
|
+
}
|
1431
|
+
}
|
1432
|
+
end
|
1433
|
+
|
1434
|
+
root { |root_window|
|
1435
|
+
title 'Hello, Toplevel!'
|
1436
|
+
|
1437
|
+
button {
|
1438
|
+
text 'Nested Window'
|
1439
|
+
|
1440
|
+
on('command') do
|
1441
|
+
toplevel(root_window) {
|
1442
|
+
title 'Custom Window'
|
1443
|
+
escapable true
|
1444
|
+
x 150
|
1445
|
+
y 180
|
1446
|
+
width 500
|
1447
|
+
height 200
|
1448
|
+
minsize 500, 100
|
1449
|
+
maxsize 1000, 300
|
1450
|
+
|
1451
|
+
toplevel_content
|
1452
|
+
}
|
1453
|
+
end
|
1454
|
+
}
|
1455
|
+
|
1456
|
+
button {
|
1457
|
+
text 'Transparent Window'
|
1458
|
+
|
1459
|
+
on('command') do
|
1460
|
+
toplevel(root_window) {
|
1461
|
+
title 'Transparent Window'
|
1462
|
+
escapable true
|
1463
|
+
alpha 0.85
|
1464
|
+
width 250
|
1465
|
+
height 100
|
1466
|
+
resizable false, false # not resizable horizontally or vertically
|
1467
|
+
|
1468
|
+
frame {
|
1469
|
+
label {
|
1470
|
+
text "This is a transparent window\nYou can hit ESCAPE to close."
|
1471
|
+
anchor 'center'
|
1472
|
+
}
|
1473
|
+
}
|
1474
|
+
}
|
1475
|
+
end
|
1476
|
+
}
|
1477
|
+
|
1478
|
+
button {
|
1479
|
+
text 'Fullscreen Window'
|
1480
|
+
|
1481
|
+
on('command') do
|
1482
|
+
toplevel(root_window) {
|
1483
|
+
title 'Fullscreen Window'
|
1484
|
+
escapable true
|
1485
|
+
fullscreen true
|
1486
|
+
|
1487
|
+
frame {
|
1488
|
+
label {
|
1489
|
+
text "This is a fullscreen window\nYou can hit ESCAPE to close."
|
1490
|
+
anchor 'center'
|
1491
|
+
}
|
1492
|
+
}
|
1493
|
+
}
|
1494
|
+
end
|
1495
|
+
}
|
1496
|
+
|
1497
|
+
if OS.mac?
|
1498
|
+
# Mac has special support for mac styles in Tk `toplevel`
|
1499
|
+
# `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
|
1500
|
+
|
1501
|
+
button {
|
1502
|
+
text 'Mac Plain (No-Button-Modeless) Window'
|
1503
|
+
|
1504
|
+
on('command') do
|
1505
|
+
toplevel(root_window) { |t|
|
1506
|
+
title 'Mac Plain (No-Button-Modeless) Window'
|
1507
|
+
escapable true
|
1508
|
+
mac_style 'plain'
|
1509
|
+
|
1510
|
+
toplevel_content
|
1511
|
+
}
|
1512
|
+
end
|
1513
|
+
}
|
1514
|
+
|
1515
|
+
button {
|
1516
|
+
text 'Mac Floating (Close-Button-Modeless) Window'
|
1517
|
+
|
1518
|
+
on('command') do
|
1519
|
+
toplevel(root_window) { |t|
|
1520
|
+
title 'Mac Floating (Close-Button-Modeless) Window'
|
1521
|
+
escapable true
|
1522
|
+
mac_style 'floating'
|
1523
|
+
|
1524
|
+
toplevel_content
|
1525
|
+
}
|
1526
|
+
end
|
1527
|
+
}
|
1528
|
+
|
1529
|
+
button {
|
1530
|
+
text 'Mac Document (All-Button-Modeless) Window'
|
1531
|
+
|
1532
|
+
on('command') do
|
1533
|
+
toplevel(root_window) { |t|
|
1534
|
+
title 'Mac Document (All-Button-Modeless) Window'
|
1535
|
+
escapable true
|
1536
|
+
mac_style 'document'
|
1537
|
+
|
1538
|
+
toplevel_content
|
1539
|
+
}
|
1540
|
+
end
|
1541
|
+
}
|
1542
|
+
|
1543
|
+
button {
|
1544
|
+
text 'Mac Utility (Close-Button-Modal) Dialog'
|
1545
|
+
|
1546
|
+
on('command') do
|
1547
|
+
toplevel(root_window) { |t|
|
1548
|
+
title 'Mac Utility (Close-Button-Modal) Dialog'
|
1549
|
+
escapable true
|
1550
|
+
mac_style 'utility'
|
1551
|
+
|
1552
|
+
toplevel_content
|
1553
|
+
}
|
1554
|
+
end
|
1555
|
+
}
|
1556
|
+
|
1557
|
+
button {
|
1558
|
+
text 'Mac Utility with Attribute List (All-Button-Modal) Dialog'
|
1559
|
+
|
1560
|
+
on('command') do
|
1561
|
+
toplevel(root_window) { |t|
|
1562
|
+
title 'Mac Utility with Attribute List (All-Button-Modal) Dialog'
|
1563
|
+
escapable true
|
1564
|
+
mac_style 'utility', 'closeBox collapseBox resizable horizontalZoom verticalZoom sideTitlebar'
|
1565
|
+
|
1566
|
+
toplevel_content
|
1567
|
+
}
|
1568
|
+
end
|
1569
|
+
}
|
1570
|
+
end
|
1571
|
+
}.open
|
1572
|
+
```
|
1573
|
+
|
1574
|
+
Run with [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
1575
|
+
|
1576
|
+
```
|
1577
|
+
ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_toplevel'"
|
1578
|
+
```
|
1579
|
+
|
1580
|
+
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
1581
|
+
|
1582
|
+
```
|
1583
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_toplevel.rb
|
1584
|
+
```
|
1585
|
+
|
1586
|
+
Glimmer app:
|
1587
|
+
|
1588
|
+
![glimmer dsl tk screenshot sample hello toplevel 1](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel.png)
|
1589
|
+
|
1590
|
+
![glimmer dsl tk screenshot sample hello toplevel 2](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel-custom-window.png)
|
1591
|
+
|
1592
|
+
![glimmer dsl tk screenshot sample hello toplevel 3](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel-transparent-window.png)
|
1593
|
+
|
1594
|
+
![glimmer dsl tk screenshot sample hello toplevel 4](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel-fullscreen-window.png)
|
1595
|
+
|
1596
|
+
![glimmer dsl tk screenshot sample hello toplevel 5](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel-mac-plain-window.png)
|
1597
|
+
|
1598
|
+
![glimmer dsl tk screenshot sample hello toplevel 6](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel-mac-floating-window.png)
|
1599
|
+
|
1600
|
+
![glimmer dsl tk screenshot sample hello toplevel 7](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel-mac-document-window.png)
|
1601
|
+
|
1602
|
+
![glimmer dsl tk screenshot sample hello toplevel 8](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel-mac-utility-window.png)
|
1603
|
+
|
1604
|
+
![glimmer dsl tk screenshot sample hello toplevel 9](images/glimmer-dsl-tk-screenshot-sample-hello-toplevel-mac-utility-with-attribute-list-window.png)
|
1605
|
+
|
1382
1606
|
### Hello, Notebook!
|
1383
1607
|
|
1384
1608
|
Glimmer code (from [samples/hello/hello_notebook.rb](samples/hello/hello_notebook.rb)):
|
@@ -1869,7 +2093,7 @@ Glimmer app:
|
|
1869
2093
|
|
1870
2094
|
### Hello, Text!
|
1871
2095
|
|
1872
|
-
You may
|
2096
|
+
You may press META+F to bring up the Find Dialog on the Mac and CONTROL+F to bring it up on Windows/Linux.
|
1873
2097
|
|
1874
2098
|
Icons used in this sample were made by <a href="https://www.flaticon.com/authors/freepik" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/" title="Flaticon"> www.flaticon.com</a>
|
1875
2099
|
|
@@ -1921,7 +2145,7 @@ class HelloText
|
|
1921
2145
|
MULTI_LINE_STRING
|
1922
2146
|
end
|
1923
2147
|
|
1924
|
-
attr_accessor :document
|
2148
|
+
attr_accessor :document, :find_text
|
1925
2149
|
|
1926
2150
|
attr_accessor :foreground
|
1927
2151
|
|
@@ -1947,8 +2171,16 @@ class HelloText
|
|
1947
2171
|
[FONT_SIZE_PROMPT] + (9..64).to_a.map(&:to_s)
|
1948
2172
|
end
|
1949
2173
|
|
2174
|
+
def find
|
2175
|
+
text_index = @text.search(/#{find_text}/i, @text.tag_ranges('sel')&.first&.last || @text.index('insert'))
|
2176
|
+
unless text_index.to_s.empty?
|
2177
|
+
@text.tag_remove('sel', '1.0', 'end')
|
2178
|
+
@text.tag_add('sel', text_index, "#{text_index} + #{find_text.size} chars")
|
2179
|
+
end
|
2180
|
+
end
|
2181
|
+
|
1950
2182
|
def launch
|
1951
|
-
root {
|
2183
|
+
@root = root {
|
1952
2184
|
title 'Hello, Text!'
|
1953
2185
|
width 1280
|
1954
2186
|
height 800
|
@@ -1956,11 +2188,6 @@ class HelloText
|
|
1956
2188
|
frame {
|
1957
2189
|
grid row: 0, column: 0
|
1958
2190
|
|
1959
|
-
label {
|
1960
|
-
grid row: 0, column: 0, columnspan: 17
|
1961
|
-
text 'Select a region of text and then apply formatting from the toolbar'
|
1962
|
-
}
|
1963
|
-
|
1964
2191
|
column_index = -1
|
1965
2192
|
|
1966
2193
|
combobox {
|
@@ -1992,7 +2219,7 @@ class HelloText
|
|
1992
2219
|
orient 'vertical'
|
1993
2220
|
}
|
1994
2221
|
|
1995
|
-
button {
|
2222
|
+
@bold_button = button {
|
1996
2223
|
grid row: 1, column: column_index += 1, column_weight: 0
|
1997
2224
|
text 'B'
|
1998
2225
|
style font: {weight: 'bold'}
|
@@ -2002,7 +2229,7 @@ class HelloText
|
|
2002
2229
|
end
|
2003
2230
|
}
|
2004
2231
|
|
2005
|
-
button {
|
2232
|
+
@italic_button = button {
|
2006
2233
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2007
2234
|
text 'I'
|
2008
2235
|
style font: {slant: 'italic'}
|
@@ -2012,7 +2239,7 @@ class HelloText
|
|
2012
2239
|
end
|
2013
2240
|
}
|
2014
2241
|
|
2015
|
-
button {
|
2242
|
+
@underline_button = button {
|
2016
2243
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2017
2244
|
text 'U'
|
2018
2245
|
style font: {underline: true}
|
@@ -2021,36 +2248,36 @@ class HelloText
|
|
2021
2248
|
@text.toggle_selection_font_format('underline', true)
|
2022
2249
|
end
|
2023
2250
|
}
|
2024
|
-
|
2251
|
+
|
2025
2252
|
separator {
|
2026
2253
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2027
2254
|
orient 'vertical'
|
2028
2255
|
}
|
2029
2256
|
|
2030
|
-
button {
|
2257
|
+
@justify_left_button = button {
|
2031
2258
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2032
|
-
image File.expand_path("images/
|
2259
|
+
image File.expand_path("images/align-left.png", __dir__), subsample: 32
|
2033
2260
|
|
2034
2261
|
on('command') do
|
2035
|
-
@text.
|
2262
|
+
@text.add_selection_format('justify', 'left')
|
2036
2263
|
end
|
2037
2264
|
}
|
2038
2265
|
|
2039
|
-
button {
|
2266
|
+
@justify_center_button = button {
|
2040
2267
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2041
|
-
image File.expand_path("images/
|
2268
|
+
image File.expand_path("images/align-center.png", __dir__), subsample: 32
|
2042
2269
|
|
2043
2270
|
on('command') do
|
2044
|
-
@text.
|
2271
|
+
@text.add_selection_format('justify', 'center')
|
2045
2272
|
end
|
2046
2273
|
}
|
2047
2274
|
|
2048
|
-
button {
|
2275
|
+
@justify_right_button = button {
|
2049
2276
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2050
|
-
image File.expand_path("images/
|
2277
|
+
image File.expand_path("images/align-right.png", __dir__), subsample: 32
|
2051
2278
|
|
2052
2279
|
on('command') do
|
2053
|
-
@text.
|
2280
|
+
@text.add_selection_format('justify', 'right')
|
2054
2281
|
end
|
2055
2282
|
}
|
2056
2283
|
|
@@ -2061,51 +2288,51 @@ class HelloText
|
|
2061
2288
|
|
2062
2289
|
button {
|
2063
2290
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2064
|
-
image File.expand_path("images/
|
2291
|
+
image File.expand_path("images/picture.png", __dir__), subsample: 32
|
2065
2292
|
|
2066
2293
|
on('command') do
|
2067
|
-
@text.
|
2294
|
+
@text.get_open_file_to_insert_image
|
2068
2295
|
end
|
2069
2296
|
}
|
2070
2297
|
|
2071
2298
|
button {
|
2072
2299
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2073
|
-
image File.expand_path("images/
|
2300
|
+
image File.expand_path("images/search.png", __dir__), subsample: 32
|
2074
2301
|
|
2075
2302
|
on('command') do
|
2076
|
-
|
2303
|
+
show_find_dialog
|
2077
2304
|
end
|
2078
2305
|
}
|
2079
2306
|
|
2307
|
+
separator {
|
2308
|
+
grid row: 1, column: column_index += 1, column_weight: 0
|
2309
|
+
orient 'vertical'
|
2310
|
+
}
|
2311
|
+
|
2080
2312
|
button {
|
2081
2313
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2082
|
-
image File.expand_path("images/
|
2314
|
+
image File.expand_path("images/cut.png", __dir__), subsample: 32
|
2083
2315
|
|
2084
2316
|
on('command') do
|
2085
|
-
@text.
|
2317
|
+
@text.text_cut
|
2086
2318
|
end
|
2087
2319
|
}
|
2088
2320
|
|
2089
|
-
separator {
|
2090
|
-
grid row: 1, column: column_index += 1, column_weight: 0
|
2091
|
-
orient 'vertical'
|
2092
|
-
}
|
2093
|
-
|
2094
2321
|
button {
|
2095
2322
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2096
|
-
image File.expand_path("images/
|
2323
|
+
image File.expand_path("images/copy.png", __dir__), subsample: 32
|
2097
2324
|
|
2098
2325
|
on('command') do
|
2099
|
-
@text.
|
2326
|
+
@text.text_copy
|
2100
2327
|
end
|
2101
2328
|
}
|
2102
2329
|
|
2103
2330
|
button {
|
2104
2331
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2105
|
-
image File.expand_path("images/
|
2332
|
+
image File.expand_path("images/paste.png", __dir__), subsample: 32
|
2106
2333
|
|
2107
2334
|
on('command') do
|
2108
|
-
@text.
|
2335
|
+
@text.text_paste
|
2109
2336
|
end
|
2110
2337
|
}
|
2111
2338
|
|
@@ -2114,12 +2341,22 @@ class HelloText
|
|
2114
2341
|
orient 'vertical'
|
2115
2342
|
}
|
2116
2343
|
|
2344
|
+
|
2117
2345
|
button {
|
2118
2346
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2119
|
-
image File.expand_path("images/
|
2347
|
+
image File.expand_path("images/undo.png", __dir__), subsample: 32
|
2120
2348
|
|
2121
2349
|
on('command') do
|
2122
|
-
@text.
|
2350
|
+
@text.edit_undo
|
2351
|
+
end
|
2352
|
+
}
|
2353
|
+
|
2354
|
+
button {
|
2355
|
+
grid row: 1, column: column_index += 1, column_weight: 0
|
2356
|
+
image File.expand_path("images/redo.png", __dir__), subsample: 32
|
2357
|
+
|
2358
|
+
on('command') do
|
2359
|
+
@text.edit_redo
|
2123
2360
|
end
|
2124
2361
|
}
|
2125
2362
|
}
|
@@ -2129,8 +2366,67 @@ class HelloText
|
|
2129
2366
|
wrap 'word'
|
2130
2367
|
undo true
|
2131
2368
|
value <=> [self, :document]
|
2369
|
+
|
2370
|
+
on('KeyPress') do |event|
|
2371
|
+
show_find_dialog if (event.keysym == 'f') && ((OS.mac? && event.state == 8) || (!OS.mac? && event.state == 4))
|
2372
|
+
end
|
2373
|
+
|
2374
|
+
on('InsertMarkMoved') do
|
2375
|
+
self.font_family = @text.applied_font_format_value('family')
|
2376
|
+
self.font_size = @text.applied_font_format_value('size')
|
2377
|
+
@bold_button.default = @text.applied_font_format_value('weight') == 'bold' ? 'active' : 'normal'
|
2378
|
+
@italic_button.default = @text.applied_font_format_value('slant') == 'italic' ? 'active' : 'normal'
|
2379
|
+
@underline_button.default = @text.applied_font_format_value('underline') == true ? 'active' : 'normal'
|
2380
|
+
self.background = @text.applied_format_value('background')
|
2381
|
+
self.foreground = @text.applied_format_value('foreground')
|
2382
|
+
@justify_left_button.default = @text.applied_format_value('justify') == 'left' ? 'active' : 'normal'
|
2383
|
+
@justify_center_button.default = @text.applied_format_value('justify') == 'center' ? 'active' : 'normal'
|
2384
|
+
@justify_right_button.default = @text.applied_format_value('justify') == 'right' ? 'active' : 'normal'
|
2385
|
+
end
|
2132
2386
|
}
|
2133
|
-
}
|
2387
|
+
}
|
2388
|
+
@root.open
|
2389
|
+
end
|
2390
|
+
|
2391
|
+
def show_find_dialog
|
2392
|
+
toplevel(@root) { |tl|
|
2393
|
+
title 'Find'
|
2394
|
+
|
2395
|
+
label {
|
2396
|
+
text 'Text:'
|
2397
|
+
}
|
2398
|
+
entry { |e|
|
2399
|
+
focus true
|
2400
|
+
text <=> [
|
2401
|
+
self,
|
2402
|
+
:find_text,
|
2403
|
+
after_write: lambda do
|
2404
|
+
text_index = @text.search(/#{find_text}/i, 'insert')
|
2405
|
+
unless text_index.to_s.empty?
|
2406
|
+
@text.tag_remove('sel', '1.0', 'end')
|
2407
|
+
@text.tag_add('sel', text_index, "#{text_index} + #{find_text.size} chars")
|
2408
|
+
end
|
2409
|
+
end
|
2410
|
+
]
|
2411
|
+
|
2412
|
+
on('KeyPress') do |event|
|
2413
|
+
if event.keysym == 'Return'
|
2414
|
+
find
|
2415
|
+
elsif event.keysym == 'Escape'
|
2416
|
+
tl.grab_release
|
2417
|
+
tl.destroy
|
2418
|
+
end
|
2419
|
+
end
|
2420
|
+
}
|
2421
|
+
button {
|
2422
|
+
text 'Find'
|
2423
|
+
default 'active'
|
2424
|
+
|
2425
|
+
on('command') do
|
2426
|
+
find
|
2427
|
+
end
|
2428
|
+
}
|
2429
|
+
}
|
2134
2430
|
end
|
2135
2431
|
end
|
2136
2432
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.36
|
data/bin/girb_runner.rb
CHANGED
@@ -27,7 +27,7 @@ require_relative '../lib/glimmer-dsl-tk'
|
|
27
27
|
|
28
28
|
include Glimmer
|
29
29
|
|
30
|
-
GIRB_RUNNER_EXIT_FILE = "#{
|
30
|
+
GIRB_RUNNER_EXIT_FILE = "#{Dir.home}/.girb_runner_exit"
|
31
31
|
FileUtils.rm_rf GIRB_RUNNER_EXIT_FILE
|
32
32
|
|
33
33
|
@exit_method = method(:exit)
|
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
|
|