clevic 0.6.0 → 0.7.0

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.
@@ -19,16 +19,17 @@ class ItemDelegate < Qt::ItemDelegate
19
19
  # This catches the event that begins the edit process.
20
20
  # Not used at the moment.
21
21
  def editorEvent ( event, model, style_option_view_item, model_index )
22
- puts "editorEvent"
23
- puts "event: #{event.inspect}"
24
- puts "model: #{model.inspect}"
25
- puts "style_option_view_item: #{style_option_view_item.inspect}"
26
- puts "model_index: #{model_index.inspect}"
22
+ #~ if $options[:debug]
23
+ #~ puts "editorEvent"
24
+ #~ puts "event: #{event.inspect}"
25
+ #~ puts "model: #{model.inspect}"
26
+ #~ puts "style_option_view_item: #{style_option_view_item.inspect}"
27
+ #~ puts "model_index: #{model_index.inspect}"
28
+ #~ end
27
29
  super
28
30
  end
29
31
 
30
32
  def createEditor( parent_widget, style_option_view_item, model_index )
31
- puts "model_index.metadata.type: #{model_index.metadata.type.inspect}"
32
33
  if model_index.metadata.type == :date
33
34
  # not going to work here because being triggered by
34
35
  # an alphanumeric keystroke (as opposed to F4)
@@ -30,8 +30,31 @@ For example, a the UI for a model called Entry would be defined like this:
30
30
  # :set is mandatory
31
31
  restricted :vat, :label => 'VAT', :set => %w{ yes no all }, :tooltip => 'Is VAT included?'
32
32
  distinct :description, :conditions => 'now() - date <= interval( 1 year )'
33
- relational :debit, 'name', :class_name => 'Account', :conditions => 'active = true', :order => 'lower(name)'
34
- relational :credit, 'name', :class_name => 'Account', :conditions => 'active = true', :order => 'lower(name)'
33
+
34
+ # this is a read-only field
35
+ plain :origin, :read_only => true
36
+
37
+ # for these, :format will be a dotted attribute accessor for the related
38
+ # ActiveRecord entity, in this case an instance of Account
39
+ relational :debit, :format => 'name', :class_name => 'Account', :conditions => 'active = true', :order => 'lower(name)'
40
+ relational :credit, :format => 'name', :class_name => 'Account', :conditions => 'active = true', :order => 'lower(name)'
41
+
42
+ # or like this to have an on-the-fly transform
43
+ # item will be an instance of Account
44
+ relational :credit, :format => lambda {|item| item.name.downcase}, :class_name => 'Account', :conditions => 'active = true', :order => 'lower(name)', :sample => 'Leilani Member Loan'
45
+
46
+ # this is a read-only display field from a related table
47
+ # the Entry class should then define a method called currency
48
+ # which returns an object that responds to 'short'.
49
+ # You can also use a Proc for :display
50
+ plain :currency, :display => 'short', :label => 'Currency'
51
+
52
+ # this is a read-only display field from a related table
53
+ # the Entry class should then define a method called currency
54
+ # which returns an object that responds to 'currency', which
55
+ # returns an object that responds to 'rate'.
56
+ # You can also use a Proc for :display
57
+ plain :some_field, :display => 'currency.rate', :label => 'Exchange Rate'
35
58
 
36
59
  # this is optional
37
60
  records :order => 'date,start'
@@ -63,6 +86,7 @@ class ModelBuilder
63
86
 
64
87
  # an ordinary field, edited in place with a text box
65
88
  def plain( attribute, options = {} )
89
+ options[:read_only] = true if options.has_key?( :display )
66
90
  @fields << Clevic::Field.new( attribute.to_sym, model_class, options )
67
91
  end
68
92
 
@@ -83,12 +107,15 @@ class ModelBuilder
83
107
 
84
108
  # for foreign keys. Edited with a combo box using values from the specified
85
109
  # path on the foreign key model object
86
- def relational( attribute, path, options = {} )
110
+ # if options[:format] has a value, it's used either as a block
111
+ # or as a dotted path
112
+ def relational( attribute, options = {}, &block )
113
+ options[:display] ||= 'to_s'
87
114
  unless options.has_key? :class_name
88
- options[:class_name] = attribute.to_s.classify
115
+ options[:class_name] = model_class.reflections[attribute].class_name || attribute.to_s.classify
89
116
  end
90
117
  field = Clevic::Field.new( attribute.to_sym, model_class, options )
91
- field.path = path
118
+
92
119
  field.delegate = RelationalDelegate.new( @table_view, field.attribute_path, options )
93
120
  @fields << field
94
121
  end
@@ -119,8 +146,8 @@ class ModelBuilder
119
146
  def build
120
147
  # build the model with all it's collections
121
148
  # using @model here because otherwise the view's
122
- # reference to this very same model is mysteriously
123
- # set to nil
149
+ # reference to this very same model is garbage collected.
150
+ # TODO put @fields into TableModel, and access from there?
124
151
  @model = Clevic::TableModel.new( self )
125
152
  @model.object_name = @table_view.model_class.name
126
153
  @model.dots = @fields.map {|x| x.column }
@@ -130,7 +157,7 @@ class ModelBuilder
130
157
 
131
158
  # the data
132
159
  @model.collection = records
133
- # fill in an empty record
160
+ # fill in an empty record for data entry
134
161
  @model.collection << model_class.new if @model.collection.size == 0
135
162
 
136
163
  # now set delegates
@@ -0,0 +1,28 @@
1
+ module Clevic
2
+
3
+ # The base class for all Clevic model and UI definitions.
4
+ # minimal definition is like this
5
+ # class User < Clevic::Record; end
6
+ # This will automatically keep track of the order
7
+ # in which models are defined, so that tabs can
8
+ # be constructed in that order.
9
+ class Record < ActiveRecord::Base
10
+ include ActiveRecord::Dirty
11
+ self.abstract_class = true
12
+ @@subclass_order = []
13
+
14
+ def self.inherited( subclass )
15
+ @@subclass_order << subclass
16
+ super
17
+ end
18
+
19
+ def self.models
20
+ @@subclass_order
21
+ end
22
+
23
+ def self.models=( array )
24
+ @@subclass_order = array
25
+ end
26
+ end
27
+
28
+ end
@@ -45,12 +45,6 @@ class TableModel < Qt::AbstractTableModel
45
45
  @builder = builder
46
46
  end
47
47
 
48
- def hasChildren( *args )
49
- puts 'hasChildren'
50
- puts "args: #{args.inspect}"
51
- super
52
- end
53
-
54
48
  def sort( col, order )
55
49
  puts 'sort'
56
50
  puts "col: #{col.inspect}"
@@ -162,31 +156,15 @@ class TableModel < Qt::AbstractTableModel
162
156
  end
163
157
 
164
158
  def flags( model_index )
159
+ retval = super
165
160
  # TODO don't return IsEditable if the model is read-only
166
- retval = qt_item_is_editable | super( model_index )
167
161
  if model_index.metadata.type == :boolean
168
162
  retval = item_boolean_flags
169
163
  end
164
+ retval |= qt_item_is_editable.to_i unless model_index.field.read_only?
170
165
  retval
171
166
  end
172
167
 
173
- def fetchMore( parent )
174
- #~ puts "fetchMore"
175
- #~ reload_data if canFetchMore( parent )
176
- end
177
-
178
- def canFetchMore( parent )
179
- false
180
- #~ puts "canFetchMore"
181
- #~ puts "self.collection.size: #{self.collection.size.inspect}"
182
- #~ puts "self.collection.sql_count: #{self.collection.sql_count.inspect}"
183
- # Here, test for self.collection.size - new_records != self.collection.sql_count
184
- # maintaining new_records will be the tricky part
185
- #~ result = self.collection.size != self.collection.sql_count
186
- #~ puts "result: #{result.inspect}"
187
- #~ result
188
- end
189
-
190
168
  def reload_data( options = {} )
191
169
  # renew cache
192
170
  self.collection = self.collection.renew( options )
@@ -248,8 +226,7 @@ class TableModel < Qt::AbstractTableModel
248
226
  begin
249
227
  value = index.gui_value
250
228
  unless value.nil?
251
- field = @builder.fields[index.column]
252
- field.do_format( value )
229
+ index.field.do_format( value )
253
230
  end
254
231
  rescue Exception => e
255
232
  puts e.backtrace
@@ -262,21 +239,23 @@ class TableModel < Qt::AbstractTableModel
262
239
  end
263
240
 
264
241
  when qt_text_alignment_role
265
- @builder.fields[index.column].alignment
242
+ index.field.alignment
266
243
 
267
244
  # these are just here to make debug output quieter
268
245
  when qt_size_hint_role;
269
246
  when qt_background_role;
270
247
  when qt_font_role;
271
- when qt_foreground_role;
248
+ when qt_foreground_role
249
+ Qt::Color.new( 'dimgray' ) if index.field.read_only?
272
250
  when qt_decoration_role;
273
251
 
274
252
  # provide a tooltip when an empty relational field is encountered
275
253
  when qt_tooltip_role
276
254
  if index.metadata.type == :association
277
- @builder.fields[index.column].delegate.if_empty_message
255
+ index.field.delegate.if_empty_message
278
256
  end
279
257
 
258
+ 'Read-only' if index.field.read_only?
280
259
  else
281
260
  puts "data index: #{index}, role: #{const_as_string(role)}" if $options[:debug]
282
261
  nil
@@ -369,7 +348,7 @@ class TableModel < Qt::AbstractTableModel
369
348
  # TODO this only works with single-dotted paths
370
349
  when qt_paste_role
371
350
  if index.metadata.type == :association
372
- field = @builder.fields[index.column]
351
+ field = index.field
373
352
  association_class = field.class_name.constantize
374
353
  candidates = association_class.find( :all, :conditions => [ "#{field.attribute_path[1]} = ?", variant.value ] )
375
354
  case candidates.size
@@ -392,6 +371,13 @@ class TableModel < Qt::AbstractTableModel
392
371
  end
393
372
  end
394
373
 
374
+ def like_operator
375
+ case model_class.connection.adapter_name
376
+ when 'PostgreSQL'; 'ilike'
377
+ else; 'like'
378
+ end
379
+ end
380
+
395
381
  # return a set of indexes that match the search criteria
396
382
  def search( start_index, search_criteria )
397
383
  # get the search value parameter, in SQL format
@@ -404,12 +390,10 @@ class TableModel < Qt::AbstractTableModel
404
390
 
405
391
  # build up the conditions
406
392
  bits = collection.build_sql_find( start_index.entity, search_criteria.direction )
407
- conditions = "#{model_class.connection.quote_column_name( start_index.field_name )} ilike :search_value"
393
+ conditions = "#{model_class.connection.quote_column_name( start_index.field_name )} #{like_operator} :search_value"
408
394
  conditions += ( " and " + bits[:sql] ) unless search_criteria.from_start?
409
395
  params = { :search_value => search_value }
410
396
  params.merge!( bits[:params] ) unless search_criteria.from_start?
411
- #~ puts "conditions: #{conditions.inspect}"
412
- #~ puts "params: #{params.inspect}"
413
397
  # find the first match
414
398
  entity = model_class.find(
415
399
  :first,
@@ -426,6 +410,10 @@ class TableModel < Qt::AbstractTableModel
426
410
  end
427
411
  end
428
412
 
413
+ def field_for_index( model_index )
414
+ @builder.fields[model_index.column]
415
+ end
416
+
429
417
  end
430
418
 
431
419
  end #module
@@ -352,9 +352,17 @@ class TableView < Qt::TableView
352
352
  end
353
353
  end
354
354
 
355
+ def save_current_row
356
+ if !current_index.nil? && current_index.valid?
357
+ save_row( current_index )
358
+ end
359
+ end
360
+
355
361
  # save the entity in the row of the given index
362
+ # actually, model.save will check if the record
363
+ # is really changed before writing to DB.
356
364
  def save_row( index )
357
- if index.valid?
365
+ if !index.nil? && index.valid?
358
366
  saved = model.save( index )
359
367
  if !saved
360
368
  error_message = Qt::ErrorMessage.new( self )
@@ -362,6 +370,7 @@ class TableView < Qt::TableView
362
370
  error_message.show_message( msg )
363
371
  error_message.show
364
372
  end
373
+ saved
365
374
  end
366
375
  end
367
376
 
@@ -392,10 +401,42 @@ class TableView < Qt::TableView
392
401
  end
393
402
  @index_override = false
394
403
  end
404
+
405
+ # work around situation where an ItemDelegate is open
406
+ # when the surrouding tab is changed, but the right events
407
+ # don't arrive.
408
+ def hideEvent( event )
409
+ super
410
+ @hiding = true
411
+ end
412
+
413
+ # work around situation where an ItemDelegate is open
414
+ # when the surrouding tab is changed, but the right events
415
+ # don't arrive.
416
+ def showEvent( event )
417
+ super
418
+ @hiding = false
419
+ end
395
420
 
421
+ def focusOutEvent( event )
422
+ super
423
+ save_current_row
424
+ end
425
+
426
+ # this is the only method that is called when an itemDelegate is open
427
+ # and the tabs are changed.
428
+ # Work around situation where an ItemDelegate is open
429
+ # when the surrouding tab is changed, but the right events
430
+ # don't arrive.
431
+ def commitData( editor )
432
+ super
433
+ save_current_row if @hiding
434
+ end
435
+
396
436
  # override to prevent tab pressed from editing next field
397
437
  # also takes into account that override_next_index may have been called
398
438
  def closeEditor( editor, end_edit_hint )
439
+ puts "end_edit_hint: #{end_edit_hint.inspect}"
399
440
  case end_edit_hint
400
441
  when Qt::AbstractItemDelegate.EditNextItem
401
442
  super( editor, Qt::AbstractItemDelegate.NoHint )
@@ -413,7 +454,13 @@ class TableView < Qt::TableView
413
454
  # If self.filter is false, use the data in the indexes to filter the data set;
414
455
  # otherwise turn filtering off.
415
456
  # Sets self.filter to true if filtering worked, false otherwise.
457
+ # indexes is a collection of Qt::ModelIndex
416
458
  def filter_by_indexes( indexes )
459
+ unless indexes[0].field.filterable?
460
+ emit status_text( "Can't filter on #{indexes[0].field.label}" )
461
+ return
462
+ end
463
+
417
464
  save_entity = current_index.entity
418
465
  save_index = current_index
419
466
 
@@ -22,12 +22,12 @@
22
22
  <x>0</x>
23
23
  <y>0</y>
24
24
  <width>727</width>
25
- <height>31</height>
25
+ <height>28</height>
26
26
  </rect>
27
27
  </property>
28
28
  <widget class="QMenu" name="menu_file" >
29
29
  <property name="title" >
30
- <string>File</string>
30
+ <string>&amp;File</string>
31
31
  </property>
32
32
  <addaction name="action_open" />
33
33
  <addaction name="action_close" />
@@ -74,12 +74,12 @@
74
74
  </action>
75
75
  <action name="action_close" >
76
76
  <property name="text" >
77
- <string>Close</string>
77
+ <string>&amp;Close</string>
78
78
  </property>
79
79
  </action>
80
80
  <action name="action_recent" >
81
81
  <property name="text" >
82
- <string>Recent</string>
82
+ <string>&amp;Recent</string>
83
83
  </property>
84
84
  </action>
85
85
  <action name="action_cut" >
@@ -1,8 +1,8 @@
1
1
  =begin
2
2
  ** Form generated from reading ui file 'browser.ui'
3
3
  **
4
- ** Created: Mon Jul 7 22:49:30 2008
5
- ** by: Qt User Interface Compiler version 4.3.2
4
+ ** Created: Thu Jul 24 15:41:20 2008
5
+ ** by: Qt User Interface Compiler version 4.3.3
6
6
  **
7
7
  ** WARNING! All changes made in this file will be lost when recompiling ui file!
8
8
  =end
@@ -25,7 +25,7 @@ class Ui_Browser
25
25
  attr_reader :action_find_next
26
26
  attr_reader :action_new_row
27
27
  attr_reader :main_widget
28
- attr_reader :qvboxLayout
28
+ attr_reader :vboxLayout
29
29
  attr_reader :statusbar
30
30
  attr_reader :menubar
31
31
  attr_reader :menu_file
@@ -34,60 +34,64 @@ class Ui_Browser
34
34
  attr_reader :menu_model
35
35
 
36
36
  def setupUi(browser)
37
- browser.setObjectName("browser")
38
- browser.setWindowIcon(Qt::Icon.new("icon.png"))
37
+ if browser.objectName.nil?
38
+ browser.objectName = "browser"
39
+ end
40
+ browser.resize(727, 740)
41
+ icon = Qt::Icon.new("icon.png")
42
+ browser.windowIcon = icon
39
43
  @action_open = Qt::Action.new(browser)
40
- @action_open.setObjectName("action_open")
44
+ @action_open.objectName = "action_open"
41
45
  @action_close = Qt::Action.new(browser)
42
- @action_close.setObjectName("action_close")
46
+ @action_close.objectName = "action_close"
43
47
  @action_recent = Qt::Action.new(browser)
44
- @action_recent.setObjectName("action_recent")
48
+ @action_recent.objectName = "action_recent"
45
49
  @action_cut = Qt::Action.new(browser)
46
- @action_cut.setObjectName("action_cut")
50
+ @action_cut.objectName = "action_cut"
47
51
  @action_copy = Qt::Action.new(browser)
48
- @action_copy.setObjectName("action_copy")
52
+ @action_copy.objectName = "action_copy"
49
53
  @action_paste = Qt::Action.new(browser)
50
- @action_paste.setObjectName("action_paste")
54
+ @action_paste.objectName = "action_paste"
51
55
  @action_filter = Qt::Action.new(browser)
52
- @action_filter.setObjectName("action_filter")
53
- @action_filter.setCheckable(true)
56
+ @action_filter.objectName = "action_filter"
57
+ @action_filter.checkable = true
54
58
  @action_find = Qt::Action.new(browser)
55
- @action_find.setObjectName("action_find")
59
+ @action_find.objectName = "action_find"
56
60
  @action_dump = Qt::Action.new(browser)
57
- @action_dump.setObjectName("action_dump")
61
+ @action_dump.objectName = "action_dump"
58
62
  @action_refresh = Qt::Action.new(browser)
59
- @action_refresh.setObjectName("action_refresh")
63
+ @action_refresh.objectName = "action_refresh"
60
64
  @action_next = Qt::Action.new(browser)
61
- @action_next.setObjectName("action_next")
65
+ @action_next.objectName = "action_next"
62
66
  @action_previous = Qt::Action.new(browser)
63
- @action_previous.setObjectName("action_previous")
67
+ @action_previous.objectName = "action_previous"
64
68
  @action_highlight = Qt::Action.new(browser)
65
- @action_highlight.setObjectName("action_highlight")
69
+ @action_highlight.objectName = "action_highlight"
66
70
  @action_new_window = Qt::Action.new(browser)
67
- @action_new_window.setObjectName("action_new_window")
71
+ @action_new_window.objectName = "action_new_window"
68
72
  @action_find_next = Qt::Action.new(browser)
69
- @action_find_next.setObjectName("action_find_next")
73
+ @action_find_next.objectName = "action_find_next"
70
74
  @action_new_row = Qt::Action.new(browser)
71
- @action_new_row.setObjectName("action_new_row")
75
+ @action_new_row.objectName = "action_new_row"
72
76
  @main_widget = Qt::Widget.new(browser)
73
- @main_widget.setObjectName("main_widget")
74
- @qvboxLayout = Qt::VBoxLayout.new(@main_widget)
75
- @qvboxLayout.setObjectName("qvboxLayout")
76
- browser.setCentralWidget(@main_widget)
77
+ @main_widget.objectName = "main_widget"
78
+ @vboxLayout = Qt::VBoxLayout.new(@main_widget)
79
+ @vboxLayout.objectName = "vboxLayout"
80
+ browser.centralWidget = @main_widget
77
81
  @statusbar = Qt::StatusBar.new(browser)
78
- @statusbar.setObjectName("statusbar")
79
- browser.setStatusBar(@statusbar)
82
+ @statusbar.objectName = "statusbar"
83
+ browser.statusBar = @statusbar
80
84
  @menubar = Qt::MenuBar.new(browser)
81
- @menubar.setObjectName("menubar")
82
- @menubar.setGeometry(Qt::Rect.new(0, 0, 727, 31))
85
+ @menubar.objectName = "menubar"
86
+ @menubar.geometry = Qt::Rect.new(0, 0, 727, 28)
83
87
  @menu_file = Qt::Menu.new(@menubar)
84
- @menu_file.setObjectName("menu_file")
88
+ @menu_file.objectName = "menu_file"
85
89
  @menu_edit = Qt::Menu.new(@menubar)
86
- @menu_edit.setObjectName("menu_edit")
90
+ @menu_edit.objectName = "menu_edit"
87
91
  @menu_search = Qt::Menu.new(@menubar)
88
- @menu_search.setObjectName("menu_search")
92
+ @menu_search.objectName = "menu_search"
89
93
  @menu_model = Qt::Menu.new(@menubar)
90
- @menu_model.setObjectName("menu_model")
94
+ @menu_model.objectName = "menu_model"
91
95
  browser.setMenuBar(@menubar)
92
96
 
93
97
  @menubar.addAction(@menu_file.menuAction())
@@ -114,11 +118,6 @@ class Ui_Browser
114
118
 
115
119
  retranslateUi(browser)
116
120
 
117
- size = Qt::Size.new(727, 740)
118
- size = size.expandedTo(browser.minimumSizeHint())
119
- browser.resize(size)
120
-
121
-
122
121
  Qt::MetaObject.connectSlotsByName(browser)
123
122
  end # setupUi
124
123
 
@@ -127,41 +126,41 @@ class Ui_Browser
127
126
  end
128
127
 
129
128
  def retranslateUi(browser)
130
- @action_open.setText(Qt::Application.translate("Browser", "&Open", nil, Qt::Application::UnicodeUTF8))
131
- @action_close.setText(Qt::Application.translate("Browser", "Close", nil, Qt::Application::UnicodeUTF8))
132
- @action_recent.setText(Qt::Application.translate("Browser", "Recent", nil, Qt::Application::UnicodeUTF8))
133
- @action_cut.setText(Qt::Application.translate("Browser", "Cut", nil, Qt::Application::UnicodeUTF8))
134
- @action_copy.setText(Qt::Application.translate("Browser", "Copy", nil, Qt::Application::UnicodeUTF8))
135
- @action_paste.setText(Qt::Application.translate("Browser", "Paste", nil, Qt::Application::UnicodeUTF8))
136
- @action_filter.setText(Qt::Application.translate("Browser", "F&ilter by current", nil, Qt::Application::UnicodeUTF8))
137
- @action_filter.setToolTip(Qt::Application.translate("Browser", "Filter by value in current field", nil, Qt::Application::UnicodeUTF8))
138
- @action_filter.setShortcut(Qt::Application.translate("Browser", "Ctrl+L", nil, Qt::Application::UnicodeUTF8))
139
- @action_find.setText(Qt::Application.translate("Browser", "&Find First", nil, Qt::Application::UnicodeUTF8))
140
- @action_find.setStatusTip(Qt::Application.translate("Browser", "Find a row with some value", nil, Qt::Application::UnicodeUTF8))
141
- @action_find.setShortcut(Qt::Application.translate("Browser", "Ctrl+F", nil, Qt::Application::UnicodeUTF8))
142
- @action_dump.setText(Qt::Application.translate("Browser", "Dump", nil, Qt::Application::UnicodeUTF8))
143
- @action_dump.setShortcut(Qt::Application.translate("Browser", "Ctrl+Shift+D", nil, Qt::Application::UnicodeUTF8))
144
- @action_refresh.setText(Qt::Application.translate("Browser", "&Refresh", nil, Qt::Application::UnicodeUTF8))
145
- @action_refresh.setIconText(Qt::Application.translate("Browser", "Refresh current table from database", nil, Qt::Application::UnicodeUTF8))
146
- @action_refresh.setToolTip(Qt::Application.translate("Browser", "Refresh current table from database", nil, Qt::Application::UnicodeUTF8))
147
- @action_refresh.setShortcut(Qt::Application.translate("Browser", "Ctrl+R", nil, Qt::Application::UnicodeUTF8))
148
- @action_next.setText(Qt::Application.translate("Browser", "&Next", nil, Qt::Application::UnicodeUTF8))
149
- @action_next.setIconText(Qt::Application.translate("Browser", "Next", nil, Qt::Application::UnicodeUTF8))
150
- @action_next.setToolTip(Qt::Application.translate("Browser", "Next Model", nil, Qt::Application::UnicodeUTF8))
151
- @action_next.setShortcut(Qt::Application.translate("Browser", "Ctrl+Tab", nil, Qt::Application::UnicodeUTF8))
152
- @action_previous.setText(Qt::Application.translate("Browser", "&Previous", nil, Qt::Application::UnicodeUTF8))
153
- @action_previous.setToolTip(Qt::Application.translate("Browser", "Previous Model", nil, Qt::Application::UnicodeUTF8))
154
- @action_previous.setShortcut(Qt::Application.translate("Browser", "Ctrl+Shift+Backtab", nil, Qt::Application::UnicodeUTF8))
155
- @action_highlight.setText(Qt::Application.translate("Browser", "&Highlight", nil, Qt::Application::UnicodeUTF8))
156
- @action_highlight.setShortcut(Qt::Application.translate("Browser", "Ctrl+H", nil, Qt::Application::UnicodeUTF8))
157
- @action_new_window.setText(Qt::Application.translate("Browser", "&New Window", nil, Qt::Application::UnicodeUTF8))
158
- @action_find_next.setText(Qt::Application.translate("Browser", "Find &Next", nil, Qt::Application::UnicodeUTF8))
159
- @action_find_next.setShortcut(Qt::Application.translate("Browser", "Ctrl+G", nil, Qt::Application::UnicodeUTF8))
160
- @action_new_row.setText(Qt::Application.translate("Browser", "New &Row", nil, Qt::Application::UnicodeUTF8))
161
- @menu_file.setTitle(Qt::Application.translate("Browser", "File", nil, Qt::Application::UnicodeUTF8))
162
- @menu_edit.setTitle(Qt::Application.translate("Browser", "Edit", nil, Qt::Application::UnicodeUTF8))
163
- @menu_search.setTitle(Qt::Application.translate("Browser", "&Search", nil, Qt::Application::UnicodeUTF8))
164
- @menu_model.setTitle(Qt::Application.translate("Browser", "&Table", nil, Qt::Application::UnicodeUTF8))
129
+ @action_open.text = Qt::Application.translate("Browser", "&Open", nil, Qt::Application::UnicodeUTF8)
130
+ @action_close.text = Qt::Application.translate("Browser", "&Close", nil, Qt::Application::UnicodeUTF8)
131
+ @action_recent.text = Qt::Application.translate("Browser", "&Recent", nil, Qt::Application::UnicodeUTF8)
132
+ @action_cut.text = Qt::Application.translate("Browser", "Cut", nil, Qt::Application::UnicodeUTF8)
133
+ @action_copy.text = Qt::Application.translate("Browser", "Copy", nil, Qt::Application::UnicodeUTF8)
134
+ @action_paste.text = Qt::Application.translate("Browser", "Paste", nil, Qt::Application::UnicodeUTF8)
135
+ @action_filter.text = Qt::Application.translate("Browser", "F&ilter by current", nil, Qt::Application::UnicodeUTF8)
136
+ @action_filter.toolTip = Qt::Application.translate("Browser", "Filter by value in current field", nil, Qt::Application::UnicodeUTF8)
137
+ @action_filter.shortcut = Qt::Application.translate("Browser", "Ctrl+L", nil, Qt::Application::UnicodeUTF8)
138
+ @action_find.text = Qt::Application.translate("Browser", "&Find First", nil, Qt::Application::UnicodeUTF8)
139
+ @action_find.statusTip = Qt::Application.translate("Browser", "Find a row with some value", nil, Qt::Application::UnicodeUTF8)
140
+ @action_find.shortcut = Qt::Application.translate("Browser", "Ctrl+F", nil, Qt::Application::UnicodeUTF8)
141
+ @action_dump.text = Qt::Application.translate("Browser", "Dump", nil, Qt::Application::UnicodeUTF8)
142
+ @action_dump.shortcut = Qt::Application.translate("Browser", "Ctrl+Shift+D", nil, Qt::Application::UnicodeUTF8)
143
+ @action_refresh.text = Qt::Application.translate("Browser", "&Refresh", nil, Qt::Application::UnicodeUTF8)
144
+ @action_refresh.iconText = Qt::Application.translate("Browser", "Refresh current table from database", nil, Qt::Application::UnicodeUTF8)
145
+ @action_refresh.toolTip = Qt::Application.translate("Browser", "Refresh current table from database", nil, Qt::Application::UnicodeUTF8)
146
+ @action_refresh.shortcut = Qt::Application.translate("Browser", "Ctrl+R", nil, Qt::Application::UnicodeUTF8)
147
+ @action_next.text = Qt::Application.translate("Browser", "&Next", nil, Qt::Application::UnicodeUTF8)
148
+ @action_next.iconText = Qt::Application.translate("Browser", "Next", nil, Qt::Application::UnicodeUTF8)
149
+ @action_next.toolTip = Qt::Application.translate("Browser", "Next Model", nil, Qt::Application::UnicodeUTF8)
150
+ @action_next.shortcut = Qt::Application.translate("Browser", "Ctrl+Tab", nil, Qt::Application::UnicodeUTF8)
151
+ @action_previous.text = Qt::Application.translate("Browser", "&Previous", nil, Qt::Application::UnicodeUTF8)
152
+ @action_previous.toolTip = Qt::Application.translate("Browser", "Previous Model", nil, Qt::Application::UnicodeUTF8)
153
+ @action_previous.shortcut = Qt::Application.translate("Browser", "Ctrl+Shift+Backtab", nil, Qt::Application::UnicodeUTF8)
154
+ @action_highlight.text = Qt::Application.translate("Browser", "&Highlight", nil, Qt::Application::UnicodeUTF8)
155
+ @action_highlight.shortcut = Qt::Application.translate("Browser", "Ctrl+H", nil, Qt::Application::UnicodeUTF8)
156
+ @action_new_window.text = Qt::Application.translate("Browser", "&New Window", nil, Qt::Application::UnicodeUTF8)
157
+ @action_find_next.text = Qt::Application.translate("Browser", "Find &Next", nil, Qt::Application::UnicodeUTF8)
158
+ @action_find_next.shortcut = Qt::Application.translate("Browser", "Ctrl+G", nil, Qt::Application::UnicodeUTF8)
159
+ @action_new_row.text = Qt::Application.translate("Browser", "New &Row", nil, Qt::Application::UnicodeUTF8)
160
+ @menu_file.title = Qt::Application.translate("Browser", "&File", nil, Qt::Application::UnicodeUTF8)
161
+ @menu_edit.title = Qt::Application.translate("Browser", "Edit", nil, Qt::Application::UnicodeUTF8)
162
+ @menu_search.title = Qt::Application.translate("Browser", "&Search", nil, Qt::Application::UnicodeUTF8)
163
+ @menu_model.title = Qt::Application.translate("Browser", "&Table", nil, Qt::Application::UnicodeUTF8)
165
164
  end # retranslateUi
166
165
 
167
166
  def retranslate_ui(browser)