glimmer-dsl-tk 0.0.32 → 0.0.33
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +4 -4
- data/VERSION +1 -1
- data/glimmer-dsl-tk.gemspec +0 -0
- data/lib/glimmer/tk/entry_proxy.rb +1 -1
- data/lib/glimmer/tk/text_proxy.rb +82 -10
- data/samples/hello/hello_text.rb +20 -7
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33884eabc43f9c6b019d12a45f75e19212e2969d447f743e29e9db5cf81c615b
|
4
|
+
data.tar.gz: 0f0e3558279a70b03aaaf3e7733125eee5bfb5cce320ea34a6bc838803227755
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9dac142530aa07249e92dc4cc314a028f7652582562031b415eaab33ac5c0a1207ef2d4f7bbe330bf62715d78f71727a3ef9f26eb761e52efdcc03778a39ac7
|
7
|
+
data.tar.gz: 117a6cd4b7fd8472c87b8e4817097d3b6f1c0ff1f765c8fa851b239fff453bbcc2bc7dc69a800d1c9fbee6669b87f821f2d2fa8cef4a407b59c1607c582a0aaf
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.0.33
|
4
|
+
|
5
|
+
- Support `text` widget `InsertMarkMoved` listener event to track insert mark movement (or alises `InsertMarkMove`, `insert_mark_move`, `insert_mark_moved`, all case-insensitive)
|
6
|
+
- Support `entry` widget `changed` and `modified` listener event aliases for `change` event
|
7
|
+
- Autodiscover format options when moving cursor in `text` widget (auto-derive from applied tags and widget font) and show in top Hello, Text! toolbar comboboxes and buttons
|
8
|
+
- Fix issue with encountering error 'NoMethodError: undefined method "size" for' when launching Hello, Text!, performing Select-All (CMD+A or CONTROL+A) and then attempting to Bold all the text.
|
9
|
+
- Fix issue in Hello, Text! whereby bolding a small region of text affects the font of the following region of text till the end of the document
|
10
|
+
- Fix issue in Hello, Text! where if all text is copied and then pasted multiple times, the `text` widget loses its keyboard/mouse listeners and CMD+F does not work anymore to bring Find dialog
|
11
|
+
|
3
12
|
## 0.0.32
|
4
13
|
|
5
14
|
- Hello, Text! Find Dialog toolbar button
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for Tk 0.0.
|
1
|
+
# [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for Tk 0.0.33
|
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)
|
@@ -158,7 +158,7 @@ gem install glimmer-dsl-tk
|
|
158
158
|
|
159
159
|
Add the following to `Gemfile`:
|
160
160
|
```
|
161
|
-
gem 'glimmer-dsl-tk', '~> 0.0.
|
161
|
+
gem 'glimmer-dsl-tk', '~> 0.0.33'
|
162
162
|
```
|
163
163
|
|
164
164
|
And, then run:
|
@@ -273,7 +273,7 @@ keyword(args) | attributes | event bindings & callbacks
|
|
273
273
|
`choose_directory(options = nil)` | None | None
|
274
274
|
`choose_font(options = nil) {|font| ... }` | None | None
|
275
275
|
`combobox` | `state`, `text` | `'ComboboxSelected'`
|
276
|
-
`entry` | `width`, `text`, `validate`, `show` (`'none', 'focus', 'focusin', 'focusout', 'key', or 'all'`) | `'validate'`, `'invalid'`, `'change'
|
276
|
+
`entry` | `width`, `text`, `validate`, `show` (`'none', 'focus', 'focusin', 'focusout', 'key', or 'all'`) | `'validate'`, `'invalid'`, `'change'` (alias: `'changed'`), `validatecommand {}`, `invalidcommand {}`
|
277
277
|
`get_multiple_open_file(options = nil)` | None | None
|
278
278
|
`get_open_file(options = nil)` | None | None
|
279
279
|
`get_save_file(options = nil)` | None | None
|
@@ -286,7 +286,7 @@ keyword(args) | attributes | event bindings & callbacks
|
|
286
286
|
`radiobutton` | `text`, `variable` (Boolean), `image` (optional keyword args: `subsample`, `zoom`, `from`, `to`, `shrink`, `compositingrule`), `compound` (`'center', 'top', 'bottom', 'left', 'right'`), `value` (default: `text`) | `command {}`
|
287
287
|
`root` | `title`, `iconphoto`, `background`, `alpha`, `fullscreen?`, `topmost?`, `transparent?`, `stackorder`, `winfo_screendepth`, `winfo_screenvisual`, `winfo_screenwidth`, `winfo_screenheight`, `winfo_pixels('li')`, `winfo_screen`, `wm_maxsize`, `state` (`'normal', 'iconic', 'withdrawn', 'icon', 'zoomed'`) | `'DELETE_WINDOW'`, `'OPEN_WINDOW'`
|
288
288
|
`separator` | `orient` (`'horizontal' (default) or 'vertical'`) | None
|
289
|
-
`text` | `value`, [many more attributes](https://tcl.tk/man/tcl8.6/TkCmd/text.htm#M116) | `'modified'`, `'selection'`
|
289
|
+
`text` | `value`, [many more attributes](https://tcl.tk/man/tcl8.6/TkCmd/text.htm#M116) | `'modified'`, `'selection'`, `'insert_mark_moved'` (alias: `'insert_mark_move', 'InsertMarkMove', 'InsertMarkMoved'`)
|
290
290
|
|
291
291
|
Options for `get_open_file` and `get_multiple_open_file` include:
|
292
292
|
- `filetypes`: `Hash` of `'Group Name' => '.ext'` entries (e.g. `filetypes: {'PNG Images' => '.png'}`
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.33
|
data/glimmer-dsl-tk.gemspec
CHANGED
Binary file
|
@@ -27,33 +27,63 @@ module Glimmer
|
|
27
27
|
#
|
28
28
|
# Follows the Proxy Design Pattern
|
29
29
|
class TextProxy < WidgetProxy
|
30
|
+
ALL_TAG = '__all__'
|
31
|
+
FORMAT_DEFAULT_MAP = {
|
32
|
+
'justify' => 'left',
|
33
|
+
}
|
34
|
+
|
30
35
|
def handle_listener(listener_name, &listener)
|
31
36
|
case listener_name.to_s.downcase
|
32
37
|
when '<<modified>>', '<modified>', 'modified'
|
33
38
|
modified_listener = Proc.new do |*args|
|
34
39
|
listener.call(*args)
|
40
|
+
apply_all_tag
|
41
|
+
@insert_mark_moved_proc.call
|
35
42
|
@tk.modified = false
|
36
43
|
end
|
37
|
-
bind('<Modified>', modified_listener)
|
44
|
+
@tk.bind('<Modified>', modified_listener)
|
38
45
|
when '<<selection>>', '<selection>', 'selection'
|
39
|
-
bind('<Selection>', listener)
|
46
|
+
@tk.bind('<Selection>', listener)
|
40
47
|
when 'destroy'
|
41
48
|
super
|
49
|
+
when 'insertmarkmove', 'insertmarkmoved', 'insert_mark_move', 'insert_mark_moved'
|
50
|
+
if @insert_mark_moved_proc.nil?
|
51
|
+
handle_listener('KeyPress') do |event|
|
52
|
+
@insert_mark_moved_proc.call
|
53
|
+
end
|
54
|
+
handle_listener('KeyRelease') do |event|
|
55
|
+
@insert_mark_moved_proc.call
|
56
|
+
end
|
57
|
+
handle_listener('ButtonPress') do |event|
|
58
|
+
@insert_mark_moved_proc.call
|
59
|
+
end
|
60
|
+
handle_listener('ButtonRelease') do |event|
|
61
|
+
@insert_mark_moved_proc.call
|
62
|
+
end
|
63
|
+
end
|
64
|
+
@insert_mark = @tk.index('insert')
|
65
|
+
@insert_mark_moved_proc = Proc.new do
|
66
|
+
new_insert_mark = @tk.index('insert')
|
67
|
+
if new_insert_mark != @insert_mark
|
68
|
+
@insert_mark = new_insert_mark
|
69
|
+
listener.call(new_insert_mark)
|
70
|
+
end
|
71
|
+
end
|
42
72
|
else
|
43
|
-
|
73
|
+
apply_all_tag
|
44
74
|
# TODO make listener pass an event that has a modifiers attribute for easy representation of :shift, :meta, :control, etc... while a letter button is pressed
|
45
75
|
begin
|
46
|
-
@tk.tag_bind(
|
76
|
+
@tk.tag_bind(ALL_TAG, listener_name, &listener)
|
47
77
|
rescue => e
|
48
78
|
Glimmer::Config.logger.debug {"Unable to bind to #{listener_name} .. attempting to surround with <>"}
|
49
79
|
Glimmer::Config.logger.debug {e.full_message}
|
50
80
|
listener_name = "<#{listener_name}" if !listener_name.start_with?('<')
|
51
81
|
listener_name = "#{listener_name}>" if !listener_name.end_with?('>')
|
52
|
-
@tk.tag_bind(
|
82
|
+
@tk.tag_bind(ALL_TAG, listener_name, &listener)
|
53
83
|
end
|
54
84
|
end
|
55
85
|
end
|
56
|
-
|
86
|
+
|
57
87
|
def add_selection_format(option, value)
|
58
88
|
process_selection_ranges { |range_start, range_end| add_format(range_start, range_end, option, value) }
|
59
89
|
end
|
@@ -91,7 +121,7 @@ module Glimmer
|
|
91
121
|
end
|
92
122
|
|
93
123
|
def applied_format_tags(region_start, region_end, option, value)
|
94
|
-
tag_names = @tk.tag_names - ['sel']
|
124
|
+
tag_names = @tk.tag_names - ['sel', ALL_TAG]
|
95
125
|
|
96
126
|
tag_names.select do |tag_name|
|
97
127
|
@tk.tag_ranges(tag_name).any? do |range|
|
@@ -102,6 +132,23 @@ module Glimmer
|
|
102
132
|
end
|
103
133
|
end
|
104
134
|
|
135
|
+
def applied_format_value(text_index = nil, option)
|
136
|
+
text_index ||= @tk.index('insert')
|
137
|
+
region_start = text_index
|
138
|
+
region_end = text_index
|
139
|
+
tag_names = @tk.tag_names - ['sel', ALL_TAG]
|
140
|
+
|
141
|
+
values = tag_names.map do |tag_name|
|
142
|
+
@tk.tag_ranges(tag_name).map do |range|
|
143
|
+
if text_index_less_than_or_equal_to_other_text_index?(range.first, region_start) && text_index_greater_than_or_equal_to_other_text_index?(range.last, region_end)
|
144
|
+
@tk.tag_cget(tag_name, option)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end.flatten.reject {|value| value.to_s.empty?}
|
148
|
+
|
149
|
+
values.last || (@tk.send(option) rescue FORMAT_DEFAULT_MAP[option])
|
150
|
+
end
|
151
|
+
|
105
152
|
def add_format(region_start, region_end, option, value)
|
106
153
|
@@tag_number = 0 unless defined?(@@tag_number)
|
107
154
|
tag = "tag#{@@tag_number += 1}"
|
@@ -155,15 +202,14 @@ module Glimmer
|
|
155
202
|
def applied_font_format_tags_and_regions(region_start, region_end)
|
156
203
|
lines = value.split("\n")
|
157
204
|
tags_and_regions = []
|
158
|
-
all_tag_names = @tk.tag_names - ['sel']
|
205
|
+
all_tag_names = @tk.tag_names - ['sel', ALL_TAG]
|
159
206
|
(region_start.to_i..region_end.to_i).each do |line_number|
|
160
207
|
start_character_index = 0
|
161
208
|
start_character_index = region_start.to_s.split('.').last.to_i if line_number == region_start.to_i
|
162
|
-
end_character_index = lines[line_number - 1].size
|
209
|
+
end_character_index = lines[line_number - 1].to_s.size
|
163
210
|
end_character_index = region_end.to_s.split('.').last.to_i if line_number == region_end.to_i
|
164
211
|
(start_character_index...end_character_index).each do |character_index|
|
165
212
|
text_index = "#{line_number}.#{character_index}"
|
166
|
-
# TODO reimplement the following using @tk.tag_names without arg since passing an arg seems broken and returns inaccurate results
|
167
213
|
region_tag = all_tag_names.reverse.find do |tag|
|
168
214
|
@tk.tag_cget(tag, 'font') && @tk.tag_ranges(tag).any? do |range_start, range_end|
|
169
215
|
text_index_less_than_or_equal_to_other_text_index?(range_start, text_index) && text_index_greater_than_or_equal_to_other_text_index?(range_end, text_index)
|
@@ -179,6 +225,27 @@ module Glimmer
|
|
179
225
|
end
|
180
226
|
tags_and_regions
|
181
227
|
end
|
228
|
+
|
229
|
+
def applied_font_format_value(text_index = nil, font_option)
|
230
|
+
text_index ||= @tk.index('insert')
|
231
|
+
region_start = text_index
|
232
|
+
region_end = @tk.index("#{text_index} + 1 chars")
|
233
|
+
tag_names = applied_font_format_tags_and_regions(region_start, region_end).map(&:first)
|
234
|
+
|
235
|
+
values = tag_names.map do |tag_name|
|
236
|
+
@tk.tag_ranges(tag_name).map do |range|
|
237
|
+
if text_index_less_than_or_equal_to_other_text_index?(range.first, region_start) && text_index_greater_than_or_equal_to_other_text_index?(range.last, region_end)
|
238
|
+
@tk.tag_cget(tag_name, 'font')
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end.flatten.reject {|value| value.to_s.empty?}
|
242
|
+
|
243
|
+
font = values.last
|
244
|
+
|
245
|
+
value = font && font.send(font_option)
|
246
|
+
|
247
|
+
value || Hash[@tk.font.actual][font_option]
|
248
|
+
end
|
182
249
|
|
183
250
|
def add_font_format(region_start, region_end, font_option, value)
|
184
251
|
applied_font_format_tags_and_regions(region_start, region_end).each do |tag, tag_region_start, tag_region_end|
|
@@ -348,11 +415,16 @@ module Glimmer
|
|
348
415
|
self.wrap = 'none'
|
349
416
|
self.padx = 5
|
350
417
|
self.pady = 5
|
418
|
+
on('Modified') { apply_all_tag }
|
351
419
|
end
|
352
420
|
|
353
421
|
def clone_font(font)
|
354
422
|
::TkFont.new(Hash[font.actual])
|
355
423
|
end
|
424
|
+
|
425
|
+
def apply_all_tag
|
426
|
+
@tk.tag_add(ALL_TAG, '1.0', 'end')
|
427
|
+
end
|
356
428
|
end
|
357
429
|
end
|
358
430
|
end
|
data/samples/hello/hello_text.rb
CHANGED
@@ -143,7 +143,7 @@ class HelloText
|
|
143
143
|
orient 'vertical'
|
144
144
|
}
|
145
145
|
|
146
|
-
button {
|
146
|
+
@bold_button = button {
|
147
147
|
grid row: 1, column: column_index += 1, column_weight: 0
|
148
148
|
text 'B'
|
149
149
|
style font: {weight: 'bold'}
|
@@ -153,7 +153,7 @@ class HelloText
|
|
153
153
|
end
|
154
154
|
}
|
155
155
|
|
156
|
-
button {
|
156
|
+
@italic_button = button {
|
157
157
|
grid row: 1, column: column_index += 1, column_weight: 0
|
158
158
|
text 'I'
|
159
159
|
style font: {slant: 'italic'}
|
@@ -163,7 +163,7 @@ class HelloText
|
|
163
163
|
end
|
164
164
|
}
|
165
165
|
|
166
|
-
button {
|
166
|
+
@underline_button = button {
|
167
167
|
grid row: 1, column: column_index += 1, column_weight: 0
|
168
168
|
text 'U'
|
169
169
|
style font: {underline: true}
|
@@ -210,7 +210,7 @@ class HelloText
|
|
210
210
|
orient 'vertical'
|
211
211
|
}
|
212
212
|
|
213
|
-
button {
|
213
|
+
@justify_left_button = button {
|
214
214
|
grid row: 1, column: column_index += 1, column_weight: 0
|
215
215
|
image File.expand_path("images/align-left.png", __dir__), subsample: 32
|
216
216
|
|
@@ -219,7 +219,7 @@ class HelloText
|
|
219
219
|
end
|
220
220
|
}
|
221
221
|
|
222
|
-
button {
|
222
|
+
@justify_center_button = button {
|
223
223
|
grid row: 1, column: column_index += 1, column_weight: 0
|
224
224
|
image File.expand_path("images/align-center.png", __dir__), subsample: 32
|
225
225
|
|
@@ -228,7 +228,7 @@ class HelloText
|
|
228
228
|
end
|
229
229
|
}
|
230
230
|
|
231
|
-
button {
|
231
|
+
@justify_right_button = button {
|
232
232
|
grid row: 1, column: column_index += 1, column_weight: 0
|
233
233
|
image File.expand_path("images/align-right.png", __dir__), subsample: 32
|
234
234
|
|
@@ -293,6 +293,19 @@ class HelloText
|
|
293
293
|
on('KeyPress') do |event|
|
294
294
|
show_find_dialog if (event.keysym == 'f') && ((OS.mac? && event.state == 8) || (!OS.mac? && event.state == 4))
|
295
295
|
end
|
296
|
+
|
297
|
+
on('InsertMarkMoved') do
|
298
|
+
self.font_family = @text.applied_font_format_value('family')
|
299
|
+
self.font_size = @text.applied_font_format_value('size')
|
300
|
+
@bold_button.default = @text.applied_font_format_value('weight') == 'bold' ? 'active' : 'normal'
|
301
|
+
@italic_button.default = @text.applied_font_format_value('slant') == 'italic' ? 'active' : 'normal'
|
302
|
+
@underline_button.default = @text.applied_font_format_value('underline') == true ? 'active' : 'normal'
|
303
|
+
self.background = @text.applied_format_value('background')
|
304
|
+
self.foreground = @text.applied_format_value('foreground')
|
305
|
+
@justify_left_button.default = @text.applied_format_value('justify') == 'left' ? 'active' : 'normal'
|
306
|
+
@justify_center_button.default = @text.applied_format_value('justify') == 'center' ? 'active' : 'normal'
|
307
|
+
@justify_right_button.default = @text.applied_format_value('justify') == 'right' ? 'active' : 'normal'
|
308
|
+
end
|
296
309
|
}
|
297
310
|
}
|
298
311
|
@root.open
|
@@ -318,7 +331,7 @@ class HelloText
|
|
318
331
|
end
|
319
332
|
end
|
320
333
|
]
|
321
|
-
|
334
|
+
|
322
335
|
on('KeyPress') do |event|
|
323
336
|
if event.keysym == 'Return'
|
324
337
|
find
|
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.33
|
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-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: glimmer
|