glimmer-dsl-tk 0.0.59 → 0.0.62

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 26c20e8d681d57d11f540136ad94fd26a4f7ab51a5663eba95599dd5fa1589fe
4
- data.tar.gz: 6f70dd20a48487e0c73135790b24e38f8080fa376cda20f1da2c8db83cb78d4c
3
+ metadata.gz: b6a4152765e0997cd3d29beec05f16be105a09ae868e49335fb09e81d552e576
4
+ data.tar.gz: 31c3f1d4ee33b5ab9dec7ccd76d11a6c50cde145cf3a5517401859b0ae16a45a
5
5
  SHA512:
6
- metadata.gz: 97fc2a77f286aec0cef3f0733aa1642415a0cf5ae420ea7713344b4b9f0de676d96fbb40b6cdba8d5a3338f8340a6b94ef3e6497043b86cd154258d66e320616
7
- data.tar.gz: d48746949f04d68643d6493cab85c04bc7951da0fcbced1c7f13ab9a968d3bab6e452b8c804b2b012ab6b662c8092e87c0bea4386a214b2ccd494a94e46b6299
6
+ metadata.gz: 7f4820bb0d35553b16fc9b37bfca7d2abdc463cbd2e958f462b5be5c53e79e7ae3abc918fa2bbc6775d642432b127fa3d26ff72d96195287fecd287e13a50a23
7
+ data.tar.gz: 6f5b093cd7f834e6d8126142d5f63e66dde7c164b463eee577cd8b177d27784335d3f2df88555ce103c68a29eaed72ab1ec1e608018e8b76655c9704e77c0826
data/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.0.62
4
+
5
+ - `icon_photo` as alias for `iconphoto` attribute on `root` and `toplevel`
6
+ - `initial_color` as alias for `initialcolor` attribute on `choose_color` built-in dialog
7
+
8
+ ## 0.0.61
9
+
10
+ - Fix issue with Hello, Entry! breaking after the latest release due to mistakenly converting color `'red'` to `'#red'` by thinking it is hex
11
+
12
+ ## 0.0.60
13
+
14
+ - Update Hello, Built-in Dialog! with more options for customizing dialogs
15
+ - Support setting colors as rgb colors via `r, g, b` (e.g. `foreground 210, 48, 110`)
16
+ - Accept hex color strings not starting with `#` (e.g. `background 'f828d7'`)
17
+
3
18
  ## 0.0.59
4
19
 
5
20
  - Auto-Default to `validate 'key'` on an `entry` when defining `validatecommand {}`, `on('validate') {}`, `invalidcommand {}`, `on('invalid') {}`
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.59
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.62
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.59'
198
+ gem 'glimmer-dsl-tk', '0.0.62'
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, initial_color: '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
@@ -328,11 +328,11 @@ keyword(args) | attributes | event bindings & callbacks
328
328
  `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`
329
329
  `notebook` | None | None
330
330
  `radiobutton` | `text`, `variable` (Boolean), `image` (optional keyword args: `subsample`, `zoom`, `from`, `to`, `shrink`, `compositingrule`), `compound` (`'center', 'top', 'bottom', 'left', 'right'`), `value` (default: `text`) | `command {}`
331
- `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'`
331
+ `root` | `title`, `icon_photo`, `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'`
332
332
  `scrollbar` | `orient` | `command`
333
333
  `scrollbar_frame` | `xscrollbar` (Boolean or scrollbar widget proxy), `yscrollbar` (Boolean or scrollbar widget proxy) | None
334
334
  `separator` | `orient` (`'horizontal' (default) or 'vertical'`) | None
335
- `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'`
335
+ `toplevel` | `title`, `icon_photo`, `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'`
336
336
  `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'`)
337
337
  `x_scrollbar` | `orient` (`'horizontal'`) | `command`
338
338
  `y_scrollbar` | `orient` (`'vertical'`) | `command`
@@ -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
 
@@ -553,7 +555,7 @@ When nesting `frame` under `notebook`, you can pass a `:text` keyword argument t
553
555
 
554
556
  #### Icon Photo
555
557
 
556
- The `iconphoto` attribute on `root` is set to the Glimmer icon by default if no icon photo is supplied.
558
+ The `icon_photo` attribute (alias for `iconphoto`) on `root` is set to the Glimmer icon by default if no icon photo is supplied.
557
559
 
558
560
  Otherwise, [Glimmer DSL for Tk](https://rubygems.org/gems/glimmer-dsl-tk) is smart enough to accept an image path directly (no need to wrap with `TkPhotoImage`)
559
561
 
@@ -562,7 +564,7 @@ Example with direct image path (you may copy/paste in [`girb`](#girb-glimmer-irb
562
564
  ```ruby
563
565
  root {
564
566
  title 'Title'
565
- iconphoto 'icons/glimmer.png'
567
+ icon_photo 'icons/glimmer.png'
566
568
  }.open
567
569
  ```
568
570
 
@@ -571,7 +573,7 @@ Example with `TkPhotoImage` object (you may copy/paste in [`girb`](#girb-glimmer
571
573
  ```ruby
572
574
  root {
573
575
  title 'Title'
574
- iconphoto TkPhotoImage.new(file: 'icons/glimmer.png')
576
+ icon_photo TkPhotoImage.new(file: 'icons/glimmer.png')
575
577
  }.open
576
578
  ```
577
579
 
@@ -1533,7 +1535,7 @@ include Glimmer
1533
1535
 
1534
1536
  root { |r|
1535
1537
  title 'Hello, Root!'
1536
- iconphoto File.expand_path('../../icons/glimmer.png', __dir__)
1538
+ icon_photo File.expand_path('../../icons/glimmer.png', __dir__)
1537
1539
  width 400
1538
1540
  height 200
1539
1541
  x -150
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.59
1
+ 0.0.62
Binary file
@@ -38,6 +38,7 @@ module Glimmer
38
38
  def interpret(parent, keyword, *args, &block)
39
39
  if args.first.is_a?(Hash)
40
40
  options = args.first.symbolize_keys
41
+ options[:initialcolor] = options.delete(:initial_color) if options.keys.include?(:initial_color)
41
42
  options[:filetypes] = options.delete(:file_types) if options.keys.include?(:file_types)
42
43
  options[:filetypes] = options[:filetypes].map { |key, value| "{#{key}} {#{value}}" } if options[:filetypes].is_a?(Hash)
43
44
  options[:parent] = options[:parent].tk if options[:parent].is_a?(Glimmer::Tk::RootProxy)
@@ -48,14 +48,14 @@ module Glimmer
48
48
  end
49
49
 
50
50
  def has_attribute?(attribute, *args)
51
- %w[width height x y].include?(attribute.to_s) || super
51
+ %w[width height x y icon_photo].include?(attribute.to_s) || super
52
52
  end
53
53
 
54
54
  def set_attribute(attribute, *args)
55
55
  case attribute.to_s
56
- when 'iconphoto'
56
+ when 'iconphoto', 'icon_photo'
57
57
  args[0..-1] = [image_argument(args)]
58
- super
58
+ super('iconphoto', *args)
59
59
  when 'resizable'
60
60
  if args.size == 1 && !args.first.is_a?(Array)
61
61
  self.resizable = [args.first]*2
@@ -67,6 +67,19 @@ module Glimmer
67
67
  end
68
68
  end
69
69
 
70
+ def get_attribute(attribute)
71
+ case attribute.to_s
72
+ when 'icon_photo'
73
+ super('iconphoto')
74
+ else
75
+ super
76
+ end
77
+ end
78
+
79
+ def icon_photo
80
+ iconphoto
81
+ end
82
+
70
83
  def width
71
84
  geometry.split(REGEX_GEOMETRY)[0].to_i
72
85
  end
@@ -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 ||= {
@@ -380,6 +410,10 @@ module Glimmer
380
410
  getter: {name: 'text', invoker: lambda { |widget, args| @tk.title }},
381
411
  setter: {name: 'text=', invoker: lambda { |widget, args| @tk.title = args.first }},
382
412
  },
413
+ 'icon_photo' => {
414
+ getter: {name: 'icon_photo', invoker: lambda { |widget, args| @tk.iconphoto }},
415
+ setter: {name: 'icon_photo=', invoker: lambda { |widget, args| @tk.iconphoto = image_argument(args) }},
416
+ },
383
417
  },
384
418
  }
385
419
  end
@@ -534,10 +568,12 @@ module Glimmer
534
568
 
535
569
  def method_missing(method, *args, &block)
536
570
  method = method.to_s
571
+ attribute_name = method.sub(/=$/, '')
572
+ args = normalize_attribute_arguments(attribute_name, args)
537
573
  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
574
  get_attribute(method)
539
575
  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)
576
+ set_attribute(attribute_name, *args)
541
577
  else
542
578
  tk.send(method, *args, &block)
543
579
  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', initial_color: '#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
@@ -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
 
@@ -25,7 +25,7 @@ include Glimmer
25
25
 
26
26
  root { |r|
27
27
  title 'Hello, Root!'
28
- iconphoto File.expand_path('../../icons/glimmer.png', __dir__)
28
+ icon_photo File.expand_path('../../icons/glimmer.png', __dir__)
29
29
  width 400
30
30
  height 200
31
31
  x -150
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.59
4
+ version: 0.0.62
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-21 00:00:00.000000000 Z
11
+ date: 2022-07-30 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