weft-qda 0.9.6 → 0.9.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/lib/weft.rb +16 -1
  2. data/lib/weft/WEFT-VERSION-STRING.rb +1 -1
  3. data/lib/weft/application.rb +17 -74
  4. data/lib/weft/backend.rb +6 -32
  5. data/lib/weft/backend/sqlite.rb +222 -164
  6. data/lib/weft/backend/sqlite/category_tree.rb +52 -48
  7. data/lib/weft/backend/sqlite/database.rb +57 -0
  8. data/lib/weft/backend/sqlite/upgradeable.rb +7 -0
  9. data/lib/weft/broadcaster.rb +90 -0
  10. data/lib/weft/category.rb +139 -47
  11. data/lib/weft/codereview.rb +160 -0
  12. data/lib/weft/coding.rb +74 -23
  13. data/lib/weft/document.rb +23 -10
  14. data/lib/weft/exceptions.rb +10 -0
  15. data/lib/weft/filters.rb +47 -224
  16. data/lib/weft/filters/indexers.rb +137 -0
  17. data/lib/weft/filters/input.rb +118 -0
  18. data/lib/weft/filters/output.rb +101 -0
  19. data/lib/weft/filters/templates.rb +80 -0
  20. data/lib/weft/filters/win32backtick.rb +246 -0
  21. data/lib/weft/query.rb +169 -0
  22. data/lib/weft/wxgui.rb +349 -294
  23. data/lib/weft/wxgui/constants.rb +43 -0
  24. data/lib/weft/wxgui/controls.rb +6 -0
  25. data/lib/weft/wxgui/controls/category_dropdown.rb +192 -0
  26. data/lib/weft/wxgui/controls/category_tree.rb +314 -0
  27. data/lib/weft/wxgui/controls/document_list.rb +97 -0
  28. data/lib/weft/wxgui/controls/multitype_control.rb +37 -0
  29. data/lib/weft/wxgui/{inspectors → controls}/textcontrols.rb +235 -64
  30. data/lib/weft/wxgui/dialogs.rb +144 -41
  31. data/lib/weft/wxgui/error_handler.rb +116 -36
  32. data/lib/weft/wxgui/exceptions.rb +7 -0
  33. data/lib/weft/wxgui/inspectors.rb +61 -208
  34. data/lib/weft/wxgui/inspectors/category.rb +19 -16
  35. data/lib/weft/wxgui/inspectors/codereview.rb +90 -132
  36. data/lib/weft/wxgui/inspectors/document.rb +12 -8
  37. data/lib/weft/wxgui/inspectors/imagedocument.rb +56 -56
  38. data/lib/weft/wxgui/inspectors/query.rb +284 -0
  39. data/lib/weft/wxgui/inspectors/script.rb +147 -23
  40. data/lib/weft/wxgui/lang/en.rb +69 -0
  41. data/lib/weft/wxgui/sidebar.rb +90 -432
  42. data/lib/weft/wxgui/utilities.rb +70 -91
  43. data/lib/weft/wxgui/workarea.rb +150 -43
  44. data/share/icons/category.ico +0 -0
  45. data/share/icons/category.xpm +109 -0
  46. data/share/icons/codereview.ico +0 -0
  47. data/share/icons/codereview.xpm +54 -0
  48. data/share/icons/d_and_c.xpm +126 -0
  49. data/share/icons/document.ico +0 -0
  50. data/share/icons/document.xpm +70 -0
  51. data/share/icons/project.ico +0 -0
  52. data/share/icons/query.ico +0 -0
  53. data/share/icons/query.xpm +56 -0
  54. data/{lib/weft/wxgui → share/icons}/search.xpm +0 -0
  55. data/share/icons/weft.ico +0 -0
  56. data/share/icons/weft.xpm +62 -0
  57. data/share/icons/weft16.ico +0 -0
  58. data/share/icons/weft32.ico +0 -0
  59. data/share/templates/category_plain.html +18 -0
  60. data/share/templates/codereview_plain.html +18 -0
  61. data/share/templates/document_plain.html +13 -0
  62. data/share/templates/document_plain.txt +7 -0
  63. data/test/001-document.rb +55 -36
  64. data/test/002-category.rb +81 -6
  65. data/test/003-code.rb +8 -4
  66. data/test/004-application.rb +13 -34
  67. data/test/005-query_review.rb +139 -0
  68. data/test/006-filters.rb +54 -42
  69. data/test/007-output_filters.rb +113 -0
  70. data/test/009a-backend_sqlite_basic.rb +95 -24
  71. data/test/009b-backend_sqlite_complex.rb +43 -62
  72. data/test/009c_backend_sqlite_bench.rb +5 -10
  73. data/test/053-doc_inspector.rb +46 -0
  74. data/test/055-query_window.rb +50 -0
  75. data/test/all-tests.rb +1 -0
  76. data/test/test-common.rb +19 -0
  77. data/test/testdata/empty.qdp +0 -0
  78. data/test/testdata/simple with space.pdf +0 -0
  79. data/test/testdata/simple.pdf +0 -0
  80. data/weft-qda.rb +40 -7
  81. metadata +74 -14
  82. data/lib/weft/wxgui/category.xpm +0 -26
  83. data/lib/weft/wxgui/document.xpm +0 -25
  84. data/lib/weft/wxgui/inspectors/search.rb +0 -265
  85. data/lib/weft/wxgui/mondrian.xpm +0 -44
  86. data/lib/weft/wxgui/weft16.xpm +0 -31
@@ -3,18 +3,18 @@ module QDA
3
3
  class CategoryWindow < InspectorWindow
4
4
  include Subscriber
5
5
 
6
- def initialize(cat, app, workarea, layout)
6
+ def initialize(cat, client, workarea, layout)
7
7
  @cat = cat
8
- @app = app
8
+ @client = client
9
9
 
10
10
  super(workarea, @cat.name, layout) do | parent |
11
- text_box = CompositeText.new(parent, '', 0, @app)
12
- text_box.populate( @app.app.get_text_at_category(@cat) )
11
+ text_box = CompositeText.new(parent, '', 0, @client)
12
+ text_box.populate( @client.app.get_text_at_category(@cat) )
13
13
  text_box
14
14
  end
15
15
 
16
16
  construct_details_panel()
17
- if ! @cat.children.empty?
17
+ if false # ! @cat.children.empty?
18
18
  construct_explore_panel()
19
19
  end
20
20
 
@@ -22,11 +22,16 @@ module QDA
22
22
  on_change_page(e)
23
23
  end
24
24
 
25
- set_icon( app.fetch_icon("category.xpm") )
25
+ set_icon( client.fetch_icon("category") )
26
26
 
27
- subscribe(:document_deleted, :category_changed, :category_deleted)
27
+ subscribe(@client,
28
+ :document_deleted, :category_changed, :category_deleted)
28
29
  end
29
-
30
+
31
+ def object()
32
+ @cat
33
+ end
34
+
30
35
  # just a mucky method to reduce the length of the initializer -
31
36
  # ideally i guess this would be done using XRC
32
37
  def construct_details_panel()
@@ -35,13 +40,12 @@ module QDA
35
40
 
36
41
  # the text entry box for the category's name
37
42
  name_box_label = Wx::StaticBox.new(panel2, -1, 'Name')
38
- name_box_sizer = Wx::StaticBoxSizer.new(name_box_label,
39
- Wx::VERTICAL)
43
+ name_box_sizer = Wx::StaticBoxSizer.new(name_box_label, Wx::VERTICAL)
40
44
  @name_field = Wx::TextCtrl.new(panel2, -1, @cat.name)
41
45
  name_box_sizer.add(@name_field, 0,
42
46
  Wx::ADJUST_MINSIZE|Wx::ALL|Wx::GROW, 4)
43
47
  sizer2.add(name_box_sizer,0, Wx::ADJUST_MINSIZE|Wx::ALL|Wx::GROW, 4)
44
-
48
+
45
49
  # Create the statistics panel
46
50
  info_panel = Wx::Panel.new(panel2, -1)
47
51
  info_box_label = Wx::StaticBox.new(info_panel, -1, 'Statistics')
@@ -100,10 +104,9 @@ module QDA
100
104
  # cf construct_details_panel
101
105
  def construct_explore_panel()
102
106
  panel = Wx::Panel.new(@notebook, -1)
103
- # panel.set_font(GLOBAL_FONT)
104
107
  sizer = Wx::BoxSizer.new(Wx::VERTICAL)
105
108
  # create a local locked copy
106
- @tree_list = CategoryTree.new(@app, panel, true)
109
+ @tree_list = CategoryTree.new(@client, panel, true)
107
110
  @tree_list.populate([@cat])
108
111
  sizer.add(@tree_list, 10, Wx::GROW|Wx::ALL, 4)
109
112
  panel.set_sizer( sizer )
@@ -113,8 +116,7 @@ module QDA
113
116
  def on_save_memo(e)
114
117
  @cat.memo = @memo_box.value
115
118
  @cat.name = @name_field.value
116
- Wx::BusyCursor.busy { @app.app.save_category( @cat ) }
117
- $wxapp.broadcast(:category_changed, @cat)
119
+ Wx::BusyCursor.busy { @client.app.save_category( @cat ) }
118
120
  end
119
121
 
120
122
  def on_change_page(e)
@@ -138,8 +140,9 @@ module QDA
138
140
  def refresh()
139
141
  set_title( @cat.name )
140
142
  @text_box.value = ''
141
- @text_box.populate( @app.app.get_text_at_category(@cat) )
143
+ @text_box.populate( @client.app.get_text_at_category(@cat) )
142
144
  @name_field.value = @cat.name
145
+ @memo_box.value = @cat.memo
143
146
  if curr_category = @drop_down.current_category()
144
147
  @text_box.highlight_codingtable(curr_category.codes)
145
148
  end
@@ -1,16 +1,17 @@
1
1
  module QDA::GUI
2
2
  class CodeReviewWindow < WorkAreaWindow
3
- include Subscriber
3
+ include QDA::Subscriber
4
4
 
5
5
  W_WINDOW_DEF_SIZE = [ 0.8, 0.6 ]
6
6
  BASE_COLOUR = Wx::Colour.new(255, 255, 255)
7
7
  HIGHLIGHT_COLOUR = Wx::Colour.new(255, 0, 0)
8
8
  GRID_COLOUR = Wx::Colour.new(223, 223, 233)
9
-
10
- def initialize(obj, app, workarea, layout)
9
+ attr_reader :client
10
+ def initialize(obj, weft_client, workarea, layout)
11
11
  super(workarea, "Code Review #{obj.dbid}", nil)
12
- @cols, @rows, @contents = [], [], []
13
- @count_method = :num_of_docs
12
+ @client = weft_client
13
+ @cr = obj
14
+ @cr.count_method = @count_method = :num_of_docs
14
15
 
15
16
  main_sizer = Wx::BoxSizer.new(Wx::VERTICAL)
16
17
  panel = Wx::Panel.new(self)
@@ -24,7 +25,7 @@ module QDA::GUI
24
25
  0.upto(11) { | i | @grid.set_row_label_value(i, '') }
25
26
 
26
27
  evt_grid_label_left_click() { | evt | on_label_clicked(evt) }
27
-
28
+ evt_grid_cell_left_dclick() { | evt | on_cell_dclicked(evt) }
28
29
  # the controls panel
29
30
  main_sizer.add(@grid, 1, Wx::GROW|Wx::ALL, 4)
30
31
  # butt_panel = Wx::Panel.new(panel, -1)
@@ -32,7 +33,7 @@ module QDA::GUI
32
33
  bott_sizer = Wx::StaticBoxSizer.new(butt_box_label,
33
34
  Wx::HORIZONTAL)
34
35
 
35
- @drop_down = CategoryDropDown.new(app, panel)
36
+ @drop_down = CategoryDropDown.new(@client, panel)
36
37
  bott_sizer.add(@drop_down, 3, Wx::ALL, 4)
37
38
 
38
39
  button = Wx::Button.new(panel, -1, 'Add as row')
@@ -79,9 +80,14 @@ module QDA::GUI
79
80
  panel.set_sizer(main_sizer)
80
81
  main_sizer.set_size_hints(panel)
81
82
 
82
- subscribe(:category_deleted, :category_changed)
83
+ self.icon = client.fetch_icon("codereview")
84
+ subscribe(client, :category_deleted, :category_changed)
83
85
  end
84
-
86
+
87
+ def object()
88
+ @cr
89
+ end
90
+
85
91
  def associated_subscribers()
86
92
  [ @drop_down ]
87
93
  end
@@ -89,11 +95,11 @@ module QDA::GUI
89
95
  # set the currently highlighted row or column as the current item
90
96
  # in the dropdown
91
97
  def on_label_clicked(e)
92
- if row = e.row and row >= 0 and @rows[row]
93
- @drop_down.receive_focus_category( @rows[row] )
98
+ if row = e.row and row >= 0 and @cr.rows[row]
99
+ @drop_down.receive_focus_category( @cr.rows[row] )
94
100
  end
95
- if col = e.col and col >= 0 and @cols[col]
96
- @drop_down.receive_focus_category( @cols[col] )
101
+ if col = e.col and col >= 0 and @cr.cols[col]
102
+ @drop_down.receive_focus_category( @cr.cols[col] )
97
103
  end
98
104
  end
99
105
 
@@ -111,165 +117,117 @@ module QDA::GUI
111
117
  self.count_method = method
112
118
  end
113
119
 
114
- def count_method=(method)
115
- if method != @count_method
116
- @count_method = method
117
- 0.upto(@rows.length - 1) { | i | calculate_row(i) }
118
- recolour_table()
120
+ def count_method=(new_method)
121
+ if new_method != @count_method
122
+ @cr.count_method = new_method
123
+ @count_method = new_method
124
+ refresh()
119
125
  end
120
126
  end
121
127
 
122
128
  def on_add_col(e)
123
129
  category = @drop_down.current_category
124
- return false unless category
125
- return false if @cols.include?(category)
126
-
127
- @cols.push(category)
128
- @grid.append_cols(1) if @cols.length > @grid.number_cols
129
- col = @cols.length - 1
130
-
131
- @grid.set_col_label_value( col, category.name )
132
- # @grid.set_col_format_number( col )
133
- calculate_col(col)
134
- recolour_table()
135
- end
136
-
137
- def calculate_col(i)
138
- col = @cols[i]
139
- @rows.each_with_index do | row_cat, j |
140
- @contents[j][i] = row_cat.codes.dup.join(col.codes)
141
- update_cell(j, i)
142
- end
130
+ return unless @cr.add_col(category)
131
+ @grid.append_cols(1) if @cr.number_cols >= @grid.number_cols
132
+ refresh()
143
133
  end
144
134
 
135
+ # add an item to the CodeReview
145
136
  def on_add_row(e)
146
137
  category = @drop_down.current_category
147
- return false unless category
148
- # don't add twice
149
- return false if @rows.include?(category)
150
-
151
- @rows.push(category)
152
- @grid.append_rows(1) if @rows.length > @grid.number_rows
153
- row = @rows.length - 1
154
-
155
- @grid.set_row_label_value( row, category.name )
156
- @contents[row] = []
157
- # @grid.set_row_format_number( row )
158
- calculate_row(row)
159
- recolour_table()
138
+ return unless @cr.add_row(category)
139
+ @grid.append_rows(1) if @cr.number_rows >= @grid.number_rows
140
+ refresh()
160
141
  end
161
142
 
162
- def calculate_row(i)
163
- row = @rows[i]
164
- @cols.each_with_index do | col_cat, j |
165
- @contents[i][j] = col_cat.codes.dup.join(row.codes)
166
- update_cell(i, j)
167
- end
168
- end
169
-
170
- # removes the selected category from both rows and colums
171
143
  def on_remove(e)
172
144
  on_remove_col(e)
173
145
  on_remove_row(e)
174
146
  end
175
147
 
148
+ # handler for removing a row, as selected in drop-down. Will remove the
149
+ # item from the underlying CodeReview, and redraw grid.
176
150
  def on_remove_col(e)
177
151
  category = @drop_down.current_category
178
- return false unless category
179
- return false unless idx = @cols.index(category)
180
- remove_col(idx)
181
- recolour_table()
182
- end
183
-
184
- def remove_col(idx)
185
- @cols.delete_at(idx)
186
- @contents.each { | row | row.delete_at(idx) }
187
- @grid.delete_cols(idx, 1)
188
- @grid.append_cols(1)
189
- update_col_labels()
152
+ if idx = @cr.remove_col(category)
153
+ @grid.delete_cols(idx, 1)
154
+ @grid.append_cols(1)
155
+ refresh()
156
+ end
190
157
  end
191
158
 
159
+ # handler for removing a row, as selected in drop-down. Will remove the
160
+ # item from the underlying CodeReview, and redraw grid.
192
161
  def on_remove_row(e)
193
162
  category = @drop_down.current_category
194
- return false unless category
195
- return false unless idx = @rows.index(category)
196
- remove_row(idx)
197
- recolour_table()
163
+ if idx = @cr.remove_row(category)
164
+ @grid.delete_rows(idx, 1)
165
+ @grid.append_rows(1)
166
+ refresh()
167
+ end
198
168
  end
199
-
200
- def remove_row(idx)
201
- @rows.delete_at(idx)
202
- @contents.delete_at(idx)
203
- @grid.delete_rows(idx, 1)
204
- @grid.append_rows(1)
205
- update_row_labels()
169
+
170
+ # repaints and recolours the content of the grid
171
+
172
+ #
173
+ def on_cell_dclicked(e)
174
+ q = @cr.to_query(@client.app, e.get_row, e.get_col)
175
+ if q
176
+ q_id = @client.app.get_preference('NextQuery') || 1
177
+ @client.app.save_preference('NextQuery', q_id + 1)
178
+ q.dbid = q_id
179
+ @workarea.launch_window(QueryWindow, q)
180
+ end
206
181
  end
207
-
208
- def update_cell(x, y)
209
- content = @contents[x][y].send(@count_method)
210
- @grid.set_cell_value( x, y, content.to_s )
182
+
183
+ def refresh()
184
+ @grid.clear_grid()
185
+
186
+ max = @cr.max()
187
+ @cr.each_cell_value() do | x, y, val |
188
+ @grid.set_cell_value(x, y, val.to_s)
189
+ tint = BASE_COLOUR.mix( HIGHLIGHT_COLOUR, max, val)
190
+ @grid.set_cell_background_colour(x, y, tint)
191
+ end
192
+ update_row_labels()
193
+ update_col_labels()
211
194
  end
212
-
195
+
196
+ # when a column is added or deleted, Wx (2.4.2) doesn't seem to redraw the
197
+ # labels correctly without help
213
198
  def update_col_labels()
214
- @cols.each_with_index do | c, i |
215
- @grid.set_col_label_value(i, c.name)
216
- end
217
- # check if we need to clean up deleted and now empty row labels
218
- # at the end - Wx 2.4.2 doesn't seem to do this automatically
219
- @grid.set_col_label_value(@cols.length, '')
220
- return if @cols.length == @grid.number_cols()
221
- for empty in ( @cols.length ... @grid.number_cols() )
199
+ @cr.each_col { | c, i | @grid.set_col_label_value(i, c.name) }
200
+ return if @cr.number_cols == @grid.number_cols
201
+ for empty in ( @cr.number_cols ... @grid.number_cols )
222
202
  @grid.set_col_label_value(empty, '')
223
203
  end
224
204
  end
225
205
 
206
+ # when a row is added or deleted, Wx (2.4.2) doesn't seem to redraw the
207
+ # labels correctly without help
226
208
  def update_row_labels()
227
- @rows.each_with_index do | c, i |
228
- @grid.set_row_label_value(i, c.name)
229
- end
209
+ @cr.each_row { | r, i | @grid.set_row_label_value(i, r.name) }
230
210
  # check if we need to clean up deleted and now empty row labels
231
211
  # at the end - Wx 2.4.2 doesn't seem to do this automatically
232
- return if @rows.length == @grid.number_rows()
233
- for empty in ( @rows.length ... @grid.number_rows() )
212
+ return if @cr.number_rows == @grid.number_rows
213
+ for empty in ( @cr.number_rows ... @grid.number_rows )
234
214
  @grid.set_row_label_value(empty, '')
235
215
  end
236
216
  end
237
-
238
- def recolour_table()
239
- max = @contents.flatten.collect { | x | x.send(@count_method) }.max
240
- @contents.each_with_index do | row_items, row |
241
- row_items.each_with_index do | code_table, col |
242
- clr = BASE_COLOUR.mix( HIGHLIGHT_COLOUR,
243
- max, code_table.send(@count_method))
244
- @grid.set_cell_background_colour(row, col, clr)
245
- end
246
- end
247
- end
248
-
217
+ private :update_row_labels, :update_col_labels
218
+
249
219
  def receive_category_changed(cat)
250
- if idx = @cols.index(cat)
251
- @cols[idx] = cat
252
- calculate_col(idx)
253
- end
254
-
255
- if idx = @rows.index(cat)
256
- @rows[idx] = cat
257
- calculate_row(idx)
258
- end
259
-
260
- recolour_table()
220
+ changed = nil
221
+ changed = @cr.update_col(cat)
222
+ changed = @cr.update_row(cat)
223
+ refresh() if changed
261
224
  end
262
225
 
263
226
  def receive_category_deleted(cat)
264
- if idx = @cols.index(cat)
265
- remove_col(idx)
266
- end
267
-
268
- if idx = @rows.index(cat)
269
- remove_row(idx)
270
- end
271
-
272
- recolour_table()
227
+ deleted = nil
228
+ deleted = @cr.remove_col(cat)
229
+ deleted = @cr.remove_row(cat)
230
+ refresh() if deleted
273
231
  end
274
232
  end
275
233
  end
@@ -4,13 +4,13 @@ module QDA
4
4
  class DocumentWindow < InspectorWindow
5
5
  include Subscriber
6
6
 
7
- def initialize(doc, app, workarea, layout)
7
+ def initialize(doc, client, workarea, layout)
8
8
  @doc = doc
9
- @app = app
9
+ @client = client
10
10
 
11
11
  super(workarea, doc.title, layout) do | txt_parent |
12
12
  text_box = DocTextViewer.new(txt_parent, @doc.dbid)
13
- text_box.set_font(@app.display_font)
13
+ text_box.set_font(@client.display_font)
14
14
  text_box.append_text( @doc.text )
15
15
  text_box.evt_enter_window do | e |
16
16
  set_cursor Wx::Cursor.new(Wx::CURSOR_IBEAM)
@@ -19,14 +19,19 @@ module QDA
19
19
  set_cursor Wx::Cursor.new(Wx::CURSOR_ARROW)
20
20
  end
21
21
  text_box.show_position(0)
22
+ text_box.insertion_point = 0
22
23
  text_box
23
24
  end
24
25
 
25
26
  construct_details_panel()
26
- set_icon( app.fetch_icon("document.xpm") )
27
- subscribe(:document_changed, :document_deleted)
27
+ set_icon( client.fetch_icon("document") )
28
+ subscribe(@client, :document_changed, :document_deleted)
28
29
  end
29
-
30
+
31
+ def object()
32
+ @doc
33
+ end
34
+
30
35
  def receive_document_deleted(doc)
31
36
  close() if doc.dbid == @doc.dbid
32
37
  end
@@ -53,8 +58,7 @@ module QDA
53
58
  def on_save_details(e)
54
59
  @doc.memo = @memo_box.value
55
60
  @doc.title = @title_box.value
56
- Wx::BusyCursor.busy { @app.app.save_document( @doc ) }
57
- $wxapp.broadcast(:document_changed, @doc)
61
+ Wx::BusyCursor.busy { @client.app.save_document( @doc ) }
58
62
  end
59
63
 
60
64
  # scroll the window's text box to the line containing the
@@ -1,56 +1,56 @@
1
- module QDA
2
- module GUI
3
-
4
- class ImageDocumentWindow < InspectorWindow
5
- Wx::init_all_image_handlers
6
-
7
- def initialize(image_file, *args)
8
- @img = Wx::Image.new(image_file)
9
- # magnifier
10
- @bitmap = Wx::Bitmap.new( @img )
11
- @zoom = 0
12
- # check height & widget to set size of child window
13
- # @bitmap.get_height
14
- # sizer = Wx::BoxSizer.new(Wx::VERTICAL)
15
- # sizer.add(img, 1, Wx::SHAPED|Wx::GROW, 5)
16
- super(*args) do
17
- # client_size = Wx::Size.new(@bitmap.width, @bitmap.height)
18
- set_client_size(Wx::Size.new(@bitmap.width, @bitmap.height))
19
- end
20
- self.set_cursor( Wx::Cursor.new(Wx::CURSOR_MAGNIFIER) )
21
- evt_paint { on_paint }
22
- evt_left_up { | e | zoom_in(e) }
23
- evt_right_up { | e | zoom_out(e) }
24
- end
25
-
26
- def on_paint
27
- paint do | dc |
28
- dc.clear
29
- dc.draw_bitmap(@bitmap, 0, 0, false)
30
- end
31
- end
32
-
33
- def zoom_in(*args)
34
- @zoom += 1
35
- zoom(*args)
36
- end
37
-
38
- def zoom_out(*args)
39
- @zoom -= 1
40
- zoom(*args)
41
- end
42
-
43
- def zoom(event)
44
- img_x2 = @img.scale(@img.get_width * ( 2 ** @zoom ),
45
- @img.get_height * ( 2 ** @zoom) )
46
- #rotate90
47
- @bitmap = Wx::Bitmap.new( img_x2 )
48
- dc = Wx::ClientDC.new(self)
49
- dc.clear
50
- dc.draw_bitmap(@bitmap, 0, 0, false)
51
- set_client_size(Wx::Size.new( @img.get_width * ( 2 ** @zoom ),
52
- @img.get_height * ( 2 ** @zoom) ) )
53
- end
54
- end
55
- end
56
- end
1
+ module QDA
2
+ module GUI
3
+
4
+ class ImageDocumentWindow < InspectorWindow
5
+ Wx::init_all_image_handlers
6
+
7
+ def initialize(image_file, *args)
8
+ @img = Wx::Image.new(image_file)
9
+ # magnifier
10
+ @bitmap = Wx::Bitmap.new( @img )
11
+ @zoom = 0
12
+ # check height & widget to set size of child window
13
+ # @bitmap.get_height
14
+ # sizer = Wx::BoxSizer.new(Wx::VERTICAL)
15
+ # sizer.add(img, 1, Wx::SHAPED|Wx::GROW, 5)
16
+ super(*args) do
17
+ # client_size = Wx::Size.new(@bitmap.width, @bitmap.height)
18
+ set_client_size(Wx::Size.new(@bitmap.width, @bitmap.height))
19
+ end
20
+ self.set_cursor( Wx::Cursor.new(Wx::CURSOR_MAGNIFIER) )
21
+ evt_paint { on_paint }
22
+ evt_left_up { | e | zoom_in(e) }
23
+ evt_right_up { | e | zoom_out(e) }
24
+ end
25
+
26
+ def on_paint
27
+ paint do | dc |
28
+ dc.clear
29
+ dc.draw_bitmap(@bitmap, 0, 0, false)
30
+ end
31
+ end
32
+
33
+ def zoom_in(*args)
34
+ @zoom += 1
35
+ zoom(*args)
36
+ end
37
+
38
+ def zoom_out(*args)
39
+ @zoom -= 1
40
+ zoom(*args)
41
+ end
42
+
43
+ def zoom(event)
44
+ img_x2 = @img.scale(@img.get_width * ( 2 ** @zoom ),
45
+ @img.get_height * ( 2 ** @zoom) )
46
+ #rotate90
47
+ @bitmap = Wx::Bitmap.new( img_x2 )
48
+ dc = Wx::ClientDC.new(self)
49
+ dc.clear
50
+ dc.draw_bitmap(@bitmap, 0, 0, false)
51
+ set_client_size(Wx::Size.new( @img.get_width * ( 2 ** @zoom ),
52
+ @img.get_height * ( 2 ** @zoom) ) )
53
+ end
54
+ end
55
+ end
56
+ end