[meld: 3/63] filediff: Improve file load handling and avoid multiple diff callbacks



commit b6d08c43c6e644adf51754aacaea633b783a2c40
Author: Kai Willadsen <kai willadsen gmail com>
Date:   Sun Jul 19 07:55:18 2015 +1000

    filediff: Improve file load handling and avoid multiple diff callbacks

 meld/filediff.py   |   24 ++++++++++++++----------
 meld/meldbuffer.py |    1 +
 2 files changed, 15 insertions(+), 10 deletions(-)
---
diff --git a/meld/filediff.py b/meld/filediff.py
index c34d8c4..6d68f3a 100644
--- a/meld/filediff.py
+++ b/meld/filediff.py
@@ -1090,8 +1090,9 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
         gfile = loader.get_location()
         pane = user_data[0]
 
+        success = False
         try:
-            loader.load_finish(result)
+            success = loader.load_finish(result)
         except GLib.Error as err:
             # TODO: Find sane error domain constants
             if err.domain == 'gtk-source-file-loader-error':
@@ -1106,7 +1107,6 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
                 u"There was a problem opening the file ā€œ%sā€." % filename)
             add_dismissable_msg(
                 pane, Gtk.STOCK_DIALOG_ERROR, primary, err.message)
-            return
 
         def is_writable(gfile):
             try:
@@ -1117,20 +1117,24 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
 
         buf = loader.get_buffer()
 
-        write_file = Gio.File.new_for_path(buf.data.savefile) if buf.data.savefile else gfile
-        self.set_buffer_writable(buf, is_writable(write_file))
+        writable = False
+        if success:
+            write_file = Gio.File.new_for_path(buf.data.savefile) if buf.data.savefile else gfile
+            writable = is_writable(write_file)
+            buf.data.encoding = loader.get_encoding()
 
-        buf.data.encoding = loader.get_encoding()
+            # TODO: Remove handling for mixed newlines in other places, or add
+            # mixed newline support to GtkSourceFile.
+            buf.data.newlines = loader.get_newline_type()
 
-        # TODO: Remove handling for mixed newlines in other places, or add
-        # mixed newline support to GtkSourceFile.
-        buf.data.newlines = loader.get_newline_type()
+        self.set_buffer_writable(buf, writable)
 
         self.undosequence.checkpoint(buf)
         buf.data.update_mtime()
+        buf.data.loaded = True
 
-        # FIXME: Only add once...
-        self.scheduler.add_task(self._diff_files())
+        if all(b.data.loaded for b in self.textbuffer[:self.num_panes]):
+            self.scheduler.add_task(self._diff_files())
 
     def _diff_files(self, refresh=False):
         yield _("[%s] Computing differences") % self.label_text
diff --git a/meld/meldbuffer.py b/meld/meldbuffer.py
index 9c89999..46d25ba 100644
--- a/meld/meldbuffer.py
+++ b/meld/meldbuffer.py
@@ -117,6 +117,7 @@ class MeldBufferData(GObject.GObject):
         self.label = self.filename = filename
 
     def reset(self):
+        self.loaded = False
         self.modified = False
         self.writable = True
         self.editable = True


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