glimmer-dsl-tk 0.0.33 → 0.0.34
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 +4 -4
- data/CHANGELOG.md +10 -1
- data/README.md +125 -47
- data/VERSION +1 -1
- data/glimmer-dsl-tk.gemspec +0 -0
- data/lib/glimmer/tk/text_proxy.rb +52 -23
- data/samples/hello/hello_text.rb +34 -38
- 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: 69e1f06607f60b2864e78e6e1eb9bfde7cf98f8d8eca2d14f12bf218d781dcb3
|
4
|
+
data.tar.gz: 7c552bb85c6b87eeefe8117b5f3d2df922ff27618f564e6dd37df63b57c17d98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a6dad9353a12a78f0e8c4a2be45e440c2bebb3e0998957447332d0ab65ec3668eb447395cb32bb8bfa4c6feed3bee991d78b07dbe500c3716e914ed0e51b312c
|
7
|
+
data.tar.gz: 36bfc6aa1b337b33b6c6a658549b603658677ea0e4e1840ec1ef58727bb12c76031d08b22fd50960001c2881819e7ec1a7e672f1c29e57d63797d0ea106531f0
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,17 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.0.34
|
4
|
+
|
5
|
+
- When applying a `text` selection format without having a selection, have it apply to current insert mark word
|
6
|
+
- Support registering multiple general event listeners on `text` widget (previously, later event listener registrations replaced former ones)
|
7
|
+
- Implement `:no_selection_default` option of `:insert_word`, `insert_letter`, or `none` for `text` selection formatting methods (`add_selection_format`, `remove_selection_format`, `toggle_selection_format`, `add_selection_font_format`, `remove_selection_font_format`, `toggle_selection_font_format`)
|
8
|
+
- Make sure to only allow `text` undo/redo when there are changes to be undoed/redoed
|
9
|
+
- Fix issue with Hello, Text! Find Dialog not coming up with keyboard shortcut (e.g. CMD+F) anymore
|
10
|
+
- Fix issue with Hello, Text! whereby after applying background, and foreground to a selection, you cannot apply bold, italic, or underline for the same selection (or font-size or font-family)
|
11
|
+
|
3
12
|
## 0.0.33
|
4
13
|
|
5
|
-
- Support `text` widget `InsertMarkMoved` listener event to track insert mark movement (or
|
14
|
+
- Support `text` widget `InsertMarkMoved` listener event to track insert mark movement (or aliases `InsertMarkMove`, `insert_mark_move`, `insert_mark_moved`, all case-insensitive)
|
6
15
|
- Support `entry` widget `changed` and `modified` listener event aliases for `change` event
|
7
16
|
- 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
17
|
- 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.
|
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.34
|
2
2
|
## MRI Ruby Desktop Development GUI Library
|
3
3
|
[](http://badge.fury.io/rb/glimmer-dsl-tk)
|
4
4
|
[](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.34'
|
162
162
|
```
|
163
163
|
|
164
164
|
And, then run:
|
@@ -349,15 +349,20 @@ The `text` widget is enhanced by [Glimmer DSL for Tk](https://rubygems.org/gems/
|
|
349
349
|
- `add_font_format(region_start, region_end, font_option, value)`
|
350
350
|
- `remove_font_format(region_start, region_end, font_option, value)`
|
351
351
|
- `toggle_font_format(region_start, region_end, font_option, value)`
|
352
|
-
- `add_selection_format(
|
353
|
-
- `remove_selection_format(
|
354
|
-
- `toggle_selection_format(
|
355
|
-
- `add_selection_font_format(
|
356
|
-
- `remove_selection_font_format(
|
357
|
-
- `toggle_selection_font_format(
|
352
|
+
- `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.
|
353
|
+
- `remove_selection_format(option, value, no_selection_default: :insert_word)`
|
354
|
+
- `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.
|
355
|
+
- `add_selection_font_format(font_option, value, no_selection_default: :insert_word)`
|
356
|
+
- `remove_selection_font_format(font_option, value, no_selection_default: :insert_word)`
|
357
|
+
- `toggle_selection_font_format(font_option, value, no_selection_default: :insert_word)`
|
358
358
|
- `text#insert_image(text_index, *image_args)`: inserts image into `text` `value` content at `text_index` location (e.g. `'insert'`)
|
359
359
|
- `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
|
360
360
|
|
361
|
+
The `:no_selection_default` keyword arg to `*_selection_*` methods determines what region to cover when no explicit selection is set:
|
362
|
+
- `:insert_word`: current word for insert mark
|
363
|
+
- `:insert_letter`: current letter for insert mark
|
364
|
+
- `:none`: no behavior when no selection is in place
|
365
|
+
|
361
366
|
Available options:
|
362
367
|
|
363
368
|
- `background`
|
@@ -731,6 +736,7 @@ More details can be found in the [Hello, Button!](#hello-button) sample below.
|
|
731
736
|
## Gotchas
|
732
737
|
|
733
738
|
- Setting `background` attribute on `frame` or `label` does not work in `'aqua'` theme on the Mac (only in `'classic'` theme)
|
739
|
+
- `text` widget does not track `KeyPress`/`KeyRelease` events perfectly (installed via `on()` listener keyword). It seems that when all text is deleted, it stops tracking key presses/releases until a number of new lines have been added to `text` `value` attribute
|
734
740
|
|
735
741
|
## Samples
|
736
742
|
|
@@ -1869,7 +1875,7 @@ Glimmer app:
|
|
1869
1875
|
|
1870
1876
|
### Hello, Text!
|
1871
1877
|
|
1872
|
-
You may
|
1878
|
+
You may press META+F to bring up the Find Dialog on the Mac and CONTROL+F to bring it up on Windows/Linux.
|
1873
1879
|
|
1874
1880
|
Icons used in this sample were made by <a href="https://www.flaticon.com/authors/freepik" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/" title="Flaticon"> www.flaticon.com</a>
|
1875
1881
|
|
@@ -1921,7 +1927,7 @@ class HelloText
|
|
1921
1927
|
MULTI_LINE_STRING
|
1922
1928
|
end
|
1923
1929
|
|
1924
|
-
attr_accessor :document
|
1930
|
+
attr_accessor :document, :find_text
|
1925
1931
|
|
1926
1932
|
attr_accessor :foreground
|
1927
1933
|
|
@@ -1947,8 +1953,16 @@ class HelloText
|
|
1947
1953
|
[FONT_SIZE_PROMPT] + (9..64).to_a.map(&:to_s)
|
1948
1954
|
end
|
1949
1955
|
|
1956
|
+
def find
|
1957
|
+
text_index = @text.search(/#{find_text}/i, @text.tag_ranges('sel')&.first&.last || @text.index('insert'))
|
1958
|
+
unless text_index.to_s.empty?
|
1959
|
+
@text.tag_remove('sel', '1.0', 'end')
|
1960
|
+
@text.tag_add('sel', text_index, "#{text_index} + #{find_text.size} chars")
|
1961
|
+
end
|
1962
|
+
end
|
1963
|
+
|
1950
1964
|
def launch
|
1951
|
-
root {
|
1965
|
+
@root = root {
|
1952
1966
|
title 'Hello, Text!'
|
1953
1967
|
width 1280
|
1954
1968
|
height 800
|
@@ -1956,11 +1970,6 @@ class HelloText
|
|
1956
1970
|
frame {
|
1957
1971
|
grid row: 0, column: 0
|
1958
1972
|
|
1959
|
-
label {
|
1960
|
-
grid row: 0, column: 0, columnspan: 17
|
1961
|
-
text 'Select a region of text and then apply formatting from the toolbar'
|
1962
|
-
}
|
1963
|
-
|
1964
1973
|
column_index = -1
|
1965
1974
|
|
1966
1975
|
combobox {
|
@@ -1992,7 +2001,7 @@ class HelloText
|
|
1992
2001
|
orient 'vertical'
|
1993
2002
|
}
|
1994
2003
|
|
1995
|
-
button {
|
2004
|
+
@bold_button = button {
|
1996
2005
|
grid row: 1, column: column_index += 1, column_weight: 0
|
1997
2006
|
text 'B'
|
1998
2007
|
style font: {weight: 'bold'}
|
@@ -2002,7 +2011,7 @@ class HelloText
|
|
2002
2011
|
end
|
2003
2012
|
}
|
2004
2013
|
|
2005
|
-
button {
|
2014
|
+
@italic_button = button {
|
2006
2015
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2007
2016
|
text 'I'
|
2008
2017
|
style font: {slant: 'italic'}
|
@@ -2012,7 +2021,7 @@ class HelloText
|
|
2012
2021
|
end
|
2013
2022
|
}
|
2014
2023
|
|
2015
|
-
button {
|
2024
|
+
@underline_button = button {
|
2016
2025
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2017
2026
|
text 'U'
|
2018
2027
|
style font: {underline: true}
|
@@ -2021,36 +2030,36 @@ class HelloText
|
|
2021
2030
|
@text.toggle_selection_font_format('underline', true)
|
2022
2031
|
end
|
2023
2032
|
}
|
2024
|
-
|
2033
|
+
|
2025
2034
|
separator {
|
2026
2035
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2027
2036
|
orient 'vertical'
|
2028
2037
|
}
|
2029
2038
|
|
2030
|
-
button {
|
2039
|
+
@justify_left_button = button {
|
2031
2040
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2032
|
-
image File.expand_path("images/
|
2041
|
+
image File.expand_path("images/align-left.png", __dir__), subsample: 32
|
2033
2042
|
|
2034
2043
|
on('command') do
|
2035
|
-
@text.
|
2044
|
+
@text.add_selection_format('justify', 'left')
|
2036
2045
|
end
|
2037
2046
|
}
|
2038
2047
|
|
2039
|
-
button {
|
2048
|
+
@justify_center_button = button {
|
2040
2049
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2041
|
-
image File.expand_path("images/
|
2050
|
+
image File.expand_path("images/align-center.png", __dir__), subsample: 32
|
2042
2051
|
|
2043
2052
|
on('command') do
|
2044
|
-
@text.
|
2053
|
+
@text.add_selection_format('justify', 'center')
|
2045
2054
|
end
|
2046
2055
|
}
|
2047
2056
|
|
2048
|
-
button {
|
2057
|
+
@justify_right_button = button {
|
2049
2058
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2050
|
-
image File.expand_path("images/
|
2059
|
+
image File.expand_path("images/align-right.png", __dir__), subsample: 32
|
2051
2060
|
|
2052
2061
|
on('command') do
|
2053
|
-
@text.
|
2062
|
+
@text.add_selection_format('justify', 'right')
|
2054
2063
|
end
|
2055
2064
|
}
|
2056
2065
|
|
@@ -2061,51 +2070,51 @@ class HelloText
|
|
2061
2070
|
|
2062
2071
|
button {
|
2063
2072
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2064
|
-
image File.expand_path("images/
|
2073
|
+
image File.expand_path("images/picture.png", __dir__), subsample: 32
|
2065
2074
|
|
2066
2075
|
on('command') do
|
2067
|
-
@text.
|
2076
|
+
@text.get_open_file_to_insert_image
|
2068
2077
|
end
|
2069
2078
|
}
|
2070
2079
|
|
2071
2080
|
button {
|
2072
2081
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2073
|
-
image File.expand_path("images/
|
2082
|
+
image File.expand_path("images/search.png", __dir__), subsample: 32
|
2074
2083
|
|
2075
2084
|
on('command') do
|
2076
|
-
|
2085
|
+
show_find_dialog
|
2077
2086
|
end
|
2078
2087
|
}
|
2079
2088
|
|
2089
|
+
separator {
|
2090
|
+
grid row: 1, column: column_index += 1, column_weight: 0
|
2091
|
+
orient 'vertical'
|
2092
|
+
}
|
2093
|
+
|
2080
2094
|
button {
|
2081
2095
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2082
|
-
image File.expand_path("images/
|
2096
|
+
image File.expand_path("images/cut.png", __dir__), subsample: 32
|
2083
2097
|
|
2084
2098
|
on('command') do
|
2085
|
-
@text.
|
2099
|
+
@text.text_cut
|
2086
2100
|
end
|
2087
2101
|
}
|
2088
2102
|
|
2089
|
-
separator {
|
2090
|
-
grid row: 1, column: column_index += 1, column_weight: 0
|
2091
|
-
orient 'vertical'
|
2092
|
-
}
|
2093
|
-
|
2094
2103
|
button {
|
2095
2104
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2096
|
-
image File.expand_path("images/
|
2105
|
+
image File.expand_path("images/copy.png", __dir__), subsample: 32
|
2097
2106
|
|
2098
2107
|
on('command') do
|
2099
|
-
@text.
|
2108
|
+
@text.text_copy
|
2100
2109
|
end
|
2101
2110
|
}
|
2102
2111
|
|
2103
2112
|
button {
|
2104
2113
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2105
|
-
image File.expand_path("images/
|
2114
|
+
image File.expand_path("images/paste.png", __dir__), subsample: 32
|
2106
2115
|
|
2107
2116
|
on('command') do
|
2108
|
-
@text.
|
2117
|
+
@text.text_paste
|
2109
2118
|
end
|
2110
2119
|
}
|
2111
2120
|
|
@@ -2114,12 +2123,22 @@ class HelloText
|
|
2114
2123
|
orient 'vertical'
|
2115
2124
|
}
|
2116
2125
|
|
2126
|
+
|
2117
2127
|
button {
|
2118
2128
|
grid row: 1, column: column_index += 1, column_weight: 0
|
2119
|
-
image File.expand_path("images/
|
2129
|
+
image File.expand_path("images/undo.png", __dir__), subsample: 32
|
2120
2130
|
|
2121
2131
|
on('command') do
|
2122
|
-
@text.
|
2132
|
+
@text.edit_undo
|
2133
|
+
end
|
2134
|
+
}
|
2135
|
+
|
2136
|
+
button {
|
2137
|
+
grid row: 1, column: column_index += 1, column_weight: 0
|
2138
|
+
image File.expand_path("images/redo.png", __dir__), subsample: 32
|
2139
|
+
|
2140
|
+
on('command') do
|
2141
|
+
@text.edit_redo
|
2123
2142
|
end
|
2124
2143
|
}
|
2125
2144
|
}
|
@@ -2129,8 +2148,67 @@ class HelloText
|
|
2129
2148
|
wrap 'word'
|
2130
2149
|
undo true
|
2131
2150
|
value <=> [self, :document]
|
2151
|
+
|
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
|
+
on('InsertMarkMoved') do
|
2157
|
+
self.font_family = @text.applied_font_format_value('family')
|
2158
|
+
self.font_size = @text.applied_font_format_value('size')
|
2159
|
+
@bold_button.default = @text.applied_font_format_value('weight') == 'bold' ? 'active' : 'normal'
|
2160
|
+
@italic_button.default = @text.applied_font_format_value('slant') == 'italic' ? 'active' : 'normal'
|
2161
|
+
@underline_button.default = @text.applied_font_format_value('underline') == true ? 'active' : 'normal'
|
2162
|
+
self.background = @text.applied_format_value('background')
|
2163
|
+
self.foreground = @text.applied_format_value('foreground')
|
2164
|
+
@justify_left_button.default = @text.applied_format_value('justify') == 'left' ? 'active' : 'normal'
|
2165
|
+
@justify_center_button.default = @text.applied_format_value('justify') == 'center' ? 'active' : 'normal'
|
2166
|
+
@justify_right_button.default = @text.applied_format_value('justify') == 'right' ? 'active' : 'normal'
|
2167
|
+
end
|
2132
2168
|
}
|
2133
|
-
}
|
2169
|
+
}
|
2170
|
+
@root.open
|
2171
|
+
end
|
2172
|
+
|
2173
|
+
def show_find_dialog
|
2174
|
+
toplevel(@root) { |tl|
|
2175
|
+
title 'Find'
|
2176
|
+
|
2177
|
+
label {
|
2178
|
+
text 'Text:'
|
2179
|
+
}
|
2180
|
+
entry { |e|
|
2181
|
+
focus true
|
2182
|
+
text <=> [
|
2183
|
+
self,
|
2184
|
+
:find_text,
|
2185
|
+
after_write: lambda do
|
2186
|
+
text_index = @text.search(/#{find_text}/i, 'insert')
|
2187
|
+
unless text_index.to_s.empty?
|
2188
|
+
@text.tag_remove('sel', '1.0', 'end')
|
2189
|
+
@text.tag_add('sel', text_index, "#{text_index} + #{find_text.size} chars")
|
2190
|
+
end
|
2191
|
+
end
|
2192
|
+
]
|
2193
|
+
|
2194
|
+
on('KeyPress') do |event|
|
2195
|
+
if event.keysym == 'Return'
|
2196
|
+
find
|
2197
|
+
elsif event.keysym == 'Escape'
|
2198
|
+
tl.grab_release
|
2199
|
+
tl.destroy
|
2200
|
+
end
|
2201
|
+
end
|
2202
|
+
}
|
2203
|
+
button {
|
2204
|
+
text 'Find'
|
2205
|
+
default 'active'
|
2206
|
+
|
2207
|
+
on('command') do
|
2208
|
+
find
|
2209
|
+
end
|
2210
|
+
}
|
2211
|
+
}
|
2134
2212
|
end
|
2135
2213
|
end
|
2136
2214
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.34
|
data/glimmer-dsl-tk.gemspec
CHANGED
Binary file
|
@@ -36,9 +36,11 @@ module Glimmer
|
|
36
36
|
case listener_name.to_s.downcase
|
37
37
|
when '<<modified>>', '<modified>', 'modified'
|
38
38
|
modified_listener = Proc.new do |*args|
|
39
|
+
@modified_count ||= 0
|
40
|
+
@modified_count += 1
|
39
41
|
listener.call(*args)
|
40
42
|
apply_all_tag
|
41
|
-
@insert_mark_moved_proc
|
43
|
+
@insert_mark_moved_proc&.call
|
42
44
|
@tk.modified = false
|
43
45
|
end
|
44
46
|
@tk.bind('<Modified>', modified_listener)
|
@@ -49,16 +51,16 @@ module Glimmer
|
|
49
51
|
when 'insertmarkmove', 'insertmarkmoved', 'insert_mark_move', 'insert_mark_moved'
|
50
52
|
if @insert_mark_moved_proc.nil?
|
51
53
|
handle_listener('KeyPress') do |event|
|
52
|
-
@insert_mark_moved_proc
|
54
|
+
@insert_mark_moved_proc&.call
|
53
55
|
end
|
54
56
|
handle_listener('KeyRelease') do |event|
|
55
|
-
@insert_mark_moved_proc
|
57
|
+
@insert_mark_moved_proc&.call
|
56
58
|
end
|
57
59
|
handle_listener('ButtonPress') do |event|
|
58
|
-
@insert_mark_moved_proc
|
60
|
+
@insert_mark_moved_proc&.call
|
59
61
|
end
|
60
62
|
handle_listener('ButtonRelease') do |event|
|
61
|
-
@insert_mark_moved_proc
|
63
|
+
@insert_mark_moved_proc&.call
|
62
64
|
end
|
63
65
|
end
|
64
66
|
@insert_mark = @tk.index('insert')
|
@@ -72,44 +74,71 @@ module Glimmer
|
|
72
74
|
else
|
73
75
|
apply_all_tag
|
74
76
|
# 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
|
77
|
+
@listeners ||= {}
|
75
78
|
begin
|
76
|
-
@
|
79
|
+
@listeners[listener_name] ||= []
|
80
|
+
@tk.tag_bind(ALL_TAG, listener_name) { |event| @listeners[listener_name].each {|l| l.call(event)} } if @listeners[listener_name].empty?
|
81
|
+
@listeners[listener_name] << listener
|
77
82
|
rescue => e
|
83
|
+
@listeners.delete(listener_name)
|
78
84
|
Glimmer::Config.logger.debug {"Unable to bind to #{listener_name} .. attempting to surround with <>"}
|
79
85
|
Glimmer::Config.logger.debug {e.full_message}
|
80
86
|
listener_name = "<#{listener_name}" if !listener_name.start_with?('<')
|
81
87
|
listener_name = "#{listener_name}>" if !listener_name.end_with?('>')
|
82
|
-
@
|
88
|
+
@listeners[listener_name] ||= []
|
89
|
+
@tk.tag_bind(ALL_TAG, listener_name) { |event| @listeners[listener_name].each {|l| l.call(event)} } if @listeners[listener_name].empty?
|
90
|
+
@listeners[listener_name] << listener
|
83
91
|
end
|
84
92
|
end
|
85
93
|
end
|
86
94
|
|
87
|
-
def
|
88
|
-
|
95
|
+
def edit_undo
|
96
|
+
@tk.edit_undo if @modified_count.to_i > 2 # <Modified> fires twice the first time, which is equivalent to one change.
|
89
97
|
end
|
90
98
|
|
91
|
-
def
|
92
|
-
|
99
|
+
def edit_redo
|
100
|
+
begin
|
101
|
+
@tk.edit_redo
|
102
|
+
rescue => e
|
103
|
+
# No Op
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def add_selection_format(option, value, no_selection_default: :insert_word)
|
108
|
+
process_selection_ranges(no_selection_default: no_selection_default) { |range_start, range_end| add_format(range_start, range_end, option, value) }
|
93
109
|
end
|
94
110
|
|
95
|
-
def
|
96
|
-
process_selection_ranges { |range_start, range_end|
|
111
|
+
def remove_selection_format(option, value, no_selection_default: :insert_word)
|
112
|
+
process_selection_ranges(no_selection_default: no_selection_default) { |range_start, range_end| remove_format(range_start, range_end, option, value) }
|
97
113
|
end
|
98
114
|
|
99
|
-
def
|
100
|
-
process_selection_ranges { |range_start, range_end|
|
115
|
+
def toggle_selection_format(option, value, no_selection_default: :insert_word)
|
116
|
+
process_selection_ranges(no_selection_default: no_selection_default) { |range_start, range_end| toggle_format(range_start, range_end, option, value) }
|
101
117
|
end
|
102
118
|
|
103
|
-
def
|
104
|
-
process_selection_ranges { |range_start, range_end|
|
119
|
+
def add_selection_font_format(option, value, no_selection_default: :insert_word)
|
120
|
+
process_selection_ranges(no_selection_default: no_selection_default) { |range_start, range_end| add_font_format(range_start, range_end, option, value) }
|
105
121
|
end
|
106
122
|
|
107
|
-
def
|
108
|
-
process_selection_ranges { |range_start, range_end|
|
123
|
+
def remove_selection_font_format(option, value, no_selection_default: :insert_word)
|
124
|
+
process_selection_ranges(no_selection_default: no_selection_default) { |range_start, range_end| remove_font_format(range_start, range_end, option, value) }
|
109
125
|
end
|
110
126
|
|
111
|
-
def
|
112
|
-
|
127
|
+
def toggle_selection_font_format(option, value, no_selection_default: :insert_word)
|
128
|
+
process_selection_ranges(no_selection_default: no_selection_default) { |range_start, range_end| toggle_font_format(range_start, range_end, option, value) }
|
129
|
+
end
|
130
|
+
|
131
|
+
def process_selection_ranges(no_selection_default: :insert_word, &processor)
|
132
|
+
regions = @tk.tag_ranges('sel')
|
133
|
+
if regions.empty?
|
134
|
+
case no_selection_default
|
135
|
+
when :insert_word
|
136
|
+
regions = [[@tk.index('insert wordstart'), @tk.index('insert wordend + 1 char')]]
|
137
|
+
when :insert_letter
|
138
|
+
regions = [[@tk.index('insert'), @tk.index('insert + 1 char')]]
|
139
|
+
end
|
140
|
+
end
|
141
|
+
regions.each do |region|
|
113
142
|
range_start = region.first
|
114
143
|
range_end = region.last
|
115
144
|
processor.call(range_start, range_end)
|
@@ -151,7 +180,7 @@ module Glimmer
|
|
151
180
|
|
152
181
|
def add_format(region_start, region_end, option, value)
|
153
182
|
@@tag_number = 0 unless defined?(@@tag_number)
|
154
|
-
tag = "
|
183
|
+
tag = "tag_#{option}_#{@@tag_number += 1}"
|
155
184
|
@tk.tag_configure(tag, {option => value})
|
156
185
|
@tk.tag_add(tag, region_start, region_end)
|
157
186
|
tag
|
@@ -202,7 +231,7 @@ module Glimmer
|
|
202
231
|
def applied_font_format_tags_and_regions(region_start, region_end)
|
203
232
|
lines = value.split("\n")
|
204
233
|
tags_and_regions = []
|
205
|
-
all_tag_names = @tk.tag_names - ['sel', ALL_TAG]
|
234
|
+
all_tag_names = (@tk.tag_names - ['sel', ALL_TAG]).select {|tag_name| tag_name.include?('_font_')}
|
206
235
|
(region_start.to_i..region_end.to_i).each do |line_number|
|
207
236
|
start_character_index = 0
|
208
237
|
start_character_index = region_start.to_s.split('.').last.to_i if line_number == region_start.to_i
|
data/samples/hello/hello_text.rb
CHANGED
@@ -107,11 +107,6 @@ class HelloText
|
|
107
107
|
frame {
|
108
108
|
grid row: 0, column: 0
|
109
109
|
|
110
|
-
label {
|
111
|
-
grid row: 0, column: 0, columnspan: 17
|
112
|
-
text 'Select a region of text and then apply formatting from the toolbar'
|
113
|
-
}
|
114
|
-
|
115
110
|
column_index = -1
|
116
111
|
|
117
112
|
combobox {
|
@@ -172,36 +167,36 @@ class HelloText
|
|
172
167
|
@text.toggle_selection_font_format('underline', true)
|
173
168
|
end
|
174
169
|
}
|
175
|
-
|
170
|
+
|
176
171
|
separator {
|
177
172
|
grid row: 1, column: column_index += 1, column_weight: 0
|
178
173
|
orient 'vertical'
|
179
174
|
}
|
180
175
|
|
181
|
-
button {
|
176
|
+
@justify_left_button = button {
|
182
177
|
grid row: 1, column: column_index += 1, column_weight: 0
|
183
|
-
image File.expand_path("images/
|
178
|
+
image File.expand_path("images/align-left.png", __dir__), subsample: 32
|
184
179
|
|
185
180
|
on('command') do
|
186
|
-
@text.
|
181
|
+
@text.add_selection_format('justify', 'left')
|
187
182
|
end
|
188
183
|
}
|
189
184
|
|
190
|
-
button {
|
185
|
+
@justify_center_button = button {
|
191
186
|
grid row: 1, column: column_index += 1, column_weight: 0
|
192
|
-
image File.expand_path("images/
|
187
|
+
image File.expand_path("images/align-center.png", __dir__), subsample: 32
|
193
188
|
|
194
189
|
on('command') do
|
195
|
-
@text.
|
190
|
+
@text.add_selection_format('justify', 'center')
|
196
191
|
end
|
197
192
|
}
|
198
193
|
|
199
|
-
button {
|
194
|
+
@justify_right_button = button {
|
200
195
|
grid row: 1, column: column_index += 1, column_weight: 0
|
201
|
-
image File.expand_path("images/
|
196
|
+
image File.expand_path("images/align-right.png", __dir__), subsample: 32
|
202
197
|
|
203
198
|
on('command') do
|
204
|
-
@text.
|
199
|
+
@text.add_selection_format('justify', 'right')
|
205
200
|
end
|
206
201
|
}
|
207
202
|
|
@@ -210,53 +205,53 @@ class HelloText
|
|
210
205
|
orient 'vertical'
|
211
206
|
}
|
212
207
|
|
213
|
-
|
208
|
+
button {
|
214
209
|
grid row: 1, column: column_index += 1, column_weight: 0
|
215
|
-
image File.expand_path("images/
|
210
|
+
image File.expand_path("images/picture.png", __dir__), subsample: 32
|
216
211
|
|
217
212
|
on('command') do
|
218
|
-
@text.
|
213
|
+
@text.get_open_file_to_insert_image
|
219
214
|
end
|
220
215
|
}
|
221
216
|
|
222
|
-
|
217
|
+
button {
|
223
218
|
grid row: 1, column: column_index += 1, column_weight: 0
|
224
|
-
image File.expand_path("images/
|
219
|
+
image File.expand_path("images/search.png", __dir__), subsample: 32
|
225
220
|
|
226
221
|
on('command') do
|
227
|
-
|
222
|
+
show_find_dialog
|
228
223
|
end
|
229
224
|
}
|
230
225
|
|
231
|
-
|
226
|
+
separator {
|
232
227
|
grid row: 1, column: column_index += 1, column_weight: 0
|
233
|
-
|
234
|
-
|
235
|
-
on('command') do
|
236
|
-
@text.add_selection_format('justify', 'right')
|
237
|
-
end
|
228
|
+
orient 'vertical'
|
238
229
|
}
|
239
230
|
|
240
|
-
|
231
|
+
button {
|
241
232
|
grid row: 1, column: column_index += 1, column_weight: 0
|
242
|
-
|
233
|
+
image File.expand_path("images/cut.png", __dir__), subsample: 32
|
234
|
+
|
235
|
+
on('command') do
|
236
|
+
@text.text_cut
|
237
|
+
end
|
243
238
|
}
|
244
239
|
|
245
240
|
button {
|
246
241
|
grid row: 1, column: column_index += 1, column_weight: 0
|
247
|
-
image File.expand_path("images/
|
242
|
+
image File.expand_path("images/copy.png", __dir__), subsample: 32
|
248
243
|
|
249
244
|
on('command') do
|
250
|
-
@text.
|
245
|
+
@text.text_copy
|
251
246
|
end
|
252
247
|
}
|
253
248
|
|
254
249
|
button {
|
255
250
|
grid row: 1, column: column_index += 1, column_weight: 0
|
256
|
-
image File.expand_path("images/
|
251
|
+
image File.expand_path("images/paste.png", __dir__), subsample: 32
|
257
252
|
|
258
253
|
on('command') do
|
259
|
-
@text.
|
254
|
+
@text.text_paste
|
260
255
|
end
|
261
256
|
}
|
262
257
|
|
@@ -265,21 +260,22 @@ class HelloText
|
|
265
260
|
orient 'vertical'
|
266
261
|
}
|
267
262
|
|
263
|
+
|
268
264
|
button {
|
269
265
|
grid row: 1, column: column_index += 1, column_weight: 0
|
270
|
-
image File.expand_path("images/
|
266
|
+
image File.expand_path("images/undo.png", __dir__), subsample: 32
|
271
267
|
|
272
268
|
on('command') do
|
273
|
-
@text.
|
269
|
+
@text.edit_undo
|
274
270
|
end
|
275
271
|
}
|
276
272
|
|
277
273
|
button {
|
278
274
|
grid row: 1, column: column_index += 1, column_weight: 0
|
279
|
-
image File.expand_path("images/
|
275
|
+
image File.expand_path("images/redo.png", __dir__), subsample: 32
|
280
276
|
|
281
277
|
on('command') do
|
282
|
-
|
278
|
+
@text.edit_redo
|
283
279
|
end
|
284
280
|
}
|
285
281
|
}
|
@@ -293,7 +289,7 @@ class HelloText
|
|
293
289
|
on('KeyPress') do |event|
|
294
290
|
show_find_dialog if (event.keysym == 'f') && ((OS.mac? && event.state == 8) || (!OS.mac? && event.state == 4))
|
295
291
|
end
|
296
|
-
|
292
|
+
|
297
293
|
on('InsertMarkMoved') do
|
298
294
|
self.font_family = @text.applied_font_format_value('family')
|
299
295
|
self.font_size = @text.applied_font_format_value('size')
|
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.34
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- AndyMaleh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: glimmer
|