[meld: 33/63] meldwindow: Move to handling page removal in a callback



commit 7424577c4cb357e914d6ca47654bc382a0cb7c48
Author: Kai Willadsen <kai willadsen gmail com>
Date:   Wed Aug 12 08:12:05 2015 +1000

    meldwindow: Move to handling page removal in a callback
    
    While this is much harder to handle, this is a necessary change if we
    are going to support async saving, since we can't wait up for any error
    cases when closing pages or quiting.

 meld/meldwindow.py |   40 ++++++++++++++++++++--------------------
 1 files changed, 20 insertions(+), 20 deletions(-)
---
diff --git a/meld/meldwindow.py b/meld/meldwindow.py
index bed2bbe..0a67e8c 100644
--- a/meld/meldwindow.py
+++ b/meld/meldwindow.py
@@ -296,9 +296,13 @@ class MeldWindow(gnomeglade.Component):
         for c in reversed(self.notebook.get_children()):
             page = c.pyobject
             self.notebook.set_current_page(self.notebook.page_num(page.widget))
-            response = self.try_remove_page(page, appquit=1)
+            response = page.on_delete_event()
             if response == Gtk.ResponseType.CANCEL:
                 return True
+        # TODO: Now also need to check whether any page is in an error
+        # state, or is asynchronously closing, or... etc. Some errors
+        # or cancellation requests will be returned from the page's
+        # on_delete_event, but not all.
 
     def has_pages(self):
         return self.notebook.get_n_pages() > 0
@@ -453,7 +457,7 @@ class MeldWindow(gnomeglade.Component):
         i = self.notebook.get_current_page()
         if i >= 0:
             page = self.notebook.get_nth_page(i).pyobject
-            self.try_remove_page(page)
+            page.on_delete_event()
 
     def on_menu_undo_activate(self, *extra):
         self.current_doc().on_undo_activate()
@@ -568,21 +572,16 @@ class MeldWindow(gnomeglade.Component):
                            "/Menubar/TabMenu/TabPlaceholder",
                            name, name, Gtk.UIManagerItemType.MENUITEM, False)
 
-    def try_remove_page(self, page, appquit=0):
-        "See if a page will allow itself to be removed"
-        response = page.on_delete_event()
-        if response != Gtk.ResponseType.CANCEL:
-            if hasattr(page, 'scheduler'):
-                self.scheduler.remove_scheduler(page.scheduler)
-            page_num = self.notebook.page_num(page.widget)
-
-            self.notebook.remove_page(page_num)
-            # Normal switch-page handlers don't get run for removing
-            # the last page from a notebook.
-            if self.notebook.get_n_pages() == 0:
-                self.on_switch_page(self.notebook, page, -1)
-                self._update_page_action_sensitivity()
-        return response
+    def page_removed(self, page, status):
+        if hasattr(page, 'scheduler'):
+            self.scheduler.remove_scheduler(page.scheduler)
+
+        page_num = self.notebook.page_num(page.widget)
+
+        self.notebook.remove_page(page_num)
+        if self.notebook.get_n_pages() == 0:
+            self.on_switch_page(self.notebook, page, -1)
+            self._update_page_action_sensitivity()
 
     def on_file_changed(self, srcpage, filename):
         for c in self.notebook.get_children():
@@ -591,8 +590,8 @@ class MeldWindow(gnomeglade.Component):
                 page.on_file_changed(filename)
 
     def _append_page(self, page, icon):
-        nbl = notebooklabel.NotebookLabel(icon, "",
-                                          lambda b: self.try_remove_page(page))
+        nbl = notebooklabel.NotebookLabel(
+            icon, "", lambda b: page.on_delete_event())
         self.notebook.append_page(page.widget, nbl)
 
         # Change focus to the newly created page only if the user is on a
@@ -610,6 +609,7 @@ class MeldWindow(gnomeglade.Component):
             page.connect("file-changed", self.on_file_changed)
             page.connect("create-diff", lambda obj, arg, kwargs:
                          self.append_diff(arg, **kwargs))
+        page.connect("close", self.page_removed)
 
         self.notebook.set_tab_reorderable(page.widget, True)
 
@@ -619,7 +619,7 @@ class MeldWindow(gnomeglade.Component):
         self.on_notebook_label_changed(doc, _("New comparison"), None)
 
         def diff_created_cb(doc, newdoc):
-            self.try_remove_page(doc)
+            doc.on_delete_event()
             idx = self.notebook.page_num(newdoc.widget)
             self.notebook.set_current_page(idx)
 


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