Changeset ed4c2264d6c5…
Parent 69ca81f25552…
by
Changes to 3 files · Browse files at ed4c2264d6c5 Showing diff from parent 69ca81f25552 Diff from another changeset...
@@ -286,10 +286,12 @@
def make_toolbutton(self, stock, label, handler,
- userdata=None, menu=None, tip=None):
+ userdata=None, menu=None, tip=None, toggle=False):
if menu:
tbutton = gtk.MenuToolButton(stock)
tbutton.set_menu(menu)
+ elif toggle:
+ tbutton = gtk.ToggleToolButton(stock)
else:
tbutton = gtk.ToolButton(stock)
|
|
|
@@ -40,6 +40,10 @@ self.filterbox = None
os.chdir(self.repo.root)
+ # Load extension support for commands which need it
+ extensions.loadall(self.ui)
+ self.exs = [ name for name, module in extensions.extensions() ]
+
def get_title(self):
return hglib.toutf(os.path.basename(self.repo.root)) + ' log'
@@ -74,6 +78,13 @@ self.synch_clicked,
tip=_('Launch synchronize tool'))
tbar += [self.synctb, gtk.SeparatorToolItem()]
+ if 'mq' in self.exs:
+ self.mqtb = self.make_toolbutton(gtk.STOCK_DIRECTORY,
+ _('MQ'),
+ self.mq_clicked,
+ tip=_('Toggle MQ panel'),
+ toggle=True)
+ tbar += [self.mqtb, gtk.SeparatorToolItem()]
self.settingtb = self.make_toolbutton(gtk.STOCK_PREFERENCES,
_('Configure'),
self.conf_clicked,
@@ -312,6 +323,9 @@ self.filterbox.set_property('visible', self.show_filterbar)
self.filterbox.set_no_show_all(True)
+ # enable MQ panel
+ self.enable_mqpanel()
+
def get_graphlimit(self, suggestion):
limit_opt = self.repo.ui.config('tortoisehg', 'graphlimit', '500')
l = 0
@@ -362,6 +376,10 @@ if self.graphview.model:
self.graphview.model.refresh()
+ # refresh MQ widget if exists
+ if hasattr(self, 'mqwidget'):
+ self.mqwidget.refresh()
+
def reload_log(self, **kwopts):
'Send refresh event to treeview object'
opts = {'date': None, 'no_merges':False, 'only_merges':False,
@@ -440,8 +458,9 @@ opts['revlist'] = [str(x) for x in heads]
self.graphview.refresh(False, [], opts)
- # refresh MQ widget
- self.mqwidget.refresh()
+ # refresh MQ widget if exists
+ if hasattr(self, 'mqwidget'):
+ self.mqwidget.refresh()
def tree_context_menu(self):
m = gtk.Menu()
@@ -462,17 +481,13 @@ m.append(create_menu(_('_revert'), self.revert))
m.append(create_menu(_('_archive'), self.archive))
- # Load extension support for commands which need it
- extensions.loadall(self.ui)
- exs = [ name for name, module in extensions.extensions() ]
-
# need transplant extension for transplant command
- if 'transplant' in exs:
+ if 'transplant' in self.exs:
m.append(create_menu(_('transp_lant to local'),
self.transplant_rev))
# need mq extension for strip command
- if 'mq' in exs:
+ if 'mq' in self.exs:
m.append(create_menu(_('strip revision'), self.strip_rev))
m.show_all()
@@ -494,23 +509,18 @@ self.cmenu_merge2 = create_menu(_('_merge with'), self.merge)
m.append(self.cmenu_merge2)
- # Load extension support for commands which need it
- extensions.loadall(self.ui)
-
- exs = [ name for name, module in extensions.extensions() ]
-
# need transplant extension for transplant command
- if 'transplant' in exs:
+ if 'transplant' in self.exs:
m.append(create_menu(_('transplant revision range to local'),
self.transplant_revs))
# need rebase extension for rebase command
- if 'rebase' in exs:
+ if 'rebase' in self.exs:
m.append(create_menu(_('rebase on top of selected'),
self.rebase_selected))
# need MQ extension for qimport / qfinish commands
- if 'mq' in exs:
+ if 'mq' in self.exs:
m.append(create_menu(_('import as MQ patches from here to selected'),
self.mqimport_revs))
m.append(create_menu(_('finish MQ patches from here to selected'),
@@ -662,30 +672,34 @@ self.filterentry = entry
filterbox.pack_start(entry, True)
- self.mqwidget = thgmq.MQWidget(self.repo)
- self.mqwidget.connect('patch-selected', self.patch_selected)
- self.mqwidget.connect('repo-invalidated', self.repo_invalidated)
+ midpane = gtk.VBox()
+ midpane.pack_start(filterbox, False, False, 0)
+ midpane.pack_start(self.graphview, True, True, 0)
+ midpane.show_all()
- vbox = gtk.VBox()
- vbox.pack_start(filterbox, False, False, 0)
- vbox.pack_start(self.graphview, True, True, 0)
- vbox.show_all()
+ if 'mq' in self.exs:
+ # create MQWidget
+ self.mqwidget = thgmq.MQWidget(self.repo)
+ self.mqwidget.connect('patch-selected', self.patch_selected)
+ self.mqwidget.connect('repo-invalidated', self.repo_invalidated)
- def wrapframe(widget):
- frame = gtk.Frame()
- frame.set_shadow_type(gtk.SHADOW_ETCHED_IN)
- frame.add(widget)
- return frame
- self.mqpaned = gtk.HPaned()
- self.mqpaned.add1(wrapframe(self.mqwidget))
- self.mqpaned.add2(wrapframe(vbox))
+ def wrapframe(widget):
+ frame = gtk.Frame()
+ frame.set_shadow_type(gtk.SHADOW_ETCHED_IN)
+ frame.add(widget)
+ return frame
+ self.mqpaned = gtk.HPaned()
+ self.mqpaned.add1(wrapframe(self.mqwidget))
+ self.mqpaned.add2(wrapframe(midpane))
+
+ midpane = self.mqpaned
# Add ChangeSet instance to bottom half of vpane
self.changeview.graphview = self.graphview
self.hpaned = self.changeview.get_body()
self.vpaned = gtk.VPaned()
- self.vpaned.pack1(self.mqpaned, True, False)
+ self.vpaned.pack1(midpane, True, False)
self.vpaned.pack2(self.hpaned)
gobject.idle_add(self.realize_settings)
@@ -1098,6 +1112,26 @@ self.reload_log()
return True
+ def enable_mqpanel(self, enable=None):
+ if not hasattr(self, 'mqpaned'):
+ return
+ if enable == None:
+ enable = bool('mq' in self.exs and self.repo.mq.applied)
+ self.mqpaned.set_position(enable and -1 or 0)
+
+ # set the state of MQ toolbutton
+ if hasattr(self, 'mqtb'):
+ self.mqtb.handler_block_by_func(self.mq_clicked)
+ self.mqtb.set_active(enable)
+ self.mqtb.handler_unblock_by_func(self.mq_clicked)
+
+ def mq_clicked(self, toolbutton, data=None):
+ active = self.mqtb.get_active()
+ if active:
+ self.enable_mqpanel(True)
+ else:
+ self.enable_mqpanel(False)
+
def tree_button_press(self, tree, event):
if event.button == 3 and not (event.state & (gtk.gdk.SHIFT_MASK |
gtk.gdk.CONTROL_MASK)):
|
|
|
@@ -37,6 +37,7 @@ gtk.HBox.__init__(self)
self.repo = repo
+ self.mqloaded = hasattr(repo, 'mq')
# side toolbar
toolbar = gtk.Toolbar()
@@ -145,6 +146,9 @@ Refresh the list of patches.
This operation will try to keep selection state.
"""
+ if not self.mqloaded:
+ return
+
# store patch selection state
sel = self.list.get_selection()
model, prevpaths = sel.get_selected_rows()
@@ -168,9 +172,6 @@ # insert separator
model.insert_after(top, (-1, '', '', ''))
- # update toolbar buttons
- self.update_toolbuttons()
-
# restore patch selection state
if len(prevpaths) > 0:
for path in prevpaths:
@@ -178,12 +179,17 @@ if iter:
sel.select_iter(iter)
+ # update UI sensitives
+ self.update_sensitives()
+
def qgoto(self, patch):
"""
[MQ] Execute 'qgoto' command.
patch: the patch name or an index to specify the patch.
"""
+ if not self.is_operable():
+ return
cmdline = ['hg', 'qgoto', patch]
dlg = hgcmd.CmdDialog(cmdline)
dlg.show_all()
@@ -199,6 +205,8 @@
all: if True, use '--all' option. (default: False)
"""
+ if not self.is_operable():
+ return
cmdline = ['hg', 'qpop']
if all:
cmdline.append('--all')
@@ -216,6 +224,8 @@
all: if True, use '--all' option. (default: False)
"""
+ if not self.is_operable():
+ return
cmdline = ['hg', 'qpush']
if all:
cmdline.append('--all')
@@ -233,6 +243,8 @@
patch: the patch name or an index to specify the patch.
"""
+ if not self.has_patch():
+ return
cmdline = ['hg', 'qdelete', patch]
dlg = hgcmd.CmdDialog(cmdline)
dlg.show_all()
@@ -250,7 +262,7 @@ name: the new patch name for renaming.
patch: the target patch name or index. (default: 'qtip')
"""
- if not name:
+ if not name or not self.has_patch():
return
cmdline = ['hg', 'qrename', patch, name]
dlg = hgcmd.CmdDialog(cmdline)
@@ -271,6 +283,9 @@
patch: the target patch name or index. (default: 'qtip')
"""
+ if not self.mqloaded or \
+ patch == 'qtip' and 'qtip' in self.repo.tags():
+ return False
target = self.repo.mq.lookup(patch)
if not target:
return False
@@ -287,6 +302,8 @@
applied: if True, enable '--applied' option. (default: False)
"""
+ if not self.has_applied():
+ return
cmdline = ['hg', 'qfinish']
if applied:
cmdline.append('--applied')
@@ -304,7 +321,7 @@
patch: the patch name or an index to specify the patch.
"""
- if not patch:
+ if not patch or not self.has_applied():
return
cmdline = ['hg', 'qfold', patch]
dlg = hgcmd.CmdDialog(cmdline)
@@ -317,8 +334,29 @@
### internal functions ###
+ def has_patch(self):
+ """ return True if MQ has applicable patch """
+ if self.mqloaded:
+ return len(self.repo.mq.series) > 0
+ return False
+
+ def has_applied(self):
+ """ return True if MQ has applied patches """
+ if self.mqloaded:
+ return len(self.repo.mq.applied) > 0
+ return False
+
+ def is_operable(self):
+ """ return True if MQ is operable """
+ if self.mqloaded:
+ repo = self.repo
+ if 'qtip' in self.repo.tags():
+ return repo['.'] == repo['qtip']
+ return len(repo.mq.series) > 0
+ return False
+
def get_iter_by_patchname(self, name):
- """ return iter has specified patch name"""
+ """ return iter has specified patch name """
if name:
for row in self.model:
if row[MQ_NAME] == name:
@@ -326,34 +364,41 @@ return None
def get_path_by_patchname(self, name):
+ """ return path has specified patch name """
return self.model.get_path(self.get_iter_by_patchname(name))
- def get_top_patchname(self):
- applied = self.repo.mq.applied
- if len(applied):
- return applied[-1].name
+ def get_qtip_patchname(self):
+ if self.mqloaded and 'qtip' in self.repo.tags():
+ return self.repo.mq.applied[-1].name
return None
- def is_top_patch(self, patchname):
- topname = self.get_top_patchname()
- if patchname and topname:
- return patchname == topname
+ def is_qtip(self, patchname):
+ if patchname:
+ return patchname == self.get_qtip_patchname()
return False
- def get_top_path(self):
- topname = self.get_top_patchname()
- if topname:
- return self.get_path_by_patchname(topname)
- return None
-
- def update_toolbuttons(self):
- q = self.repo.mq
- in_bottom = len(q.applied) == 0
- in_top = len(q.unapplied(self.repo)) == 0
- self.btn['popall'].set_sensitive(not in_bottom)
- self.btn['pop'].set_sensitive(not in_bottom)
- self.btn['push'].set_sensitive(not in_top)
- self.btn['pushall'].set_sensitive(not in_top)
+ def update_sensitives(self):
+ """ Update the sensitives of entire UI """
+ def disable_mqmoves():
+ for name in ('popall', 'pop', 'push', 'pushall'):
+ self.btn[name].set_sensitive(False)
+ if self.mqloaded:
+ self.list.set_sensitive(True)
+ self.btn['menu'].set_sensitive(True)
+ if self.is_operable():
+ q = self.repo.mq
+ in_bottom = len(q.applied) == 0
+ in_top = len(q.unapplied(self.repo)) == 0
+ self.btn['popall'].set_sensitive(not in_bottom)
+ self.btn['pop'].set_sensitive(not in_bottom)
+ self.btn['push'].set_sensitive(not in_top)
+ self.btn['pushall'].set_sensitive(not in_top)
+ else:
+ disable_mqmoves()
+ else:
+ self.list.set_sensitive(False)
+ self.btn['menu'].set_sensitive(False)
+ disable_mqmoves()
def scroll_to_current(self):
"""
@@ -362,9 +407,12 @@ """
if self.list.get_selection().count_selected_rows() > 0:
return
- top = self.get_top_path()
- if top:
- self.list.scroll_to_cell(top)
+ qtipname = self.get_qtip_patchname()
+ if not qtipname:
+ return
+ path = self.get_path_by_patchname(qtipname)
+ if path:
+ self.list.scroll_to_cell(path)
def cell_data_func(self, column, cell, model, iter):
row = model[iter]
@@ -378,7 +426,7 @@ cell.set_property('foreground', 'black')
patchname = row[MQ_NAME]
- if self.is_top_patch(patchname):
+ if self.is_qtip(patchname):
cell.set_property('weight', pango.WEIGHT_BOLD)
else:
cell.set_property('weight', pango.WEIGHT_NORMAL)
@@ -399,7 +447,7 @@ item.connect('activate', handler, row)
menu.append(item)
- is_top = self.is_top_patch(row[MQ_NAME])
+ is_top = self.is_qtip(row[MQ_NAME])
is_applied = row[MQ_STATUS] == 'A'
if not is_top:
@@ -463,11 +511,12 @@
def list_row_activated(self, list, path, column):
patchname = self.model[path][MQ_NAME]
- if self.get_top_patchname() != patchname:
+ if self.get_qtip_patchname() != patchname:
self.qgoto(patchname)
def list_size_allocated(self, list, req):
- self.scroll_to_current()
+ if self.mqloaded and self.has_applied():
+ self.scroll_to_current()
def popall_clicked(self, toolbutton):
self.qpop(all=True)
@@ -481,7 +530,7 @@ def pushall_clicked(self, toolbutton):
self.qpush(all=True)
- """ context menu signal handlers """
+ ### context menu signal handlers ###
def goto_activated(self, menuitem, row):
self.qgoto(row[MQ_NAME])
|
Loading...