clevic 0.8.0 → 0.11.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +9 -0
- data/Manifest.txt +13 -10
- data/README.txt +6 -9
- data/Rakefile +35 -24
- data/TODO +29 -17
- data/bin/clevic +84 -37
- data/config/hoe.rb +7 -3
- data/lib/clevic.rb +2 -4
- data/lib/clevic/browser.rb +37 -49
- data/lib/clevic/cache_table.rb +55 -165
- data/lib/clevic/db_options.rb +32 -21
- data/lib/clevic/default_view.rb +66 -0
- data/lib/clevic/delegates.rb +51 -67
- data/lib/clevic/dirty.rb +101 -0
- data/lib/clevic/extensions.rb +24 -38
- data/lib/clevic/field.rb +400 -99
- data/lib/clevic/item_delegate.rb +32 -33
- data/lib/clevic/model_builder.rb +315 -148
- data/lib/clevic/order_attribute.rb +53 -0
- data/lib/clevic/record.rb +57 -57
- data/lib/clevic/search_dialog.rb +71 -67
- data/lib/clevic/sql_dialects.rb +33 -0
- data/lib/clevic/table_model.rb +73 -120
- data/lib/clevic/table_searcher.rb +165 -0
- data/lib/clevic/table_view.rb +140 -100
- data/lib/clevic/ui/.gitignore +1 -0
- data/lib/clevic/ui/browser_ui.rb +55 -56
- data/lib/clevic/ui/search_dialog_ui.rb +50 -51
- data/lib/clevic/version.rb +2 -2
- data/lib/clevic/view.rb +89 -0
- data/models/accounts_models.rb +12 -9
- data/models/minimal_models.rb +4 -2
- data/models/times_models.rb +41 -25
- data/models/times_sqlite_models.rb +1 -145
- data/models/values_models.rb +15 -16
- data/test/test_cache_table.rb +138 -0
- data/test/test_helper.rb +131 -0
- data/test/test_model_index_extensions.rb +22 -0
- data/test/test_order_attribute.rb +62 -0
- data/test/test_sql_dialects.rb +77 -0
- data/test/test_table_searcher.rb +188 -0
- metadata +36 -20
- data/bin/import-times +0 -128
- data/config/jamis.rb +0 -589
- data/env.sh +0 -1
- data/lib/active_record/dirty.rb +0 -87
- data/lib/clevic/field_builder.rb +0 -42
- data/website/index.html +0 -170
- data/website/index.txt +0 -17
- data/website/screenshot.png +0 -0
- data/website/stylesheets/screen.css +0 -131
- data/website/template.html.erb +0 -41
data/History.txt
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
== 0.11.1
|
2
|
+
* Define views in separate classes (subclass of Clevic::View) while
|
3
|
+
maintaining view definition inside the ActiveRecord::Base subclass.
|
4
|
+
* foreground and background color specifiers for fields
|
5
|
+
* better handling of virtual fields
|
6
|
+
* more tests
|
7
|
+
* make Clevic::Record a module to be included in an ActiveRecord::Base
|
8
|
+
* use Gather for hash/block value collection.
|
9
|
+
|
1
10
|
== 0.8.0
|
2
11
|
* Big improvements to the way the UI is defined in Entity classes.
|
3
12
|
* Show Entity-specific menus, both in the menu bar and as a right-click.
|
data/Manifest.txt
CHANGED
@@ -4,27 +4,29 @@ README.txt
|
|
4
4
|
Rakefile
|
5
5
|
TODO
|
6
6
|
bin/clevic
|
7
|
-
bin/import-times
|
8
7
|
config/hoe.rb
|
9
|
-
config/jamis.rb
|
10
8
|
config/requirements.rb
|
11
|
-
|
12
|
-
lib/active_record/dirty.rb
|
9
|
+
lib/clevic/dirty.rb
|
13
10
|
lib/clevic.rb
|
14
11
|
lib/clevic/browser.rb
|
15
12
|
lib/clevic/cache_table.rb
|
16
13
|
lib/clevic/db_options.rb
|
14
|
+
lib/clevic/default_view.rb
|
17
15
|
lib/clevic/delegates.rb
|
18
16
|
lib/clevic/extensions.rb
|
19
17
|
lib/clevic/field.rb
|
20
|
-
lib/clevic/field_builder.rb
|
21
18
|
lib/clevic/item_delegate.rb
|
22
19
|
lib/clevic/model_builder.rb
|
23
20
|
lib/clevic/model_column.rb
|
21
|
+
lib/clevic/order_attribute.rb
|
24
22
|
lib/clevic/record.rb
|
25
23
|
lib/clevic/search_dialog.rb
|
24
|
+
lib/clevic/sql_dialects.rb
|
26
25
|
lib/clevic/table_model.rb
|
26
|
+
lib/clevic/table_searcher.rb
|
27
27
|
lib/clevic/table_view.rb
|
28
|
+
lib/clevic/view.rb
|
29
|
+
lib/clevic/ui/.gitignore
|
28
30
|
lib/clevic/ui/browser.ui
|
29
31
|
lib/clevic/ui/browser_ui.rb
|
30
32
|
lib/clevic/ui/icon.png
|
@@ -44,8 +46,9 @@ sql/accounts.sql
|
|
44
46
|
sql/times.sql
|
45
47
|
sql/times_sqlite.sql
|
46
48
|
tasks/website.rake
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
test/test_cache_table.rb
|
50
|
+
test/test_helper.rb
|
51
|
+
test/test_model_index_extensions.rb
|
52
|
+
test/test_order_attribute.rb
|
53
|
+
test/test_sql_dialects.rb
|
54
|
+
test/test_table_searcher.rb
|
data/README.txt
CHANGED
@@ -37,20 +37,17 @@ in Linux, slightly tested in Windows and OSX.
|
|
37
37
|
|
38
38
|
=== Model definition:
|
39
39
|
|
40
|
-
Models and their UI representation must be defined in Ruby. A
|
41
|
-
|
42
|
-
a minimally functional UI. Beyond that, the framework provides
|
43
|
-
a DSL for defining more complex and useful behaviour (see Clevic::ModelBuilder).
|
40
|
+
Models and their UI representation must be defined in Ruby. A descendant of ActiveRecord::Base
|
41
|
+
that includes the Clevic::Record module will provide a minimally functional UI.
|
44
42
|
|
45
|
-
|
46
|
-
|
43
|
+
Beyond that, the framework provides a DSL for defining more complex and useful behaviour
|
44
|
+
(see Clevic::ModelBuilder).
|
47
45
|
|
48
46
|
In the models/ subdirectory, start with minimal_models.rb.
|
49
47
|
account_models.rb and times_models.rb provide definitions for more real-world examples.
|
50
48
|
Associated SQL schemas are in the sql subdirectory.
|
51
49
|
|
52
|
-
For implementation and more extensive
|
53
|
-
comments, see Clevic::Browser and Clevic::ModelBuilder.
|
50
|
+
For implementation and more extensive comments, see Clevic::ModelBuilder.
|
54
51
|
|
55
52
|
=== Framework
|
56
53
|
|
@@ -84,7 +81,7 @@ See TODO file.
|
|
84
81
|
=== Other
|
85
82
|
|
86
83
|
* bsearch (http://0xcc.net/ruby-bsearch)
|
87
|
-
* active_record/dirty (included)
|
84
|
+
* active_record/dirty (included, for active_record < 2.1.x)
|
88
85
|
* db driver (ie postgres-pr)
|
89
86
|
* rdbms (ie postgres)
|
90
87
|
|
data/Rakefile
CHANGED
@@ -15,7 +15,7 @@ end
|
|
15
15
|
|
16
16
|
# list of .ui files
|
17
17
|
UI_FILES = FileList.new( 'lib/clevic/ui/*.ui' )
|
18
|
-
CLEAN.include( 'ChangeLog' )
|
18
|
+
CLEAN.include( 'ChangeLog', 'coverage', 'profiling' )
|
19
19
|
CLOBBER.include( 'ChangeLog', 'pkg', 'lib/clevic/ui/*_ui.rb' )
|
20
20
|
|
21
21
|
UI_FILES.each do |ui_file|
|
@@ -57,12 +57,6 @@ task :run => :ui do |t|
|
|
57
57
|
exec "ruby -Ilib bin/clevic #{ARGV.join(' ')}"
|
58
58
|
end
|
59
59
|
|
60
|
-
desc "Runs Clevic in warning mode, with test databases and debug flag on"
|
61
|
-
task :sqlite => :ui do |t|
|
62
|
-
ARGV.shift()
|
63
|
-
exec "ruby -Ilib bin/clevic #{ARGV.join(' ')} times_sqlite_model.rb"
|
64
|
-
end
|
65
|
-
|
66
60
|
desc "Runs Clevic in debug mode, with test databases"
|
67
61
|
task :debug => :ui do |t|
|
68
62
|
ARGV.shift()
|
@@ -90,6 +84,7 @@ MODELS_LIST.each do |model_file|
|
|
90
84
|
namespace :irb do
|
91
85
|
task short_model( model_file ) do |t|
|
92
86
|
ARGV.shift()
|
87
|
+
ARGV.shift() if ARGV[0] == '--'
|
93
88
|
ENV['RUBYLIB'] ||= '.'
|
94
89
|
ENV['RUBYLIB'] += ":#{File.expand_path('.')}/lib"
|
95
90
|
exec "irb -Ilib -rclevic -r#{model_file} -rclevic/db_options.rb"
|
@@ -99,6 +94,17 @@ MODELS_LIST.each do |model_file|
|
|
99
94
|
# generate runs
|
100
95
|
namespace :run do
|
101
96
|
desc "run clevic with #{model_file}"
|
97
|
+
task short_model( model_file ) => :ui do |t|
|
98
|
+
ARGV.shift()
|
99
|
+
ARGV.shift() if ARGV[0] == '--'
|
100
|
+
cmd = "ruby -Ilib bin/clevic -D #{model_file} #{ARGV.join(' ')}"
|
101
|
+
puts "cmd: #{cmd.inspect}"
|
102
|
+
exec cmd
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
namespace :warn do
|
107
|
+
desc "run clevic with #{model_file} and warnings on"
|
102
108
|
task short_model( model_file ) => :ui do |t|
|
103
109
|
ARGV.shift()
|
104
110
|
exec "ruby -w -Ilib bin/clevic -D #{model_file} #{ARGV.join(' ')}"
|
@@ -108,25 +114,30 @@ end
|
|
108
114
|
|
109
115
|
task :package => :ui
|
110
116
|
|
111
|
-
# redefine this from the Hoe-1.7.0 sources to use
|
112
|
-
# the jamis template.
|
113
|
-
Rake::RDocTask.new(:docs) do |rd|
|
114
|
-
rd.main = "README.txt"
|
115
|
-
rd.options << '-d' if RUBY_PLATFORM !~ /win32/ and `which dot` =~ /\/dot/ and not ENV['NODOT']
|
116
|
-
rd.rdoc_dir = 'doc'
|
117
|
-
rd.template = 'config/jamis.rb'
|
118
|
-
files = $hoe.spec.files.grep($hoe.rdoc_pattern)
|
119
|
-
files -= ['Manifest.txt']
|
120
|
-
rd.rdoc_files.push(*files)
|
121
|
-
|
122
|
-
title = "#{$hoe.name}-#{$hoe.version} Documentation"
|
123
|
-
title = "#{$hoe.rubyforge_name}'s " + title if $hoe.rubyforge_name != $hoe.name
|
124
|
-
|
125
|
-
rd.options << "-t #{title}"
|
126
|
-
end
|
127
|
-
|
128
117
|
desc "Update ChangeLog from the SVN log"
|
129
118
|
task :changelog do |t|
|
130
119
|
ARGV.shift
|
131
120
|
exec "svn2cl --break-before-msg -o ChangeLog #{ARGV.join(' ')}"
|
132
121
|
end
|
122
|
+
|
123
|
+
# remove hoe documentation task
|
124
|
+
Rake::Task['docs'].clear
|
125
|
+
|
126
|
+
# make this respond to docs, so it fits in with the rest of the build
|
127
|
+
Rake::RDocTask.new do |rdoc|
|
128
|
+
rdoc.name = :docs
|
129
|
+
rdoc.title = "Clevic DB UI builder"
|
130
|
+
rdoc.main = 'README.txt'
|
131
|
+
rdoc.rdoc_dir = 'doc'
|
132
|
+
rdoc.rdoc_files.include %w{History.txt lib/**/*.rb README.txt TODO}
|
133
|
+
rdoc.options += [
|
134
|
+
'-SHN',
|
135
|
+
'-f', 'darkfish', # This is the important bit
|
136
|
+
'-A', 'property=Property',
|
137
|
+
#~ '--quiet',
|
138
|
+
"--opname=index.html",
|
139
|
+
#~ "--line-numbers",
|
140
|
+
#~ '--format=darkfish',
|
141
|
+
#~ "--inline-source"
|
142
|
+
]
|
143
|
+
end
|
data/TODO
CHANGED
@@ -1,8 +1,23 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
need a :name specified for Field that defaults to the attribute name
|
2
|
+
allow directories for a setup.
|
3
|
+
implement the :default field option
|
4
|
+
ModelBuilder#modify_field to override default_ui definitions
|
5
|
+
rename ModelBuilder to ViewBuilder?
|
6
|
+
|
7
|
+
need a text field (multiple lines, edit in a separate window)
|
8
|
+
need a map field (For ie -1 = short, 1 = long). Already in restricted, but it's kinda clunky.
|
9
|
+
:records missing in define_ui causes a crash
|
10
|
+
|
11
|
+
:display and :format in ModelBuilder
|
12
|
+
tests. Use ZenTest to generate tests
|
13
|
+
Check out ar-extensions. Like operators look nice.
|
14
|
+
make sure ActiveRecord doesn't keep updating column definitions. ie production mode.
|
15
|
+
caching of repeated related entity lookups. Possibly ActiveRecord::QueryCache
|
16
|
+
Ramen http://ramen.rubyforge.org/ for metadata. MySQL and MSSQL only right now.
|
17
|
+
|
18
|
+
metadata for virtual fields. Add a member to Field for class_name.constantize
|
19
|
+
consolidate metadata across TableModel, and Field. Would like to have it all in Field.
|
20
|
+
gui_value vs attribute_value vs field_value etc
|
6
21
|
generate models - DrySQL
|
7
22
|
allow moving of tabs
|
8
23
|
habtm relations
|
@@ -14,17 +29,16 @@ sorting by header. See void QAbstractItemModel::sort ( int column, Qt::SortOrder
|
|
14
29
|
- layoutChanged
|
15
30
|
|
16
31
|
undo
|
32
|
+
- could possibly handle this in the TableModel
|
17
33
|
- acts_as_trashable to undo deletes
|
18
34
|
- other commands. Possibly via ActiveRecord callbacks?
|
19
35
|
- Keep a history of changes, ie xy, new. xy, changed. x,y copied etc.
|
20
36
|
- Use Transaction::Simple?
|
21
37
|
- undo of field changes
|
38
|
+
- memoize
|
22
39
|
|
23
40
|
Using F4 to open list, and then selecting from the combo and exiting using Return (or tab?) doesn't set the correct value
|
24
41
|
wrap description, and allow Access-style zooming
|
25
|
-
Ctrl-PgDn to last row in this column. Also extend selection
|
26
|
-
sorting by header. See void QAbstractItemModel::sort ( int column, Qt::SortOrder order = Qt::AscendingOrder )
|
27
|
-
- layoutChanged
|
28
42
|
|
29
43
|
search with acts_as_searchable and hyperestraier
|
30
44
|
|
@@ -33,7 +47,7 @@ moving of columns
|
|
33
47
|
/-style filtering?
|
34
48
|
|
35
49
|
for dates, add year if not specified, with 6 months on either side range. Configurable?
|
36
|
-
value
|
50
|
+
value parsing not in model
|
37
51
|
copy a field from a mouse-selection (ctrl-b maybe)
|
38
52
|
hiding of fields
|
39
53
|
|
@@ -68,11 +82,11 @@ Ctrl-; date formatting goes 07--08 instead of 07-Apr-08. But typing the full mon
|
|
68
82
|
|
69
83
|
empty database
|
70
84
|
--------------
|
71
|
-
resize fields for first record, while it's being entered. use Qt::ExpandingLineEdit for ComboDelegate? Doesn't exist in Ruby bindings
|
85
|
+
resize fields for first record, while it's being entered. use Qt::ExpandingLineEdit for ComboDelegate? Doesn't exist in Ruby bindings.
|
72
86
|
|
73
87
|
editing
|
74
88
|
-------
|
75
|
-
F2 for standard edit, F4 for calendar edit
|
89
|
+
F2 for standard edit, F4 for full edit, ie text window, or calendar edit
|
76
90
|
Only move for data_changed if field was exited with tab, not enter.
|
77
91
|
tooltips for tabs
|
78
92
|
Help in general for new data capture people
|
@@ -101,14 +115,15 @@ changes more or less instantly.
|
|
101
115
|
preferences
|
102
116
|
-----------
|
103
117
|
store previous searches, by model & app
|
118
|
+
store year ranges for 2 digit years in dates.
|
104
119
|
|
105
120
|
maybe
|
106
121
|
-----
|
107
|
-
acts_as_shellable looks
|
122
|
+
acts_as_shellable looks nice
|
108
123
|
consolidate read-only-ness checks
|
109
124
|
Look at DataMapper. Not suitable - need to declare properties.
|
110
|
-
use rubigen for creating model definition files
|
111
|
-
ActiveMDB for migrating
|
125
|
+
use rubigen for creating model definition files?
|
126
|
+
ActiveMDB for migrating?
|
112
127
|
allow moving of rows
|
113
128
|
discontiguous copying of entities/csv
|
114
129
|
multi-row copying
|
@@ -125,7 +140,6 @@ QueryBuilder
|
|
125
140
|
Accounts
|
126
141
|
--------
|
127
142
|
paste of "common" records with different dates
|
128
|
-
restricted type for Account Type record
|
129
143
|
|
130
144
|
Times
|
131
145
|
-----
|
@@ -133,5 +147,3 @@ Times
|
|
133
147
|
Ctrl-Shift-" should not copy date if it already exists, and should not copy time if it's a different date.
|
134
148
|
Ctrl-Shift-" after it's done, tab doesn't change fields
|
135
149
|
look up invoice for project leaves the wrong fields highlighted, and focus in the wrong field.
|
136
|
-
warnings on overlap times (in status bar, or highlight)
|
137
|
-
warnings on large intervals (in status bar, or highlight)
|
data/bin/clevic
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
require 'pathname'
|
4
4
|
|
5
|
+
require 'clevic.rb'
|
5
6
|
require 'clevic/browser.rb'
|
6
|
-
require 'clevic/db_options.rb'
|
7
7
|
require 'optparse'
|
8
8
|
require 'active_support'
|
9
9
|
|
@@ -38,49 +38,91 @@ if $options[:debug]
|
|
38
38
|
pp $options
|
39
39
|
end
|
40
40
|
|
41
|
+
unless $options[:verbose]
|
42
|
+
# turn off "Object#type deprecated" messages
|
43
|
+
# and anything else output by rb_warn
|
44
|
+
$VERBOSE = nil
|
45
|
+
end
|
46
|
+
|
41
47
|
class Pathname
|
42
48
|
# require this pathname if it exists
|
43
49
|
def require_if_exists
|
44
50
|
require realpath.to_s if exist?
|
45
51
|
end
|
52
|
+
|
53
|
+
# just for fun, really
|
54
|
+
alias_method :/, :+
|
55
|
+
end
|
56
|
+
|
57
|
+
def subclasses( base )
|
58
|
+
classes = []
|
59
|
+
ObjectSpace.each_object( Class ) do |x|
|
60
|
+
if x.ancestors.include?( base )
|
61
|
+
case
|
62
|
+
when x == ActiveRecord::Base; # don't include this
|
63
|
+
else; classes << x
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
classes.sort{|a,b| a.name <=> b.name}
|
46
68
|
end
|
47
69
|
|
48
70
|
def load_rails_models( root, config, models )
|
49
71
|
# initialize Rails
|
50
|
-
load config
|
51
|
-
#~ puts "RAILS_ROOT: #{RAILS_ROOT.inspect}"
|
72
|
+
load config / 'environment.rb'
|
52
73
|
require 'initializer.rb'
|
53
74
|
Rails::Initializer.run do |config|
|
54
75
|
config.frameworks -= [ :action_mailer, :action_pack, :active_resource ]
|
55
76
|
end
|
56
77
|
|
57
|
-
# load lib/ files
|
58
|
-
$: << ( root
|
59
|
-
( root
|
60
|
-
puts "filename: #{filename.inspect}"
|
78
|
+
# load lib/ files for the rails project
|
79
|
+
$: << ( root / 'lib' ).realpath.to_s
|
80
|
+
( root / 'lib' ).children.each do |filename|
|
61
81
|
load filename if filename.file?
|
62
82
|
end
|
63
|
-
|
64
|
-
#
|
65
|
-
|
83
|
+
|
84
|
+
# include Dirty if it isn't already
|
85
|
+
begin
|
86
|
+
ActiveRecord::Dirty
|
87
|
+
rescue NameError
|
88
|
+
ActiveRecord::Base.send(:include, ActiveRecord::Dirty)
|
89
|
+
end
|
66
90
|
|
67
91
|
# load models
|
68
|
-
models.
|
69
|
-
|
92
|
+
models.find do |dir_entry|
|
93
|
+
# don't load directory entries
|
94
|
+
next unless dir_entry.file?
|
95
|
+
# only load .rb files
|
96
|
+
next unless dir_entry.basename.to_s =~ /\.rb$/
|
70
97
|
begin
|
71
|
-
load
|
98
|
+
load dir_entry
|
72
99
|
rescue Exception => e
|
73
|
-
puts "Error loading #{
|
100
|
+
puts "Error loading #{dir_entry.basename.to_s}: #{e.message}"
|
74
101
|
puts e.backtrace
|
75
102
|
end
|
76
103
|
end
|
104
|
+
|
105
|
+
# include the Clevic::Record module in each descendant of
|
106
|
+
# ActiveRecord::Base so that the default views will be created.
|
107
|
+
subclasses( ActiveRecord::Base ).each do |model|
|
108
|
+
if model.table_exists?
|
109
|
+
model.send :include, Clevic::Record unless model.abstract_class?
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def load_single_model_file( pathname )
|
115
|
+
( pathname + '.rb' ).require_if_exists
|
116
|
+
pathname.require_if_exists
|
117
|
+
( pathname + '_models' ).require_if_exists
|
118
|
+
( pathname + '_models.rb' ).require_if_exists
|
77
119
|
end
|
78
120
|
|
79
121
|
def load_models( pathname )
|
80
122
|
if pathname.directory?
|
81
|
-
config = pathname
|
82
|
-
app = pathname
|
83
|
-
models = app
|
123
|
+
config = pathname / 'config'
|
124
|
+
app = pathname / 'app'
|
125
|
+
models = app / 'models'
|
84
126
|
# check if this is a Rails directory
|
85
127
|
if config.exist? && app.exist? && models.exist?
|
86
128
|
# this is probably a Rails project"
|
@@ -88,26 +130,31 @@ def load_models( pathname )
|
|
88
130
|
end
|
89
131
|
else
|
90
132
|
# assume we have a single file, and try some variations
|
91
|
-
( pathname
|
92
|
-
pathname.require_if_exists
|
93
|
-
( pathname + '_models' ).require_if_exists
|
94
|
-
( pathname + '_models.rb' ).require_if_exists
|
133
|
+
load_single_model_file( pathname )
|
95
134
|
end
|
96
135
|
end
|
97
136
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
#
|
109
|
-
main_window.
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
app.exec
|
137
|
+
begin
|
138
|
+
# load model files
|
139
|
+
raise "no model definition file specified" if args.empty?
|
140
|
+
args.each { |arg| load_models( Pathname.new( arg ) ) }
|
141
|
+
|
142
|
+
app = Qt::Application.new( args )
|
143
|
+
|
144
|
+
# show UI
|
145
|
+
main_window = Qt::MainWindow.new
|
146
|
+
browser = Clevic::Browser.new( main_window )
|
147
|
+
# this must come after Clevic::Browser.new
|
148
|
+
main_window.show
|
149
|
+
# make sure any partially edited records are saved when the window is closed
|
150
|
+
app.connect( SIGNAL('lastWindowClosed()') ) { browser.save_all }
|
151
|
+
begin
|
152
|
+
app.exec
|
153
|
+
rescue
|
154
|
+
puts $!.message
|
155
|
+
puts $!.backtrace
|
156
|
+
end
|
157
|
+
rescue Exception => e
|
158
|
+
puts e.message
|
159
|
+
puts e.backtrace
|
160
|
+
end
|