glimmer-dsl-tk 0.0.23 → 0.0.24
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +206 -18
- data/VERSION +1 -1
- data/glimmer-dsl-tk.gemspec +0 -0
- data/lib/glimmer/tk/entry_proxy.rb +17 -0
- data/lib/glimmer/tk/widget_proxy.rb +32 -17
- data/lib/glimmer-dsl-tk.rb +1 -0
- data/samples/hello/hello_entry.rb +104 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 406613fff26324b7f91ddbaea11f01f90241b883f99a7732beb27a097eaae24d
|
4
|
+
data.tar.gz: d2e0828831b9cb7a6b017be648253972ad1cb8e8c48fa20046e6a3bd4b0b59f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ba903e6e9d4e611e7c7f17c94f902a6a33945e07ab46136c30003ad5189b707a6485ab4f7c472503699ead75119b20d237e9bda1484f32373354dc74ba8e90a
|
7
|
+
data.tar.gz: c4d5f2c7f8338e3fdfc0452e97d7f0498b7b2ded75a586272f11cfadc61b71ee6db197d2b76441d2c2f925914ff61e6577d8fef36c106426267bd7a23c3d3d5f
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.0.24
|
4
|
+
|
5
|
+
- Hello, Entry!
|
6
|
+
- Update `entry` data-binding logic to trace 'write' changes to `entry` `textvariable` as that is more correct than monitoring `validatecommand`
|
7
|
+
- Support `entry` `validate` (alias for `validatecommand`), `invalid` (alias for `invalidcommand`), and `change` event bindings
|
8
|
+
- Support `entry` `show` and `validate` attributes
|
9
|
+
- Support `grid` options `row_weight` (for row expansion), `column_weight` (for column expansion), `row_minsize` (alias: `min_height`), and `column_minsize` (alias: `min_width`)
|
10
|
+
|
3
11
|
## 0.0.23
|
4
12
|
|
5
13
|
- Hello, Radiobutton!
|
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.24
|
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)
|
@@ -105,6 +105,7 @@ Other [Glimmer](https://github.com/AndyObtiva/glimmer) DSL gems:
|
|
105
105
|
- [Hello, Combobox!](#hello-combobox)
|
106
106
|
- [Hello, List Single Selection!](#hello-list-single-selection)
|
107
107
|
- [Hello, List Multi Selection!](#hello-list-multi-selection)
|
108
|
+
- [Hello, Entry!](#hello-entry)
|
108
109
|
- [Hello, Computed!](#hello-computed)
|
109
110
|
- [Help](#help)
|
110
111
|
- [Issues](#issues)
|
@@ -142,7 +143,7 @@ gem install glimmer-dsl-tk
|
|
142
143
|
|
143
144
|
Add the following to `Gemfile`:
|
144
145
|
```
|
145
|
-
gem 'glimmer-dsl-tk', '~> 0.0.
|
146
|
+
gem 'glimmer-dsl-tk', '~> 0.0.24'
|
146
147
|
```
|
147
148
|
|
148
149
|
And, then run:
|
@@ -254,7 +255,7 @@ keyword(args) | attributes | event bindings & callbacks
|
|
254
255
|
`button` | `text`, `image` (optional keyword args: `subsample`, `zoom`, `from`, `to`, `shrink`, `compositingrule`), `compound` (`'center', 'top', 'bottom', 'left', 'right'`), `default` (`'active', 'normal'`) | `command {}`
|
255
256
|
`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
257
|
`combobox` | `state`, `text` | `'ComboboxSelected'`
|
257
|
-
`entry` | `width`, `text` |
|
258
|
+
`entry` | `width`, `text`, `validate`, `show` (`'none', 'focus', 'focusin', 'focusout', 'key', or 'all'`) | `'validate'`, `'invalid'`, `'change'`, `validatecommand {}`, `invalidcommand {}`
|
258
259
|
`frame(text: nil)` | `width`, `height`, `borderwidth`, `relief` (`'flat' (default), 'raised', 'sunken', 'solid', 'ridge', 'groove'`) | None
|
259
260
|
`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
|
260
261
|
`list` | `selectmode`, `selection` | None
|
@@ -315,7 +316,7 @@ keyword(args) | attributes | event bindings & callbacks
|
|
315
316
|
|
316
317
|
#### Event Bindings
|
317
318
|
|
318
|
-
Any events that normally can be accepted by the Tk `bind` or `protocol` methods can be accepted by the `on(event) {}` listener syntax.
|
319
|
+
Any events that normally can be accepted by the Tk `bind` or `protocol` methods can be accepted by the `on(event) {}` listener syntax. For actual (non-virtual) events, 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
320
|
|
320
321
|
#### Grid Layout
|
321
322
|
|
@@ -474,7 +475,7 @@ That code binds the `textvariable` value of the `entry` to the `country` attribu
|
|
474
475
|
|
475
476
|
It automatically handles all the Tk plumbing behind the scenes.
|
476
477
|
|
477
|
-
More details can be found in
|
478
|
+
More details can be found in [Hello, Entry!](#hello-entry) and [Hello, Computed!](#hello-computed) samples below.
|
478
479
|
|
479
480
|
### Checkbutton Data-Binding
|
480
481
|
|
@@ -573,7 +574,7 @@ ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_world'"
|
|
573
574
|
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
574
575
|
|
575
576
|
```
|
576
|
-
ruby -r ./lib/glimmer-dsl-tk.rb
|
577
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_world.rb
|
577
578
|
```
|
578
579
|
|
579
580
|
Glimmer app:
|
@@ -672,7 +673,7 @@ ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_button'"
|
|
672
673
|
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
673
674
|
|
674
675
|
```
|
675
|
-
ruby -r ./lib/glimmer-dsl-tk.rb
|
676
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_button.rb
|
676
677
|
```
|
677
678
|
|
678
679
|
Glimmer app:
|
@@ -805,7 +806,7 @@ ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_checkbutton'"
|
|
805
806
|
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
806
807
|
|
807
808
|
```
|
808
|
-
ruby -r ./lib/glimmer-dsl-tk.rb
|
809
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_checkbutton.rb
|
809
810
|
```
|
810
811
|
|
811
812
|
Glimmer app:
|
@@ -919,7 +920,7 @@ ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_radiobutton'"
|
|
919
920
|
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
920
921
|
|
921
922
|
```
|
922
|
-
ruby -r ./lib/glimmer-dsl-tk.rb
|
923
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_radiobutton.rb
|
923
924
|
```
|
924
925
|
|
925
926
|
Glimmer app:
|
@@ -992,7 +993,7 @@ ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_frame'"
|
|
992
993
|
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
993
994
|
|
994
995
|
```
|
995
|
-
ruby -r ./lib/glimmer-dsl-tk.rb
|
996
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_frame.rb
|
996
997
|
```
|
997
998
|
|
998
999
|
Glimmer app:
|
@@ -1042,7 +1043,7 @@ ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_root'"
|
|
1042
1043
|
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
1043
1044
|
|
1044
1045
|
```
|
1045
|
-
ruby -r ./lib/glimmer-dsl-tk.rb
|
1046
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_root.rb
|
1046
1047
|
```
|
1047
1048
|
|
1048
1049
|
Glimmer app:
|
@@ -1096,7 +1097,7 @@ ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_notebook'"
|
|
1096
1097
|
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
1097
1098
|
|
1098
1099
|
```
|
1099
|
-
ruby -r ./lib/glimmer-dsl-tk.rb
|
1100
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_notebook.rb
|
1100
1101
|
```
|
1101
1102
|
|
1102
1103
|
Glimmer app:
|
@@ -1209,7 +1210,7 @@ ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_label'"
|
|
1209
1210
|
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
1210
1211
|
|
1211
1212
|
```
|
1212
|
-
ruby -r ./lib/glimmer-dsl-tk.rb
|
1213
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_label.rb
|
1213
1214
|
```
|
1214
1215
|
|
1215
1216
|
Glimmer app:
|
@@ -1311,7 +1312,7 @@ ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_message_box'"
|
|
1311
1312
|
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
1312
1313
|
|
1313
1314
|
```
|
1314
|
-
ruby -r ./lib/glimmer-dsl-tk.rb
|
1315
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_message_box.rb
|
1315
1316
|
```
|
1316
1317
|
|
1317
1318
|
Glimmer app:
|
@@ -1352,7 +1353,7 @@ ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_combobox'"
|
|
1352
1353
|
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
1353
1354
|
|
1354
1355
|
```
|
1355
|
-
ruby -r ./lib/glimmer-dsl-tk.rb
|
1356
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_combobox.rb
|
1356
1357
|
```
|
1357
1358
|
|
1358
1359
|
Glimmer app:
|
@@ -1392,7 +1393,7 @@ ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_list_single_selection'"
|
|
1392
1393
|
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
1393
1394
|
|
1394
1395
|
```
|
1395
|
-
ruby -r ./lib/glimmer-dsl-tk.rb
|
1396
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_list_single_selection.rb
|
1396
1397
|
```
|
1397
1398
|
|
1398
1399
|
Glimmer app:
|
@@ -1430,7 +1431,7 @@ ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_list_multi_selection'"
|
|
1430
1431
|
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
1431
1432
|
|
1432
1433
|
```
|
1433
|
-
ruby -r ./lib/glimmer-dsl-tk.rb
|
1434
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_list_multi_selection.rb
|
1434
1435
|
```
|
1435
1436
|
|
1436
1437
|
Glimmer app:
|
@@ -1510,7 +1511,194 @@ ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_computed'"
|
|
1510
1511
|
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
1511
1512
|
|
1512
1513
|
```
|
1513
|
-
ruby -r ./lib/glimmer-dsl-tk.rb
|
1514
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_computed.rb
|
1515
|
+
```
|
1516
|
+
|
1517
|
+
Glimmer app:
|
1518
|
+
|
1519
|
+
![glimmer dsl tk screenshot sample hello computed](images/glimmer-dsl-tk-screenshot-sample-hello-computed.png)
|
1520
|
+
|
1521
|
+
### Hello, Entry!
|
1522
|
+
|
1523
|
+
Glimmer code (from [samples/hello/hello_entry.rb](samples/hello/hello_entry.rb)):
|
1524
|
+
|
1525
|
+
```ruby
|
1526
|
+
require 'glimmer-dsl-tk'
|
1527
|
+
|
1528
|
+
class HelloEntry
|
1529
|
+
include Glimmer
|
1530
|
+
|
1531
|
+
attr_accessor :default, :password, :telephone, :read_only
|
1532
|
+
|
1533
|
+
def initialize
|
1534
|
+
self.default = 'default'
|
1535
|
+
self.password = 'password'
|
1536
|
+
self.telephone = '555-555-5555'
|
1537
|
+
self.read_only = 'Telephone area code is 555'
|
1538
|
+
end
|
1539
|
+
|
1540
|
+
def launch
|
1541
|
+
root {
|
1542
|
+
title 'Hello, Entry!'
|
1543
|
+
|
1544
|
+
label {
|
1545
|
+
grid sticky: 'ew', column_weight: 1
|
1546
|
+
text 'default entry'
|
1547
|
+
}
|
1548
|
+
entry {
|
1549
|
+
grid sticky: 'ew'
|
1550
|
+
text <=> [self, :default]
|
1551
|
+
}
|
1552
|
+
|
1553
|
+
label {
|
1554
|
+
grid sticky: 'ew'
|
1555
|
+
text 'password entry'
|
1556
|
+
}
|
1557
|
+
entry {
|
1558
|
+
grid sticky: 'ew'
|
1559
|
+
show '*'
|
1560
|
+
text <=> [self, :password]
|
1561
|
+
}
|
1562
|
+
|
1563
|
+
@validated_entry_label = label {
|
1564
|
+
grid sticky: 'ew'
|
1565
|
+
text 'entry with event handlers'
|
1566
|
+
}
|
1567
|
+
entry {
|
1568
|
+
grid sticky: 'ew'
|
1569
|
+
text <=> [self, :telephone]
|
1570
|
+
validate 'key'
|
1571
|
+
|
1572
|
+
## this event kicks in just after the user typed and before modifying the text variable
|
1573
|
+
on('validate') do |new_text_variable|
|
1574
|
+
telephone?(new_text_variable.value)
|
1575
|
+
end
|
1576
|
+
|
1577
|
+
## this event kicks in just after the text variable is validated and before it is modified
|
1578
|
+
on('invalid') do |validate_args|
|
1579
|
+
@validated_entry_label.text = "#{validate_args.string} is not valid!"
|
1580
|
+
@validated_entry_label.foreground = 'red'
|
1581
|
+
end
|
1582
|
+
|
1583
|
+
## this event kicks in just after the text variable is validated and modified
|
1584
|
+
on('change') do |new_text_variable|
|
1585
|
+
self.read_only = "Telephone area code is #{new_text_variable.value.gsub(/[^0-9]/, '')[0...3]}"
|
1586
|
+
@validated_entry_label.text = 'entry with event handlers'
|
1587
|
+
@validated_entry_label.foreground = nil
|
1588
|
+
end
|
1589
|
+
}
|
1590
|
+
|
1591
|
+
label {
|
1592
|
+
grid sticky: 'ew'
|
1593
|
+
text 'read-only entry'
|
1594
|
+
}
|
1595
|
+
entry {
|
1596
|
+
grid sticky: 'ew'
|
1597
|
+
text <=> [self, :read_only]
|
1598
|
+
readonly true
|
1599
|
+
}
|
1600
|
+
}.open
|
1601
|
+
end
|
1602
|
+
|
1603
|
+
def telephone?(text)
|
1604
|
+
!!text.match(/^\d{0,3}[-.\/]?\d{0,3}[-.\/]?\d{0,4}$/)
|
1605
|
+
end
|
1606
|
+
end
|
1607
|
+
|
1608
|
+
HelloEntry.new.launch
|
1609
|
+
```
|
1610
|
+
|
1611
|
+
Run with [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
1612
|
+
|
1613
|
+
```
|
1614
|
+
ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_entry'"
|
1615
|
+
```
|
1616
|
+
|
1617
|
+
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
1618
|
+
|
1619
|
+
```
|
1620
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_entry.rb
|
1621
|
+
```
|
1622
|
+
|
1623
|
+
Glimmer app:
|
1624
|
+
|
1625
|
+
![glimmer dsl tk screenshot sample hello entry](images/glimmer-dsl-tk-screenshot-sample-hello-entry.png)
|
1626
|
+
![glimmer dsl tk screenshot sample hello entry validated](images/glimmer-dsl-tk-screenshot-sample-hello-entry-validated.png)
|
1627
|
+
|
1628
|
+
### Hello, Computed!
|
1629
|
+
|
1630
|
+
Glimmer code (from [samples/hello/hello_computed.rb](samples/hello/hello_computed.rb)):
|
1631
|
+
|
1632
|
+
```ruby
|
1633
|
+
# ... more code precedes
|
1634
|
+
root {
|
1635
|
+
title 'Hello, Computed!'
|
1636
|
+
|
1637
|
+
frame {
|
1638
|
+
grid column: 0, row: 0, padx: 5, pady: 5
|
1639
|
+
|
1640
|
+
label {
|
1641
|
+
grid column: 0, row: 0, sticky: 'w'
|
1642
|
+
text 'First Name: '
|
1643
|
+
}
|
1644
|
+
entry {
|
1645
|
+
grid column: 1, row: 0
|
1646
|
+
width 15
|
1647
|
+
text <=> [@contact, :first_name]
|
1648
|
+
}
|
1649
|
+
|
1650
|
+
label {
|
1651
|
+
grid column: 0, row: 1, sticky: 'w'
|
1652
|
+
text 'Last Name: '
|
1653
|
+
}
|
1654
|
+
entry {
|
1655
|
+
grid column: 1, row: 1
|
1656
|
+
width 15
|
1657
|
+
text <=> [@contact, :last_name]
|
1658
|
+
}
|
1659
|
+
|
1660
|
+
label {
|
1661
|
+
grid column: 0, row: 2, sticky: 'w'
|
1662
|
+
text 'Year of Birth: '
|
1663
|
+
}
|
1664
|
+
entry {
|
1665
|
+
grid column: 1, row: 2
|
1666
|
+
width 15
|
1667
|
+
text <=> [@contact, :year_of_birth]
|
1668
|
+
}
|
1669
|
+
|
1670
|
+
label {
|
1671
|
+
grid column: 0, row: 3, sticky: 'w'
|
1672
|
+
text 'Name: '
|
1673
|
+
}
|
1674
|
+
label {
|
1675
|
+
grid column: 1, row: 3, sticky: 'w'
|
1676
|
+
text <=> [@contact, :name, computed_by: [:first_name, :last_name]]
|
1677
|
+
}
|
1678
|
+
|
1679
|
+
label {
|
1680
|
+
grid column: 0, row: 4, sticky: 'w'
|
1681
|
+
text 'Age: '
|
1682
|
+
}
|
1683
|
+
label {
|
1684
|
+
grid column: 1, row: 4, sticky: 'w'
|
1685
|
+
text <=> [@contact, :age, on_write: :to_i, computed_by: [:year_of_birth]]
|
1686
|
+
}
|
1687
|
+
}
|
1688
|
+
}.open
|
1689
|
+
# ... more code follows
|
1690
|
+
```
|
1691
|
+
|
1692
|
+
Run with [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
1693
|
+
|
1694
|
+
```
|
1695
|
+
ruby -r glimmer-dsl-tk -e "require 'samples/hello/hello_computed'"
|
1696
|
+
```
|
1697
|
+
|
1698
|
+
Alternatively, run from cloned project without [glimmer-dsl-tk](https://rubygems.org/gems/glimmer-dsl-tk) gem installed:
|
1699
|
+
|
1700
|
+
```
|
1701
|
+
ruby -r ./lib/glimmer-dsl-tk.rb samples/hello/hello_computed.rb
|
1514
1702
|
```
|
1515
1703
|
|
1516
1704
|
Glimmer app:
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.24
|
data/glimmer-dsl-tk.gemspec
CHANGED
Binary file
|
@@ -33,9 +33,26 @@ module Glimmer
|
|
33
33
|
def validatecommand_block=(proc)
|
34
34
|
tk.validatecommand(proc)
|
35
35
|
end
|
36
|
+
|
36
37
|
def invalidcommand_block=(proc)
|
37
38
|
tk.invalidcommand(proc)
|
38
39
|
end
|
40
|
+
|
41
|
+
def handle_listener(listener_name, &listener)
|
42
|
+
case listener_name.to_s.downcase
|
43
|
+
when 'change'
|
44
|
+
tk.textvariable.trace('write') {
|
45
|
+
listener.call(@tk.textvariable)
|
46
|
+
}
|
47
|
+
when 'validatecommand', 'validate'
|
48
|
+
self.validatecommand_block = listener
|
49
|
+
when 'invalidcommand', 'invalid'
|
50
|
+
self.invalidcommand_block = listener
|
51
|
+
else
|
52
|
+
super
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
39
56
|
end
|
40
57
|
end
|
41
58
|
end
|
@@ -149,7 +149,11 @@ module Glimmer
|
|
149
149
|
|
150
150
|
def set_attribute(attribute, *args)
|
151
151
|
widget_custom_attribute = widget_custom_attribute_mapping[tk.class] && widget_custom_attribute_mapping[tk.class][attribute.to_s]
|
152
|
-
if
|
152
|
+
if respond_to?(attribute, super_only: true)
|
153
|
+
send(attribute, *args)
|
154
|
+
elsif respond_to?(attribute_setter(attribute), super_only: true)
|
155
|
+
send(attribute_setter(attribute), *args)
|
156
|
+
elsif widget_custom_attribute
|
153
157
|
widget_custom_attribute[:setter][:invoker].call(@tk, args)
|
154
158
|
elsif tk_widget_has_attribute_setter?(attribute)
|
155
159
|
unless args.size == 1 && @tk.send(attribute) == args.first
|
@@ -197,6 +201,26 @@ module Glimmer
|
|
197
201
|
"#{attribute}="
|
198
202
|
end
|
199
203
|
|
204
|
+
def grid(options = {})
|
205
|
+
options = options.stringify_keys
|
206
|
+
index_in_parent = @parent_proxy.children.index(self)
|
207
|
+
options['rowweight'] = options.delete('row_weight') if options.keys.include?('row_weight')
|
208
|
+
options['columnweight'] = options.delete('column_weight') if options.keys.include?('column_weight')
|
209
|
+
options['columnweight'] = options['rowweight'] = options.delete('weight') if options.keys.include?('weight')
|
210
|
+
options['rowminsize'] = options.delete('row_minsize') if options.keys.include?('row_minsize')
|
211
|
+
options['rowminsize'] = options.delete('minheight') if options.keys.include?('minheight')
|
212
|
+
options['rowminsize'] = options.delete('min_height') if options.keys.include?('min_height')
|
213
|
+
options['columnminsize'] = options.delete('column_minsize') if options.keys.include?('column_minsize')
|
214
|
+
options['columnminsize'] = options.delete('minwidth') if options.keys.include?('minwidth')
|
215
|
+
options['columnminsize'] = options.delete('min_width') if options.keys.include?('min_width')
|
216
|
+
options['columnminsize'] = options['rowminsize'] = options.delete('minsize') if options.keys.include?('minsize')
|
217
|
+
TkGrid.rowconfigure(@parent_proxy.tk, index_in_parent, 'weight'=> options.delete('rowweight')) if options.keys.include?('rowweight')
|
218
|
+
TkGrid.rowconfigure(@parent_proxy.tk, index_in_parent, 'minsize'=> options.delete('rowminsize')) if options.keys.include?('rowminsize')
|
219
|
+
TkGrid.columnconfigure(@parent_proxy.tk, index_in_parent, 'weight'=> options.delete('columnweight')) if options.keys.include?('columnweight')
|
220
|
+
TkGrid.columnconfigure(@parent_proxy.tk, index_in_parent, 'minsize'=> options.delete('columnminsize')) if options.keys.include?('columnminsize')
|
221
|
+
@tk.grid(options)
|
222
|
+
end
|
223
|
+
|
200
224
|
def widget_custom_attribute_mapping
|
201
225
|
# TODO consider extracting to modules/subclasses
|
202
226
|
@widget_custom_attribute_mapping ||= {
|
@@ -249,7 +273,7 @@ module Glimmer
|
|
249
273
|
::Tk::Tile::TEntry => {
|
250
274
|
'text' => {
|
251
275
|
getter: {name: 'text', invoker: lambda { |widget, args| @tk.textvariable&.value }},
|
252
|
-
setter: {name: 'text=', invoker: lambda { |widget, args| @tk.textvariable&.value = args.first
|
276
|
+
setter: {name: 'text=', invoker: lambda { |widget, args| @tk.textvariable&.value = args.first }},
|
253
277
|
},
|
254
278
|
},
|
255
279
|
::Tk::Root => {
|
@@ -285,23 +309,14 @@ module Glimmer
|
|
285
309
|
},
|
286
310
|
::Tk::Tile::TEntry => {
|
287
311
|
'text' => lambda do |observer|
|
288
|
-
tk.
|
289
|
-
|
290
|
-
@text_variable_edit = new_tk_variable.value != @tk.textvariable.value
|
291
|
-
if @text_variable_edit
|
292
|
-
observer.call(new_tk_variable.value)
|
293
|
-
@text_variable_edit = nil
|
294
|
-
true
|
295
|
-
else
|
296
|
-
false
|
297
|
-
end
|
312
|
+
tk.textvariable.trace('write') {
|
313
|
+
observer.call(@tk.textvariable.value)
|
298
314
|
}
|
299
315
|
end,
|
300
316
|
},
|
301
317
|
::Tk::Tile::TRadiobutton => {
|
302
318
|
'variable' => lambda do |observer|
|
303
319
|
@tk.command {
|
304
|
-
pd @tk.variable.value, @tk.value
|
305
320
|
observer.call(@tk.variable.value == @tk.value)
|
306
321
|
}
|
307
322
|
end,
|
@@ -361,15 +376,15 @@ module Glimmer
|
|
361
376
|
super(method.to_sym, *args, &block)
|
362
377
|
end
|
363
378
|
|
364
|
-
def respond_to?(method, *args, &block)
|
365
|
-
super ||
|
366
|
-
tk.respond_to?(method, *args, &block)
|
379
|
+
def respond_to?(method, *args, super_only: false, &block)
|
380
|
+
super(method, true) ||
|
381
|
+
!super_only && tk.respond_to?(method, *args, &block)
|
367
382
|
end
|
368
383
|
|
369
384
|
private
|
370
385
|
|
371
386
|
def initialize_defaults
|
372
|
-
|
387
|
+
grid unless @tk.is_a?(::Tk::Toplevel)
|
373
388
|
end
|
374
389
|
end
|
375
390
|
end
|
data/lib/glimmer-dsl-tk.rb
CHANGED
@@ -0,0 +1,104 @@
|
|
1
|
+
# Copyright (c) 2020-2021 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require 'glimmer-dsl-tk'
|
23
|
+
|
24
|
+
class HelloEntry
|
25
|
+
include Glimmer
|
26
|
+
|
27
|
+
attr_accessor :default, :password, :telephone, :read_only
|
28
|
+
|
29
|
+
def initialize
|
30
|
+
self.default = 'default'
|
31
|
+
self.password = 'password'
|
32
|
+
self.telephone = '555-555-5555'
|
33
|
+
self.read_only = 'Telephone area code is 555'
|
34
|
+
end
|
35
|
+
|
36
|
+
def launch
|
37
|
+
root {
|
38
|
+
title 'Hello, Entry!'
|
39
|
+
|
40
|
+
label {
|
41
|
+
grid sticky: 'ew', column_weight: 1
|
42
|
+
text 'default entry'
|
43
|
+
}
|
44
|
+
entry {
|
45
|
+
grid sticky: 'ew'
|
46
|
+
text <=> [self, :default]
|
47
|
+
}
|
48
|
+
|
49
|
+
label {
|
50
|
+
grid sticky: 'ew'
|
51
|
+
text 'password entry'
|
52
|
+
}
|
53
|
+
entry {
|
54
|
+
grid sticky: 'ew'
|
55
|
+
show '*'
|
56
|
+
text <=> [self, :password]
|
57
|
+
}
|
58
|
+
|
59
|
+
@validated_entry_label = label {
|
60
|
+
grid sticky: 'ew'
|
61
|
+
text 'entry with event handlers'
|
62
|
+
}
|
63
|
+
entry {
|
64
|
+
grid sticky: 'ew'
|
65
|
+
text <=> [self, :telephone]
|
66
|
+
validate 'key'
|
67
|
+
|
68
|
+
## this event kicks in just after the user typed and before modifying the text variable
|
69
|
+
on('validate') do |new_text_variable|
|
70
|
+
telephone?(new_text_variable.value)
|
71
|
+
end
|
72
|
+
|
73
|
+
## this event kicks in just after the text variable is validated and before it is modified
|
74
|
+
on('invalid') do |validate_args|
|
75
|
+
@validated_entry_label.text = "#{validate_args.string} is not valid!"
|
76
|
+
@validated_entry_label.foreground = 'red'
|
77
|
+
end
|
78
|
+
|
79
|
+
## this event kicks in just after the text variable is validated and modified
|
80
|
+
on('change') do |new_text_variable|
|
81
|
+
self.read_only = "Telephone area code is #{new_text_variable.value.gsub(/[^0-9]/, '')[0...3]}"
|
82
|
+
@validated_entry_label.text = 'entry with event handlers'
|
83
|
+
@validated_entry_label.foreground = nil
|
84
|
+
end
|
85
|
+
}
|
86
|
+
|
87
|
+
label {
|
88
|
+
grid sticky: 'ew'
|
89
|
+
text 'read-only entry'
|
90
|
+
}
|
91
|
+
entry {
|
92
|
+
grid sticky: 'ew'
|
93
|
+
text <=> [self, :read_only]
|
94
|
+
readonly true
|
95
|
+
}
|
96
|
+
}.open
|
97
|
+
end
|
98
|
+
|
99
|
+
def telephone?(text)
|
100
|
+
!!text.match(/^\d{0,3}[-.\/]?\d{0,3}[-.\/]?\d{0,4}$/)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
HelloEntry.new.launch
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glimmer-dsl-tk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- AndyMaleh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-10-
|
11
|
+
date: 2021-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: glimmer
|
@@ -190,7 +190,8 @@ dependencies:
|
|
190
190
|
- - "~>"
|
191
191
|
- !ruby/object:Gem::Version
|
192
192
|
version: 0.7.0
|
193
|
-
description: Glimmer DSL for Tk (MRI Ruby Desktop Development GUI Library)
|
193
|
+
description: Glimmer DSL for Tk (MRI Ruby Desktop Development GUI Library) - Ruby
|
194
|
+
DSL for Tcl/Tk with bidirectional/unidirectional data-binding support
|
194
195
|
email: andy.am@gmail.com
|
195
196
|
executables:
|
196
197
|
- girb
|
@@ -242,6 +243,7 @@ files:
|
|
242
243
|
- samples/hello/hello_combobox.rb
|
243
244
|
- samples/hello/hello_computed.rb
|
244
245
|
- samples/hello/hello_computed/contact.rb
|
246
|
+
- samples/hello/hello_entry.rb
|
245
247
|
- samples/hello/hello_frame.rb
|
246
248
|
- samples/hello/hello_label.rb
|
247
249
|
- samples/hello/hello_list_multi_selection.rb
|