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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7aedcfa3ba9a8d44ce0df9ee4f684535d3492c858ca0171f4181a80ed4772899
4
- data.tar.gz: 21f8b0577f27116216821c2bcbe3fd458261a5f8c957c5c0a2aa4683d370310d
3
+ metadata.gz: 1c1ff2eeecd4520bb427d6a2ca0abb85ea41f5b3b92d859253b59c9574c6c899
4
+ data.tar.gz: 907fa263dc715be72bf022258da6cb58aaef70e2d647ee17c29f9eda942547e5
5
5
  SHA512:
6
- metadata.gz: fc1404d69d320e772a50506bfde13942cc7f981fb932c1c0999340c1c048ce64935eeac799d6af3b258a1a18ccb3472b9915814da72a96f5fb4d5f0b9af13fb6
7
- data.tar.gz: eac5a371a0d685fab5cd397a43f7b25c333d855b5972c898dd0794c4001f61c08440d5da4f80911017155f0c051cea79391eefa5e603e13fb5292db12f4d2689
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.2
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
  [![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.2'
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` (explicit data-binding by using `<=>` and [implicit data-binding](#table-api) by assigning value directly)
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.2
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
  ![glimmer-dsl-libui-mac-basic-table-selection-none.png](/images/glimmer-dsl-libui-mac-basic-table-selection-none.png)
1527
1525
  ![glimmer-dsl-libui-mac-basic-table-selection-header-not-visible.png](/images/glimmer-dsl-libui-mac-basic-table-selection-header-not-visible.png)
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
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
- handle_listener('on_edited') { model_binding.call(cell_rows) } if property == 'cell_rows'
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.2
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