[gedit/wip/redesign2: 13/28] Port external tools to new menu api



commit 7bf6da080afa7da1fd432495181e3d635ea27348
Author: Ignacio Casal Quinteiro <icq gnome org>
Date:   Thu Jan 2 19:50:53 2014 +0100

    Port external tools to new menu api

 plugins/externaltools/tools/functions.py         |    2 +-
 plugins/externaltools/tools/library.py           |    5 +-
 plugins/externaltools/tools/manager.py           |   14 +-
 plugins/externaltools/tools/tools.ui             |   27 +----
 plugins/externaltools/tools/windowactivatable.py |  159 +++++++---------------
 5 files changed, 64 insertions(+), 143 deletions(-)
---
diff --git a/plugins/externaltools/tools/functions.py b/plugins/externaltools/tools/functions.py
index 5fa6a1f..4b758dc 100644
--- a/plugins/externaltools/tools/functions.py
+++ b/plugins/externaltools/tools/functions.py
@@ -286,7 +286,7 @@ class MultipleDocumentsSaver:
         if self._counter == 0 and not self._error:
             run_external_tool(self._window, self._panel, self._node)
 
-def capture_menu_action(action, window, panel, node):
+def capture_menu_action(action, parameter, window, panel, node):
     if node.save_files == 'document' and window.get_active_document():
         MultipleDocumentsSaver(window, panel, False, node)
         return
diff --git a/plugins/externaltools/tools/library.py b/plugins/externaltools/tools/library.py
index 1e2a1aa..b1f2113 100644
--- a/plugins/externaltools/tools/library.py
+++ b/plugins/externaltools/tools/library.py
@@ -477,6 +477,7 @@ class Tool(object):
 
 if __name__ == '__main__':
     library = ToolLibrary()
+    library.set_locations(os.path.expanduser("~/.config/gedit/tools"))
 
     def print_tool(t, indent):
         print(indent * "  " + "%s: %s" % (t.filename, t.name))
@@ -484,9 +485,9 @@ if __name__ == '__main__':
     def print_dir(d, indent):
         print(indent * "  " + d.dirname + '/')
         for i in d.subdirs:
-            print_dir(i, indent+1)
+            print_dir(i, indent + 1)
         for i in d.tools:
-            print_tool(i, indent+1)
+            print_tool(i, indent + 1)
 
     print_dir(library.tree, 0)
 
diff --git a/plugins/externaltools/tools/manager.py b/plugins/externaltools/tools/manager.py
index a654172..56406bc 100644
--- a/plugins/externaltools/tools/manager.py
+++ b/plugins/externaltools/tools/manager.py
@@ -299,8 +299,8 @@ class Manager(GObject.Object):
 
     def build(self):
         callbacks = {
-            'on_action_add_tool_activated'    : self.on_action_add_tool_activated,
-            'on_action_remove_tool_activated' : self.on_action_remove_tool_activated,
+            'on_add_tool_button_clicked'    : self.on_add_tool_button_clicked,
+            'on_remove_tool_button_clicked' : self.on_remove_tool_button_clicked,
             'on_tool_manager_dialog_response' : self.on_tool_manager_dialog_response,
             'on_tool_manager_dialog_focus_out': self.on_tool_manager_dialog_focus_out,
             'on_tool_manager_dialog_configure_event': self.on_tool_manager_dialog_configure_event,
@@ -629,8 +629,8 @@ class Manager(GObject.Object):
 
         removable = node is not None and node.is_local()
 
-        self['remove-tool-action'].set_sensitive(removable)
-        self['revert-tool-action'].set_sensitive(removable)
+        self['remove-tool-button'].set_sensitive(removable)
+        self['revert-tool-button'].set_sensitive(removable)
 
         if node is not None and node.is_global():
             self['remove-tool-button'].hide()
@@ -675,7 +675,7 @@ class Manager(GObject.Object):
 
         return self.language_id_from_iter(piter)
 
-    def on_action_add_tool_activated(self, action):
+    def on_add_tool_button_clicked(self, button):
         self.save_current_tool()
 
         # block handlers while inserting a new item
@@ -707,7 +707,7 @@ class Manager(GObject.Object):
 
         self.update_remove_revert()
 
-    def on_action_remove_tool_activated(self, action):
+    def on_remove_tool_button_clicked(self, button):
         piter, node = self.get_selected_tool()
 
         if not node:
@@ -720,7 +720,7 @@ class Manager(GObject.Object):
                 self.remove_accelerator(node, shortcut)
                 self.add_accelerator(node)
 
-                self['revert-tool-action'].set_sensitive(False)
+                self['revert-tool-button'].set_sensitive(False)
                 self.fill_fields()
 
                 self.tool_changed(node)
diff --git a/plugins/externaltools/tools/tools.ui b/plugins/externaltools/tools/tools.ui
index a77bfb3..1a91753 100644
--- a/plugins/externaltools/tools/tools.ui
+++ b/plugins/externaltools/tools/tools.ui
@@ -1,9 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
-  <object class="GtkAction" id="add-tool-action">
-    <signal name="activate" handler="on_action_add_tool_activated" swapped="no"/>
-  </object>
   <object class="GtkListStore" id="model_applicability">
     <columns>
       <!-- column-name gchararray -->
@@ -132,12 +129,6 @@
       </row>
     </data>
   </object>
-  <object class="GtkAction" id="remove-tool-action">
-    <signal name="activate" handler="on_action_remove_tool_activated" swapped="no"/>
-  </object>
-  <object class="GtkAction" id="revert-tool-action">
-    <signal name="activate" handler="on_action_remove_tool_activated" swapped="no"/>
-  </object>
   <object class="GeditDocument" id="commands_buffer"/>
   <object class="GtkDialog" id="tool-manager-dialog">
     <property name="can_focus">False</property>
@@ -164,7 +155,6 @@
             <child>
               <object class="GtkButton" id="button1">
                 <property name="label">gtk-help</property>
-                <property name="use_action_appearance">False</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
@@ -181,7 +171,6 @@
             <child>
               <object class="GtkButton" id="button2">
                 <property name="label">gtk-close</property>
-                <property name="use_action_appearance">False</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
@@ -279,16 +268,13 @@
                     </style>
                     <child>
                       <object class="GtkToolButton" id="add-tool-button">
-                        <property name="use_action_appearance">False</property>
-                        <property name="related_action">add-tool-action</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Add a new tool</property>
-                        <property name="related_action">add-tool-action</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="label" translatable="yes">Add Tool</property>
                         <property name="use_underline">True</property>
                         <property name="icon_name">list-add-symbolic</property>
+                        <signal name="clicked" handler="on_add_tool_button_clicked" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -297,16 +283,13 @@
                     </child>
                     <child>
                       <object class="GtkToolButton" id="remove-tool-button">
-                        <property name="use_action_appearance">False</property>
-                        <property name="related_action">remove-tool-action</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Remove selected tool</property>
-                        <property name="related_action">remove-tool-action</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="label" translatable="yes">Remove Tool</property>
                         <property name="use_underline">True</property>
                         <property name="icon_name">list-remove-symbolic</property>
+                        <signal name="clicked" handler="on_remove_tool_button_clicked" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -315,16 +298,13 @@
                     </child>
                     <child>
                       <object class="GtkToolButton" id="revert-tool-button">
-                        <property name="use_action_appearance">False</property>
-                        <property name="related_action">revert-tool-action</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Revert tool</property>
-                        <property name="related_action">revert-tool-action</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="label" translatable="yes">Revert Tool</property>
                         <property name="use_underline">True</property>
                         <property name="icon_name">edit-undo-symbolic</property>
+                        <signal name="clicked" handler="on_remove_tool_button_clicked" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -431,7 +411,6 @@
                                 <property name="can_focus">False</property>
                                 <child>
                                   <object class="GtkButton" id="languages_button">
-                                    <property name="use_action_appearance">False</property>
                                     <property name="visible">True</property>
                                     <property name="can_focus">False</property>
                                     <property name="receives_default">False</property>
diff --git a/plugins/externaltools/tools/windowactivatable.py 
b/plugins/externaltools/tools/windowactivatable.py
index 431dc76..51d9492 100644
--- a/plugins/externaltools/tools/windowactivatable.py
+++ b/plugins/externaltools/tools/windowactivatable.py
@@ -18,7 +18,7 @@
 
 __all__ = ('ExternalToolsPlugin', 'Manager', 'OutputPanel', 'Capture', 'UniqueById')
 
-from gi.repository import Gio, GObject, Gtk, Gedit, PeasGtk
+from gi.repository import GLib, Gio, GObject, Gtk, Gedit, PeasGtk
 from .manager import Manager
 from .library import ToolLibrary
 from .outputpanel import OutputPanel
@@ -26,16 +26,13 @@ from .capture import Capture
 from .functions import *
 
 class ToolMenu(object):
-    def __init__(self, library, window, panel, menupath):
+    def __init__(self, library, window, panel, menu):
         super(ToolMenu, self).__init__()
         self._library = library
         self._window = window
         self._panel = panel
-        self._menupath = menupath
-
-        self._merge_id = 0
-        self._action_group = Gtk.ActionGroup("ExternalToolsPluginToolActions")
-        self._signals = []
+        self._menu = menu
+        self._action_tools = {}
 
         self.update()
 
@@ -43,75 +40,44 @@ class ToolMenu(object):
         self.remove()
 
     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():
-            if action._tool_handler is not None:
-                action.disconnect(action._tool_handler)
-
-            action._tool_item = None
-            action._tool_handler = None
-
-            self._action_group.remove_action(action)
-
-        accelmap = Gtk.AccelMap.get()
+        self._menu.remove_all()
 
-        for s in self._signals:
-            accelmap.disconnect(s)
+        for name, tool in self._action_tools.items():
+            self._window.remove_action(name)
 
-        self._signals = []
+            if tool.shortcut:
+                app = Gio.Application.get_default()
+                app.remove_accelerator(tool.shortcut)
+        self._action_tools = {}
 
-    def _insert_directory(self, directory, path):
-        ui_manager = self._window.get_ui_manager()
+    def _insert_directory(self, directory, menu):
+        for d in sorted(directory.subdirs, key=lambda x: x.name.lower()):
+            submenu = Gio.Menu()
+            menu.append_submenu(d.name.replace('_', '__'), submenu)
+            section = Gio.Menu()
+            submenu.append_section(None, section)
 
-        for item in sorted(directory.subdirs, key=lambda x: x.name.lower()):
-            action_name = 'ExternalToolDirectory_%X_%X' % (id(item), id(item.name))
-            action = Gtk.Action(action_name, item.name.replace('_', '__'), None, None)
-            self._action_group.add_action(action)
+            self._insert_directory(d, section)
 
-            ui_manager.add_ui(self._merge_id, path,
-                              action_name, action_name,
-                              Gtk.UIManagerItemType.MENU, False)
-                           
-            self._insert_directory(item, path + '/' + action_name)
+        for tool in sorted(directory.tools, key=lambda x: x.name.lower()):
+            action_name = 'external-tool_%X_%X' % (id(tool), id(tool.name))
+            self._action_tools[action_name] = tool
 
-        for item in sorted(directory.tools, key=lambda x: x.name.lower()):
-            action_name = 'ExternalToolTool_%X_%X' % (id(item), id(item.name))
-            action = Gtk.Action(action_name, item.name.replace('_', '__'), item.comment, None)
-            handler = action.connect("activate", capture_menu_action, self._window, self._panel, item)
+            action = Gio.SimpleAction(name=action_name)
+            action.connect('activate', capture_menu_action, self._window, self._panel, tool)
+            self._window.add_action(action)
 
-            # Attach the item and the handler to the action object
-            action._tool_item = item
-            action._tool_handler = handler
+            item = Gio.MenuItem.new(tool.name.replace('_', '__'), "win.%s" % action_name)
+            item.set_attribute_value("hidden-when", GLib.Variant.new_string("action-disabled"))
+            menu.append_item(item)
 
-            # Make sure to replace accel
-            accelpath = '<Actions>/ExternalToolsPluginToolActions/%s' % (action_name, )
-            
-            if item.shortcut:
-                key, mod = Gtk.accelerator_parse(item.shortcut)
-                Gtk.AccelMap.change_entry(accelpath, key, mod, True)
-                
-                self._signals.append(Gtk.AccelMap.get().connect('changed::%s' % (accelpath,), 
self.on_accelmap_changed, item))
-
-            self._action_group.add_action_with_accel(action, item.shortcut)
-
-            ui_manager.add_ui(self._merge_id, path,
-                              action_name, action_name,
-                              Gtk.UIManagerItemType.MENUITEM, False)
-
-    def on_accelmap_changed(self, accelmap, path, key, mod, tool):
-        tool.shortcut = Gtk.accelerator_name(key, mod)
-        tool.save()
-        self._window._external_tools_window_activatable.update_manager(tool)
+            if tool.shortcut:
+                app = Gio.Application.get_default()
+                app.add_accelerator(tool.shortcut, "win.%s" % action_name, None)
 
     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._insert_directory(self._library.tree, self._menu)
         self.filter(self._window.get_active_document())
 
     def filter_language(self, language, item):
@@ -145,10 +111,11 @@ class ToolMenu(object):
             'untitled': not titled,
         }
 
-        for action in self._action_group.list_actions():
-            if action._tool_item is not None:
-                action.set_visible(states[action._tool_item.applicability] and
-                                   self.filter_language(language, action._tool_item))
+        for name, tool in self._action_tools.items():
+            action = self._window.lookup_action(name)
+            if action:
+                action.set_enabled(states[tool.applicability] and
+                                   self.filter_language(language, tool))
 
 # FIXME: restore the launch of the manager on configure using PeasGtk.Configurable
 class WindowActivatable(GObject.Object, Gedit.WindowActivatable):
@@ -167,45 +134,23 @@ class WindowActivatable(GObject.Object, Gedit.WindowActivatable):
         self.window._external_tools_window_activatable = self
         self._library = ToolLibrary()
 
-        ui_manager = self.window.get_ui_manager()
-
-        self._action_group = Gtk.ActionGroup(name='ExternalToolsPluginActions')
-        self._action_group.set_translation_domain('gedit')
-        self._action_group.add_actions([('ExternalToolManager', None,
-                                         _('Manage _External Tools...'), None,
-                                         _("Opens the External Tools Manager"),
-                                         lambda action: self.open_dialog()),
-                                        ('ExternalTools', None,
-                                         _('External _Tools'), None,
-                                         _("External tools"), None)])
-        ui_manager.insert_action_group(self._action_group, -1)
-
-        ui_string = """
-            <ui>
-              <menubar name="MenuBar">
-                <menu name="ToolsMenu" action="Tools">
-                  <placeholder name="ToolsOps_4">
-                    <separator/>
-                    <menu name="ExternalToolsMenu" action="ExternalTools">
-                        <placeholder name="ExternalToolPlaceholder"/>
-                    </menu>
-                    <separator/>
-                  </placeholder>
-                  <placeholder name="ToolsOps_5">
-                    <menuitem name="ExternalToolManager" action="ExternalToolManager"/>
-                  </placeholder>
-                </menu>
-              </menubar>
-            </ui>"""
-
-        self._merge_id = ui_manager.add_ui_from_string(ui_string)
+        action = Gio.SimpleAction(name="manage_tools")
+        action.connect("activate", lambda action, parameter: self.open_dialog())
+        self.window.add_action(action)
+
+        self.gear_menu = self.extend_gear_menu("ext9")
+        item = Gio.MenuItem.new(_("Manage _External Tools..."), "win.manage_tools")
+        self.gear_menu.append_menu_item(item)
+        external_tools_submenu = Gio.Menu()
+        item = Gio.MenuItem.new_submenu(_("External _Tools"), external_tools_submenu)
+        self.gear_menu.append_menu_item(item)
+        external_tools_submenu_section = Gio.Menu()
+        external_tools_submenu.append_section(None, external_tools_submenu_section)
 
         # Create output console
         self._output_buffer = OutputPanel(self.plugin_info.get_data_dir(), self.window)
 
-        self.menu = ToolMenu(self._library, self.window, self._output_buffer,
-                             "/MenuBar/ToolsMenu/ToolsOps_4/ExternalToolsMenu/ExternalToolPlaceholder")
-        ui_manager.ensure_update()
+        self.menu = ToolMenu(self._library, self.window, self._output_buffer, external_tools_submenu_section)
 
         bottom = self.window.get_bottom_panel()
         image = Gtk.Image.new_from_icon_name("system-run-symbolic", Gtk.IconSize.MENU)
@@ -217,15 +162,11 @@ class WindowActivatable(GObject.Object, Gedit.WindowActivatable):
     def do_update_state(self):
         if self.menu is not None:
             self.menu.filter(self.window.get_active_document())
-            self.window.get_ui_manager().ensure_update()
 
     def do_deactivate(self):
         self.window._external_tools_window_activatable = None
-        ui_manager = self.window.get_ui_manager()
         self.menu.deactivate()
-        ui_manager.remove_ui(self._merge_id)
-        ui_manager.remove_action_group(self._action_group)
-        ui_manager.ensure_update()
+        self.window.remove_action("manage_tools")
 
         bottom = self.window.get_bottom_panel()
         bottom.remove_item(self._output_buffer.panel)


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