[gedit] Fixed accelerator update problem



commit ddd7116cf67e4cc97a680b4faadfd494e8125b47
Author: Jesse van den Kieboom <jesse icecrew nl>
Date:   Fri May 22 19:22:18 2009 +0200

    Fixed accelerator update problem
    
    This also makes changes to an accelerator from the menu actually persistent for the tool.
    Pretty nifty stuff!
---
 plugins/externaltools/tools/__init__.py |   44 +++++++++++++++++++++++++++++-
 plugins/externaltools/tools/manager.py  |    6 +++-
 2 files changed, 47 insertions(+), 3 deletions(-)

diff --git a/plugins/externaltools/tools/__init__.py b/plugins/externaltools/tools/__init__.py
index 37f206e..c0c3806 100644
--- a/plugins/externaltools/tools/__init__.py
+++ b/plugins/externaltools/tools/__init__.py
@@ -39,23 +39,36 @@ class ToolMenu(object):
 
         self._merge_id = 0
         self._action_group = gtk.ActionGroup("ExternalToolsPluginToolActions")
-        self._window.get_ui_manager().insert_action_group(self._action_group, -1)
+        self._signals = []
+
         self.update()
 
     def deactivate(self):
         self.remove()
-        self._window.get_ui_manager().remove_action_group(self._action_group)
 
     def remove(self):
         if self._merge_id != 0:
             self._window.get_ui_manager().remove_ui(self._merge_id)
+            self._window.get_ui_manager().remove_action_group(self._action_group)
             self._merge_id = 0
 
         for action in self._action_group.list_actions():
             handler = action.get_data(self.ACTION_HANDLER_DATA_KEY)
+
             if handler is not None:
                 action.disconnect(handler)
+
+            action.set_data(self.ACTION_ITEM_DATA_KEY, None)
+            action.set_data(self.ACTION_HANDLER_DATA_KEY, None)
+
             self._action_group.remove_action(action)
+        
+        accelmap = gtk.accel_map_get()
+
+        for s in self._signals:
+            accelmap.disconnect(s)
+        
+        self._signals = []
 
     def _insert_directory(self, directory, path):
         manager = self._window.get_ui_manager()
@@ -68,6 +81,7 @@ class ToolMenu(object):
             manager.add_ui(self._merge_id, path,
                            action_name, action_name,
                            gtk.UI_MANAGER_MENU, False)
+                           
             self._insert_directory(item, path + '/' + action_name)
 
         for item in directory.tools:
@@ -77,16 +91,33 @@ class ToolMenu(object):
 
             action.set_data(self.ACTION_ITEM_DATA_KEY, item)
             action.set_data(self.ACTION_HANDLER_DATA_KEY, handler)
+            
+            # Make sure to replace accel
+            accelpath = '<Actions>/ExternalToolsPluginToolActions/%s' % (action_name, )
+            
+            if item.shortcut:
+                key, mod = gtk.accelerator_parse(item.shortcut)
+                gtk.accel_map_change_entry(accelpath, key, mod, True)
+                
+                self._signals.append(gtk.accel_map_get().connect('changed::%s' % (accelpath,), self.on_accelmap_changed, item))
+                
             self._action_group.add_action_with_accel(action, item.shortcut)
 
             manager.add_ui(self._merge_id, path,
                            action_name, action_name,
                            gtk.UI_MANAGER_MENUITEM, False)
 
+    def on_accelmap_changed(self, accelmap, path, key, mod, tool):
+        tool.shortcut = gtk.accelerator_name(key, mod)
+        tool.save()
+        
+        self._window.get_data("ExternalToolsPluginWindowData").update_manager(tool)
+
     def update(self):
         self.remove()
         self._merge_id = self._window.get_ui_manager().new_merge_id()
         self._insert_directory(self._library.tree, self._menupath)
+        self._window.get_ui_manager().insert_action_group(self._action_group, -1)
         self.filter(self._window.get_active_document())
 
     def filter_language(self, language, item):
@@ -195,6 +226,9 @@ class ExternalToolsWindowHelper(object):
         bottom = self._window.get_bottom_panel()
         bottom.remove_item(self._output_buffer.panel)
 
+    def update_manager(self, tool):
+        self._plugin.update_manager(tool)
+
 class ExternalToolsPlugin(gedit.Plugin):
     WINDOW_DATA_KEY = "ExternalToolsPluginWindowData"
 
@@ -228,6 +262,12 @@ class ExternalToolsPlugin(gedit.Plugin):
 
         return self._manager.dialog
 
+    def update_manager(self, tool):
+        if not self._manager:
+            return
+
+        self._manager.tool_changed(tool, True)
+
     def on_manager_destroy(self, dialog):
         self._manager = None
 
diff --git a/plugins/externaltools/tools/manager.py b/plugins/externaltools/tools/manager.py
index 23665e1..c2126d6 100644
--- a/plugins/externaltools/tools/manager.py
+++ b/plugins/externaltools/tools/manager.py
@@ -637,9 +637,12 @@ class Manager:
         self['tool-table'].set_sensitive(True)
         self.view.get_selection().handler_unblock(self.selection_changed_id)
 
-    def tool_changed(self, tool):
+    def tool_changed(self, tool, refresh=False):
         for row in self._tool_rows[tool]:
             self.model.row_changed(row.get_path(), self.model.get_iter(row.get_path()))
+        
+        if refresh and tool == self.current_node:
+            self.fill_fields()
 
     def on_remove_tool_button_clicked(self, button):
         piter, node = self.get_selected_tool()
@@ -818,6 +821,7 @@ class Manager:
 
     def on_tool_manager_dialog_focus_out(self, dialog, event):
         self.save_current_tool()
+
         for window in gedit.app_get_default().get_windows():
             helper = window.get_data("ExternalToolsPluginWindowData")
             helper.menu.update()



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]