[meld] ui.filechooser: New widget offering encoding selection



commit 5665a44bdada4e62107dfa52ba4555837de94acf
Author: Kai Willadsen <kai willadsen gmail com>
Date:   Sat Oct 22 07:53:03 2016 +1000

    ui.filechooser: New widget offering encoding selection

 meld/ui/filechooser.py |   79 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 79 insertions(+), 0 deletions(-)
---
diff --git a/meld/ui/filechooser.py b/meld/ui/filechooser.py
new file mode 100644
index 0000000..ca04d89
--- /dev/null
+++ b/meld/ui/filechooser.py
@@ -0,0 +1,79 @@
+# Copyright (C) 2016 Kai Willadsen <kai willadsen gmail com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+"""This module provides file choosers that let users select a text encoding."""
+
+from gi.repository import Gtk
+from gi.repository import GtkSource
+
+
+class MeldFileChooserDialog(Gtk.FileChooserDialog):
+
+    """A simple GTK+ file chooser dialog with a text encoding combo box."""
+
+    __gtype_name__ = 'MeldFileChooserDialog'
+
+    def __init__(self, title=None, parent=None,
+                 action=Gtk.FileChooserAction.OPEN,
+                 buttons=None):
+        if buttons is None:
+            if action == Gtk.FileChooserAction.SAVE:
+                buttons = (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
+                           Gtk.STOCK_SAVE, Gtk.ResponseType.ACCEPT)
+            else:
+                buttons = (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
+                           Gtk.STOCK_OPEN, Gtk.ResponseType.ACCEPT)
+
+        Gtk.FileChooserDialog.__init__(self, title, parent, action, buttons)
+        self.encoding_store = Gtk.ListStore(str, str)
+        self.connect("notify::action", self.action_changed_cb)
+
+    def make_encoding_combo(self):
+        """Create the combo box for text encoding selection"""
+        codecs = []
+        current = GtkSource.encoding_get_current()
+        codecs.append((current.to_string(), current.get_charset()))
+        codecs.append((None, None))
+        for encoding in GtkSource.encoding_get_all():
+            codecs.append((encoding.to_string(), encoding.get_charset()))
+
+        self.encoding_store.clear()
+        for entry in codecs:
+            self.encoding_store.append(entry)
+
+        combo = Gtk.ComboBox()
+        combo.set_model(self.encoding_store)
+        cell = Gtk.CellRendererText()
+        combo.pack_start(cell, True)
+        combo.add_attribute(cell, 'text', 0)
+        combo.set_row_separator_func(
+            lambda model, it, data: not model.get_value(it, 1), None)
+        combo.props.active = 0
+        return combo
+
+    def get_encoding(self):
+        """Return the currently-selected text file encoding"""
+        combo = self.props.extra_widget
+        if not combo:
+            return None
+        charset = self.encoding_store.get_value(combo.get_active_iter(), 1)
+        return GtkSource.Encoding.get_from_charset(charset)
+
+    def action_changed_cb(self, *args):
+        if self.props.action in (Gtk.FileChooserAction.OPEN,
+                                 Gtk.FileChooserAction.SAVE):
+            self.props.extra_widget = self.make_encoding_combo()
+        else:
+            self.props.extra_widget = None


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