Streamlined the accelerator wireup code by extracting repeated calls to a
helper method.  Also extracted the helper method for moving a treeview's
currently selected row from status for reuse in changeset.


# HG changeset patch
# User Daniel Rocco <dro...@westga.edu>
# Date 1262661223 18000
# Node ID 241defa8cb8a560980194a81fbdf6c2df2346c7f
# Parent  e1fc1ada69c7d07f8eb9d343ab6f2d64f7e39bc5
gtklib: cleanup accelerator code, treeview selection helper

Streamlined the accelerator wireup code by extracting repeated calls to a
helper method.  Also extracted the helper method for moving a treeview's
currently selected row from status for reuse in changeset.

diff -r e1fc1ada69c7 -r 241defa8cb8a tortoisehg/hgtk/gtklib.py
--- a/tortoisehg/hgtk/gtklib.py	Sun Jan 03 22:16:47 2010 -0600
+++ b/tortoisehg/hgtk/gtklib.py	Mon Jan 04 22:13:43 2010 -0500
@@ -51,6 +51,15 @@
     else:
         return '<Control>'
 
+def add_accelerator(widget, signal, accelgroup, accelerator,
+                    accel_flags=gtk.ACCEL_VISIBLE):
+    """Add an accelerator for signal to widget.
+
+    accelerator is the key string parsed by gtk.accelerator_parse; the
+    other parameters are passed to gtk.Widget.add_accelerator"""
+    key, modifier = gtk.accelerator_parse(accelerator)
+    widget.add_accelerator(signal, accelgroup, key, modifier, accel_flags)
+
 def set_tortoise_keys(window, connect=True):
     'Set default TortoiseHg keyboard accelerators'
     if sys.platform == 'darwin':
@@ -60,21 +69,17 @@
     mod = get_thg_modifier()
     accelgroup = gtk.AccelGroup()
     window.add_accel_group(accelgroup)
-    key, modifier = gtk.accelerator_parse(mod+'w')
-    window.add_accelerator('thg-close', accelgroup, key, modifier,
-            gtk.ACCEL_VISIBLE)
-    key, modifier = gtk.accelerator_parse(mod+'q')
-    window.add_accelerator('thg-exit', accelgroup, key, modifier,
-            gtk.ACCEL_VISIBLE)
-    key, modifier = gtk.accelerator_parse('F5')
-    window.add_accelerator('thg-refresh', accelgroup, key, modifier,
-            gtk.ACCEL_VISIBLE)
-    key, modifier = gtk.accelerator_parse(mod+'r')
-    window.add_accelerator('thg-refresh', accelgroup, key, modifier,
-            gtk.ACCEL_VISIBLE)
-    key, modifier = gtk.accelerator_parse(mod+'Return')
-    window.add_accelerator('thg-accept', accelgroup, key, modifier,
-            gtk.ACCEL_VISIBLE)
+
+    default_accelerators = [
+        (mod+'w', 'thg-close'),
+        (mod+'q', 'thg-exit'),
+        ('F5', 'thg-refresh'),
+        (mod+'r', 'thg-refresh'),
+        (mod+'Return', 'thg-accept'),
+    ]
+
+    for accelerator, signal in default_accelerators:
+        add_accelerator(window, signal, accelgroup, accelerator)
 
     # connect ctrl-w and ctrl-q to every window
     if connect:
@@ -94,6 +99,31 @@
     window.destroy()
     return True
 
+def move_treeview_selection(window, treeview, distance=1):
+    """Accelerator handler to move a treeview's cursor and selection
+
+    Moves the treeview's cursor by distance and selects the row on which
+    the cursor lands.
+
+    distance: an integer number of rows to move the cursor, positive to
+              move the selection down, negative for up.  A distance of
+              0 will reset the selection to the current row."""
+    row = 0
+    path = treeview.get_cursor()[0]
+    if path:
+        row = path[0]
+    model = treeview.get_model()
+
+    # make sure new row is within bounds
+    new_row = min((row + distance), len(model) - 1)
+    new_row = max(0, new_row)
+
+    selected = model.get_iter_from_string(str(new_row))
+    selection = treeview.get_selection()
+    selection.unselect_all()
+    selection.select_iter(selected)
+    treeview.set_cursor(model.get_path(selected))
+
 class MessageDialog(gtk.Dialog):
     button_map = {
             gtk.BUTTONS_NONE: None,
diff -r e1fc1ada69c7 -r 241defa8cb8a tortoisehg/hgtk/status.py
--- a/tortoisehg/hgtk/status.py	Sun Jan 03 22:16:47 2010 -0600
+++ b/tortoisehg/hgtk/status.py	Mon Jan 04 22:13:43 2010 -0500
@@ -209,16 +209,12 @@
         accelgroup = gtk.AccelGroup()
         mod = gtklib.get_thg_modifier()
         
-        key, modifier = gtk.accelerator_parse(mod+'d')
-        self.filetree.add_accelerator('thg-diff', accelgroup, key,
-                        modifier, gtk.ACCEL_VISIBLE)
+        gtklib.add_accelerator(self.filetree, 'thg-diff', accelgroup, mod+'d')
         self.filetree.connect('thg-diff', self.thgdiff)
         self.connect('thg-refresh', self.thgrefresh)
 
         # set CTRL-c accelerator for copy-clipboard
-        key, modifier = gtk.accelerator_parse(mod+'c')
-        self.difftree.add_accelerator('copy-clipboard', accelgroup, key,
-                        modifier, gtk.ACCEL_VISIBLE)
+        gtklib.add_accelerator(self.difftree, 'copy-clipboard', accelgroup, mod+'c')
         self.difftree.connect('copy-clipboard', self.copy_to_clipboard)
 
         def scroll_diff_notebook(widget, direction=gtk.SCROLL_PAGE_DOWN):
@@ -227,23 +223,6 @@
 
             page.emit("scroll-child", direction, False)
 
-        def move_filetree_selection(widget, distance=1):
-            row = 0
-            path = self.filetree.get_cursor()[0]
-            if path:
-                row = path[0]
-            model = self.filetree.get_model()
-
-            # make sure new row is within bounds            
-            new_row = min((row + distance), len(model) - 1)
-            new_row = max(0, new_row)
-
-            selected = model.get_iter_from_string(str(new_row))
-            selection = self.filetree.get_selection()
-            selection.unselect_all()
-            selection.select_iter(selected)
-            self.filetree.set_cursor(model.get_path(selected))
-
         def toggle_filetree_selection(*arguments):
             self.sel_clicked(not self.selcb.get_active())
 
@@ -261,24 +240,26 @@
             else:
                 notebook.prev_page()
                 
-        # signal, accelerator key, handler, parameter                
+        # signal, accelerator key, handler, (parameters)
         status_accelerators = [
             ('status-scroll-down', 'bracketright', scroll_diff_notebook,
-             gtk.SCROLL_PAGE_DOWN),
+             (gtk.SCROLL_PAGE_DOWN,)),
             ('status-scroll-up', 'bracketleft', scroll_diff_notebook,
-             gtk.SCROLL_PAGE_UP),
-            ('status-next-file', 'period', move_filetree_selection, 1),
-            ('status-previous-file', 'comma', move_filetree_selection, -1),
-            ('status-select-all', 'u', toggle_filetree_selection, None),
-            ('status-next-page', 'p', next_diff_notebook_page, None),
+             (gtk.SCROLL_PAGE_UP,)),
+            ('status-next-file', 'period', gtklib.move_treeview_selection,
+             (self.filetree, 1)),
+            ('status-previous-file', 'comma', gtklib.move_treeview_selection,
+             (self.filetree, -1)),
+            ('status-select-all', 'u', toggle_filetree_selection, ()),
+            ('status-next-page', 'p', next_diff_notebook_page, ()),
             ('status-previous-page', '<Shift>p',
-             previous_diff_notebook_page, None),
-            ]
+             previous_diff_notebook_page, ()),
+        ]
         
-        for signal, accelerator, handler, param in status_accelerators:
-            key, modifier = gtk.accelerator_parse(mod + accelerator)
-            self.add_accelerator(signal, accelgroup, key, modifier, 0)
-            self.connect(signal, handler, param)
+        for signal, accelerator, handler, parameters in status_accelerators:
+            gtklib.add_accelerator(self, signal, accelgroup,
+                                   mod + accelerator)
+            self.connect(signal, handler, *parameters)
 
         return accelgroup
                 
------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev 
_______________________________________________
Tortoisehg-develop mailing list
Tortoisehg-develop@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tortoisehg-develop

Reply via email to