clevic 0.13.0.b9 → 0.13.0.b10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. data/History.txt +3 -0
  2. data/lib/clevic/action_builder.rb +16 -16
  3. data/lib/clevic/ar_methods.rb +22 -22
  4. data/lib/clevic/attribute_list.rb +5 -5
  5. data/lib/clevic/cache_table.rb +18 -18
  6. data/lib/clevic/dataset_roller.rb +3 -3
  7. data/lib/clevic/default_view.rb +4 -4
  8. data/lib/clevic/delegate.rb +8 -8
  9. data/lib/clevic/delegates/combo_delegate.rb +22 -22
  10. data/lib/clevic/delegates/distinct_delegate.rb +5 -5
  11. data/lib/clevic/delegates/relational_delegate.rb +6 -6
  12. data/lib/clevic/delegates/set_delegate.rb +3 -3
  13. data/lib/clevic/dirty.rb +1 -1
  14. data/lib/clevic/emitter.rb +3 -3
  15. data/lib/clevic/extensions.rb +4 -4
  16. data/lib/clevic/field.rb +68 -68
  17. data/lib/clevic/field_valuer.rb +26 -26
  18. data/lib/clevic/filter_command.rb +6 -6
  19. data/lib/clevic/framework.rb +3 -3
  20. data/lib/clevic/generic_format.rb +2 -2
  21. data/lib/clevic/many_field.rb +3 -3
  22. data/lib/clevic/model_builder.rb +88 -84
  23. data/lib/clevic/model_column.rb +13 -13
  24. data/lib/clevic/ordered_dataset.rb +7 -7
  25. data/lib/clevic/qt/action_builder.rb +3 -3
  26. data/lib/clevic/qt/browser.rb +28 -28
  27. data/lib/clevic/qt/clipboard.rb +5 -5
  28. data/lib/clevic/qt/combo_delegate.rb +12 -12
  29. data/lib/clevic/qt/distinct_delegate.rb +1 -1
  30. data/lib/clevic/qt/extensions.rb +4 -4
  31. data/lib/clevic/qt/qt_combo_box.rb +7 -7
  32. data/lib/clevic/qt/relational_delegate.rb +5 -5
  33. data/lib/clevic/qt/search_dialog.rb +15 -15
  34. data/lib/clevic/qt/simplest_delegate.rb +2 -2
  35. data/lib/clevic/qt/table_model.rb +46 -46
  36. data/lib/clevic/qt/table_view.rb +48 -48
  37. data/lib/clevic/qt/text_delegate.rb +9 -9
  38. data/lib/clevic/rails_models_loaders.rb +3 -3
  39. data/lib/clevic/record.rb +8 -8
  40. data/lib/clevic/sampler.rb +6 -6
  41. data/lib/clevic/sequel_ar_adapter.rb +22 -22
  42. data/lib/clevic/sequel_clevic.rb +10 -10
  43. data/lib/clevic/sequel_meta.rb +5 -5
  44. data/lib/clevic/sequel_naked.rb +4 -4
  45. data/lib/clevic/swing/action.rb +20 -20
  46. data/lib/clevic/swing/action_builder.rb +2 -2
  47. data/lib/clevic/swing/boolean_delegate.rb +3 -3
  48. data/lib/clevic/swing/browser.rb +37 -37
  49. data/lib/clevic/swing/cell_editor.rb +13 -13
  50. data/lib/clevic/swing/cell_renderer.rb +7 -7
  51. data/lib/clevic/swing/clipboard.rb +19 -19
  52. data/lib/clevic/swing/combo_delegate.rb +26 -26
  53. data/lib/clevic/swing/confirm_dialog.rb +7 -7
  54. data/lib/clevic/swing/delegate.rb +4 -4
  55. data/lib/clevic/swing/extensions.rb +24 -24
  56. data/lib/clevic/swing/field.rb +1 -1
  57. data/lib/clevic/swing/relational_delegate.rb +2 -2
  58. data/lib/clevic/swing/row_header.rb +32 -32
  59. data/lib/clevic/swing/search_dialog.rb +31 -31
  60. data/lib/clevic/swing/selection_model.rb +12 -12
  61. data/lib/clevic/swing/swing_table_index.rb +6 -6
  62. data/lib/clevic/swing/table_model.rb +30 -30
  63. data/lib/clevic/swing/table_view.rb +54 -54
  64. data/lib/clevic/swing/table_view_focus.rb +4 -4
  65. data/lib/clevic/swing/tag_delegate.rb +14 -14
  66. data/lib/clevic/swing/tag_editor.rb +4 -4
  67. data/lib/clevic/swing/text_area_delegate.rb +6 -6
  68. data/lib/clevic/swing/text_delegate.rb +4 -4
  69. data/lib/clevic/table_index.rb +14 -14
  70. data/lib/clevic/table_model.rb +30 -30
  71. data/lib/clevic/table_searcher.rb +19 -19
  72. data/lib/clevic/table_view.rb +92 -92
  73. data/lib/clevic/table_view_paste.rb +19 -19
  74. data/lib/clevic/version.rb +1 -1
  75. data/lib/clevic/view.rb +22 -22
  76. data/models/accounts_models.rb +10 -10
  77. data/models/examples.rb +2 -2
  78. data/models/times_models.rb +32 -32
  79. data/models/values_models.rb +2 -2
  80. data/test/test_cache_table.rb +15 -15
  81. data/test/test_helper.rb +7 -7
  82. data/test/test_model_index_extensions.rb +6 -6
  83. data/test/test_table_model.rb +6 -6
  84. data/test/test_table_searcher.rb +25 -25
  85. metadata +33 -35
@@ -5,26 +5,26 @@ module Qt
5
5
  def no_insert=( bool )
6
6
  self.insert_policy = Qt::ComboBox::NoInsert if bool
7
7
  end
8
-
8
+
9
9
  def <<( item )
10
10
  text, data = item_to_editor( item )
11
11
  add_item( text, data.to_variant )
12
12
  end
13
-
13
+
14
14
  def include?( item )
15
15
  text, data = item_to_editor( item )
16
16
  find_data( data.to_variant ) != -1
17
17
  end
18
-
18
+
19
19
  def selected_item=( item )
20
20
  text, data = item_to_editor( item )
21
21
  self.current_index = find_data( data.to_variant )
22
22
  end
23
-
23
+
24
24
  def selected_item
25
25
  delegate.editor_to_item( item_data( self.current_index ).value )
26
26
  end
27
-
27
+
28
28
  # wrapper for the delegate method so we don't have
29
29
  # to keep checking for nil values
30
30
  def item_to_editor( item )
@@ -34,7 +34,7 @@ module Qt
34
34
  ['', nil ]
35
35
  end
36
36
  end
37
-
37
+
38
38
  # wrapper for the delegate method so we don't have
39
39
  # to keep checking for nil values
40
40
  def editor_to_item( data )
@@ -45,7 +45,7 @@ module Qt
45
45
  end
46
46
  end
47
47
  end
48
-
48
+
49
49
  # Adding these to Qt::Widget as the superclass
50
50
  # doesn't work for some reason.
51
51
  class ComboBox
@@ -12,11 +12,11 @@ class RelationalDelegate < ComboDelegate
12
12
  def item_to_editor( item )
13
13
  [ field.transform_attribute( item ), item.pk.to_variant ]
14
14
  end
15
-
15
+
16
16
  def editor_to_item( data )
17
17
  entity.related_class[ data ]
18
18
  end
19
-
19
+
20
20
  # called by Qt when it wants to give the delegate an index to edit
21
21
  def setEditorData( editor_widget, model_index )
22
22
  if is_combo?( editor_widget )
@@ -26,11 +26,11 @@ class RelationalDelegate < ComboDelegate
26
26
  editor_widget.line_edit.andand.select_all
27
27
  end
28
28
  end
29
-
29
+
30
30
  # return an entity object, given a text selection
31
31
  def translate_from_editor_text( editor_widget, text )
32
32
  item_index = editor_widget.find_text( text )
33
-
33
+
34
34
  # fetch record id from editor_widget item_data
35
35
  item_data = editor_widget.item_data( item_index )
36
36
  if item_data.valid?
@@ -39,7 +39,7 @@ class RelationalDelegate < ComboDelegate
39
39
  field.related_class[ item_data.to_int ]
40
40
  end
41
41
  end
42
-
42
+
43
43
  end
44
44
 
45
45
  end
@@ -8,68 +8,68 @@ module Clevic
8
8
  class SearchDialog
9
9
  include AcceptReject
10
10
  include QtFlags
11
-
11
+
12
12
  attr_reader :match_flags, :layout
13
13
  attr_accessor :result
14
-
14
+
15
15
  def initialize( parent )
16
16
  @layout = Ui_SearchDialog.new
17
17
  @dialog = Qt::Dialog.new
18
18
  @layout.setupUi( @dialog )
19
19
  end
20
-
20
+
21
21
  def from_start?
22
22
  layout.from_start.value
23
23
  end
24
-
24
+
25
25
  def from_start=( value )
26
26
  layout.from_start.value = value
27
27
  end
28
-
28
+
29
29
  def regex?
30
30
  layout.regex.value
31
31
  end
32
-
32
+
33
33
  def whole_words?
34
34
  layout.whole_words.value
35
35
  end
36
-
36
+
37
37
  def search_combo
38
38
  layout.search_combo
39
39
  end
40
-
40
+
41
41
  def forwards?
42
42
  layout.forwards.checked?
43
43
  end
44
-
44
+
45
45
  def backwards?
46
46
  layout.backwards.checked?
47
47
  end
48
-
48
+
49
49
  # return either :backwards or :forwards
50
50
  def direction
51
51
  return :forwards if forwards?
52
52
  return :backwards if backwards?
53
53
  raise "direction not known"
54
54
  end
55
-
55
+
56
56
  def exec( text = '' )
57
57
  search_combo.edit_text = text.to_s
58
58
  search_combo.set_focus
59
59
  self.result = @dialog.exec
60
-
60
+
61
61
  # remember previous searches
62
62
  if search_combo.find_text( search_combo.current_text ) == -1
63
63
  search_combo.add_item( search_combo.current_text )
64
64
  end
65
-
65
+
66
66
  self
67
67
  end
68
-
68
+
69
69
  def search_text
70
70
  search_combo.current_text
71
71
  end
72
-
72
+
73
73
  end
74
74
 
75
75
  end
@@ -9,8 +9,8 @@ module SimplestDelegate
9
9
  [ item, item ]
10
10
  end
11
11
  end
12
-
13
-
12
+
13
+
14
14
  def editor_to_item( data )
15
15
  data.value
16
16
  end
@@ -18,43 +18,43 @@ including the Clevic::Record module in a Sequel::Model subclass.
18
18
  =end
19
19
  class TableModel < Qt::AbstractTableModel
20
20
  include QtFlags
21
-
21
+
22
22
  signals(
23
23
  # index where error occurred, value, message
24
24
  'data_error(QModelIndex,QVariant,QString)'
25
25
  )
26
-
26
+
27
27
  def emit_data_error( index, data, string )
28
28
  emit data_error( index, data.to_variant, string )
29
29
  end
30
-
30
+
31
31
  def initialize( parent = nil )
32
32
  super
33
33
  end
34
-
34
+
35
35
  # add a new item, and set defaults from the Clevic::View
36
36
  def add_new_item_start
37
37
  begin_insert_rows( Qt::ModelIndex.invalid, row_count, row_count )
38
38
  end
39
-
39
+
40
40
  def add_new_item_end
41
41
  # notify listeners that the model has changed
42
42
  end_insert_rows
43
43
  end
44
-
44
+
45
45
  def remove_notify( rows, &block )
46
46
  begin_remove_rows( Qt::ModelIndex.invalid, rows.first, rows.last )
47
47
  # do the removal
48
48
  yield
49
49
  end_remove_rows
50
50
  end
51
-
51
+
52
52
  # save the AR model at the given index, if it's dirty
53
53
  def update_vertical_header( index )
54
54
  raise "preferably use data_changed here, if possible"
55
55
  emit headerDataChanged( Qt::Vertical, index.row, index.row )
56
56
  end
57
-
57
+
58
58
  def rowCount( parent = nil )
59
59
  collection.size
60
60
  end
@@ -63,34 +63,34 @@ class TableModel < Qt::AbstractTableModel
63
63
  def row_count
64
64
  collection.size
65
65
  end
66
-
66
+
67
67
  def columnCount( parent = nil )
68
68
  fields.size
69
69
  end
70
-
70
+
71
71
  # Not looked up or aliased properly by Qt bindings
72
72
  def column_count
73
73
  fields.size
74
74
  end
75
-
75
+
76
76
  def flags( model_index )
77
77
  retval = super
78
-
78
+
79
79
  # sometimes this actually happens.
80
80
  # TODO probably a bug in the combo editor exit code
81
81
  return retval if model_index.column >= columnCount
82
-
82
+
83
83
  # TODO don't return IsEditable if the model is read-only
84
84
  if model_index.meta.type == :boolean
85
85
  retval = item_boolean_flags
86
86
  end
87
-
87
+
88
88
  unless model_index.field.read_only? || read_only?
89
89
  retval |= qt_item_is_editable.to_i
90
90
  end
91
91
  retval
92
92
  end
93
-
93
+
94
94
  # values for horizontal and vertical headers
95
95
  def headerData( section, orientation, role )
96
96
  value =
@@ -103,22 +103,22 @@ class TableModel < Qt::AbstractTableModel
103
103
  # display record number. Object id is in tooltip.
104
104
  section+1
105
105
  end
106
-
106
+
107
107
  when qt_text_alignment_role
108
108
  case orientation
109
109
  when Qt::Vertical
110
110
  Qt::AlignRight | Qt::AlignVCenter
111
111
  end
112
-
112
+
113
113
  when Qt::SizeHintRole
114
114
  # anything other than nil here makes the headers disappear.
115
115
  nil
116
-
116
+
117
117
  when qt_tooltip_role
118
118
  case orientation
119
119
  when Qt::Horizontal
120
120
  fields[section].tooltip
121
-
121
+
122
122
  when Qt::Vertical
123
123
  case
124
124
  when !collection[section].errors.empty?
@@ -131,7 +131,7 @@ class TableModel < Qt::AbstractTableModel
131
131
  end
132
132
  end
133
133
  end
134
-
134
+
135
135
  when qt_background_role
136
136
  if orientation == Qt::Vertical
137
137
  item = collection[section]
@@ -144,15 +144,15 @@ class TableModel < Qt::AbstractTableModel
144
144
  end
145
145
  end
146
146
  end
147
-
147
+
148
148
  else
149
149
  #~ puts "headerData section: #{section}, role: #{const_as_string(role)}" if $options[:debug]
150
150
  nil
151
151
  end
152
-
152
+
153
153
  return value.to_variant
154
154
  end
155
-
155
+
156
156
  # Provide data to UI.
157
157
  def data( index, role = qt_display_role )
158
158
  #~ puts "data for index: #{index.inspect}, field #{index.field.attribute.inspect} and role: #{const_as_string role}"
@@ -166,18 +166,18 @@ class TableModel < Qt::AbstractTableModel
166
166
  unless index.meta.type == :boolean
167
167
  value = index.display_value
168
168
  end
169
-
169
+
170
170
  when qt_edit_role
171
171
  # see comment for qt_display_role
172
172
  unless index.meta.type == :boolean
173
173
  value = index.edit_value
174
174
  end
175
-
175
+
176
176
  when qt_checkstate_role
177
177
  if index.meta.type == :boolean
178
178
  index.raw_value ? qt_checked : qt_unchecked
179
179
  end
180
-
180
+
181
181
  when qt_text_alignment_role
182
182
  case index.field.alignment
183
183
  when :left; qt_alignleft
@@ -185,34 +185,34 @@ class TableModel < Qt::AbstractTableModel
185
185
  when :centre; qt_aligncenter
186
186
  when :justified; qt_alignjustified
187
187
  end
188
-
188
+
189
189
  # just here to make debug output quieter
190
190
  when qt_size_hint_role;
191
-
191
+
192
192
  # show field with a red background if there's an error
193
193
  when qt_background_role
194
194
  index.field.background_for( index.entity ) || Qt::Color.new( 'red' ) if index.has_errors?
195
-
195
+
196
196
  when qt_font_role;
197
-
197
+
198
198
  when qt_foreground_role
199
199
  index.field.foreground_for( index.entity ) ||
200
200
  if index.field.read_only? || read_only?
201
201
  Qt::Color.new( 'dimgray' )
202
202
  end
203
-
203
+
204
204
  when qt_decoration_role;
205
205
  index.field.decoration_for( index.entity )
206
-
206
+
207
207
  when qt_tooltip_role
208
208
  index.tooltip
209
-
209
+
210
210
  else
211
211
  puts "data index: #{index}, role: #{const_as_string(role)}" if $options[:debug]
212
212
  nil
213
213
  # return the variant
214
214
  end.to_variant
215
-
215
+
216
216
  rescue Exception => e
217
217
  # this can generate a lot of errors from view code, so don't emit data_error every one
218
218
  puts "#{entity_view.class.name}.#{index.field.id}: #{index.inspect} for role: #{const_as_string role} #{value.inspect} #{index.entity.inspect}"
@@ -231,23 +231,23 @@ class TableModel < Qt::AbstractTableModel
231
231
  when qt_edit_role
232
232
  # Don't allow the primary key to be changed
233
233
  return false if index.attribute == entity_class.primary_key.to_sym
234
-
234
+
235
235
  if ( index.column < 0 || index.column >= column_count )
236
236
  raise "invalid column #{index.column}"
237
237
  end
238
-
238
+
239
239
  begin
240
240
  case
241
241
  when variant.class.name == 'Qt::Date'
242
242
  index.attribute_value = Date.new( variant.year, variant.month, variant.day )
243
-
243
+
244
244
  when variant.class.name == 'Qt::Time'
245
245
  index.attribute_value = Time.new( variant.hour, variant.min, variant.sec )
246
-
246
+
247
247
  else
248
248
  index.edit_value = variant.value
249
249
  end
250
-
250
+
251
251
  # value conversion was successful
252
252
  data_changed( index )
253
253
  true
@@ -266,7 +266,7 @@ class TableModel < Qt::AbstractTableModel
266
266
  else
267
267
  false
268
268
  end
269
-
269
+
270
270
  # user-defined role
271
271
  # TODO this only works with single-dotted paths
272
272
  when qt_paste_role
@@ -283,17 +283,17 @@ class TableModel < Qt::AbstractTableModel
283
283
  index.attribute_value = variant.value
284
284
  end
285
285
  true
286
-
286
+
287
287
  else
288
288
  puts "role: #{role.inspect}"
289
289
  true
290
-
290
+
291
291
  end
292
292
  else
293
293
  false
294
294
  end
295
295
  end
296
-
296
+
297
297
  # A rubyish way of doing dataChanged
298
298
  # - if args has one element, it's either a single ModelIndex
299
299
  # or something that understands top_left and bottom_right. These
@@ -313,10 +313,10 @@ class TableModel < Qt::AbstractTableModel
313
313
  # assume it's a ModelIndex
314
314
  emit dataChanged( arg, arg )
315
315
  end
316
-
316
+
317
317
  when 2
318
318
  emit dataChanged( args.first, args.last )
319
-
319
+
320
320
  else
321
321
  unless block.nil?
322
322
  change = DataChange.new
@@ -326,7 +326,7 @@ class TableModel < Qt::AbstractTableModel
326
326
  end
327
327
  end
328
328
  end
329
-
329
+
330
330
  end
331
331
 
332
332
  end #module