# HG changeset patch
# User Sune Foldager <c...@cyanite.org>
# Date 1260195114 -3600
# Node ID 7f75ee16a245c7fd352cd556490f90d8409456b2
# Parent  73b22761a42499fdb9a13a3c3d9468cfa229b66d
history/mq: manipulate patches with ctrl + arrow keys

Unapplied patches can be reordered using ctrl + arrow up/down and page up/down.
Patches can be popped and pushed in order using ctrl + arrow left/right.

diff --git a/tortoisehg/hgtk/hgtk.py b/tortoisehg/hgtk/hgtk.py
--- a/tortoisehg/hgtk/hgtk.py
+++ b/tortoisehg/hgtk/hgtk.py
@@ -35,7 +35,8 @@
 
 # Add TortoiseHg signals, hooked to key accelerators in gtklib
 for sig in ('copy-clipboard', 'thg-diff', 'thg-parent', 'thg-rename',
-        'thg-revision'):
+            'thg-revision', 'mq-move-up', 'mq-move-down', 'mq-move-top',
+            'mq-move-bottom', 'mq-pop', 'mq-push'):
     gobject.signal_new(sig, gtk.TreeView,
         gobject.SIGNAL_ACTION, gobject.TYPE_NONE, ())
 for sig in ('thg-exit', 'thg-close', 'thg-refresh', 'thg-accept', 
'thg-reflow'):
diff --git a/tortoisehg/hgtk/thgmq.py b/tortoisehg/hgtk/thgmq.py
--- a/tortoisehg/hgtk/thgmq.py
+++ b/tortoisehg/hgtk/thgmq.py
@@ -7,6 +7,7 @@
 
 import os
 import gtk
+import gtk.keysyms
 import gobject
 import pango
 
@@ -151,6 +152,44 @@
         self.list.connect('row-activated', self.list_row_activated)
         self.list.connect('size-allocate', self.list_size_allocated)
 
+        ## mq patch manipulation accelerators
+        if accelgroup:
+            mod = gtk.gdk.CONTROL_MASK
+
+            def mq_move(tree, key):
+                oldrow = tree.get_cursor()[0][0]
+                minval = self.separator_pos + 1
+                if oldrow < minval:
+                    return True
+                maxval = len(self.model) - 1
+                if key == gtk.keysyms.Up:
+                    newrow = oldrow - 1
+                elif key == gtk.keysyms.Down:
+                    newrow = oldrow + 1
+                elif key == gtk.keysyms.Page_Up:
+                    newrow = minval
+                elif key == gtk.keysyms.Page_Down:
+                    newrow = maxval
+                else:
+                    return True
+                if newrow != oldrow and newrow >= minval and newrow <= maxval:
+                    self.move_patch(oldrow, newrow)
+                return True
+
+            def add(name, key, hook=None):
+                self.list.add_accelerator(name, accelgroup, key, mod, 0)
+                if hook:
+                    self.list.connect(name, hook)
+                else:
+                    self.list.connect(name, mq_move, key)
+
+            add('mq-move-up', gtk.keysyms.Up)
+            add('mq-move-down', gtk.keysyms.Down)
+            add('mq-move-top', gtk.keysyms.Page_Up)
+            add('mq-move-bottom', gtk.keysyms.Page_Down)
+            add('mq-pop', gtk.keysyms.Left, lambda _: self.qpop())
+            add('mq-push', gtk.keysyms.Right, lambda _: self.qpush())
+
         self.cols = {}
         self.cells = {}
 
@@ -205,6 +244,31 @@
                     self.qrename_ui(model[paths[0]][MQ_NAME])
             self.list.connect('thg-rename', thgrename)
 
+    def move_patch(self, oldidx, newidx):
+
+        def list_move_item(list, oldpos, newpos):
+            olditem = list[oldpos]
+            del list[oldpos]
+            list.insert(newpos, olditem)
+
+        # Update series
+        p = self.repo.mq
+        model = self.model
+        oldrow = model[oldidx]
+        newrow = model[newidx]
+        list_move_item(p.full_series, p.find_series(oldrow[MQ_NAME]),
+                                      p.find_series(newrow[MQ_NAME]))
+        p.series_dirty = True
+        p.save_dirty()
+
+        # Update TreeView
+        if newidx < oldidx:
+            model.move_before(oldrow.iter, newrow.iter)
+        else:
+            model.move_after(oldrow.iter, newrow.iter)
+        for i in xrange(min(oldidx, newidx), max(oldidx, newidx) + 1):
+            model[i][MQ_INDEX] = i-2
+
     ### public functions ###
 
     def refresh(self):
@@ -247,7 +311,8 @@
 
         # insert separator
         if top:
-            self.model.insert_after(top, (INDEX_SEPARATOR, None, None, None, 
None))
+            row = self.model.insert_after(top, (INDEX_SEPARATOR, None, None, 
None, None))
+            self.separator_pos = self.model.get_path(row)[0]
 
         # restore patch selection
         if selname:

------------------------------------------------------------------------------
Join us December 9, 2009 for the Red Hat Virtual Experience,
a free event focused on virtualization and cloud computing. 
Attend in-depth sessions from your desk. Your couch. Anywhere.
http://p.sf.net/sfu/redhat-sfdev2dev
_______________________________________________
Tortoisehg-develop mailing list
Tortoisehg-develop@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tortoisehg-develop

Reply via email to