[meld: 35/63] patchdialog: Use a simplistic GtkSourceFileSaver for saving patch files



commit bb4c1112a77c3f2ff1cfe4e0e875f995ea5f378a
Author: Kai Willadsen <kai willadsen gmail com>
Date:   Wed Aug 12 09:06:32 2015 +1000

    patchdialog: Use a simplistic GtkSourceFileSaver for saving patch files

 meld/patchdialog.py |   64 ++++++++++++++++++++++++++++++++++----------------
 1 files changed, 43 insertions(+), 21 deletions(-)
---
diff --git a/meld/patchdialog.py b/meld/patchdialog.py
index c6c3d8e..dedc485 100644
--- a/meld/patchdialog.py
+++ b/meld/patchdialog.py
@@ -17,12 +17,15 @@
 import difflib
 import os
 
+from gi.repository import Gio
+from gi.repository import GLib
 from gi.repository import Gtk
 from gi.repository import GtkSource
 
 from .ui import gnomeglade
 
 from meld.conf import _
+from meld.misc import error_dialog
 from meld.settings import meldsettings
 from .util.compat import text_type
 from meld.sourceview import LanguageManager
@@ -94,32 +97,51 @@ class PatchDialog(gnomeglade.Component):
         diff_text = "".join(difflib.unified_diff(text0, text1, name0, name1))
         buf.set_text(diff_text)
 
+    def save_patch(self, filename):
+        buf = self.textview.get_buffer()
+        sourcefile = GtkSource.File.new()
+        targetfile = Gio.File.new_for_path(filename)
+        saver = GtkSource.FileSaver.new_with_target(
+            buf, sourcefile, targetfile)
+        saver.save_async(
+            GLib.PRIORITY_HIGH,
+            callback=self.file_saved_cb,
+        )
+
+    def file_saved_cb(self, saver, result, *args):
+        gfile = saver.get_location()
+        try:
+            saver.save_finish(result)
+        except GLib.Error as err:
+            filename = GLib.markup_escape_text(
+                gfile.get_parse_name()).decode('utf-8')
+            error_dialog(
+                primary=_("Could not save file %s.") % filename,
+                secondary=_("Couldn't save file due to:\n%s") % (
+                    GLib.markup_escape_text(str(err))),
+            )
+
     def run(self):
         self.update_patch()
 
-        while 1:
-            result = self.widget.run()
-            if result < 0:
-                break
+        result = self.widget.run()
+        if result < 0:
+            self.widget.hide()
+            return
 
+        # Copy patch to clipboard
+        if result == 1:
             buf = self.textview.get_buffer()
             start, end = buf.get_bounds()
-            txt = text_type(buf.get_text(start, end, False), 'utf8')
-
-            # Copy patch to clipboard
-            if result == 1:
-                clip = Gtk.clipboard_get()
-                clip.set_text(txt)
-                clip.store()
-                break
-            # Save patch as a file
-            else:
-                # FIXME: These filediff methods are actually general utility.
-                filename = self.filediff._get_filename_for_saving(
-                    _("Save Patch"))
-                if filename:
-                    txt = txt.encode('utf-8')
-                    self.filediff._save_text_to_filename(filename, txt)
-                    break
+            clip = Gtk.Clipboard.get()
+            clip.set_text(buf.get_text(start, end, False))
+            clip.store()
+        # Save patch as a file
+        else:
+            # FIXME: These filediff methods are actually general utility.
+            filename = self.filediff._get_filename_for_saving(
+                _("Save Patch"))
+            if filename:
+                self.save_patch(filename)
 
         self.widget.hide()


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