Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 1.0, 1.0.1, and 1.0.2

statusbar: redesign to get extensibility as component

New StatusBar component has the feature called 'field'.
In default, it has one field 'status' and progress bar.
If you need extra field other than default 'status' field,
you can add it using 'append_field()' method with field name.

Changeset 81ade04935a6

Parent 27dfffc12c15

by Yuki KODAMA

Changes to 8 files · Browse files at 81ade04935a6 Showing diff from parent 27dfffc12c15 Diff from another changeset...

 
457
458
459
460
 
461
462
463
 
516
517
518
519
 
520
521
522
 
759
760
761
762
 
763
764
765
 
839
840
841
842
 
843
844
845
 
457
458
459
 
460
461
462
463
 
516
517
518
 
519
520
521
522
 
759
760
761
 
762
763
764
765
 
839
840
841
 
842
843
844
845
@@ -457,7 +457,7 @@
  try:   hglib.hgcmd_toq(q, *args)   except (util.Abort, error.LookupError), e: - self.stbar.set_status_text(_('Abort: %s') % str(e)) + self.stbar.set_text(_('Abort: %s') % str(e))     thread = thread2.Thread(target=threadfunc, args=args)   thread.start() @@ -516,7 +516,7 @@
  iter = model.get_iter(path)   self.currev = model[iter][GCOL_REVID]   self.curpath = hglib.fromutf(model[iter][GCOL_PATH]) - self.stbar.set_status_text(hglib.toutf(model[iter][GCOL_DESC])) + self.stbar.set_text(model[iter][GCOL_DESC])     def close_current_page(self):   num = self.notebook.get_current_page() @@ -759,7 +759,7 @@
  try:   hglib.hgcmd_toq(q, *args)   except (util.Abort, error.LookupError), e: - self.stbar.set_status_text(_('Abort: %s') % str(e)) + self.stbar.set_text(_('Abort: %s') % str(e))     (frame, treeview, origpath, graphview) = objs   q = Queue.Queue() @@ -839,7 +839,7 @@
  anniter = model.get_iter(path)   self.currev = model[anniter][ACOL_REVID]   self.path = model.path - self.stbar.set_status_text(model[anniter][ACOL_DESC]) + self.stbar.set_text(model[anniter][ACOL_DESC])     def ann_button_release(self, widget, event, objs):   if event.button == 3 and not (event.state & (gtk.gdk.SHIFT_MASK |
 
271
272
273
274
 
275
276
277
 
271
272
273
 
274
275
276
277
@@ -271,7 +271,7 @@
  thread = thread2.Thread(target=self.search_thread, args=(q, tgts))   thread.start()   self.stbar.begin() - self.stbar.set_status_text(_('finding source of ') + ', '.join(tgts)) + self.stbar.set_text(_('finding source of ') + ', '.join(tgts))   gobject.timeout_add(50, self.search_wait, thread, q)     def search_thread(self, q, tgts):
 
1086
1087
1088
1089
 
1090
1091
1092
 
1102
1103
1104
1105
 
1106
1107
1108
 
1289
1290
1291
 
 
 
1292
1293
 
 
 
1294
1295
1296
 
1086
1087
1088
 
1089
1090
1091
1092
 
1102
1103
1104
 
1105
1106
1107
1108
 
1289
1290
1291
1292
1293
1294
1295
 
1296
1297
1298
1299
1300
1301
@@ -1086,7 +1086,7 @@
  else:   filtertext = '%s: %s' % (filterprefix, nomergestext)   - self.stbar.set_right2_text(filtertext) + self.stbar.set_text(filtertext, name='filter')     # refresh MQ widget if exists   if hasattr(self, 'mqwidget'): @@ -1102,7 +1102,7 @@
  if ncount > 0:   idle_text = _("Patch '%s' applied") % \   self.mqwidget.get_qtip_patchname() - self.stbar.set_right3_text(status_text) + self.stbar.set_text(status_text, name='mq')   self.stbar.set_idle_text(idle_text)     # Remember options to next time reload_log is called @@ -1289,8 +1289,13 @@
  def get_body(self):   self.connect('delete-event', self.delete)   self.gorev_dialog = None + self.limit = self.get_graphlimit(None) + + # prepare statusbar   self.stbar = statusbar.StatusBar() - self.limit = self.get_graphlimit(None) + self.stbar.append_field('mq') + self.stbar.append_field('filter') + self.stbar.append_field('rev')     # Allocate TreeView instance to use internally   limit = self.limit
 
269
270
271
272
 
273
274
275
 
379
380
381
382
 
383
384
385
 
269
270
271
 
272
273
274
275
 
379
380
381
 
382
383
384
385
@@ -269,7 +269,7 @@
  revision_text = _('%(count)d of %(total)d Revisions') % {   'count': len(self.model),   'total': len(self.repo) } - self.pbar.set_right1_text(revision_text) + self.pbar.set_text(revision_text, name='rev')   return False     def do_get_property(self, property): @@ -379,7 +379,7 @@
  gobject.idle_add(self.populate, self.currevid)   else:   self.treeview.set_model(None) - self.pbar.set_status_text(_('Repository is empty')) + self.pbar.set_text(_('Repository is empty'))     def construct_treeview(self):   self.treeview = gtk.TreeView()
 
176
177
178
179
 
180
181
182
 
176
177
178
 
179
180
181
182
@@ -176,7 +176,7 @@
  self.hgthread = hgthread.HgThread(cmdline, postfunc)   self.hgthread.start()   self.stbar.begin() - self.stbar.set_status_text('hg ' + ' '.join(cmdline)) + self.stbar.set_text('hg ' + ' '.join(cmdline))     def _cmd_running(self):   if self.hgthread and self.hgthread.isAlive():
 
781
782
783
784
 
785
786
787
 
781
782
783
 
784
785
786
787
@@ -781,7 +781,7 @@
  self.ready = True   self.update_check_count()   self.stbar.end() - self.stbar.set_status_text(self.status_error) + self.stbar.set_text(self.status_error)   return False   self.repo = self.newrepo   self.ui = self.repo.ui
 
10
11
12
 
 
 
 
 
13
14
15
16
 
 
 
 
17
18
 
 
 
19
20
21
22
 
 
23
24
25
26
 
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
44
45
46
47
48
49
50
 
 
 
 
51
52
53
54
 
 
55
56
 
57
58
 
59
60
61
 
 
62
63
64
 
65
66
67
68
69
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
71
72
73
74
 
 
75
76
77
 
 
 
 
 
 
 
 
78
79
80
 
 
 
 
 
 
 
81
82
83
 
 
 
 
 
 
 
 
 
84
85
86
 
 
 
 
 
 
 
 
 
 
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
27
28
29
30
31
 
 
32
33
34
 
 
 
35
36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
38
39
 
 
 
 
 
40
41
42
43
44
45
 
 
46
47
48
 
49
50
 
51
52
 
 
53
54
55
56
 
57
58
59
60
 
 
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
 
 
82
83
84
 
 
85
86
87
88
89
90
91
92
93
 
 
94
95
96
97
98
99
100
101
 
 
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
@@ -10,77 +10,113 @@
 import gobject    from tortoisehg.util.i18n import _ +from tortoisehg.hgtk import gtklib + +ALIGN_MAP = { gtk.JUSTIFY_LEFT: 0, + gtk.JUSTIFY_CENTER: 0.5, + gtk.JUSTIFY_RIGHT: 1}    class StatusBar(gtk.HBox):   def __init__(self, extra=None):   gtk.HBox.__init__(self) + + self.fields = {} + self.boxes = {} +   self.idle_text = None - self.started = False + self.timeout_id = None + + self.append_field('status', expand=True, sep=False)     self.pbar = gtk.ProgressBar() - self.sttext = gtk.Label("") - self.sttext.set_alignment(0, 0.5) + self.pbar.set_no_show_all(True) + self.append_widget(self.pbar, pack=gtk.PACK_START)   - self.pbox = gtk.HBox() - self.pbox.pack_start(gtk.VSeparator(), False, False) - self.pbox.pack_start(self.pbar, False, False) + gtklib.idle_add_single_call(self.after_init)   - self.pack_start(self.sttext, padding=4) - if extra: - self.pack_end(extra, False, False) - self.right1_label = gtk.Label() - self.pack_end(self.right1_label, False, False, padding=20) - self.pack_end(self.pbox, False, False, padding=1) - self.pbox.set_child_visible(False) - self.right2_label = gtk.Label() - self.pack_end(self.right2_label, False, False, padding=5) - self.right3_label = gtk.Label() - self.pack_end(self.right3_label, False, False, padding=20) - self.show_all() - - def _pulse_timer(self, now=False): - self.pbar.pulse() - return True + ### public methods ###     def begin(self, msg=_('Running...'), timeout=100): - self.pbox.set_child_visible(True) - self.pbox.map() - self.set_status_text(msg) - self.started = True - self._timeout_event = gobject.timeout_add(timeout, self._pulse_timer) + self.set_text(msg) + self.pbar.map() + self.pbar.show_all() + self.timeout_id = gobject.timeout_add(timeout, self.pulse_timer)     def end(self, msg=None, unmap=True): - self.started = False - gobject.source_remove(self._timeout_event) + gobject.source_remove(self.timeout_id) + self.timeout_id = None   - t = '' + text = ''   if msg: - t = msg + text = msg   elif self.idle_text: - t = self.idle_text - self.set_status_text(t) + text = self.idle_text + self.set_text(text)     if unmap: - self.pbox.unmap() + self.pbar.unmap()   else:   self.pbar.set_fraction(1.0)   - def set_status_text(self, msg): - self.sttext.set_text(str(msg)) + def set_text(self, msg, name='status'): + try: + label, box = self.fields[name], self.boxes[name] + except KeyError: + raise _('unknown field name: %s') % name + + if not msg and not name == 'status': + label.set_text('') + box.hide_all() + box.unmap() + box.set_no_show_all(True) + return + + label.set_text(msg) + if box.get_no_show_all(): + box.set_no_show_all(False) + box.map() + box.show_all()     def set_idle_text(self, msg):   self.idle_text = msg - if msg and not self.started: - self.set_status_text(msg) + if msg and self.timeout_id is None: + self.set_text(msg, name='status')   - def set_right1_text(self, msg): - self.right1_label.set_text(str(msg)) + def append_widget(self, widget, expand=False, pack=gtk.PACK_START): + if pack == gtk.PACK_START: + packfunc = self.pack_start + elif pack == gtk.PACK_END: + packfunc = self.pack_end + else: + raise _('invalid pack direction: %s') % pack + packfunc(widget, expand, expand, 2)   - def set_right2_text(self, msg): - self.right2_label.set_text(str(msg)) + def append_field(self, name, expand=False, pack=gtk.PACK_START, + align=gtk.JUSTIFY_LEFT, sep=True): + label = gtk.Label() + try: + label.set_alignment(ALIGN_MAP[align], 0.5) + except KeyError: + raise _('invalid alignment value: %s') % align   - def set_right3_text(self, msg): - self.right3_label.set_text(str(msg)) + box = gtk.HBox() + if sep: + box.pack_start(gtk.VSeparator(), False, False, 2) + box.pack_start(label, expand, expand, 2) + self.append_widget(box, expand, pack) + box.set_no_show_all(True) + + self.fields[name] = label + self.boxes[name] = box     def set_pulse_step(self, val):   self.pbar.set_pulse_step(val) + + ### signal handlers ### + + def after_init(self, *args): + self.pbar.set_no_show_all(False) + + def pulse_timer(self, now=False): + self.pbar.pulse() + return True
 
564
565
566
567
 
568
569
570
 
564
565
566
 
567
568
569
570
@@ -564,7 +564,7 @@
  self.hgthread = hgthread.HgThread(cmdline, parent=self)   self.hgthread.start()   self.stbar.begin() - self.stbar.set_status_text('hg ' + ' '.join(cmd)) + self.stbar.set_text('hg ' + ' '.join(cmd))     self.add_src_to_recent(remote_path)