jota 0.9.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/gui.rb CHANGED
@@ -1,8 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- # $Id: gui.rb 300 2011-04-18 08:38:44Z dz $
4
-
5
-
6
3
  # rdoc: see http://en.wikibooks.org/wiki/Ruby_Programming/RubyDoc
7
4
 
8
5
  # = Class Gui - Realize the GTK+ related functions of Jota
@@ -34,6 +31,7 @@ require 'clip'
34
31
  require 'clip_array'
35
32
  require 'helper'
36
33
  require 'preferences'
34
+ require 'objspace'
37
35
 
38
36
  class Gui
39
37
 
@@ -42,8 +40,8 @@ require 'gtk2'
42
40
  attr :glade
43
41
 
44
42
  def Gui.gtk_version
45
- return "GTK+ %d.%d.%d" % [ Gtk::MAJOR_VERSION,
46
- Gtk::MINOR_VERSION,
43
+ return "GTK+ %d.%d.%d" % [ Gtk::MAJOR_VERSION,
44
+ Gtk::MINOR_VERSION,
47
45
  Gtk::MICRO_VERSION ]
48
46
  # TODO http://ruby-gnome2.sourceforge.jp/hiki.cgi?Gtk#MICRO_VERSION
49
47
  end
@@ -55,7 +53,7 @@ def initialize
55
53
  @clip_widget = nil
56
54
  @next_autosave = Time.now
57
55
  @changed = false
58
- end
56
+ end
59
57
 
60
58
  def open(filename)
61
59
  begin
@@ -67,7 +65,7 @@ def open(filename)
67
65
  set_autosave
68
66
  @changed = false
69
67
  return @data
70
- end
68
+ end
71
69
 
72
70
  def close
73
71
  update
@@ -75,7 +73,7 @@ def close
75
73
  if @data
76
74
  @data.close
77
75
  end
78
- end
76
+ end
79
77
 
80
78
  def clip_array
81
79
  return @data
@@ -113,15 +111,15 @@ def create_gui(width=nil, height=nil)
113
111
  @top_window.add_accel_group(@accel_group)
114
112
  @glade["main_menu"].accel_group=(@accel_group)
115
113
 
116
- @glade["menu_new"].add_accelerator('activate', @accel_group,
114
+ @glade["menu_new"].add_accelerator('activate', @accel_group,
117
115
  Gdk::Keyval::GDK_N, Gdk::Window::CONTROL_MASK, Gtk::ACCEL_VISIBLE)
118
- @glade["menu_open"].add_accelerator('activate', @accel_group,
116
+ @glade["menu_open"].add_accelerator('activate', @accel_group,
119
117
  Gdk::Keyval::GDK_O, Gdk::Window::CONTROL_MASK, Gtk::ACCEL_VISIBLE)
120
- @glade["menu_save"].add_accelerator('activate', @accel_group,
118
+ @glade["menu_save"].add_accelerator('activate', @accel_group,
121
119
  Gdk::Keyval::GDK_S, Gdk::Window::CONTROL_MASK, Gtk::ACCEL_VISIBLE)
122
- @glade["menu_close"].add_accelerator('activate', @accel_group,
120
+ @glade["menu_close"].add_accelerator('activate', @accel_group,
123
121
  Gdk::Keyval::GDK_W, Gdk::Window::CONTROL_MASK, Gtk::ACCEL_VISIBLE)
124
- @glade["menu_quit"].add_accelerator('activate', @accel_group,
122
+ @glade["menu_quit"].add_accelerator('activate', @accel_group,
125
123
  Gdk::Keyval::GDK_Q, Gdk::Window::CONTROL_MASK, Gtk::ACCEL_VISIBLE)
126
124
 
127
125
  # Update buttons and stuff
@@ -135,7 +133,12 @@ def create_gui(width=nil, height=nil)
135
133
  autosave
136
134
  true
137
135
  end
138
- end
136
+
137
+ # Log memory consumption
138
+ Gtk.timeout_add(86400*1000) do # once a day
139
+ print_verbose "ObjectSpace.memsize_of_all #{ObjectSpace.memsize_of_all}"
140
+ end
141
+ end
139
142
 
140
143
 
141
144
  #
@@ -144,16 +147,16 @@ end
144
147
 
145
148
  def on_top_destroy(widget)
146
149
  quit_app
147
- end
150
+ end
148
151
 
149
152
  def on_top_delete(widget, arg0)
150
153
  quit_app
151
154
  return true
152
- end
155
+ end
153
156
 
154
157
  def on_dialog_delete(widget, arg0)
155
158
  return true
156
- end
159
+ end
157
160
 
158
161
 
159
162
  #
@@ -163,13 +166,13 @@ end
163
166
  def on_main_menu_pressed(widget)
164
167
  update
165
168
  set_goto_menu
166
-
169
+
167
170
  @glade["main_menu"].popup(
168
171
  nil,
169
172
  nil,
170
173
  Gtk.current_event.button,
171
174
  Gtk.current_event_time)
172
- end
175
+ end
173
176
 
174
177
  def on_edit_menu_pressed(widget)
175
178
  @glade["edit_text_menu"].popup(
@@ -177,7 +180,7 @@ def on_edit_menu_pressed(widget)
177
180
  nil,
178
181
  Gtk.current_event.button,
179
182
  Gtk.current_event_time)
180
- end
183
+ end
181
184
 
182
185
  def on_delete_clicked(widget)
183
186
  if pref("confirm_delete") then
@@ -201,7 +204,7 @@ def on_delete_clicked(widget)
201
204
  update
202
205
 
203
206
  if pref("deletesave_enable") and not @data.current.empty? then
204
- deletefile = expand_filename(pref("deletesave_file"),
207
+ deletefile = expand_filename(pref("deletesave_file"),
205
208
  @data.dirname, @data.filename)
206
209
  begin
207
210
  @data.append(deletefile)
@@ -213,26 +216,26 @@ def on_delete_clicked(widget)
213
216
  @data.delete
214
217
  @changed = true
215
218
  show
216
- end
219
+ end
217
220
 
218
221
  def on_new_clicked(widget)
219
222
  update
220
223
  @data.new
221
224
  @changed = true
222
225
  show
223
- end
226
+ end
224
227
 
225
228
  def on_next_clicked(widget)
226
229
  update
227
230
  @data.next
228
231
  show
229
- end
232
+ end
230
233
 
231
234
  def on_prev_clicked(widget)
232
235
  update
233
236
  @data.prev
234
237
  show
235
- end
238
+ end
236
239
 
237
240
 
238
241
 
@@ -243,12 +246,12 @@ end
243
246
 
244
247
  def on_menu_quit_activate(widget)
245
248
  quit_app
246
- end
249
+ end
247
250
 
248
251
  def on_menu_save_activate(widget)
249
252
  update
250
253
  @data.save
251
- end
254
+ end
252
255
 
253
256
  def on_menu_new_activate(widget)
254
257
  filename = file_chooser_dialog :save
@@ -271,7 +274,7 @@ def on_menu_new_activate(widget)
271
274
  show
272
275
  set_autosave
273
276
  set_style
274
- end
277
+ end
275
278
 
276
279
  def on_menu_open_activate(widget)
277
280
  filename = file_chooser_dialog :open
@@ -288,13 +291,13 @@ def on_menu_open_activate(widget)
288
291
  update
289
292
  @data.close
290
293
  end
291
-
294
+
292
295
  @data = ca
293
296
 
294
297
  show
295
298
  set_autosave
296
299
  set_style
297
- end
300
+ end
298
301
 
299
302
  def on_menu_close_activate(widget)
300
303
  if @data.nil? then
@@ -305,7 +308,7 @@ def on_menu_close_activate(widget)
305
308
  @data.close
306
309
  @data = nil
307
310
  show
308
- end
311
+ end
309
312
 
310
313
  def on_menu_preferences_activate(widget)
311
314
  old_autosave_seconds = pref("autosave_seconds")
@@ -322,7 +325,7 @@ def on_menu_preferences_activate(widget)
322
325
  @glade["entry_sample"].text = "Sample Text"
323
326
 
324
327
  @glade["pref_autosave_enable"].active = pref("autosave_enable")
325
- @glade["pref_autosave_minutes"].text =
328
+ @glade["pref_autosave_minutes"].text =
326
329
  "%d" % (pref("autosave_seconds").to_i/60.0)
327
330
 
328
331
  @glade["pref_deletesave_enable"].active = pref("deletesave_enable")
@@ -339,7 +342,7 @@ def on_menu_preferences_activate(widget)
339
342
 
340
343
  set_pref("autosave_enable", @glade["pref_autosave_enable"].active?)
341
344
  set_pref("autosave_seconds", 60 * @glade["pref_autosave_minutes"].text.to_i)
342
-
345
+
343
346
  set_pref("deletesave_enable", @glade["pref_deletesave_enable"].active?)
344
347
  set_pref("deletesave_file", @glade["pref_deletesave_file"].text)
345
348
 
@@ -356,18 +359,18 @@ def on_menu_preferences_activate(widget)
356
359
  dialog.signal_connect("close") do
357
360
  dialog.hide
358
361
  end
359
- end
362
+ end
360
363
 
361
364
  def on_menu_about_activate(widget)
362
365
  dialog = @glade["about_dialog"]
363
366
  dialog.show
364
- dialog.signal_connect("close") do
367
+ dialog.signal_connect("close") do
365
368
  dialog.hide
366
369
  end
367
370
  dialog.signal_connect("destroy") do # XXX tut's nicht!?
368
371
  dialog.hide
369
372
  end
370
- dialog.signal_connect("response") do
373
+ dialog.signal_connect("response") do
371
374
  dialog.hide
372
375
  end
373
376
  end
@@ -396,7 +399,7 @@ def on_edit_text_wrap_activate(widget)
396
399
  else
397
400
  @clip_widget.wrap_mode = Gtk::TextTag::WRAP_NONE
398
401
  end
399
- end
402
+ end
400
403
 
401
404
 
402
405
  #
@@ -420,17 +423,17 @@ def on_font(widget)
420
423
  end
421
424
 
422
425
  dialog.show
423
- end
426
+ end
424
427
 
425
428
  def on_bgcolor(widget)
426
429
  color_helper :dialog_text => "Select Background Color",
427
430
  :pref_variable => "background"
428
- end
431
+ end
429
432
 
430
433
  def on_fgcolor(widget)
431
434
  color_helper :dialog_text => "Select Foreground Color",
432
435
  :pref_variable => "foreground"
433
- end
436
+ end
434
437
 
435
438
  # XXX
436
439
  def on_clip_button_press_event(widget,event)
@@ -454,7 +457,7 @@ def error_msgbox(message)
454
457
  Gtk::Dialog::MODAL,
455
458
  Gtk::MessageDialog::ERROR,
456
459
  Gtk::MessageDialog::BUTTONS_OK,
457
- message);
460
+ message.to_s);
458
461
  msgbox.title = "Error"
459
462
 
460
463
  msgbox.run do | response |
@@ -465,7 +468,7 @@ def error_msgbox(message)
465
468
  end
466
469
  end
467
470
  msgbox.destroy
468
- end
471
+ end
469
472
 
470
473
  def set_goto_menu
471
474
  return if @data.nil?
@@ -481,7 +484,7 @@ def set_goto_menu
481
484
 
482
485
  # Using markup in a MenuItems is not implemented before
483
486
  # GTK+ 2.16. Ruby GTK is 2.12 at the moment (2009-07).
484
-
487
+
485
488
  #la = Gtk::Label.new
486
489
  if i == @data.current_index then
487
490
  #title.gsub!(/</,"&lt;")
@@ -496,7 +499,7 @@ def set_goto_menu
496
499
 
497
500
  #mi = Gtk::MenuItem.new
498
501
  #mi.label = la
499
- mi = Gtk::MenuItem.new("%s%2d: %s" %
502
+ mi = Gtk::MenuItem.new("%s%2d: %s" %
500
503
  [marker, i+1, title])
501
504
  mi.signal_connect("activate") do
502
505
  on_menu_goto(i)
@@ -512,7 +515,7 @@ end
512
515
  def color_helper (hash)
513
516
  dialog_text = hash[:dialog_text]
514
517
  pref_variable = hash[:pref_variable]
515
-
518
+
516
519
  dialog = Gtk::ColorSelectionDialog.new(dialog_text)
517
520
 
518
521
  dialog.colorsel.current_color = array_to_color(pref(pref_variable))
@@ -533,7 +536,7 @@ def color_helper (hash)
533
536
  end
534
537
 
535
538
  dialog.show
536
- end
539
+ end
537
540
 
538
541
 
539
542
  def pref(key)
@@ -542,13 +545,13 @@ def pref(key)
542
545
  else
543
546
  @data.pref[key]
544
547
  end
545
- end
548
+ end
546
549
 
547
550
  def set_pref(key,value)
548
551
  if @data
549
552
  @data.pref[key] = value
550
553
  end
551
- end
554
+ end
552
555
 
553
556
  def set_title
554
557
  if @data then
@@ -581,12 +584,12 @@ def set_buttons
581
584
  else
582
585
  @glade["but_delete"].sensitive = true
583
586
  @glade["but_new"].sensitive = true
584
- @glade["but_next"].sensitive =
587
+ @glade["but_next"].sensitive =
585
588
  (@data.current_index != @data.length-1)
586
589
  @glade["but_prev"].sensitive = (@data.current_index != 0)
587
590
  @glade["but_edit"].sensitive = true
588
591
 
589
- @glade["label_index"].text =
592
+ @glade["label_index"].text =
590
593
  "%d of %d" % [@data.current_index+1, @data.length]
591
594
 
592
595
  status = ""
@@ -606,15 +609,15 @@ def set_buttons
606
609
  @glade["menu_goto"].sensitive = true
607
610
  end
608
611
 
609
- @top_window.focus = @glade["clip"]
610
- end
612
+ @glade["clip"].grab_focus
613
+ end
611
614
 
612
615
  def set_wrap_mode
613
616
  return if @data.nil?
614
617
 
615
618
  # Gtk::ToggleButton#active= emits an activate signal
616
619
  # and thus calls on_edit_text_wrap_activate
617
-
620
+
618
621
  if @data.current.wrap then
619
622
  @glade["edit_text_wrap"].active = true
620
623
  else
@@ -631,7 +634,7 @@ def set_style
631
634
  @clip_widget.modify_base(Gtk::STATE_NORMAL,
632
635
  array_to_color(pref("background")))
633
636
  @clip_widget.modify_font(Pango::FontDescription.new(pref("font")))
634
- end
637
+ end
635
638
 
636
639
 
637
640
  #
@@ -644,7 +647,7 @@ def set_style_sample(fg_gdk_color, bg_gdk_color, font)
644
647
  sample.modify_text(Gtk::STATE_NORMAL, fg_gdk_color) if fg_gdk_color
645
648
  sample.modify_base(Gtk::STATE_NORMAL, bg_gdk_color) if bg_gdk_color
646
649
  sample.modify_font(Pango::FontDescription.new(font)) if font
647
- end
650
+ end
648
651
 
649
652
  def quit_app
650
653
  if pref("confirm_quit") then
@@ -672,7 +675,7 @@ def quit_app
672
675
  end
673
676
 
674
677
  Gtk.main_quit
675
- end
678
+ end
676
679
 
677
680
  def set_about_dialog
678
681
  dlg = @glade["about_dialog"]
@@ -689,7 +692,7 @@ def set_about_dialog
689
692
  dlg.website="#{Version::AUTHOR_WEBSITE}"
690
693
  dlg.license="#{Version::LICENSE}"
691
694
  dlg.authors=["#{Version::AUTHOR} <#{Version::AUTHOR_EMAIL}>"]
692
- end
695
+ end
693
696
 
694
697
  def clip_to_widget(textview, clip_array)
695
698
  print_debug "clip_to_widget"
@@ -702,7 +705,7 @@ def clip_to_widget(textview, clip_array)
702
705
  clip = clip_array.current
703
706
 
704
707
  textview.buffer.text = clip.text
705
-
708
+
706
709
  if clip.pos then
707
710
  #mark = textview.buffer.get_insert
708
711
  # isn't implemented in Ruby ... grrrr
@@ -717,8 +720,8 @@ def clip_to_widget(textview, clip_array)
717
720
  textview.editable = true
718
721
  end
719
722
 
720
- @top_window.focus = @glade["clip"]
721
- end
723
+ @glade["clip"].grab_focus
724
+ end
722
725
 
723
726
  def widget_to_clip(textview, clip_array)
724
727
  print_debug "widget_to_clip"
@@ -732,21 +735,21 @@ def widget_to_clip(textview, clip_array)
732
735
  clip_array.current.wrap = true
733
736
  end
734
737
  end
735
- end
738
+ end
736
739
 
737
740
  def set_autosave
738
741
  if pref("autosave_enable") then
739
742
  @next_autosave = Time.now + pref("autosave_seconds")
740
743
  end
741
- end
744
+ end
742
745
 
743
746
  def array_to_color(arr)
744
747
  return Gdk::Color.new(arr[0],arr[1],arr[2])
745
- end
748
+ end
746
749
 
747
750
  def color_to_array(gdk_color)
748
751
  return [gdk_color.red, gdk_color.green, gdk_color.blue]
749
- end
752
+ end
750
753
 
751
754
  def file_chooser_dialog(mode)
752
755
  case mode
@@ -794,7 +797,7 @@ def file_chooser_dialog(mode)
794
797
  dialog.destroy
795
798
 
796
799
  return filename
797
- end
800
+ end
798
801
 
799
802
  def show
800
803
  clip_to_widget(@clip_widget,@data)
@@ -802,7 +805,7 @@ def show
802
805
  set_wrap_mode
803
806
  set_title
804
807
  end
805
-
808
+
806
809
  def update
807
810
  widget_to_clip(@clip_widget, @data) if @data
808
811
  set_buttons
@@ -810,10 +813,10 @@ def update
810
813
  end
811
814
 
812
815
  def autosave
813
- # do autosave if enabled and due
814
- if @data &&
816
+ # do autosave if enabled
817
+ if @data &&
815
818
  @changed &&
816
- pref("autosave_enable") &&
819
+ pref("autosave_enable") &&
817
820
  Time.now >= @next_autosave then
818
821
  print_verbose "autosaving at #{Time.now}"
819
822
  @data.save