[gedit-plugins] Port textsize plugins to libpeas.



commit 3574312772024fc13d9829216b0cce16f900ca4a
Author: Ignacio Casal Quinteiro <icq gnome org>
Date:   Tue Jul 13 17:49:24 2010 +0200

    Port textsize plugins to libpeas.

 plugins/textsize/textsize/Makefile.am       |    3 +-
 plugins/textsize/textsize/__init__.py       |  208 +++++++++++++++++++++++--
 plugins/textsize/textsize/documenthelper.py |   25 ++--
 plugins/textsize/textsize/windowhelper.py   |  227 ---------------------------
 4 files changed, 208 insertions(+), 255 deletions(-)
---
diff --git a/plugins/textsize/textsize/Makefile.am b/plugins/textsize/textsize/Makefile.am
index c457af2..28ec71e 100644
--- a/plugins/textsize/textsize/Makefile.am
+++ b/plugins/textsize/textsize/Makefile.am
@@ -6,7 +6,6 @@ plugin_PYTHON =	\
 	constants.py \
 	documenthelper.py \
 	__init__.py \
-	signals.py \
-	windowhelper.py
+	signals.py
 
 -include $(top_srcdir)/git.mk
diff --git a/plugins/textsize/textsize/__init__.py b/plugins/textsize/textsize/__init__.py
index c1ee8bd..deaf213 100644
--- a/plugins/textsize/textsize/__init__.py
+++ b/plugins/textsize/textsize/__init__.py
@@ -23,24 +23,206 @@
 #  Boston, MA 02111-1307, USA.
 
 from gettext import gettext as _
+from gi.repository import GObject, Gtk, Gdk, Gedit
+import constants
+from documenthelper import DocumentHelper
+from gi.overrides import keysyms
 
-import gtk
-import gedit
-from windowhelper import WindowHelper
+# UI manager snippet to add menu items to the View menu
+ui_str = """
+<ui>
+  <menubar name="MenuBar">
+    <menu name="ViewMenu" action="View">
+      <placeholder name="ViewOps_2">
+        <menuitem name="IncreaseFontSize" action="IncreaseFontSizeAction"/>
+        <menuitem name="DecreaseFontSize" action="DecreaseFontSizeAction"/>
+        <menuitem name="ResetFontSize" action="ResetFontSizeAction"/>
+      </placeholder>
+    </menu>
+  </menubar>
+</ui>
+"""
+
+class TextSizePlugin(GObject.Object, Gedit.WindowActivatable):
+    __gtype_name__ = "TextSizePlugin"
 
-class TextSizePlugin(gedit.Plugin):
     def __init__(self):
-        gedit.Plugin.__init__(self)
-        self._instances = {}
+        GObject.Object.__init__(self)
+
+    def do_activate(self, window):
+        self._window = window
+        self._views  = {}
+
+        # Insert menu items
+        self._insert_menu()
+
+        # Insert document helpers
+        for view in window.get_views():
+            self.add_document_helper(view)
+
+        window.connect('tab-added', self.on_tab_added)
+        window.connect('tab-removed', self.on_tab_removed)
+
+        self._accel_group = Gtk.AccelGroup()
+        self._window.add_accel_group(self._accel_group)
+
+        self._proxy_callback_map = {
+            'IncreaseFontSizeAction': self.on_increase_font_accel,
+            'DecreaseFontSizeAction': self.on_decrease_font_accel,
+            'ResetFontSizeAction': self.on_reset_font_accel
+        }
+
+        self._proxy_mapping = {}
+        self._init_proxy_accels()
+        self._accel_map_handler_id = Gtk.AccelMap.get().connect('changed', self.on_accel_map_changed)
+
+    def _install_proxy(self, action):
+        if not isinstance(action, Gtk.Action):
+            action = self._action_group.get_action(str(action))
+
+        if not action:
+            return
+
+        entry = Gtk.AccelMap.lookup_entry(action.get_accel_path())
+
+        if not entry:
+            return
+
+        mapping = {
+            Gdk.plus: Gdk.KP_Add,
+            Gdk.KP_Add: Gdk.plus,
+            Gdk.minus: Gdk.KP_Subtract,
+            Gdk.KP_Subtract: Gdk.minus,
+            keysyms._0: Gdk.KP_0,
+            Gdk.KP_0: keysyms._0
+        }
+
+        if entry[0] in mapping:
+            key = mapping[entry[0]]
+            mod = entry[1]
+
+            callback = self._proxy_callback_map[action.get_name()]
+
+            self._accel_group.connect_group(key, mod, Gtk.ACCEL_LOCKED, callback)
+            self._proxy_mapping[action] = (key, mod)
+
+    def _init_proxy_accels(self):
+        self._install_proxy('IncreaseFontSizeAction')
+        self._install_proxy('DecreaseFontSizeAction')
+        self._install_proxy('ResetFontSizeAction')
+
+    def do_deactivate(self, window):
+        # Remove any installed menu items
+        self._remove_menu()
+
+        for view in self._window.get_views():
+            self.remove_document_helper(view)
+
+        window.remove_accel_group(self._accel_group)
+
+        Gtk.AccelMap.get().disconnect(self._accel_map_handler_id)
+
+        self._window = None
+        self._accel_group = None
+        self._action_group = None
+
+    def _insert_menu(self):
+        # Get the GtkUIManager
+        manager = self._window.get_ui_manager()
+
+        # Create a new action group
+        self._action_group = Gtk.ActionGroup()
+        self._action_group.add_actions([("IncreaseFontSizeAction", None, _("_Increase font size"),
+                                         "<Ctrl>plus", None,
+                                         self.on_increase_font_size_activate),
+                                         ("DecreaseFontSizeAction", None, _("_Decrease font size"),
+                                         "<Ctrl>minus", None,
+                                         self.on_decrease_font_size_activate),
+                                         ("ResetFontSizeAction", None, _("_Reset font size"),
+                                         "<Ctrl>0", None,
+                                         self.on_reset_font_size_activate)])
+
+        # Insert the action group
+        manager.insert_action_group(self._action_group, -1)
+
+        # Merge the UI
+        self._ui_id = manager.add_ui_from_string(ui_str)
+
+    def _remove_menu(self):
+        # Get the GtkUIManager
+        manager = self._window.get_ui_manager()
+
+        # Remove the ui
+        manager.remove_ui(self._ui_id)
+
+        # Remove the action group
+        manager.remove_action_group(self._action_group)
+
+        # Make sure the manager updates
+        manager.ensure_update()
+
+    def do_update_state(self, window):
+        self._action_group.set_sensitive(self._window.get_active_document() != None)
+
+    def get_helper(self, view):
+        return view.get_data(constants.DOCUMENT_HELPER_KEY)
+
+    def add_document_helper(self, view):
+        if self.get_helper(view) != None:
+            return
+
+        DocumentHelper(view)
+
+    def remove_document_helper(self, view):
+        helper = self.get_helper(view)
+
+        if helper != None:
+            helper.stop()
+
+    def call_helper(self, cb):
+        view = self._window.get_active_view()
+
+        if view:
+            cb(self.get_helper(view))
+
+    # Menu activate handlers
+    def on_increase_font_size_activate(self, action, user_data=None):
+        self.call_helper(lambda helper: helper.increase_font_size())
+
+    def on_decrease_font_size_activate(self, action, user_data=None):
+        self.call_helper(lambda helper: helper.decrease_font_size())
+
+    def on_reset_font_size_activate(self, action, user_data=None):
+        self.call_helper(lambda helper: helper.reset_font_size())
+
+    def on_increase_font_accel(self, group, accel, key, mod):
+        self.call_helper(lambda helper: helper.increase_font_size())
+
+    def on_decrease_font_accel(self, group, accel, key, mod):
+        self.call_helper(lambda helper: helper.decrease_font_size())
+
+    def on_reset_font_accel(self, group, accel, key, mod):
+        self.call_helper(lambda helper: helper.reset_font_size())
+
+    def on_tab_added(self, window, tab):
+        self.add_document_helper(tab.get_view())
+
+    def on_tab_removed(self, window, tab):
+        self.remove_document_helper(tab.get_view())
+
+    def _remap_proxy(self, action):
+        # Remove previous proxy
 
-    def activate(self, window):
-        self._instances[window] = WindowHelper(self, window)
+        if action in self._proxy_mapping:
+            item = self._proxy_mapping[action]
+            self._accel_group.disconnect_key(item[0], item[1])
 
-    def deactivate(self, window):
-        self._instances[window].deactivate()
-        del self._instances[window]
+        self._install_proxy(action)
 
-    def update_ui(self, window):
-        self._instances[window].update_ui()
+    def on_accel_map_changed(self, accelmap, path, key, mod):
+        for action in self._action_group.list_actions():
+            if action.get_accel_path() == path:
+                self._remap_proxy(action)
+                return
 
 # ex:ts=4:et:
diff --git a/plugins/textsize/textsize/documenthelper.py b/plugins/textsize/textsize/documenthelper.py
index 38a0146..99406c6 100644
--- a/plugins/textsize/textsize/documenthelper.py
+++ b/plugins/textsize/textsize/documenthelper.py
@@ -21,8 +21,7 @@
 
 from signals import Signals
 import constants
-import pango
-import gtk
+from gi.repository import Gtk, Gdk, Pango
 
 class DocumentHelper(Signals):
     def __init__(self, view):
@@ -87,10 +86,10 @@ class DocumentHelper(Signals):
 
         buf = self._view.get_buffer()
         bounds = buf.get_selection_bounds()
-        size = description.get_size() / pango.SCALE
+        size = description.get_size() / Pango.SCALE
 
         if not bounds:
-            description.set_size(max(1, (size + amount)) * pango.SCALE)
+            description.set_size(max(1, (size + amount)) * Pango.SCALE)
 
             self._view.modify_font(description)
             self._last_font = description
@@ -104,12 +103,12 @@ class DocumentHelper(Signals):
                 # Simply use the overall font size as the base
                 newsize = size + amount
             elif len(tags) == 1:
-                newsize = tags[0].props.font_desc.get_size() / pango.SCALE + amount
+                newsize = tags[0].props.font_desc.get_size() / Pango.SCALE + amount
             else:
                 newsize = 0
 
                 for tag in tags:
-                    newsize += tag.props.font_desc.get_size() / pango.SCALE
+                    newsize += tag.props.font_desc.get_size() / Pango.SCALE
 
                 newsize = round(newsize / len(tags))
 
@@ -119,7 +118,7 @@ class DocumentHelper(Signals):
                 newtag = buf.create_tag(None)
 
                 desc = description.copy()
-                desc.set_size(newsize * pango.SCALE)
+                desc.set_size(newsize * Pango.SCALE)
 
                 newtag.props.font_desc = desc
                 self._font_tags[newsize] = newtag
@@ -156,24 +155,24 @@ class DocumentHelper(Signals):
                 buf.remove_tag(tag, bounds[0], bounds[1])
 
     def on_scroll_event(self, view, event):
-        state = event.state & gtk.accelerator_get_default_mod_mask()
+        state = event.scroll.state & Gtk.accelerator_get_default_mod_mask()
 
-        if state != gtk.gdk.CONTROL_MASK:
+        if state != Gdk.ModifierType.CONTROL_MASK:
             return False
 
-        if event.direction == gtk.gdk.SCROLL_UP:
+        if event.scroll.direction == Gdk.ScrollDirection.UP:
             self.increase_font_size()
             return True
-        elif event.direction == gtk.gdk.SCROLL_DOWN:
+        elif event.scroll.direction == Gdk.ScrollDirection.DOWN:
             self.decrease_font_size()
             return True
 
         return False
 
     def on_button_press_event(self, view, event):
-        state = event.state & gtk.accelerator_get_default_mod_mask()
+        state = event.button.state & Gtk.accelerator_get_default_mod_mask()
 
-        if state == gtk.gdk.CONTROL_MASK and event.button == 2:
+        if state == Gdk.ModifierType.CONTROL_MASK and event.button.button == 2:
             self.reset_font_size()
             return True
         else:



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