glimmer-dsl-libui 0.7.3 → 0.7.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +19 -3
- data/VERSION +1 -1
- data/examples/basic_table_selection.rb +163 -152
- data/examples/basic_table_selection2.rb +12 -9
- data/examples/basic_table_selection3.rb +307 -0
- data/glimmer-dsl-libui.gemspec +0 -0
- data/lib/glimmer/libui/control_proxy/column.rb +6 -0
- data/lib/glimmer/libui/control_proxy/table_proxy.rb +79 -7
- data/lib/glimmer/libui/custom_control/refined_table.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5f7eb8d1c417de9910ff49f86592694558a3333f4840971f65be1232adf7408b
|
4
|
+
data.tar.gz: 9cdf9733b7026aae945ec183ba4551ee2bbe120454c0a094c02a99bd5338069a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a6c290b75e8301cadd8c837be2612dd4e653192577ea0c8f2493d4fa4a0b7198f2f8008c99d7adeef42320e5b4d86be339b37fe9ca588ee4cc9e22ad36c0a48
|
7
|
+
data.tar.gz: b51a3e1e878b9adde67cc6670f682df5d7ab09a6678b8b16655fbcb0d5e3770b5119f867ea58c4b025a78e043ed56cd0309f86eccdec0b90d31c19b375a0007b
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.7.4
|
4
|
+
|
5
|
+
- `table` `sortable` property (default: `true`) to enable automatic table sorting support when `cell_rows` is an `Array` (does not sort if `cell_rows` is a lazy enumerable)
|
6
|
+
- Fix issue with not auto-checking checkboxes for zero-or-many table selection in `examples/basic_table_selection2.rb`
|
7
|
+
- Rename `examples/basic_table_selection.rb` to `examples/basic_table_selection3.rb` and add new `examples/basic_table_selection.rb` with automated `table` selection via `sortable` property (default: `true`)
|
8
|
+
- Disable automatic sorting by default in `refined_table` (set its `table` `sortable` property to `false`) since it does not sort over the entire collection, yet the visible collection only
|
9
|
+
- Disable `sortable` sorting for `table` `button_column` since it does not make sense for it
|
10
|
+
|
3
11
|
## 0.7.3
|
4
12
|
|
5
13
|
- `table` `selection` data-binding support
|
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.4
|
2
2
|
## Prerequisite-Free Ruby Desktop Development GUI Library
|
3
3
|
### The Quickest Way From Zero To GUI
|
4
4
|
[![Gem Version](https://badge.fury.io/rb/glimmer-dsl-libui.svg)](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.4'
|
548
548
|
```
|
549
549
|
|
550
550
|
Test that installation worked by running the [Meta-Example](#examples):
|
@@ -824,7 +824,7 @@ There are additional useful `Glimmer::LibUI` operations that are not found in `L
|
|
824
824
|
|
825
825
|
The `table` control must first declare its columns via one of these column keywords (mentioned in [Supported Keywords](#supported-keywords)):
|
826
826
|
- `background_color_column`: expects color cell values
|
827
|
-
- `button_column`: expects `String` cell values
|
827
|
+
- `button_column`: expects `String` cell values and a nested `on_clicked` listener that gets triggerd when a button is clicked
|
828
828
|
- `checkbox_column`: expects Boolean cell values
|
829
829
|
- `checkbox_text_column`: expects dual-element `Array` of Boolean and `String` cell values
|
830
830
|
- `checkbox_text_color_column`: expects triple-element `Array` of Boolean, `String`, and color cell values
|
@@ -842,6 +842,22 @@ Note that the `cell_rows` property declaration results in "implicit data-binding
|
|
842
842
|
- Inserting cell rows: Calling `Array#<<`, `Array#push`, `Array#prepend`, or any insertion/addition `Array` method automatically inserts rows in actual `table` control
|
843
843
|
- Changing cell rows: Calling `Array#[]=`, `Array#map!`, or any update `Array` method automatically updates rows in actual `table` control
|
844
844
|
|
845
|
+
More details about table data-binding can be found in [examples/basic_table.rb](https://github.com/AndyObtiva/glimmer-dsl-libui/blob/master/docs/examples/GLIMMER-DSL-LIBUI-BASIC-EXAMPLES.md#basic-table) or other `table` [basic examples](https://github.com/AndyObtiva/glimmer-dsl-libui/blob/master/docs/examples/GLIMMER-DSL-LIBUI-BASIC-EXAMPLES.md) and [advanced examples](https://github.com/AndyObtiva/glimmer-dsl-libui/blob/master/docs/examples/GLIMMER-DSL-LIBUI-ADVANCED-EXAMPLES.md).
|
846
|
+
|
847
|
+
The `table` control supports table selection and table sorting automatically as smart defaults, which can also be configured if needed as per the options below.
|
848
|
+
|
849
|
+
There are other properties that `table` supports:
|
850
|
+
- `selection_mode` (`Symbol`) [default: `:zero_or_one`]: sets selection mode to `:one`, `:zero_or_one`, `:zero_or_many`, or `:none`
|
851
|
+
- `selection` (`Integer` or `Array` of `Integer`s): a single `Integer` row index for `:one` and `:zero_or_one` selection modes, or an `Array` of `Integer` row indexes if selection mode is `:zero_or_many`
|
852
|
+
- `header_visible` (Boolean): shows or hides column headers
|
853
|
+
- `sortable` (Boolean) [default: `true`]: enables automatic table sorting support
|
854
|
+
|
855
|
+
To handle `table` sorting manually, the following can be set inside a table column:
|
856
|
+
- `sort_indicator` (`Symbol`): sets sort indicator to ascending or descending with the value being `:ascending`, `:descending`, `:asc`, `:desc`, `:a`, or `:d`
|
857
|
+
- `on_clicked` (`Proc`): this listener is triggered when a table column is clicked
|
858
|
+
|
859
|
+
More details about table selection and table sorting can be found in [examples/basic_table_selection.rb](https://github.com/AndyObtiva/glimmer-dsl-libui/blob/master/docs/examples/GLIMMER-DSL-LIBUI-BASIC-EXAMPLES.md#basic-table-selection).
|
860
|
+
|
845
861
|
([explicit data-binding](#data-binding) supports everything available with implicit data-binding too)
|
846
862
|
|
847
863
|
Example (you may copy/paste in [`girb`](#girb-glimmer-irb)):
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.7.
|
1
|
+
0.7.4
|
@@ -1,6 +1,45 @@
|
|
1
1
|
require 'glimmer-dsl-libui'
|
2
2
|
|
3
3
|
class BasicTableSelection
|
4
|
+
TableColumnPresenter = Struct.new(:name,
|
5
|
+
:column,
|
6
|
+
:table_presenter,
|
7
|
+
keyword_init: true)
|
8
|
+
|
9
|
+
TablePresenter = Struct.new(:data,
|
10
|
+
:column_names,
|
11
|
+
:selection_mode,
|
12
|
+
:selection,
|
13
|
+
:header_visible,
|
14
|
+
:sortable,
|
15
|
+
keyword_init: true) do
|
16
|
+
def selection_items
|
17
|
+
data.size.times.map { |row| "Row #{row} Selection" }
|
18
|
+
end
|
19
|
+
|
20
|
+
def toggle_header_visible
|
21
|
+
self.header_visible = !(header_visible.nil? || header_visible)
|
22
|
+
end
|
23
|
+
|
24
|
+
def toggle_sortable
|
25
|
+
self.sortable = !(sortable.nil? || sortable)
|
26
|
+
end
|
27
|
+
|
28
|
+
def column_presenters
|
29
|
+
@column_presenters ||= column_names.each_with_index.map do |column_name, column|
|
30
|
+
TableColumnPresenter.new(name: column_name, column: column, table_presenter: self)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def selected_row
|
35
|
+
selection && data[selection]
|
36
|
+
end
|
37
|
+
|
38
|
+
def selected_rows
|
39
|
+
selection && selection.is_a?(Array) && selection.map { |row| data[row] }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
4
43
|
include Glimmer::LibUI::Application
|
5
44
|
|
6
45
|
before_body do
|
@@ -11,10 +50,38 @@ class BasicTableSelection
|
|
11
50
|
%w[horse neigh],
|
12
51
|
%w[cow moo]
|
13
52
|
]
|
14
|
-
@
|
15
|
-
|
16
|
-
|
17
|
-
|
53
|
+
@one_table_presenter = TablePresenter.new(
|
54
|
+
data: data.dup,
|
55
|
+
column_names: ['Name', 'Description'],
|
56
|
+
selection_mode: :one, # other values are :zero_or_many , :zero_or_one, :none (default is :zero_or_one if not specified)
|
57
|
+
selection: 2, # initial selection row index (could be nil too or just left off, defaulting to 0)
|
58
|
+
header_visible: nil, # defaults to true
|
59
|
+
sortable: nil, # defaults to true
|
60
|
+
)
|
61
|
+
@zero_or_one_table_presenter = TablePresenter.new(
|
62
|
+
data: data.dup,
|
63
|
+
column_names: ['Name', 'Description'],
|
64
|
+
selection_mode: :zero_or_one, # other values are :zero_or_many , :one, :none (default is :zero_or_one if not specified)
|
65
|
+
selection: nil, # initial selection row index (could be an integer too or just left off, defaulting to nil)
|
66
|
+
header_visible: nil, # defaults to true
|
67
|
+
sortable: nil, # defaults to true
|
68
|
+
)
|
69
|
+
@zero_or_many_table_presenter = TablePresenter.new(
|
70
|
+
data: data.dup,
|
71
|
+
column_names: ['Name', 'Description'],
|
72
|
+
selection_mode: :zero_or_many, # other values are :zero_or_many , :one, :none (default is :zero_or_one if not specified)
|
73
|
+
selection: [0, 2, 4], # initial selection row index (could be an integer too or just left off, defaulting to nil)
|
74
|
+
header_visible: nil, # defaults to true
|
75
|
+
sortable: nil, # defaults to true
|
76
|
+
)
|
77
|
+
@none_table_presenter = TablePresenter.new(
|
78
|
+
data: data.dup,
|
79
|
+
column_names: ['Name', 'Description'],
|
80
|
+
selection_mode: :none, # other values are :zero_or_many , :zero_or_one, :one (default is :zero_or_one if not specified)
|
81
|
+
selection: nil, # defaults to nil
|
82
|
+
header_visible: nil, # defaults to true
|
83
|
+
sortable: nil, # defaults to true
|
84
|
+
)
|
18
85
|
end
|
19
86
|
|
20
87
|
body {
|
@@ -26,42 +93,37 @@ class BasicTableSelection
|
|
26
93
|
stretchy false
|
27
94
|
|
28
95
|
@one_table_selection_radio_buttons = radio_buttons {
|
29
|
-
items @
|
30
|
-
|
31
|
-
on_selected do |rb|
|
32
|
-
@one_table.selection = [rb.selected]
|
33
|
-
end
|
96
|
+
items @one_table_presenter.selection_items
|
97
|
+
selected <=> [@one_table_presenter, :selection]
|
34
98
|
}
|
35
99
|
}
|
36
|
-
|
37
|
-
|
100
|
+
|
101
|
+
horizontal_box {
|
38
102
|
stretchy false
|
39
103
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
}
|
44
|
-
|
45
|
-
@one_table = table {
|
46
|
-
text_column('Animal') {
|
47
|
-
# sort_indicator :descending # (optional) can be :ascending, :descending, or nil (default)
|
48
|
-
|
49
|
-
on_clicked do |tc, column|
|
50
|
-
sort_one_table_column(tc, column)
|
104
|
+
button('Toggle Table Header Visibility') {
|
105
|
+
on_clicked do
|
106
|
+
@one_table_presenter.toggle_header_visible
|
51
107
|
end
|
52
108
|
}
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
sort_one_table_column(tc, column)
|
109
|
+
|
110
|
+
button('Toggle Table Sortability') {
|
111
|
+
on_clicked do
|
112
|
+
@one_table_presenter.toggle_sortable # toggles sortable attribute to false or true
|
58
113
|
end
|
59
114
|
}
|
115
|
+
}
|
116
|
+
|
117
|
+
@one_table = table {
|
118
|
+
@one_table_presenter.column_presenters.each do |column_presenter|
|
119
|
+
text_column(column_presenter.name)
|
120
|
+
end
|
60
121
|
|
61
|
-
cell_rows @
|
62
|
-
selection_mode
|
63
|
-
selection
|
64
|
-
|
122
|
+
cell_rows @one_table_presenter.data
|
123
|
+
selection_mode <= [@one_table_presenter, :selection_mode]
|
124
|
+
selection <=> [@one_table_presenter, :selection]
|
125
|
+
header_visible <= [@one_table_presenter, :header_visible]
|
126
|
+
sortable <= [@one_table_presenter, :sortable]
|
65
127
|
|
66
128
|
on_row_clicked do |t, row|
|
67
129
|
puts "Row Clicked: #{row}"
|
@@ -77,54 +139,48 @@ class BasicTableSelection
|
|
77
139
|
puts "Selection Changed: #{selection.inspect}"
|
78
140
|
puts "Added Selection: #{added_selection.inspect}"
|
79
141
|
puts "Removed Selection: #{removed_selection.inspect}"
|
80
|
-
@one_table_selection_radio_buttons.selected = selection
|
81
142
|
end
|
82
143
|
}
|
83
144
|
}
|
84
145
|
}
|
85
|
-
|
146
|
+
|
86
147
|
tab_item('Zero-Or-One') {
|
87
148
|
vertical_box {
|
88
149
|
vertical_box {
|
89
150
|
stretchy false
|
90
151
|
|
91
152
|
@zero_or_one_table_selection_radio_buttons = radio_buttons {
|
92
|
-
items @
|
93
|
-
|
94
|
-
on_selected do |rb|
|
95
|
-
@zero_or_one_table.selection = [rb.selected]
|
96
|
-
end
|
153
|
+
items @zero_or_one_table_presenter.selection_items
|
154
|
+
selected <=> [@zero_or_one_table_presenter, :selection]
|
97
155
|
}
|
98
156
|
}
|
99
157
|
|
100
|
-
|
158
|
+
horizontal_box {
|
101
159
|
stretchy false
|
102
160
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
}
|
107
|
-
|
108
|
-
@zero_or_one_table = table {
|
109
|
-
text_column('Animal') {
|
110
|
-
# sort_indicator :descending # (optional) can be :ascending, :descending, or nil (default)
|
111
|
-
|
112
|
-
on_clicked do |tc, column|
|
113
|
-
sort_zero_or_one_table_column(tc, column)
|
161
|
+
button('Toggle Table Header Visibility') {
|
162
|
+
on_clicked do
|
163
|
+
@zero_or_one_table_presenter.toggle_header_visible
|
114
164
|
end
|
115
165
|
}
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
sort_zero_or_one_table_column(tc, column)
|
166
|
+
|
167
|
+
button('Toggle Table Sortability') {
|
168
|
+
on_clicked do
|
169
|
+
@zero_or_one_table_presenter.toggle_sortable # toggles sortable attribute to false or true
|
121
170
|
end
|
122
171
|
}
|
172
|
+
}
|
173
|
+
|
174
|
+
@zero_or_one_table = table {
|
175
|
+
@zero_or_one_table_presenter.column_presenters.each do |column_presenter|
|
176
|
+
text_column(column_presenter.name)
|
177
|
+
end
|
123
178
|
|
124
|
-
cell_rows @
|
125
|
-
selection_mode
|
126
|
-
|
127
|
-
|
179
|
+
cell_rows @zero_or_one_table_presenter.data
|
180
|
+
selection_mode <= [@zero_or_one_table_presenter, :selection_mode]
|
181
|
+
selection <=> [@zero_or_one_table_presenter, :selection]
|
182
|
+
header_visible <= [@zero_or_one_table_presenter, :header_visible]
|
183
|
+
sortable <= [@zero_or_one_table_presenter, :sortable]
|
128
184
|
|
129
185
|
on_row_clicked do |t, row|
|
130
186
|
puts "Row Clicked: #{row}"
|
@@ -140,7 +196,6 @@ class BasicTableSelection
|
|
140
196
|
puts "Selection Changed: #{selection.inspect}"
|
141
197
|
puts "Added Selection: #{added_selection.inspect}"
|
142
198
|
puts "Removed Selection: #{removed_selection.inspect}"
|
143
|
-
@zero_or_one_table_selection_radio_buttons.selected = selection
|
144
199
|
end
|
145
200
|
}
|
146
201
|
}
|
@@ -151,49 +206,46 @@ class BasicTableSelection
|
|
151
206
|
vertical_box {
|
152
207
|
stretchy false
|
153
208
|
|
154
|
-
@zero_or_many_table_selection_checkboxes = @
|
209
|
+
@zero_or_many_table_selection_checkboxes = @zero_or_many_table_presenter.data.size.times.map do |row|
|
155
210
|
checkbox("Row #{row} Selection") {
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
end
|
211
|
+
checked <=> [@zero_or_many_table_presenter, :selection,
|
212
|
+
on_read: ->(selection_rows) {selection_rows.to_a.include?(row)},
|
213
|
+
on_write: ->(checked_value) {
|
214
|
+
checked_value ?
|
215
|
+
(@zero_or_many_table_presenter.selection.to_a + [row]).uniq :
|
216
|
+
@zero_or_many_table_presenter.selection.to_a.reject {|v| v == row }
|
217
|
+
},
|
218
|
+
]
|
165
219
|
}
|
166
220
|
end
|
167
221
|
}
|
168
222
|
|
169
|
-
|
223
|
+
horizontal_box {
|
170
224
|
stretchy false
|
171
225
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
}
|
176
|
-
|
177
|
-
@zero_or_many_table = table {
|
178
|
-
text_column('Animal') {
|
179
|
-
# sort_indicator :descending # (optional) can be :ascending, :descending, or nil (default)
|
180
|
-
|
181
|
-
on_clicked do |tc, column|
|
182
|
-
sort_zero_or_many_table_column(tc, column)
|
226
|
+
button('Toggle Table Header Visibility') {
|
227
|
+
on_clicked do
|
228
|
+
@zero_or_many_table_presenter.toggle_header_visible
|
183
229
|
end
|
184
230
|
}
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
sort_zero_or_many_table_column(tc, column)
|
231
|
+
|
232
|
+
button('Toggle Table Sortability') {
|
233
|
+
on_clicked do
|
234
|
+
@zero_or_many_table_presenter.toggle_sortable # toggles sortable attribute to false or true
|
190
235
|
end
|
191
236
|
}
|
237
|
+
}
|
238
|
+
|
239
|
+
@zero_or_many_table = table {
|
240
|
+
@zero_or_many_table_presenter.column_presenters.each do |column_presenter|
|
241
|
+
text_column(column_presenter.name)
|
242
|
+
end
|
192
243
|
|
193
|
-
cell_rows @
|
194
|
-
selection_mode
|
195
|
-
selection
|
196
|
-
|
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
|
+
sortable <= [@zero_or_many_table_presenter, :sortable]
|
197
249
|
|
198
250
|
on_row_clicked do |t, row|
|
199
251
|
puts "Row Clicked: #{row}"
|
@@ -209,46 +261,39 @@ class BasicTableSelection
|
|
209
261
|
puts "Selection Changed: #{selection.inspect}"
|
210
262
|
puts "Added Selection: #{added_selection.inspect}"
|
211
263
|
puts "Removed Selection: #{removed_selection.inspect}"
|
212
|
-
removed_selection&.each do |selected_row|
|
213
|
-
@zero_or_many_table_selection_checkboxes[selected_row].checked = false
|
214
|
-
end
|
215
|
-
added_selection&.each do |selected_row|
|
216
|
-
@zero_or_many_table_selection_checkboxes[selected_row].checked = true
|
217
|
-
end
|
218
264
|
end
|
219
265
|
}
|
220
266
|
}
|
221
267
|
}
|
222
|
-
|
268
|
+
|
223
269
|
tab_item('None') {
|
224
270
|
vertical_box {
|
225
|
-
|
271
|
+
horizontal_box {
|
226
272
|
stretchy false
|
227
273
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
}
|
232
|
-
|
233
|
-
@none_table = table {
|
234
|
-
text_column('Animal') {
|
235
|
-
# sort_indicator :descending # (optional) can be :ascending, :descending, or nil (default)
|
236
|
-
|
237
|
-
on_clicked do |tc, column|
|
238
|
-
sort_none_table_column(tc, column)
|
274
|
+
button('Toggle Table Header Visibility') {
|
275
|
+
on_clicked do
|
276
|
+
@none_table_presenter.toggle_header_visible
|
239
277
|
end
|
240
278
|
}
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
sort_none_table_column(tc, column)
|
279
|
+
|
280
|
+
button('Toggle Table Sortability') {
|
281
|
+
on_clicked do
|
282
|
+
@none_table_presenter.toggle_sortable # toggles sortable attribute to false or true
|
246
283
|
end
|
247
284
|
}
|
285
|
+
}
|
286
|
+
|
287
|
+
@none_table = table {
|
288
|
+
@none_table_presenter.column_presenters.each do |column_presenter|
|
289
|
+
text_column(column_presenter.name)
|
290
|
+
end
|
248
291
|
|
249
|
-
cell_rows @
|
250
|
-
selection_mode
|
251
|
-
|
292
|
+
cell_rows @none_table_presenter.data
|
293
|
+
selection_mode <= [@none_table_presenter, :selection_mode]
|
294
|
+
selection <=> [@none_table_presenter, :selection]
|
295
|
+
header_visible <= [@none_table_presenter, :header_visible]
|
296
|
+
sortable <= [@none_table_presenter, :sortable]
|
252
297
|
|
253
298
|
on_row_clicked do |t, row|
|
254
299
|
puts "Row Clicked: #{row}"
|
@@ -264,40 +309,6 @@ class BasicTableSelection
|
|
264
309
|
}
|
265
310
|
}
|
266
311
|
}
|
267
|
-
|
268
|
-
def sort_one_table_column(tc, column)
|
269
|
-
puts "Clicked column #{column}: #{tc.name}"
|
270
|
-
selected_row = @one_table.selection && @one_table_data[@one_table.selection]
|
271
|
-
tc.toggle_sort_indicator
|
272
|
-
@one_table_data.sort_by! { |row_data| row_data[column] }
|
273
|
-
@one_table_data.reverse! if tc.sort_indicator == :descending
|
274
|
-
@one_table.selection = @one_table_data.index(selected_row)
|
275
|
-
end
|
276
|
-
|
277
|
-
def sort_zero_or_one_table_column(tc, column)
|
278
|
-
puts "Clicked column #{column}: #{tc.name}"
|
279
|
-
selected_row = @zero_or_one_table.selection && @zero_or_one_table_data[@zero_or_one_table.selection]
|
280
|
-
tc.toggle_sort_indicator
|
281
|
-
@zero_or_one_table_data.sort_by! { |row_data| row_data[column] }
|
282
|
-
@zero_or_one_table_data.reverse! if tc.sort_indicator == :descending
|
283
|
-
@zero_or_one_table.selection = @zero_or_one_table_data.index(selected_row)
|
284
|
-
end
|
285
|
-
|
286
|
-
def sort_zero_or_many_table_column(tc, column)
|
287
|
-
puts "Clicked column #{column}: #{tc.name}"
|
288
|
-
selected_rows = @zero_or_many_table.selection&.map { |row| @zero_or_many_table_data[row] }
|
289
|
-
tc.toggle_sort_indicator
|
290
|
-
@zero_or_many_table_data.sort_by! { |row_data| row_data[column] }
|
291
|
-
@zero_or_many_table_data.reverse! if tc.sort_indicator == :descending
|
292
|
-
@zero_or_many_table.selection = selected_rows&.map {|row_data| @zero_or_many_table_data.index(row_data) }
|
293
|
-
end
|
294
|
-
|
295
|
-
def sort_none_table_column(tc, column)
|
296
|
-
puts "Clicked column #{column}: #{tc.name}"
|
297
|
-
tc.toggle_sort_indicator
|
298
|
-
@none_table_data.sort_by! { |row_data| row_data[column] }
|
299
|
-
@none_table_data.reverse! if tc.sort_indicator == :descending
|
300
|
-
end
|
301
312
|
end
|
302
313
|
|
303
314
|
BasicTableSelection.launch
|
@@ -126,6 +126,7 @@ class BasicTableSelection
|
|
126
126
|
selection_mode <= [@one_table_presenter, :selection_mode]
|
127
127
|
selection <=> [@one_table_presenter, :selection]
|
128
128
|
header_visible <= [@one_table_presenter, :header_visible]
|
129
|
+
sortable false # disable default sorting behavior to demonstrate manual sorting
|
129
130
|
|
130
131
|
on_row_clicked do |t, row|
|
131
132
|
puts "Row Clicked: #{row}"
|
@@ -181,6 +182,7 @@ class BasicTableSelection
|
|
181
182
|
selection_mode <= [@zero_or_one_table_presenter, :selection_mode]
|
182
183
|
selection <=> [@zero_or_one_table_presenter, :selection]
|
183
184
|
header_visible <= [@zero_or_one_table_presenter, :header_visible]
|
185
|
+
sortable false # disable default sorting behavior to demonstrate manual sorting
|
184
186
|
|
185
187
|
on_row_clicked do |t, row|
|
186
188
|
puts "Row Clicked: #{row}"
|
@@ -208,15 +210,14 @@ class BasicTableSelection
|
|
208
210
|
|
209
211
|
@zero_or_many_table_selection_checkboxes = @zero_or_many_table_presenter.data.size.times.map do |row|
|
210
212
|
checkbox("Row #{row} Selection") {
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
end
|
213
|
+
checked <=> [@zero_or_many_table_presenter, :selection,
|
214
|
+
on_read: ->(selection_rows) {selection_rows.to_a.include?(row)},
|
215
|
+
on_write: ->(checked_value) {
|
216
|
+
checked_value ?
|
217
|
+
(@zero_or_many_table_presenter.selection.to_a + [row]).uniq :
|
218
|
+
@zero_or_many_table_presenter.selection.to_a.reject {|v| v == row }
|
219
|
+
},
|
220
|
+
]
|
220
221
|
}
|
221
222
|
end
|
222
223
|
}
|
@@ -245,6 +246,7 @@ class BasicTableSelection
|
|
245
246
|
selection_mode <= [@zero_or_many_table_presenter, :selection_mode]
|
246
247
|
selection <=> [@zero_or_many_table_presenter, :selection]
|
247
248
|
header_visible <= [@zero_or_many_table_presenter, :header_visible]
|
249
|
+
sortable false # disable default sorting behavior to demonstrate manual sorting
|
248
250
|
|
249
251
|
on_row_clicked do |t, row|
|
250
252
|
puts "Row Clicked: #{row}"
|
@@ -291,6 +293,7 @@ class BasicTableSelection
|
|
291
293
|
selection_mode <= [@none_table_presenter, :selection_mode]
|
292
294
|
selection <=> [@none_table_presenter, :selection]
|
293
295
|
header_visible <= [@none_table_presenter, :header_visible]
|
296
|
+
sortable false # disable default sorting behavior to demonstrate manual sorting
|
294
297
|
|
295
298
|
on_row_clicked do |t, row|
|
296
299
|
puts "Row Clicked: #{row}"
|
@@ -0,0 +1,307 @@
|
|
1
|
+
require 'glimmer-dsl-libui'
|
2
|
+
|
3
|
+
class BasicTableSelection
|
4
|
+
include Glimmer::LibUI::Application
|
5
|
+
|
6
|
+
before_body do
|
7
|
+
data = [
|
8
|
+
%w[cat meow],
|
9
|
+
%w[dog woof],
|
10
|
+
%w[chicken cock-a-doodle-doo],
|
11
|
+
%w[horse neigh],
|
12
|
+
%w[cow moo]
|
13
|
+
]
|
14
|
+
@one_table_data = data.dup
|
15
|
+
@zero_or_one_table_data = data.dup
|
16
|
+
@zero_or_many_table_data = data.dup
|
17
|
+
@none_table_data = data.dup
|
18
|
+
end
|
19
|
+
|
20
|
+
body {
|
21
|
+
window('Basic Table Selection', 400, 300) {
|
22
|
+
tab {
|
23
|
+
tab_item('One') {
|
24
|
+
vertical_box {
|
25
|
+
vertical_box {
|
26
|
+
stretchy false
|
27
|
+
|
28
|
+
@one_table_selection_radio_buttons = radio_buttons {
|
29
|
+
items @one_table_data.size.times.map { |row| "Row #{row} Selection" }
|
30
|
+
|
31
|
+
on_selected do |rb|
|
32
|
+
@one_table.selection = [rb.selected]
|
33
|
+
end
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
button('Toggle Table Header Visibility') {
|
38
|
+
stretchy false
|
39
|
+
|
40
|
+
on_clicked do
|
41
|
+
@one_table.header_visible = !@one_table.header_visible
|
42
|
+
end
|
43
|
+
}
|
44
|
+
|
45
|
+
@one_table = table {
|
46
|
+
text_column('Animal') {
|
47
|
+
# sort_indicator :descending # (optional) can be :ascending, :descending, or nil (default)
|
48
|
+
|
49
|
+
on_clicked do |tc, column|
|
50
|
+
sort_one_table_column(tc, column)
|
51
|
+
end
|
52
|
+
}
|
53
|
+
text_column('Description') {
|
54
|
+
# sort_indicator :descending # (optional) can be :ascending, :descending, or nil (default)
|
55
|
+
|
56
|
+
on_clicked do |tc, column|
|
57
|
+
sort_one_table_column(tc, column)
|
58
|
+
end
|
59
|
+
}
|
60
|
+
|
61
|
+
cell_rows @one_table_data
|
62
|
+
selection_mode :one # other values are :zero_or_many , :zero_or_one, :none (default is :zero_or_one if not specified)
|
63
|
+
selection 2 # initial selection row index (could be nil too or just left off, defaulting to 0)
|
64
|
+
# header_visible true # default
|
65
|
+
sortable false # disable default sorting behavior to demonstrate manual sorting
|
66
|
+
|
67
|
+
on_row_clicked do |t, row|
|
68
|
+
puts "Row Clicked: #{row}"
|
69
|
+
end
|
70
|
+
|
71
|
+
on_row_double_clicked do |t, row|
|
72
|
+
puts "Row Double Clicked: #{row}"
|
73
|
+
end
|
74
|
+
|
75
|
+
on_selection_changed do |t, selection, added_selection, removed_selection|
|
76
|
+
# selection is an array or nil if selection mode is zero_or_many
|
77
|
+
# otherwise, selection is a single index integer or nil when not selected
|
78
|
+
puts "Selection Changed: #{selection.inspect}"
|
79
|
+
puts "Added Selection: #{added_selection.inspect}"
|
80
|
+
puts "Removed Selection: #{removed_selection.inspect}"
|
81
|
+
@one_table_selection_radio_buttons.selected = selection
|
82
|
+
end
|
83
|
+
}
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
tab_item('Zero-Or-One') {
|
88
|
+
vertical_box {
|
89
|
+
vertical_box {
|
90
|
+
stretchy false
|
91
|
+
|
92
|
+
@zero_or_one_table_selection_radio_buttons = radio_buttons {
|
93
|
+
items @zero_or_one_table_data.size.times.map { |row| "Row #{row} Selection" }
|
94
|
+
|
95
|
+
on_selected do |rb|
|
96
|
+
@zero_or_one_table.selection = [rb.selected]
|
97
|
+
end
|
98
|
+
}
|
99
|
+
}
|
100
|
+
|
101
|
+
button('Toggle Table Header Visibility') {
|
102
|
+
stretchy false
|
103
|
+
|
104
|
+
on_clicked do
|
105
|
+
@zero_or_one_table.header_visible = !@zero_or_one_table.header_visible
|
106
|
+
end
|
107
|
+
}
|
108
|
+
|
109
|
+
@zero_or_one_table = table {
|
110
|
+
text_column('Animal') {
|
111
|
+
# sort_indicator :descending # (optional) can be :ascending, :descending, or nil (default)
|
112
|
+
|
113
|
+
on_clicked do |tc, column|
|
114
|
+
sort_zero_or_one_table_column(tc, column)
|
115
|
+
end
|
116
|
+
}
|
117
|
+
text_column('Description') {
|
118
|
+
# sort_indicator :descending # (optional) can be :ascending, :descending, or nil (default)
|
119
|
+
|
120
|
+
on_clicked do |tc, column|
|
121
|
+
sort_zero_or_one_table_column(tc, column)
|
122
|
+
end
|
123
|
+
}
|
124
|
+
|
125
|
+
cell_rows @zero_or_one_table_data
|
126
|
+
selection_mode :zero_or_one # other values are :zero_or_many , :one, :none (default is :zero_or_one if not specified)
|
127
|
+
# selection 0 # initial selection row index (could be nil too or just left off)
|
128
|
+
# header_visible true # default
|
129
|
+
sortable false # disable default sorting behavior to demonstrate manual sorting
|
130
|
+
|
131
|
+
on_row_clicked do |t, row|
|
132
|
+
puts "Row Clicked: #{row}"
|
133
|
+
end
|
134
|
+
|
135
|
+
on_row_double_clicked do |t, row|
|
136
|
+
puts "Row Double Clicked: #{row}"
|
137
|
+
end
|
138
|
+
|
139
|
+
on_selection_changed do |t, selection, added_selection, removed_selection|
|
140
|
+
# selection is an array or nil if selection mode is zero_or_many
|
141
|
+
# otherwise, selection is a single index integer or nil when not selected
|
142
|
+
puts "Selection Changed: #{selection.inspect}"
|
143
|
+
puts "Added Selection: #{added_selection.inspect}"
|
144
|
+
puts "Removed Selection: #{removed_selection.inspect}"
|
145
|
+
@zero_or_one_table_selection_radio_buttons.selected = selection
|
146
|
+
end
|
147
|
+
}
|
148
|
+
}
|
149
|
+
}
|
150
|
+
|
151
|
+
tab_item('Zero-Or-Many') {
|
152
|
+
vertical_box {
|
153
|
+
vertical_box {
|
154
|
+
stretchy false
|
155
|
+
|
156
|
+
@zero_or_many_table_selection_checkboxes = @zero_or_many_table_data.size.times.map do |row|
|
157
|
+
checkbox("Row #{row} Selection") {
|
158
|
+
on_toggled do |c|
|
159
|
+
table_selection = @zero_or_many_table.selection.to_a
|
160
|
+
if c.checked?
|
161
|
+
table_selection << row unless table_selection.include?(row)
|
162
|
+
else
|
163
|
+
table_selection.delete(row) if table_selection.include?(row)
|
164
|
+
end
|
165
|
+
@zero_or_many_table.selection = table_selection
|
166
|
+
end
|
167
|
+
}
|
168
|
+
end
|
169
|
+
}
|
170
|
+
|
171
|
+
button('Toggle Table Header Visibility') {
|
172
|
+
stretchy false
|
173
|
+
|
174
|
+
on_clicked do
|
175
|
+
@zero_or_many_table.header_visible = !@zero_or_many_table.header_visible
|
176
|
+
end
|
177
|
+
}
|
178
|
+
|
179
|
+
@zero_or_many_table = table {
|
180
|
+
text_column('Animal') {
|
181
|
+
# sort_indicator :descending # (optional) can be :ascending, :descending, or nil (default)
|
182
|
+
|
183
|
+
on_clicked do |tc, column|
|
184
|
+
sort_zero_or_many_table_column(tc, column)
|
185
|
+
end
|
186
|
+
}
|
187
|
+
text_column('Description') {
|
188
|
+
# sort_indicator :descending # (optional) can be :ascending, :descending, or nil (default)
|
189
|
+
|
190
|
+
on_clicked do |tc, column|
|
191
|
+
sort_zero_or_many_table_column(tc, column)
|
192
|
+
end
|
193
|
+
}
|
194
|
+
|
195
|
+
cell_rows @zero_or_many_table_data
|
196
|
+
selection_mode :zero_or_many # other values are :none , :zero_or_one , and :one (default is :zero_or_one if not specified)
|
197
|
+
selection 0, 2, 4 # initial selection row indexes (could be empty array too or just left off)
|
198
|
+
# header_visible true # default
|
199
|
+
sortable false # disable default sorting behavior to demonstrate manual sorting
|
200
|
+
|
201
|
+
on_row_clicked do |t, row|
|
202
|
+
puts "Row Clicked: #{row}"
|
203
|
+
end
|
204
|
+
|
205
|
+
on_row_double_clicked do |t, row|
|
206
|
+
puts "Row Double Clicked: #{row}"
|
207
|
+
end
|
208
|
+
|
209
|
+
on_selection_changed do |t, selection, added_selection, removed_selection|
|
210
|
+
# selection is an array or nil if selection mode is zero_or_many
|
211
|
+
# otherwise, selection is a single index integer or nil when not selected
|
212
|
+
puts "Selection Changed: #{selection.inspect}"
|
213
|
+
puts "Added Selection: #{added_selection.inspect}"
|
214
|
+
puts "Removed Selection: #{removed_selection.inspect}"
|
215
|
+
removed_selection&.each do |selected_row|
|
216
|
+
@zero_or_many_table_selection_checkboxes[selected_row].checked = false
|
217
|
+
end
|
218
|
+
added_selection&.each do |selected_row|
|
219
|
+
@zero_or_many_table_selection_checkboxes[selected_row].checked = true
|
220
|
+
end
|
221
|
+
end
|
222
|
+
}
|
223
|
+
}
|
224
|
+
}
|
225
|
+
|
226
|
+
tab_item('None') {
|
227
|
+
vertical_box {
|
228
|
+
button('Toggle Table Header Visibility') {
|
229
|
+
stretchy false
|
230
|
+
|
231
|
+
on_clicked do
|
232
|
+
@none_table.header_visible = !@none_table.header_visible
|
233
|
+
end
|
234
|
+
}
|
235
|
+
|
236
|
+
@none_table = table {
|
237
|
+
text_column('Animal') {
|
238
|
+
# sort_indicator :descending # (optional) can be :ascending, :descending, or nil (default)
|
239
|
+
|
240
|
+
on_clicked do |tc, column|
|
241
|
+
sort_none_table_column(tc, column)
|
242
|
+
end
|
243
|
+
}
|
244
|
+
text_column('Description') {
|
245
|
+
# sort_indicator :descending # (optional) can be :ascending, :descending, or nil (default)
|
246
|
+
|
247
|
+
on_clicked do |tc, column|
|
248
|
+
sort_none_table_column(tc, column)
|
249
|
+
end
|
250
|
+
}
|
251
|
+
|
252
|
+
cell_rows @none_table_data
|
253
|
+
selection_mode :none # other values are :zero_or_many , :zero_or_one, :one (default is :zero_or_one if not specified)
|
254
|
+
# header_visible true # default
|
255
|
+
sortable false # disable default sorting behavior to demonstrate manual sorting
|
256
|
+
|
257
|
+
on_row_clicked do |t, row|
|
258
|
+
puts "Row Clicked: #{row}"
|
259
|
+
end
|
260
|
+
|
261
|
+
on_row_double_clicked do |t, row|
|
262
|
+
puts "Row Double Clicked: #{row}"
|
263
|
+
end
|
264
|
+
}
|
265
|
+
}
|
266
|
+
}
|
267
|
+
|
268
|
+
}
|
269
|
+
}
|
270
|
+
}
|
271
|
+
|
272
|
+
def sort_one_table_column(tc, column)
|
273
|
+
puts "Clicked column #{column}: #{tc.name}"
|
274
|
+
selected_row = @one_table.selection && @one_table_data[@one_table.selection]
|
275
|
+
tc.toggle_sort_indicator
|
276
|
+
@one_table_data.sort_by! { |row_data| row_data[column] }
|
277
|
+
@one_table_data.reverse! if tc.sort_indicator == :descending
|
278
|
+
@one_table.selection = @one_table_data.index(selected_row)
|
279
|
+
end
|
280
|
+
|
281
|
+
def sort_zero_or_one_table_column(tc, column)
|
282
|
+
puts "Clicked column #{column}: #{tc.name}"
|
283
|
+
selected_row = @zero_or_one_table.selection && @zero_or_one_table_data[@zero_or_one_table.selection]
|
284
|
+
tc.toggle_sort_indicator
|
285
|
+
@zero_or_one_table_data.sort_by! { |row_data| row_data[column] }
|
286
|
+
@zero_or_one_table_data.reverse! if tc.sort_indicator == :descending
|
287
|
+
@zero_or_one_table.selection = @zero_or_one_table_data.index(selected_row)
|
288
|
+
end
|
289
|
+
|
290
|
+
def sort_zero_or_many_table_column(tc, column)
|
291
|
+
puts "Clicked column #{column}: #{tc.name}"
|
292
|
+
selected_rows = @zero_or_many_table.selection&.map { |row| @zero_or_many_table_data[row] }
|
293
|
+
tc.toggle_sort_indicator
|
294
|
+
@zero_or_many_table_data.sort_by! { |row_data| row_data[column] }
|
295
|
+
@zero_or_many_table_data.reverse! if tc.sort_indicator == :descending
|
296
|
+
@zero_or_many_table.selection = selected_rows&.map {|row_data| @zero_or_many_table_data.index(row_data) }
|
297
|
+
end
|
298
|
+
|
299
|
+
def sort_none_table_column(tc, column)
|
300
|
+
puts "Clicked column #{column}: #{tc.name}"
|
301
|
+
tc.toggle_sort_indicator
|
302
|
+
@none_table_data.sort_by! { |row_data| row_data[column] }
|
303
|
+
@none_table_data.reverse! if tc.sort_indicator == :descending
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
BasicTableSelection.launch
|
data/glimmer-dsl-libui.gemspec
CHANGED
Binary file
|
@@ -101,6 +101,12 @@ module Glimmer
|
|
101
101
|
|
102
102
|
def handle_listener(listener_name, &listener)
|
103
103
|
column_listeners_for(listener_name) << listener
|
104
|
+
# TODO fix this by adding a `on_button_clicked` listener in the future to separate it from `on_clicked` on the column header
|
105
|
+
begin
|
106
|
+
super # attempt to handle listener natively if this column supports it (button_column)
|
107
|
+
rescue => e
|
108
|
+
# No Op
|
109
|
+
end
|
104
110
|
end
|
105
111
|
|
106
112
|
def column_listeners
|
@@ -37,6 +37,28 @@ module Glimmer
|
|
37
37
|
include Glimmer::FiddleConsumer
|
38
38
|
|
39
39
|
CUSTOM_LISTENER_NAMES = ['on_changed', 'on_edited']
|
40
|
+
DEFAULT_COLUMN_SORT_BLOCK = lambda do |table_cell_row, column, table_proxy|
|
41
|
+
if table_cell_row.is_a?(Array)
|
42
|
+
value = table_cell_row[column]
|
43
|
+
else
|
44
|
+
attribute = table_proxy.column_attributes[column]
|
45
|
+
value = table_cell_row.send(attribute)
|
46
|
+
end
|
47
|
+
if value.is_a?(Array)
|
48
|
+
# This is needed to not crash on sorting an unsortable array
|
49
|
+
value = value.map do |element|
|
50
|
+
case element
|
51
|
+
when true
|
52
|
+
1
|
53
|
+
when false
|
54
|
+
0
|
55
|
+
else
|
56
|
+
element
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
value
|
61
|
+
end
|
40
62
|
|
41
63
|
attr_reader :model_handler, :model, :table_params, :columns
|
42
64
|
|
@@ -66,6 +88,7 @@ module Glimmer
|
|
66
88
|
configure_selection
|
67
89
|
configure_header_visible
|
68
90
|
configure_column_sort_indicators
|
91
|
+
configure_sorting
|
69
92
|
end
|
70
93
|
|
71
94
|
def post_initialize_child(child)
|
@@ -183,6 +206,7 @@ module Glimmer
|
|
183
206
|
result = ::LibUI.table_header_visible(@libui)
|
184
207
|
LibUI.integer_to_boolean(result)
|
185
208
|
end
|
209
|
+
alias header_visible? header_visible
|
186
210
|
|
187
211
|
def header_visible=(value)
|
188
212
|
@header_visible = value
|
@@ -194,6 +218,17 @@ module Glimmer
|
|
194
218
|
end
|
195
219
|
alias set_header_visible header_visible=
|
196
220
|
|
221
|
+
def sortable
|
222
|
+
@sortable = true if @sortable.nil?
|
223
|
+
@sortable
|
224
|
+
end
|
225
|
+
alias sortable? sortable
|
226
|
+
|
227
|
+
def sortable=(value)
|
228
|
+
@sortable = value
|
229
|
+
end
|
230
|
+
alias set_sortable sortable=
|
231
|
+
|
197
232
|
def column_attributes
|
198
233
|
@column_attributes ||= columns.select {|column| column.is_a?(Column)}.map(&:name).map(&:underscore)
|
199
234
|
end
|
@@ -625,16 +660,14 @@ module Glimmer
|
|
625
660
|
def register_column_listeners
|
626
661
|
# register accumulated column listeners after table content is closed
|
627
662
|
return if @columns.nil? || @columns.empty?
|
628
|
-
if @columns.any? {|column| column.is_a?(Column)
|
663
|
+
if @columns.any? {|column| column.is_a?(Column)}
|
629
664
|
::LibUI.table_header_on_clicked(@libui) do |_, column_index|
|
630
665
|
actual_columns = @columns.select {|column| column.is_a?(Column)}
|
631
666
|
column = actual_columns[column_index]
|
632
|
-
if column.is_a?(Column)
|
667
|
+
if column.is_a?(Column) && !column.is_a?(Column::ButtonColumnProxy)
|
633
668
|
column_listeners = column.column_listeners_for('on_clicked')
|
634
|
-
|
635
|
-
|
636
|
-
column_listener.call(column, column_index)
|
637
|
-
end
|
669
|
+
column_listeners.each do |column_listener|
|
670
|
+
column_listener.call(column, column_index)
|
638
671
|
end
|
639
672
|
end
|
640
673
|
end
|
@@ -654,8 +687,47 @@ module Glimmer
|
|
654
687
|
end
|
655
688
|
|
656
689
|
def configure_column_sort_indicators
|
657
|
-
column_proxies.each
|
690
|
+
column_proxies.each(&:configure_sort_indicator)
|
691
|
+
end
|
692
|
+
|
693
|
+
def configure_sorting
|
694
|
+
if sortable?
|
695
|
+
columns.each do |column_object|
|
696
|
+
next unless column_object.is_a?(Column) && !column_object.is_a?(Column::ButtonColumnProxy)
|
697
|
+
column_object.on_clicked do |column_proxy, column|
|
698
|
+
sort_by_column(column_proxy, column)
|
699
|
+
end
|
700
|
+
end
|
701
|
+
end
|
702
|
+
end
|
703
|
+
|
704
|
+
def sort_by_column(column_proxy, column)
|
705
|
+
return unless sortable? && cell_rows.is_a?(Array)
|
706
|
+
old_selection = backup_selection
|
707
|
+
column_proxy.toggle_sort_indicator
|
708
|
+
cell_rows.sort_by! {|table_cell_row| DEFAULT_COLUMN_SORT_BLOCK.call(table_cell_row, column, self) }
|
709
|
+
cell_rows.reverse! if column_proxy.sort_indicator == :descending
|
710
|
+
restore_selection(old_selection)
|
711
|
+
end
|
712
|
+
|
713
|
+
def backup_selection
|
714
|
+
if selection_mode == ::LibUI::TableSelectionModeZeroOrMany
|
715
|
+
selected_rows = selection&.map { |row| cell_rows[row] }
|
716
|
+
else
|
717
|
+
selected_row = selection && cell_rows[selection]
|
718
|
+
end
|
658
719
|
end
|
720
|
+
|
721
|
+
def restore_selection(old_selection)
|
722
|
+
if selection_mode == ::LibUI::TableSelectionModeZeroOrMany
|
723
|
+
selected_rows = old_selection
|
724
|
+
self.selection = selected_rows&.map {|row_data| cell_rows.index(row_data) }
|
725
|
+
else
|
726
|
+
selected_row = old_selection
|
727
|
+
self.selection = cell_rows.index(selected_row)
|
728
|
+
end
|
729
|
+
end
|
730
|
+
|
659
731
|
end
|
660
732
|
end
|
661
733
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Maleh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-04-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: glimmer
|
@@ -358,6 +358,7 @@ files:
|
|
358
358
|
- examples/basic_table_progress_bar.rb
|
359
359
|
- examples/basic_table_selection.rb
|
360
360
|
- examples/basic_table_selection2.rb
|
361
|
+
- examples/basic_table_selection3.rb
|
361
362
|
- examples/basic_transform.rb
|
362
363
|
- examples/basic_transform2.rb
|
363
364
|
- examples/basic_window.rb
|