[gnome-builder] buffer-manager: add ide_buffer_manager_save_all_async()



commit ce29fb0e4f72cdf66108d82c75bf13b989059fb6
Author: Christian Hergert <christian hergert me>
Date:   Mon May 4 17:57:23 2015 -0700

    buffer-manager: add ide_buffer_manager_save_all_async()
    
    This helper simplifies the process of saving all the buffers and then
    performing a follow up (such as exit).

 libide/ide-buffer-manager.c |   78 +++++++++++++++++++++++++++++++++++++++++++
 libide/ide-buffer-manager.h |    7 ++++
 2 files changed, 85 insertions(+), 0 deletions(-)
---
diff --git a/libide/ide-buffer-manager.c b/libide/ide-buffer-manager.c
index e3a25c1..518e946 100644
--- a/libide/ide-buffer-manager.c
+++ b/libide/ide-buffer-manager.c
@@ -1595,3 +1595,81 @@ ide_buffer_manager_get_n_buffers (IdeBufferManager *self)
 
   return self->buffers->len;
 }
+
+static void
+ide_buffer_manager_save_all__save_file_cb (GObject      *object,
+                                           GAsyncResult *result,
+                                           gpointer      user_data)
+{
+  IdeBufferManager *self = (IdeBufferManager *)object;
+  g_autoptr(GTask) task = user_data;
+  GError *error = NULL;
+  guint *count;
+
+  if (!ide_buffer_manager_save_file_finish (self, result, &error))
+    {
+      g_warning ("%s", error->message);
+      g_clear_error (&error);
+    }
+
+  count = g_task_get_task_data (task);
+  if (--(*count) == 0)
+    g_task_return_boolean (task, TRUE);
+}
+
+void
+ide_buffer_manager_save_all_async (IdeBufferManager    *self,
+                                   GCancellable        *cancellable,
+                                   GAsyncReadyCallback  callback,
+                                   gpointer             user_data)
+{
+  g_autoptr(GTask) task = NULL;
+  gsize i;
+  guint *count;
+
+  g_return_if_fail (IDE_IS_BUFFER_MANAGER (self));
+  g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
+
+  task = g_task_new (self, cancellable, callback, user_data);
+
+  count = g_new0 (guint, 1);
+  *count = self->buffers->len;
+  g_task_set_task_data (task, count, g_free);
+
+  for (i = 0; i < self->buffers->len; i++)
+    {
+      IdeBuffer *buffer;
+
+      buffer = g_ptr_array_index (self->buffers, i);
+
+      if (!gtk_text_buffer_get_modified (GTK_TEXT_BUFFER (buffer)))
+        {
+          (*count)--;
+          continue;
+        }
+
+      ide_buffer_manager_save_file_async (self,
+                                          buffer,
+                                          ide_buffer_get_file (buffer),
+                                          NULL,
+                                          cancellable,
+                                          ide_buffer_manager_save_all__save_file_cb,
+                                          g_object_ref (task));
+
+    }
+
+  if (*count == 0)
+    g_task_return_boolean (task, TRUE);
+}
+
+gboolean
+ide_buffer_manager_save_all_finish (IdeBufferManager  *self,
+                                    GAsyncResult      *result,
+                                    GError           **error)
+{
+  GTask *task = (GTask *)result;
+
+  g_return_val_if_fail (IDE_IS_BUFFER_MANAGER (self), FALSE);
+
+  return g_task_propagate_boolean (task, error);
+}
diff --git a/libide/ide-buffer-manager.h b/libide/ide-buffer-manager.h
index 1393f04..5705a3d 100644
--- a/libide/ide-buffer-manager.h
+++ b/libide/ide-buffer-manager.h
@@ -51,6 +51,13 @@ void                      ide_buffer_manager_save_file_async     (IdeBufferManag
 gboolean                  ide_buffer_manager_save_file_finish    (IdeBufferManager     *self,
                                                                   GAsyncResult         *result,
                                                                   GError              **error);
+void                      ide_buffer_manager_save_all_async      (IdeBufferManager     *self,
+                                                                  GCancellable         *cancellable,
+                                                                  GAsyncReadyCallback   callback,
+                                                                  gpointer              user_data);
+gboolean                  ide_buffer_manager_save_all_finish     (IdeBufferManager     *self,
+                                                                  GAsyncResult         *result,
+                                                                  GError              **error);
 IdeBuffer                *ide_buffer_manager_get_focus_buffer    (IdeBufferManager     *self);
 void                      ide_buffer_manager_set_focus_buffer    (IdeBufferManager     *self,
                                                                   IdeBuffer            *buffer);


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