glimmer-dsl-tk 0.0.58 → 0.0.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cf96d61575c30434197c7edfe2bfb6e6fd9fb84c70c18c0e924d688418351315
4
- data.tar.gz: eaa003fd150d7fac2e85196e477714ea7df87d7a4651e44c0a909b8c566085c3
3
+ metadata.gz: 65202d323a2567e112890475495d310877f839c0a064f8f4e17e2564df47b422
4
+ data.tar.gz: 93515ff8e8ef6ff1e8b3eae4d3f809522110fb9e0e83e4523eaede034cd605d0
5
5
  SHA512:
6
- metadata.gz: 9451fadd605400721e4fd02a601e2720a2e4a41daa28aa0fa69b32f43ae1334de5ecde54ed2cd7d0f13bebdcdfe666daa4391c585fbea24302556eec8389f8af
7
- data.tar.gz: c9e1ad3acd64c17b7642500ed7764c8f3be955de5a5a34d9cd482ac65a23aaba613396d6b14cfaddcd1537d63df6c3e810e723cd48c46bbcb318b00e4b5bc1ed
6
+ metadata.gz: a5206b004b6b49c5b29444410b86d978cb787314e25c32f069e2e973b456f164a20c04a295a2cac4bd90d0e5627df5477605daf8cc9439bf883caea4e79485b3
7
+ data.tar.gz: 9addeadf0b91a2c51a0ac137b550d700a2a621d52ca997d8618ff6d83281be2c030eebe34ca0cf4bd0c122b3fa4b26c9ac8ecf4b1e2b3f46ba7bafad562f1052
data/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.0.61
4
+
5
+ - Fix issue with Hello, Entry! breaking after the latest release due to mistakenly converting color `'red'` to `'#red'` by thinking it is hex
6
+
7
+ ## 0.0.60
8
+
9
+ - Update Hello, Built-in Dialog! with more options for customizing dialogs
10
+ - Support setting colors as rgb colors via `r, g, b` (e.g. `foreground 210, 48, 110`)
11
+ - Accept hex color strings not starting with `#` (e.g. `background 'f828d7'`)
12
+
13
+ ## 0.0.59
14
+
15
+ - Auto-Default to `validate 'key'` on an `entry` when defining `validatecommand {}`, `on('validate') {}`, `invalidcommand {}`, `on('invalid') {}`
16
+
3
17
  ## 0.0.58
4
18
 
5
19
  - Support `@tk.textvariable.trace('write')` kind of variable tracing via `on_var(trace_operation) {}` listeners (e.g. `on_textvariable('write') {}`)
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.58
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.61
2
2
  ## Ruby Tk 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)
@@ -195,7 +195,7 @@ gem install glimmer-dsl-tk
195
195
 
196
196
  Add the following to `Gemfile`:
197
197
  ```
198
- gem 'glimmer-dsl-tk', '0.0.58'
198
+ gem 'glimmer-dsl-tk', '0.0.61'
199
199
  ```
200
200
 
201
201
  And, then run:
@@ -309,14 +309,14 @@ keyword(args) | attributes | event bindings & callbacks
309
309
  ------------- | ---------- | ---------
310
310
  `button` | `text`, `image` (optional keyword args: `subsample`, `zoom`, `from`, `to`, `shrink`, `compositingrule`), `compound` (`'center', 'top', 'bottom', 'left', 'right'`), `default` (`'active', 'normal'`) | `command {}`
311
311
  `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 {}`
312
- `choose_color(options = nil)` | None | None
313
- `choose_directory(options = nil)` | None | None
314
- `choose_font(options = nil) {|font| ... }` | None | None
312
+ `choose_color(parent: nil, initialcolor: 'white', title: 'Colors')` | None | None
313
+ `choose_directory(parent: nil)` | None | None
314
+ `choose_font(family: nil, size: nil, weight: nil) {|font| ... }` | None | None
315
315
  `combobox` | `state`, `text` | `'ComboboxSelected'`
316
316
  `entry` | `width`, `text`, `validate`, `show` (`'none', 'focus', 'focusin', 'focusout', 'key', or 'all'`) | `'validate'`, `'invalid'`, `'change'` (alias: `'changed'`), `validatecommand {}`, `invalidcommand {}`
317
- `get_multiple_open_file(options = nil)` | None | None
318
- `get_open_file(options = nil)` | None | None
319
- `get_save_file(options = nil)` | None | None
317
+ `get_multiple_open_file(parent: nil, title: '')` | None | None
318
+ `get_open_file(parent: nil, title: '')` | None | None
319
+ `get_save_file(parent: nil, title: '')` | None | None
320
320
  `spinbox` | `text`, `from`, `to`, `increment`, `format`, [more attributes](https://tcl.tk/man/tcl8.6/TkCmd/text.htm#M116) | `command {}`, `'increment'`, `'decrement'`
321
321
  `frame(text: nil)` | `width`, `height`, `borderwidth`, `relief` (`'flat' (default), 'raised', 'sunken', 'solid', 'ridge', 'groove'`) | None
322
322
  `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
@@ -343,6 +343,8 @@ Options for `get_open_file` and `get_multiple_open_file` include:
343
343
  #### Common Attributes
344
344
 
345
345
  - `grid`: `Hash` of `:row`, `:column`, `:padx`, `:pady`, `:sticky` (`'e', 'w', 'n', 's'` or any combination of direction letters)
346
+ - `foreground`: [Built-in Color](https://tcl.tk/man/tcl8.6/TkCmd/colors.htm) (e.g. `'AliceBlue'`), Hex color (e.g. `'#ffd807'`), or RGB color array (e.g. `foreground 255, 128, 75`)
347
+ - `background`: [Built-in Color](https://tcl.tk/man/tcl8.6/TkCmd/colors.htm) (e.g. `'AliceBlue'`), Hex color (e.g. `'#ffd807'`), or RGB color array (e.g. `foreground 255, 128, 75`)
346
348
 
347
349
  #### Common Event Bindings
348
350
 
@@ -2181,12 +2183,13 @@ class HelloEntry
2181
2183
  def launch
2182
2184
  root {
2183
2185
  title 'Hello, Entry!'
2184
-
2186
+ minsize 230, 0
2187
+
2185
2188
  label {
2186
2189
  grid sticky: 'ew'
2187
2190
  text 'default entry'
2188
2191
  }
2189
- entry {
2192
+ entry { |the_entry|
2190
2193
  grid sticky: 'ew'
2191
2194
  text <=> [self, :default]
2192
2195
  }
@@ -2205,11 +2208,14 @@ class HelloEntry
2205
2208
  grid sticky: 'ew'
2206
2209
  text 'entry with event handlers'
2207
2210
  }
2208
- entry {
2211
+ entry { |the_entry|
2209
2212
  grid sticky: 'ew'
2210
2213
  text <=> [self, :telephone]
2211
- validate 'key'
2212
2214
 
2215
+ # validate 'key' # default when on('validate') or on('invalid') is specified
2216
+ ## Validation happens on key change by default when validation listeners are specified
2217
+ ## (other accepted values: 'none', 'focus', 'focusin', 'focusout', 'key', or 'all')
2218
+
2213
2219
  ## this event kicks in just after the user typed and before modifying the text variable
2214
2220
  on('validate') do |new_text_variable|
2215
2221
  telephone?(new_text_variable.value)
@@ -2217,7 +2223,7 @@ class HelloEntry
2217
2223
 
2218
2224
  ## this event kicks in just after the text variable is validated and before it is modified
2219
2225
  on('invalid') do |validate_args|
2220
- @validated_entry_label.text = "#{validate_args.string} is not valid!"
2226
+ @validated_entry_label.text = "#{validate_args.value} is not a valid phone!"
2221
2227
  @validated_entry_label.foreground = 'red'
2222
2228
  end
2223
2229
 
@@ -2227,6 +2233,13 @@ class HelloEntry
2227
2233
  @validated_entry_label.text = 'entry with event handlers'
2228
2234
  @validated_entry_label.foreground = nil
2229
2235
  end
2236
+
2237
+ ## this is similar to on('change') (which is Glimmer-specific), but more low level at the Tk level
2238
+ ## it is the equivalent of calling: the_entry.tk.textvariable.trace('write') { puts "..." }
2239
+ ## More at: https://tkdocs.com/tutorial/widgets.html#entry and https://tcl.tk/man/tcl8.6/TclCmd/trace.htm#M14
2240
+ on_textvariable('write') do
2241
+ puts "\"#{the_entry.text}\" has been written to entry!"
2242
+ end
2230
2243
  }
2231
2244
 
2232
2245
  label {
@@ -4274,9 +4287,9 @@ https://github.com/ancorgs/y3network-ruby-ui
4274
4287
 
4275
4288
  This is a Graphical User Interface for the famous [cryptopunks Ruby gem](https://github.com/cryptopunksnotdead/cryptopunks/tree/master/cryptopunks).
4276
4289
 
4277
- https://github.com/cryptopunksnotdead/cryptopunks-gui
4290
+ https://github.com/cryptopunksnotdead/cryptopunks/tree/master/cryptopunks-gui
4278
4291
 
4279
- ![CryptoPunks GUI Screenshot](https://raw.githubusercontent.com/cryptopunksnotdead/cryptopunks-gui/master/screenshots/cryptopunks-gui-screenshot.png)
4292
+ ![CryptoPunks GUI Screenshot](https://raw.githubusercontent.com/cryptopunksnotdead/cryptopunks/master/cryptopunks-gui/screenshots/cryptopunks-gui-screenshot.png)
4280
4293
 
4281
4294
  ### Circule
4282
4295
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.58
1
+ 0.0.61
Binary file
@@ -31,13 +31,24 @@ module Glimmer
31
31
  include TextVariableOwner
32
32
 
33
33
  def validatecommand_block=(proc)
34
+ self.validate = 'key' unless validate
34
35
  tk.validatecommand(proc)
35
36
  end
36
37
 
37
38
  def invalidcommand_block=(proc)
39
+ self.validate = 'key' unless validate
38
40
  tk.invalidcommand(proc)
39
41
  end
40
42
 
43
+ def validate
44
+ @validate
45
+ end
46
+
47
+ def validate=(value)
48
+ @validate = value
49
+ @tk.validate(value)
50
+ end
51
+
41
52
  def handle_listener(listener_name, &listener)
42
53
  case listener_name.to_s.downcase
43
54
  when 'change', 'changed', 'modified'
@@ -73,6 +73,7 @@ module Glimmer
73
73
  prepend DraggableAndDroppable
74
74
 
75
75
  FONTS_PREDEFINED = %w[default text fixed menu heading caption small_caption icon tooltip]
76
+ HEXADECIMAL_CHARACTERS = %w[0 1 2 3 4 5 6 7 8 9 a b c d e f]
76
77
 
77
78
  attr_reader :parent_proxy, :tk, :args, :keyword, :children, :bind_ids, :destroyed
78
79
  alias destroyed? destroyed
@@ -192,6 +193,7 @@ module Glimmer
192
193
 
193
194
  def set_attribute(attribute, *args)
194
195
  begin
196
+ args = normalize_attribute_arguments(attribute, args)
195
197
  widget_custom_attribute = widget_custom_attribute_mapping[tk.class] && widget_custom_attribute_mapping[tk.class][attribute.to_s]
196
198
  if respond_to?(attribute_setter(attribute), super_only: true)
197
199
  send(attribute_setter(attribute), *args)
@@ -308,6 +310,34 @@ module Glimmer
308
310
  @tk.style = style
309
311
  end
310
312
 
313
+ def normalize_attribute_arguments(attribute, args)
314
+ attribute_argument_normalizers[attribute]&.call(args) || args
315
+ end
316
+
317
+ def attribute_argument_normalizers
318
+ color_normalizer = lambda do |args|
319
+ if args.size > 1 || args.first.is_a?(Numeric)
320
+ rgb = args
321
+ rgb = rgb.map(&:to_s).map(&:to_i)
322
+ rgb = 3.times.map { |n| rgb[n] || 0}
323
+ hex = rgb.map { |color| color.to_s(16).ljust(2, '0') }.join
324
+ ["##{hex}"]
325
+ elsif args.size == 1 &&
326
+ args.first.is_a?(String) &&
327
+ !args.first.start_with?('#') &&
328
+ (args.first.size == 3 || args.first.size == 6) &&
329
+ (args.first.chars.all? {|char| HEXADECIMAL_CHARACTERS.include?(char.downcase)})
330
+ ["##{args.first}"]
331
+ else
332
+ args
333
+ end
334
+ end
335
+ @attribute_argument_normalizers ||= {
336
+ 'background' => color_normalizer,
337
+ 'foreground' => color_normalizer,
338
+ }
339
+ end
340
+
311
341
  def widget_custom_attribute_mapping
312
342
  # TODO consider extracting to modules/subclasses
313
343
  @widget_custom_attribute_mapping ||= {
@@ -534,10 +564,12 @@ module Glimmer
534
564
 
535
565
  def method_missing(method, *args, &block)
536
566
  method = method.to_s
567
+ attribute_name = method.sub(/=$/, '')
568
+ args = normalize_attribute_arguments(attribute_name, args)
537
569
  if args.empty? && block.nil? && ((widget_custom_attribute_mapping[tk.class] && widget_custom_attribute_mapping[tk.class][method]) || has_state?(method) || has_attributes_attribute?(method))
538
570
  get_attribute(method)
539
571
  elsif method.end_with?('=') && block.nil? && ((widget_custom_attribute_mapping[tk.class] && widget_custom_attribute_mapping[tk.class][method.sub(/=$/, '')]) || has_state?(method) || has_attributes_attribute?(method))
540
- set_attribute(method.sub(/=$/, ''), *args)
572
+ set_attribute(attribute_name, *args)
541
573
  else
542
574
  tk.send(method, *args, &block)
543
575
  end
@@ -31,21 +31,47 @@ root { |w|
31
31
  y 150
32
32
 
33
33
  frame {
34
- %w[get_open_file get_multiple_open_file get_save_file choose_directory choose_color].each do |dialog|
34
+ %w[get_open_file get_multiple_open_file get_save_file choose_directory].each do |dialog|
35
+ dialog_name = dialog.split('_').map(&:capitalize).join(' ')
35
36
  button {
36
- text dialog.split('_').map(&:capitalize).join(' ')
37
+ text dialog_name
37
38
 
38
39
  on('command') do
39
- result = send(dialog, parent: w)
40
+ # parent is optional.
41
+ # It is recommended to set parent to display dialog on top of.
42
+ #
43
+ # title is optional (defaults to blank).
44
+ # It is not supported by choose_directory (its title is always blank).
45
+ result = send(dialog, parent: w, title: dialog_name)
46
+ # Uniformly handle both a singular result (e.g. from get_open_file)
47
+ # and an array of results (e.g. from get_multiple_open_file)
40
48
  @result_label.text = [result].flatten.join("\n")
41
49
  end
42
50
  }
43
51
  end
44
52
 
53
+ button {
54
+ text 'Choose Color'
55
+
56
+ on('command') do
57
+ # parent is optional.
58
+ # It is recommended to set parent to display dialog on top of.
59
+ #
60
+ # title is optional (defaults to 'Colors').
61
+ #
62
+ # initialcolor is optional (defaults to 'white').
63
+ # It can be a built-in color (e.g. 'AliceBlue') or hex (e.g. '#FFFF00')
64
+ # Full list of built-in colors is at: https://tcl.tk/man/tcl8.6/TkCmd/colors.htm
65
+ chosen_color = choose_color(parent: w, title: 'Choose Color', initialcolor: '#FFFF00')
66
+ @result_label.text = chosen_color
67
+ end
68
+ }
69
+
45
70
  button {
46
71
  text 'Choose Font'
47
72
 
48
73
  on('command') do
74
+ # Initial family, size, and weight are optional.
49
75
  choose_font(family: 'Courier New', size: '30', weight: 'bold') do |chosen_font|
50
76
  @result_label.text = chosen_font
51
77
  end
@@ -64,8 +64,11 @@ class HelloEntry
64
64
  entry { |the_entry|
65
65
  grid sticky: 'ew'
66
66
  text <=> [self, :telephone]
67
- validate 'key'
68
67
 
68
+ # validate 'key' # default when on('validate') or on('invalid') is specified
69
+ ## Validation happens on key change by default when validation listeners are specified
70
+ ## (other accepted values: 'none', 'focus', 'focusin', 'focusout', 'key', or 'all')
71
+
69
72
  ## this event kicks in just after the user typed and before modifying the text variable
70
73
  on('validate') do |new_text_variable|
71
74
  telephone?(new_text_variable.value)
@@ -80,8 +80,13 @@ class HelloLabel
80
80
  anchor 'center'
81
81
  justify 'center' # other options are: 'left' and 'right'
82
82
  font 'caption' # other options are: 'default', 'text', 'fixed', 'menu', 'heading', 'small_caption', 'icon', 'tooltip'
83
- foreground 'blue'
84
83
  relief 'sunken' # other options are: 'flat' (default), 'raised', 'solid', 'ridge', 'groove'
84
+ foreground 38, 20, 138 # RGB (Red Green Blue) color
85
+
86
+ # Other supported color arguments:
87
+ # foreground 'blue' # built-in color alternative from https://tcl.tk/man/tcl8.6/TkCmd/colors.htm
88
+ # foreground '#ff0000' # hex color
89
+ # foreground 'ff0000' # hex color missing the # prefix
85
90
  }
86
91
  }
87
92
 
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.58
4
+ version: 0.0.61
5
5
  platform: ruby
6
6
  authors:
7
7
  - AndyMaleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-07 00:00:00.000000000 Z
11
+ date: 2022-07-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: glimmer
@@ -170,8 +170,8 @@ dependencies:
170
170
  - - "~>"
171
171
  - !ruby/object:Gem::Version
172
172
  version: 0.7.0
173
- description: Glimmer DSL for Tk (MRI Ruby Desktop Development GUI Library) - Ruby
174
- DSL for Tcl/Tk with bidirectional/unidirectional data-binding support.
173
+ description: Glimmer DSL for Tk (Ruby Tk Desktop Development GUI Library) - Ruby DSL
174
+ for Tcl/Tk with bidirectional/unidirectional data-binding support.
175
175
  email: andy.am@gmail.com
176
176
  executables:
177
177
  - girb