glimmer-dsl-libui 0.7.2 → 0.7.3
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 +6 -0
- data/README.md +4 -3
- data/VERSION +1 -1
- data/docs/examples/GLIMMER-DSL-LIBUI-BASIC-EXAMPLES.md +8 -2
- data/examples/basic_table_selection2.rb +311 -0
- data/glimmer-dsl-libui.gemspec +0 -0
- data/lib/glimmer/libui/control_proxy/column.rb +9 -0
- data/lib/glimmer/libui/control_proxy/table_proxy.rb +6 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c1ff2eeecd4520bb427d6a2ca0abb85ea41f5b3b92d859253b59c9574c6c899
|
4
|
+
data.tar.gz: 907fa263dc715be72bf022258da6cb58aaef70e2d647ee17c29f9eda942547e5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f8cd302076fc5e5cdced272facbd12c9af556cc0c5d1c2a3cdd271676316c80f302b496613334db749c67a8ecff2ca88bb50b3157583bce693ea7a9f77b277b
|
7
|
+
data.tar.gz: f5062b028e2c4ca0eb1e804842d7940f43c4bfb8d1212b9075a0ca223c71f9730bb36c83345029e4d4eaee30d6056851621e4726d619c7f5209c0b08bde9f74d
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.7.3
|
4
|
+
|
5
|
+
- `table` `selection` data-binding support
|
6
|
+
- `table` column `sort_indicator` data-binding support
|
7
|
+
- New `examples/basic_table_selection2.rb` that uses `selection`, `selection_mode`, `header_visible`, and `sort_indicator` data-binding support
|
8
|
+
|
3
9
|
## 0.7.2
|
4
10
|
|
5
11
|
- `table` `on_selection_changed` listener arguments now provide extra arguments of `selection`, `added_selection`, `removed_selection` after first argument (`table`)
|
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 LibUI 0.7.
|
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 LibUI 0.7.3
|
2
2
|
## Prerequisite-Free Ruby Desktop Development GUI Library
|
3
3
|
### The Quickest Way From Zero To GUI
|
4
4
|
[](http://badge.fury.io/rb/glimmer-dsl-libui)
|
@@ -544,7 +544,7 @@ gem install glimmer-dsl-libui
|
|
544
544
|
Or install via Bundler `Gemfile`:
|
545
545
|
|
546
546
|
```ruby
|
547
|
-
gem 'glimmer-dsl-libui', '~> 0.7.
|
547
|
+
gem 'glimmer-dsl-libui', '~> 0.7.3'
|
548
548
|
```
|
549
549
|
|
550
550
|
Test that installation worked by running the [Meta-Example](#examples):
|
@@ -1976,7 +1976,8 @@ Data-binding supports utilizing the [MVP (Model View Presenter)](https://en.wiki
|
|
1976
1976
|
- `search_entry`: `text`
|
1977
1977
|
- `slider`: `value`
|
1978
1978
|
- `spinbox`: `value`
|
1979
|
-
- `table`: `cell_rows`
|
1979
|
+
- `table`: `cell_rows`, `selection`
|
1980
|
+
- `table` columns (e.g. `text_column`): `sort_indicator`
|
1980
1981
|
- `time_picker`: `time`
|
1981
1982
|
|
1982
1983
|
Example of bidirectional data-binding:
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.7.
|
1
|
+
0.7.3
|
@@ -1506,8 +1506,6 @@ Mac | Windows | Linux
|
|
1506
1506
|
|
1507
1507
|
## Basic Table Selection
|
1508
1508
|
|
1509
|
-
[examples/basic_table_selection.rb](/examples/basic_table_selection.rb)
|
1510
|
-
|
1511
1509
|
Run with this command from the root of the project if you cloned the project:
|
1512
1510
|
|
1513
1511
|
```
|
@@ -1526,6 +1524,14 @@ ruby -r glimmer-dsl-libui -e "require 'examples/basic_table_selection'"
|
|
1526
1524
|

|
1527
1525
|

|
1528
1526
|
|
1527
|
+
Version 1 (without data-binding):
|
1528
|
+
|
1529
|
+
[examples/basic_table_selection.rb](/examples/basic_table_selection.rb)
|
1530
|
+
|
1531
|
+
Version 2 (with data-binding):
|
1532
|
+
|
1533
|
+
[examples/basic_table_selection2.rb](/examples/basic_table_selection2.rb)
|
1534
|
+
|
1529
1535
|
## Basic Area
|
1530
1536
|
|
1531
1537
|
[examples/basic_area.rb](/examples/basic_area.rb)
|
@@ -0,0 +1,311 @@
|
|
1
|
+
require 'glimmer-dsl-libui'
|
2
|
+
|
3
|
+
class BasicTableSelection
|
4
|
+
TableColumnPresenter = Struct.new(:name,
|
5
|
+
:column,
|
6
|
+
:sort_indicator,
|
7
|
+
:table_presenter,
|
8
|
+
keyword_init: true) do
|
9
|
+
def toggle_sort_indicator
|
10
|
+
self.sort_indicator = self.sort_indicator != :ascending ? :ascending : :descending
|
11
|
+
end
|
12
|
+
|
13
|
+
def sort
|
14
|
+
selected_data = table_presenter.selection_mode == :zero_or_many ? table_presenter.selected_rows : table_presenter.selected_row
|
15
|
+
toggle_sort_indicator
|
16
|
+
table_presenter.data.sort_by! { |row_data| row_data[column] }
|
17
|
+
table_presenter.data.reverse! if sort_indicator == :descending
|
18
|
+
table_presenter.selection = table_presenter.selection_mode == :zero_or_many ? selected_data&.map { |selected_row| table_presenter.data.index(selected_row) } : table_presenter.data.index(selected_data)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
TablePresenter = Struct.new(:data,
|
23
|
+
:column_names,
|
24
|
+
:selection_mode,
|
25
|
+
:selection,
|
26
|
+
:header_visible,
|
27
|
+
keyword_init: true) do
|
28
|
+
def selection_items
|
29
|
+
data.size.times.map { |row| "Row #{row} Selection" }
|
30
|
+
end
|
31
|
+
|
32
|
+
def toggle_header_visible
|
33
|
+
self.header_visible = !(header_visible.nil? || header_visible)
|
34
|
+
end
|
35
|
+
|
36
|
+
def column_presenters
|
37
|
+
@column_presenters ||= column_names.each_with_index.map do |column_name, column|
|
38
|
+
TableColumnPresenter.new(name: column_name, column: column, table_presenter: self)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def selected_row
|
43
|
+
selection && data[selection]
|
44
|
+
end
|
45
|
+
|
46
|
+
def selected_rows
|
47
|
+
selection && selection.is_a?(Array) && selection.map { |row| data[row] }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
include Glimmer::LibUI::Application
|
52
|
+
|
53
|
+
before_body do
|
54
|
+
data = [
|
55
|
+
%w[cat meow],
|
56
|
+
%w[dog woof],
|
57
|
+
%w[chicken cock-a-doodle-doo],
|
58
|
+
%w[horse neigh],
|
59
|
+
%w[cow moo]
|
60
|
+
]
|
61
|
+
@one_table_presenter = TablePresenter.new(
|
62
|
+
data: data.dup,
|
63
|
+
column_names: ['Name', 'Description'],
|
64
|
+
selection_mode: :one, # other values are :zero_or_many , :zero_or_one, :none (default is :zero_or_one if not specified)
|
65
|
+
selection: 2, # initial selection row index (could be nil too or just left off, defaulting to 0)
|
66
|
+
header_visible: nil, # defaults to true
|
67
|
+
)
|
68
|
+
@zero_or_one_table_presenter = TablePresenter.new(
|
69
|
+
data: data.dup,
|
70
|
+
column_names: ['Name', 'Description'],
|
71
|
+
selection_mode: :zero_or_one, # other values are :zero_or_many , :one, :none (default is :zero_or_one if not specified)
|
72
|
+
selection: nil, # initial selection row index (could be an integer too or just left off, defaulting to nil)
|
73
|
+
header_visible: nil, # defaults to true
|
74
|
+
)
|
75
|
+
@zero_or_many_table_presenter = TablePresenter.new(
|
76
|
+
data: data.dup,
|
77
|
+
column_names: ['Name', 'Description'],
|
78
|
+
selection_mode: :zero_or_many, # other values are :zero_or_many , :one, :none (default is :zero_or_one if not specified)
|
79
|
+
selection: [0, 2, 4], # initial selection row index (could be an integer too or just left off, defaulting to nil)
|
80
|
+
header_visible: nil, # defaults to true
|
81
|
+
)
|
82
|
+
@none_table_presenter = TablePresenter.new(
|
83
|
+
data: data.dup,
|
84
|
+
column_names: ['Name', 'Description'],
|
85
|
+
selection_mode: :none, # other values are :zero_or_many , :zero_or_one, :one (default is :zero_or_one if not specified)
|
86
|
+
selection: nil, # defaults to nil
|
87
|
+
header_visible: nil, # defaults to true
|
88
|
+
)
|
89
|
+
end
|
90
|
+
|
91
|
+
body {
|
92
|
+
window('Basic Table Selection', 400, 300) {
|
93
|
+
tab {
|
94
|
+
tab_item('One') {
|
95
|
+
vertical_box {
|
96
|
+
vertical_box {
|
97
|
+
stretchy false
|
98
|
+
|
99
|
+
@one_table_selection_radio_buttons = radio_buttons {
|
100
|
+
items @one_table_presenter.selection_items
|
101
|
+
selected <=> [@one_table_presenter, :selection]
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
button('Toggle Table Header Visibility') {
|
106
|
+
stretchy false
|
107
|
+
|
108
|
+
on_clicked do
|
109
|
+
@one_table_presenter.toggle_header_visible
|
110
|
+
end
|
111
|
+
}
|
112
|
+
|
113
|
+
@one_table = table {
|
114
|
+
@one_table_presenter.column_presenters.each do |column_presenter|
|
115
|
+
text_column(column_presenter.name) {
|
116
|
+
sort_indicator <=> [column_presenter, :sort_indicator]
|
117
|
+
|
118
|
+
on_clicked do |tc, column|
|
119
|
+
puts "Clicked column #{column}: #{tc.name}"
|
120
|
+
column_presenter.sort
|
121
|
+
end
|
122
|
+
}
|
123
|
+
end
|
124
|
+
|
125
|
+
cell_rows @one_table_presenter.data
|
126
|
+
selection_mode <= [@one_table_presenter, :selection_mode]
|
127
|
+
selection <=> [@one_table_presenter, :selection]
|
128
|
+
header_visible <= [@one_table_presenter, :header_visible]
|
129
|
+
|
130
|
+
on_row_clicked do |t, row|
|
131
|
+
puts "Row Clicked: #{row}"
|
132
|
+
end
|
133
|
+
|
134
|
+
on_row_double_clicked do |t, row|
|
135
|
+
puts "Row Double Clicked: #{row}"
|
136
|
+
end
|
137
|
+
|
138
|
+
on_selection_changed do |t, selection, added_selection, removed_selection|
|
139
|
+
# selection is an array or nil if selection mode is zero_or_many
|
140
|
+
# otherwise, selection is a single index integer or nil when not selected
|
141
|
+
puts "Selection Changed: #{selection.inspect}"
|
142
|
+
puts "Added Selection: #{added_selection.inspect}"
|
143
|
+
puts "Removed Selection: #{removed_selection.inspect}"
|
144
|
+
end
|
145
|
+
}
|
146
|
+
}
|
147
|
+
}
|
148
|
+
|
149
|
+
tab_item('Zero-Or-One') {
|
150
|
+
vertical_box {
|
151
|
+
vertical_box {
|
152
|
+
stretchy false
|
153
|
+
|
154
|
+
@zero_or_one_table_selection_radio_buttons = radio_buttons {
|
155
|
+
items @zero_or_one_table_presenter.selection_items
|
156
|
+
selected <=> [@zero_or_one_table_presenter, :selection]
|
157
|
+
}
|
158
|
+
}
|
159
|
+
|
160
|
+
button('Toggle Table Header Visibility') {
|
161
|
+
stretchy false
|
162
|
+
|
163
|
+
on_clicked do
|
164
|
+
@zero_or_one_table_presenter.toggle_header_visible
|
165
|
+
end
|
166
|
+
}
|
167
|
+
|
168
|
+
@zero_or_one_table = table {
|
169
|
+
@zero_or_one_table_presenter.column_presenters.each do |column_presenter|
|
170
|
+
text_column(column_presenter.name) {
|
171
|
+
sort_indicator <=> [column_presenter, :sort_indicator]
|
172
|
+
|
173
|
+
on_clicked do |tc, column|
|
174
|
+
puts "Clicked column #{column}: #{tc.name}"
|
175
|
+
column_presenter.sort
|
176
|
+
end
|
177
|
+
}
|
178
|
+
end
|
179
|
+
|
180
|
+
cell_rows @zero_or_one_table_presenter.data
|
181
|
+
selection_mode <= [@zero_or_one_table_presenter, :selection_mode]
|
182
|
+
selection <=> [@zero_or_one_table_presenter, :selection]
|
183
|
+
header_visible <= [@zero_or_one_table_presenter, :header_visible]
|
184
|
+
|
185
|
+
on_row_clicked do |t, row|
|
186
|
+
puts "Row Clicked: #{row}"
|
187
|
+
end
|
188
|
+
|
189
|
+
on_row_double_clicked do |t, row|
|
190
|
+
puts "Row Double Clicked: #{row}"
|
191
|
+
end
|
192
|
+
|
193
|
+
on_selection_changed do |t, selection, added_selection, removed_selection|
|
194
|
+
# selection is an array or nil if selection mode is zero_or_many
|
195
|
+
# otherwise, selection is a single index integer or nil when not selected
|
196
|
+
puts "Selection Changed: #{selection.inspect}"
|
197
|
+
puts "Added Selection: #{added_selection.inspect}"
|
198
|
+
puts "Removed Selection: #{removed_selection.inspect}"
|
199
|
+
end
|
200
|
+
}
|
201
|
+
}
|
202
|
+
}
|
203
|
+
|
204
|
+
tab_item('Zero-Or-Many') {
|
205
|
+
vertical_box {
|
206
|
+
vertical_box {
|
207
|
+
stretchy false
|
208
|
+
|
209
|
+
@zero_or_many_table_selection_checkboxes = @zero_or_many_table_presenter.data.size.times.map do |row|
|
210
|
+
checkbox("Row #{row} Selection") {
|
211
|
+
on_toggled do |c|
|
212
|
+
table_selection = @zero_or_many_table_presenter.selection.to_a
|
213
|
+
if c.checked?
|
214
|
+
table_selection << row unless table_selection.include?(row)
|
215
|
+
else
|
216
|
+
table_selection.delete(row) if table_selection.include?(row)
|
217
|
+
end
|
218
|
+
@zero_or_many_table_presenter.selection = table_selection
|
219
|
+
end
|
220
|
+
}
|
221
|
+
end
|
222
|
+
}
|
223
|
+
|
224
|
+
button('Toggle Table Header Visibility') {
|
225
|
+
stretchy false
|
226
|
+
|
227
|
+
on_clicked do
|
228
|
+
@zero_or_many_table_presenter.toggle_header_visible
|
229
|
+
end
|
230
|
+
}
|
231
|
+
|
232
|
+
@zero_or_many_table = table {
|
233
|
+
@zero_or_many_table_presenter.column_presenters.each do |column_presenter|
|
234
|
+
text_column(column_presenter.name) {
|
235
|
+
sort_indicator <=> [column_presenter, :sort_indicator]
|
236
|
+
|
237
|
+
on_clicked do |tc, column|
|
238
|
+
puts "Clicked column #{column}: #{tc.name}"
|
239
|
+
column_presenter.sort
|
240
|
+
end
|
241
|
+
}
|
242
|
+
end
|
243
|
+
|
244
|
+
cell_rows @zero_or_many_table_presenter.data
|
245
|
+
selection_mode <= [@zero_or_many_table_presenter, :selection_mode]
|
246
|
+
selection <=> [@zero_or_many_table_presenter, :selection]
|
247
|
+
header_visible <= [@zero_or_many_table_presenter, :header_visible]
|
248
|
+
|
249
|
+
on_row_clicked do |t, row|
|
250
|
+
puts "Row Clicked: #{row}"
|
251
|
+
end
|
252
|
+
|
253
|
+
on_row_double_clicked do |t, row|
|
254
|
+
puts "Row Double Clicked: #{row}"
|
255
|
+
end
|
256
|
+
|
257
|
+
on_selection_changed do |t, selection, added_selection, removed_selection|
|
258
|
+
# selection is an array or nil if selection mode is zero_or_many
|
259
|
+
# otherwise, selection is a single index integer or nil when not selected
|
260
|
+
puts "Selection Changed: #{selection.inspect}"
|
261
|
+
puts "Added Selection: #{added_selection.inspect}"
|
262
|
+
puts "Removed Selection: #{removed_selection.inspect}"
|
263
|
+
end
|
264
|
+
}
|
265
|
+
}
|
266
|
+
}
|
267
|
+
|
268
|
+
tab_item('None') {
|
269
|
+
vertical_box {
|
270
|
+
button('Toggle Table Header Visibility') {
|
271
|
+
stretchy false
|
272
|
+
|
273
|
+
on_clicked do
|
274
|
+
@none_table_presenter.toggle_header_visible
|
275
|
+
end
|
276
|
+
}
|
277
|
+
|
278
|
+
@none_table = table {
|
279
|
+
@none_table_presenter.column_presenters.each do |column_presenter|
|
280
|
+
text_column(column_presenter.name) {
|
281
|
+
sort_indicator <=> [column_presenter, :sort_indicator]
|
282
|
+
|
283
|
+
on_clicked do |tc, column|
|
284
|
+
puts "Clicked column #{column}: #{tc.name}"
|
285
|
+
column_presenter.sort
|
286
|
+
end
|
287
|
+
}
|
288
|
+
end
|
289
|
+
|
290
|
+
cell_rows @none_table_presenter.data
|
291
|
+
selection_mode <= [@none_table_presenter, :selection_mode]
|
292
|
+
selection <=> [@none_table_presenter, :selection]
|
293
|
+
header_visible <= [@none_table_presenter, :header_visible]
|
294
|
+
|
295
|
+
on_row_clicked do |t, row|
|
296
|
+
puts "Row Clicked: #{row}"
|
297
|
+
end
|
298
|
+
|
299
|
+
on_row_double_clicked do |t, row|
|
300
|
+
puts "Row Double Clicked: #{row}"
|
301
|
+
end
|
302
|
+
}
|
303
|
+
}
|
304
|
+
}
|
305
|
+
|
306
|
+
}
|
307
|
+
}
|
308
|
+
}
|
309
|
+
end
|
310
|
+
|
311
|
+
BasicTableSelection.launch
|
data/glimmer-dsl-libui.gemspec
CHANGED
Binary file
|
@@ -85,6 +85,15 @@ module Glimmer
|
|
85
85
|
self.sort_indicator = value
|
86
86
|
end
|
87
87
|
end
|
88
|
+
|
89
|
+
def data_bind_write(property, model_binding)
|
90
|
+
case property
|
91
|
+
when 'sort_indicator'
|
92
|
+
Glimmer::DataBinding::Observer.proc do
|
93
|
+
model_binding.call(sort_indicator)
|
94
|
+
end.observe(self, :sort_indicator)
|
95
|
+
end
|
96
|
+
end
|
88
97
|
|
89
98
|
def can_handle_listener?(listener_name)
|
90
99
|
listener_name == 'on_clicked'
|
@@ -224,7 +224,12 @@ module Glimmer
|
|
224
224
|
end
|
225
225
|
|
226
226
|
def data_bind_write(property, model_binding)
|
227
|
-
|
227
|
+
case property
|
228
|
+
when 'cell_rows'
|
229
|
+
handle_listener('on_edited') { model_binding.call(cell_rows) }
|
230
|
+
when 'selection'
|
231
|
+
handle_listener('on_selection_changed') { model_binding.call(selection) }
|
232
|
+
end
|
228
233
|
end
|
229
234
|
|
230
235
|
def array_deep_dup(array_or_object)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glimmer-dsl-libui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Maleh
|
@@ -357,6 +357,7 @@ files:
|
|
357
357
|
- examples/basic_table_image_text3.rb
|
358
358
|
- examples/basic_table_progress_bar.rb
|
359
359
|
- examples/basic_table_selection.rb
|
360
|
+
- examples/basic_table_selection2.rb
|
360
361
|
- examples/basic_transform.rb
|
361
362
|
- examples/basic_transform2.rb
|
362
363
|
- examples/basic_window.rb
|