glimmer-dsl-swt 0.3.0 → 0.3.1

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: 1b818d6b949f1a1c4388ecad2f9d6f425afbdf0c772a99031c2ea1cf1276dc1c
4
- data.tar.gz: 7f9f78326e9a083b170f9606bfb7337963bda57c4648e7f585c435747f77e94a
3
+ metadata.gz: ce119763646f3e3ccc0211534317572ed02c5d21b9820387dec34d83b714e50f
4
+ data.tar.gz: 1c4486c574ab3e8d30957133b9aab200dcfbdea10ea1c4aa0279a4991f80a0dd
5
5
  SHA512:
6
- metadata.gz: e56deeff2d43d47a8e875ed1e32ba54f6cca9398053afdd5351257a2b0da3326384412635cf0c41529e8d961abab5de32d69cc5b6e23e67f1ebec23bb372b174
7
- data.tar.gz: 49dc96a0dc0921bac9b0cd048d9e33d1436dffa09b4bcb48704f162a30209c52209b3ca03318c89e7277835e682821ec89fb4f32f9c26218fb8ed1812a340dcb
6
+ metadata.gz: cea6c2e7ac8920d4ae87e447f08c7a622fc8851827b76160dc07b36d8c725911bf94a772aa5f47e43465a24961f7dc38b1d974a164ec3704d159dee61deb7712
7
+ data.tar.gz: 8efbb95213218c052cbcc8165dc2305c41f26a42f1a374ba05fd9b5912c3a79bfbb99522a524c8cc0fa88b128c471ab22e03fb75a750b7dd31708617b4c6b4cf
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 /> Glimmer DSL for SWT 0.3.0 (Desktop GUI)
1
+ # <img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 /> Glimmer DSL for SWT 0.3.1 (Desktop GUI)
2
2
  [![Gem Version](https://badge.fury.io/rb/glimmer-dsl-swt.svg)](http://badge.fury.io/rb/glimmer-dsl-swt)
3
3
  [![Travis CI](https://travis-ci.com/AndyObtiva/glimmer-dsl-swt.svg?branch=master)](https://travis-ci.com/github/AndyObtiva/glimmer-dsl-swt)
4
4
  [![Coverage Status](https://coveralls.io/repos/github/AndyObtiva/glimmer-dsl-swt/badge.svg?branch=master)](https://coveralls.io/github/AndyObtiva/glimmer-dsl-swt?branch=master)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.3.1
@@ -130,7 +130,11 @@ module Glimmer
130
130
  # This method is not needed except in rare circumstances where there is a need to start the SWT Event Loop before opening the shell.
131
131
  def start_event_loop
132
132
  until @swt_widget.isDisposed
133
- @display.sleep unless @display.readAndDispatch
133
+ begin
134
+ @display.sleep unless @display.readAndDispatch
135
+ rescue => e
136
+ Glimmer::Config.logger&.debug e.full_message
137
+ end
134
138
  end
135
139
  end
136
140
 
@@ -3,7 +3,7 @@ require 'glimmer/swt/widget_proxy'
3
3
  module Glimmer
4
4
  module SWT
5
5
  class TableColumnProxy < Glimmer::SWT::WidgetProxy
6
- attr_reader :no_sort, :sort_property
6
+ attr_reader :no_sort, :sort_property, :editor
7
7
  alias no_sort? no_sort
8
8
  attr_accessor :sort_block, :sort_by_block
9
9
 
@@ -19,6 +19,10 @@ module Glimmer
19
19
  @sort_property = args unless args.empty?
20
20
  end
21
21
 
22
+ def editor=(args)
23
+ @editor = args
24
+ end
25
+
22
26
  end
23
27
  end
24
28
  end
@@ -1,4 +1,4 @@
1
- require 'glimmer/swt/widget_proxy'
1
+ require 'glimmer/swt/widget_proxy'
2
2
 
3
3
  module Glimmer
4
4
  module SWT
@@ -23,8 +23,8 @@ module Glimmer
23
23
  def find_table_item_and_column_index
24
24
  {}.tap do |result|
25
25
  if respond_to?(:x) && respond_to?(:y)
26
- result[:table_item] = widget.getItems.detect do |ti|
27
- result[:column_index] = widget.getColumnCount.times.to_a.detect do |ci|
26
+ result[:table_item] = widget.items.detect do |ti|
27
+ result[:column_index] = widget.column_count.times.to_a.detect do |ci|
28
28
  ti.getBounds(ci).contains(x, y)
29
29
  end
30
30
  end
@@ -33,7 +33,61 @@ module Glimmer
33
33
  end
34
34
  end
35
35
 
36
- attr_reader :table_editor, :table_editor_text_proxy, :sort_property, :sort_direction, :sort_block, :sort_type, :sort_by_block, :additional_sort_properties
36
+ class << self
37
+ def editors
38
+ @editors ||= {
39
+ text: {
40
+ widget_value_property: :text,
41
+ editor_gui: lambda do |args, model, property, table_proxy|
42
+ table_proxy.table_editor.minimumHeight = 20
43
+ table_editor_widget_proxy = text(*args) {
44
+ text model.send(property)
45
+ focus true
46
+ on_focus_lost {
47
+ table_proxy.finish_edit!
48
+ }
49
+ on_key_pressed { |key_event|
50
+ if key_event.keyCode == swt(:cr)
51
+ table_proxy.finish_edit!
52
+ elsif key_event.keyCode == swt(:esc)
53
+ table_proxy.cancel_edit!
54
+ end
55
+ }
56
+ }
57
+ table_editor_widget_proxy.swt_widget.selectAll
58
+ table_editor_widget_proxy
59
+ end,
60
+ },
61
+ combo: {
62
+ widget_value_property: :text,
63
+ editor_gui: lambda do |args, model, property, table_proxy|
64
+ table_proxy.table_editor.minimumHeight = 25
65
+ table_editor_widget_proxy = combo(*args) {
66
+ items model.send("#{property}_options")
67
+ text model.send(property)
68
+ focus true
69
+ on_focus_lost {
70
+ table_proxy.finish_edit!
71
+ }
72
+ on_key_pressed { |key_event|
73
+ if key_event.keyCode == swt(:cr)
74
+ table_proxy.finish_edit!
75
+ elsif key_event.keyCode == swt(:esc)
76
+ table_proxy.cancel_edit!
77
+ end
78
+ }
79
+ on_widget_selected {
80
+ table_proxy.finish_edit!
81
+ }
82
+ }
83
+ table_editor_widget_proxy
84
+ end,
85
+ }
86
+ }
87
+ end
88
+ end
89
+
90
+ attr_reader :table_editor, :table_editor_text_proxy, :table_editor_widget_proxy, :sort_property, :sort_direction, :sort_block, :sort_type, :sort_by_block, :additional_sort_properties, :editor
37
91
  attr_accessor :column_properties
38
92
 
39
93
  def initialize(underscored_widget_name, parent, args)
@@ -46,7 +100,7 @@ module Glimmer
46
100
 
47
101
  def model_binding
48
102
  swt_widget.data
49
- end
103
+ end
50
104
 
51
105
  def sort_by_column(table_column_proxy)
52
106
  index = swt_widget.columns.to_a.index(table_column_proxy.swt_widget)
@@ -100,6 +154,10 @@ module Glimmer
100
154
  @additional_sort_properties = args unless args.empty?
101
155
  end
102
156
 
157
+ def editor=(args)
158
+ @editor = args
159
+ end
160
+
103
161
  def sort
104
162
  return unless sort_property && (sort_type || sort_block || sort_by_block)
105
163
  array = model_binding.evaluate_property
@@ -152,6 +210,14 @@ module Glimmer
152
210
  })
153
211
  end
154
212
 
213
+ def post_initialize_child(table_column_proxy)
214
+ table_column_proxies << table_column_proxy
215
+ end
216
+
217
+ def table_column_proxies
218
+ @table_column_proxies ||= []
219
+ end
220
+
155
221
  # Indicates if table is in edit mode, thus displaying a text widget for a table item cell
156
222
  def edit_mode?
157
223
  !!@edit_mode
@@ -177,58 +243,62 @@ module Glimmer
177
243
 
178
244
  def edit_table_item(table_item, column_index, before_write: nil, after_write: nil, after_cancel: nil)
179
245
  return if table_item.nil?
246
+ model = table_item.data
247
+ property = column_properties[column_index]
180
248
  @cancel_edit&.call if @edit_mode
249
+ action_taken = false
181
250
  @edit_mode = true
182
- content {
183
- @table_editor_text_proxy = text {
184
- focus true
185
- text table_item.getText(column_index)
186
- action_taken = false
187
- @cancel_edit = lambda do
188
- @cancel_in_progress = true
189
- @table_editor_text_proxy&.swt_widget&.dispose
190
- @table_editor_text_proxy = nil
191
- after_cancel&.call
251
+
252
+ editor_config = table_column_proxies[column_index].editor || editor
253
+ editor_config = editor_config.to_a
254
+ editor_widget_options = editor_config.last.is_a?(Hash) ? editor_config.last : {}
255
+ editor_widget_arg_last_index = editor_config.last.is_a?(Hash) ? -2 : -1
256
+ editor_widget = editor_config[0] || :text
257
+ editor_widget_args = editor_config[1..editor_widget_arg_last_index]
258
+ model_editing_property = editor_widget_options[:property] || property
259
+ widget_value_property = TableProxy::editors[editor_widget][:widget_value_property]
260
+
261
+ @cancel_edit = lambda do |event=nil|
262
+ @cancel_in_progress = true
263
+ @table_editor_widget_proxy&.swt_widget&.dispose
264
+ @table_editor_widget_proxy = nil
265
+ after_cancel&.call
266
+ @edit_in_progress = false
267
+ @cancel_in_progress = false
268
+ @cancel_edit = nil
269
+ @edit_mode = false
270
+ end
271
+
272
+ @finish_edit = lambda do |event=nil|
273
+ new_value = @table_editor_widget_proxy&.swt_widget&.send(widget_value_property)
274
+ if table_item.isDisposed
275
+ @cancel_edit.call
276
+ elsif new_value && !action_taken && !@edit_in_progress && !@cancel_in_progress
277
+ action_taken = true
278
+ @edit_in_progress = true
279
+ if new_value == model.send(model_editing_property)
280
+ @cancel_edit.call
281
+ else
282
+ before_write&.call
283
+ model.send("#{model_editing_property}=", new_value) # makes table update itself, so must search for selected table item again
284
+ # Table refresh happens here because of model update triggering observers, so must retrieve table item again
285
+ edited_table_item = search { |ti| ti.getData == model }.first
286
+ swt_widget.showItem(edited_table_item)
287
+ @table_editor_widget_proxy&.swt_widget&.dispose
288
+ @table_editor_widget_proxy = nil
289
+ after_write&.call(edited_table_item)
192
290
  @edit_in_progress = false
193
- @cancel_in_progress = false
194
- @cancel_edit = nil
195
- @edit_mode = false
196
- end
197
- @finish_edit = lambda do |event=nil|
198
- if table_item.isDisposed
199
- @cancel_edit.call
200
- elsif !action_taken && !@edit_in_progress && !@cancel_in_progress
201
- action_taken = true
202
- @edit_in_progress = true
203
- new_text = @table_editor_text_proxy.swt_widget.getText
204
- if new_text == table_item.getText(column_index)
205
- @cancel_edit.call
206
- else
207
- before_write&.call
208
- table_item.setText(column_index, new_text)
209
- model = table_item.getData
210
- model.send("#{column_properties[column_index]}=", new_text) # makes table update itself, so must search for selected table item again
211
- edited_table_item = search { |ti| ti.getData == model }.first
212
- swt_widget.showItem(edited_table_item)
213
- @table_editor_text_proxy&.swt_widget&.dispose
214
- @table_editor_text_proxy = nil
215
- after_write&.call(edited_table_item)
216
- @edit_in_progress = false
217
- end
218
- end
219
291
  end
220
- on_focus_lost(&@finish_edit)
221
- on_key_pressed { |key_event|
222
- if key_event.keyCode == swt(:cr)
223
- @finish_edit.call(key_event)
224
- elsif key_event.keyCode == swt(:esc)
225
- @cancel_edit.call
226
- end
227
- }
228
- }
229
- @table_editor_text_proxy.swt_widget.selectAll
292
+ end
293
+ end
294
+
295
+ content {
296
+ @table_editor_widget_proxy = @table_editor_text_proxy = TableProxy::editors[editor_widget][:editor_gui].call(editor_widget_args, model, model_editing_property, self)
230
297
  }
231
- @table_editor.setEditor(@table_editor_text_proxy.swt_widget, table_item, column_index)
298
+ @table_editor.setEditor(@table_editor_widget_proxy.swt_widget, table_item, column_index)
299
+ rescue => e
300
+ Glimmer::Config.logger&.error e.full_message
301
+ raise e
232
302
  end
233
303
 
234
304
  def add_listener(underscored_listener_name, &block)
@@ -271,7 +271,7 @@ module Glimmer
271
271
  return nil
272
272
  end
273
273
  swt_widget_class
274
- rescue NameError => e
274
+ rescue SyntaxError, NameError => e
275
275
  Glimmer::Config.logger&.debug e.full_message
276
276
  # Glimmer::Config.logger&.debug("#{e.message}\n#{e.backtrace.join("\n")}")
277
277
  nil
@@ -138,12 +138,8 @@ module Glimmer
138
138
  @swt_widget = @body_root.swt_widget
139
139
  end
140
140
 
141
- # Subclasses may override to perform post initialization work on an added child
142
- def post_initialize_child(child)
143
- body_root.post_initialize_child(child)
144
- end
145
-
146
141
  def can_handle_observation_request?(observation_request)
142
+ observation_request = observation_request.to_s
147
143
  result = false
148
144
  if observation_request.start_with?('on_updated_')
149
145
  property = observation_request.sub(/^on_updated_/, '')
@@ -153,6 +149,7 @@ module Glimmer
153
149
  end
154
150
 
155
151
  def handle_observation_request(observation_request, &block)
152
+ observation_request = observation_request.to_s
156
153
  if observation_request.start_with?('on_updated_')
157
154
  property = observation_request.sub(/^on_updated_/, '') # TODO look into eliminating duplication from above
158
155
  add_observer(DataBinding::Observer.proc(&block), property) if can_add_observer?(property)
@@ -188,7 +185,9 @@ module Glimmer
188
185
 
189
186
  # This method ensures it has an instance method not coming from Glimmer DSL
190
187
  def has_instance_method?(method_name)
191
- respond_to?(method_name) && !method(method_name)&.source_location&.first&.include?('glimmer/dsl/engine.rb')
188
+ respond_to?(method_name) &&
189
+ !method(method_name)&.source_location&.first&.include?('glimmer/dsl/engine.rb') &&
190
+ !method(method_name)&.source_location&.first&.include?('glimmer/swt/widget_proxy.rb')
192
191
  end
193
192
 
194
193
  def get_attribute(attribute_name)
@@ -229,13 +228,14 @@ module Glimmer
229
228
  end
230
229
  end
231
230
 
232
- def dispose
233
- body_root.dispose
234
- end
235
-
236
231
  def method_missing(method, *args, &block)
237
232
  body_root.send(method, *args, &block)
238
233
  end
234
+
235
+ def respond_to?(method, *args, &block)
236
+ super or
237
+ body_root.respond_to?(method, *args, &block)
238
+ end
239
239
 
240
240
  private
241
241
 
metadata CHANGED
@@ -1,21 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glimmer-dsl-swt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - AndyMaleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-17 00:00:00.000000000 Z
11
+ date: 2020-07-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: 0.9.4
18
+ version: 0.9.5
19
19
  name: glimmer
20
20
  type: :runtime
21
21
  prerelease: false
@@ -23,7 +23,7 @@ dependencies:
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.9.4
26
+ version: 0.9.5
27
27
  - !ruby/object:Gem::Dependency
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements: