[gnome-builder] Closing an untitled document doesn't close it



commit af5e873742b6e9d45a3fbf67c182dc86a2cdb28d
Author: Dimitris Zenios <dimitris zenios gmail com>
Date:   Sun Jan 11 17:02:23 2015 +0200

    Closing an untitled document doesn't close it
    
    A request close signal has been implemented in order for
    the document grid to decide whether it should close the document.
    
    The signal is catched and if the document has no changes
    we close the view else we popup a save / cancel dialog.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=742698

 src/documents/gb-document-grid.c  |   64 +++++++++++++++++++++++++++++++++++--
 src/documents/gb-document-stack.c |   24 +++++++++++++-
 src/documents/gb-document-stack.h |   14 +++++---
 3 files changed, 91 insertions(+), 11 deletions(-)
---
diff --git a/src/documents/gb-document-grid.c b/src/documents/gb-document-grid.c
index ba8465b..8211a7a 100644
--- a/src/documents/gb-document-grid.c
+++ b/src/documents/gb-document-grid.c
@@ -21,6 +21,8 @@
 #include <glib/gi18n.h>
 
 #include "gb-document-grid.h"
+#include "gb-widget.h"
+#include "gb-close-confirmation-dialog.h"
 
 struct _GbDocumentGridPrivate
 {
@@ -226,6 +228,59 @@ gb_document_grid_focus_neighbor (GbDocumentGrid   *grid,
     gtk_widget_grab_focus (neighbor);
 }
 
+static gboolean
+gb_document_grid_request_close (GbDocumentGrid *grid,
+                                GbDocumentView *view)
+{
+  gboolean ret = FALSE;
+  GbDocument *document;
+
+  g_return_val_if_fail (GB_IS_DOCUMENT_GRID (grid), FALSE);
+  g_return_val_if_fail (GB_IS_DOCUMENT_VIEW (view), FALSE);
+
+  document = gb_document_view_get_document (view);
+  if (!document)
+    return FALSE;
+
+  if (gb_document_get_modified (document))
+    {
+      GbWorkbench *workbench;
+      GtkWidget *dialog;
+      gint response_id;
+
+      workbench = gb_widget_get_workbench (GTK_WIDGET (view));
+      dialog = gb_close_confirmation_dialog_new_single (GTK_WINDOW (workbench),
+                                                 document);
+      response_id = gtk_dialog_run (GTK_DIALOG (dialog));
+
+      switch (response_id)
+        {
+        case GTK_RESPONSE_YES:
+          if (gb_document_is_untitled (document))
+            gb_document_save_as_async (document, GTK_WIDGET (workbench), NULL, NULL, NULL);
+          else
+            gb_document_save_async (document, GTK_WIDGET (workbench), NULL, NULL, NULL);
+          break;
+
+        case GTK_RESPONSE_NO:
+          break;
+
+        case GTK_RESPONSE_DELETE_EVENT:
+        case GTK_RESPONSE_CANCEL:
+          ret = TRUE;
+          break;
+
+        default:
+          g_assert_not_reached ();
+        }
+
+      gtk_widget_hide (dialog);
+      gtk_widget_destroy (dialog);
+    }
+
+  return ret;
+}
+
 static void
 gb_document_grid_view_closed (GbDocumentGrid *grid,
                               GbDocumentView *view)
@@ -247,9 +302,6 @@ gb_document_grid_view_closed (GbDocumentGrid *grid,
   if (!document)
     return;
 
-  if (gb_document_get_modified (document))
-    return;
-
   stacks = gb_document_grid_get_stacks (grid);
 
   for (iter = stacks; iter; iter = iter->next)
@@ -309,6 +361,12 @@ gb_document_grid_create_stack (GbDocumentGrid *grid)
                            grid,
                            G_CONNECT_SWAPPED | G_CONNECT_AFTER);
 
+  g_signal_connect_object (stack,
+                           "request-close",
+                           G_CALLBACK (gb_document_grid_request_close),
+                           grid,
+                           G_CONNECT_SWAPPED | G_CONNECT_AFTER);
+
   return stack;
 }
 
diff --git a/src/documents/gb-document-stack.c b/src/documents/gb-document-stack.c
index b510cad..b550bb7 100644
--- a/src/documents/gb-document-stack.c
+++ b/src/documents/gb-document-stack.c
@@ -55,6 +55,7 @@ enum {
   EMPTY,
   FOCUS_NEIGHBOR,
   VIEW_CLOSED,
+  REQUEST_CLOSE,
   LAST_SIGNAL
 };
 
@@ -76,16 +77,24 @@ gb_document_stack_remove_view (GbDocumentStack *stack,
   GtkWidget *visible_child;
   GtkWidget *controls;
   gboolean visible;
+  gboolean close_response;
 
   g_return_if_fail (GB_IS_DOCUMENT_STACK (stack));
   g_return_if_fail (GB_IS_DOCUMENT_VIEW (view));
 
+  g_object_ref (view);
+
+  g_signal_emit (stack, gSignals [REQUEST_CLOSE], 0, view, &close_response);
+  if (close_response)
+    {
+      g_object_unref (view);
+      return;
+    }
+
   /* Release our weak pointer */
   if (view == stack->priv->active_view)
     gb_clear_weak_pointer (&stack->priv->active_view);
 
-  g_object_ref (view);
-
   /*
    * WORKAROUND:
    *
@@ -926,6 +935,17 @@ gb_document_stack_class_init (GbDocumentStackClass *klass)
                   1,
                   GB_TYPE_DOCUMENT_VIEW);
 
+  gSignals [REQUEST_CLOSE] =
+    g_signal_new ("request-close",
+                  GB_TYPE_DOCUMENT_STACK,
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (GbDocumentStackClass, request_close),
+                  NULL, NULL,
+                  g_cclosure_marshal_generic,
+                  G_TYPE_BOOLEAN,
+                  1,
+                  GB_TYPE_DOCUMENT_VIEW);
+
   g_type_ensure (GB_TYPE_DOCUMENT_MENU_BUTTON);
 }
 
diff --git a/src/documents/gb-document-stack.h b/src/documents/gb-document-stack.h
index bbfed8c..af26a63 100644
--- a/src/documents/gb-document-stack.h
+++ b/src/documents/gb-document-stack.h
@@ -51,12 +51,14 @@ struct _GbDocumentStackClass
 {
   GtkBoxClass parent;
 
-  void (*create_view) (GbDocumentStack *stack,
-                       GbDocument      *document,
-                       GbDocumentSplit  split);
-  void (*empty)       (GbDocumentStack *stack);
-  void (*view_closed) (GbDocumentStack *stack,
-                       GbDocumentView  *view);
+  void (*create_view)   (GbDocumentStack *stack,
+                         GbDocument      *document,
+                         GbDocumentSplit  split);
+  void (*empty)         (GbDocumentStack *stack);
+  void (*view_closed)   (GbDocumentStack *stack,
+                         GbDocumentView  *view);
+  void (*request_close) (GbDocumentStack *stack,
+                         GbDocumentView  *view);
 };
 
 GType              gb_document_stack_get_type             (void);


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