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.
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.35
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.35'
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/hello_frame.rb](samples/hello/hello_frame.rb)):
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/AndyObtiva/cryptopunks-gui
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
- ![CryptoPunks GUI Screenshot](https://raw.githubusercontent.com/AndyObtiva/cryptopunks-gui/master/screenshots/cryptopunks-gui-screenshot.png)
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.35
1
+ 0.0.39
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