[gnome-todo] task-list: Add gtd_task_list_import_task



commit 3a559eabe7f88a0dea097572ae696befe9798f46
Author: Jamie Murphy <hello jamiethalacker dev>
Date:   Tue Jun 28 13:18:16 2022 -0700

    task-list: Add gtd_task_list_import_task

 src/core/gtd-task-list.c | 130 +++++++++++++++++++++++++++++++++++++++++++++++
 src/core/gtd-task-list.h |  11 ++++
 2 files changed, 141 insertions(+)
---
diff --git a/src/core/gtd-task-list.c b/src/core/gtd-task-list.c
index c4ef29c5..08287141 100644
--- a/src/core/gtd-task-list.c
+++ b/src/core/gtd-task-list.c
@@ -41,6 +41,12 @@
  * It implements #GListModel, and can be used as the model for #GtkListBox.
  */
 
+typedef struct
+{
+  GtdTask *task;
+  GTask   *gtask;
+} ImportingTaskData;
+
 typedef struct
 {
   GtdProvider         *provider;
@@ -189,6 +195,29 @@ remove_task (GtdTaskList *self,
  * Callbacks
  */
 
+static void
+on_import_old_task_removed_cb (GObject      *object,
+                               GAsyncResult *result,
+                               gpointer      user_data)
+{
+  GtdTask *new_task;
+  GTask *gtask;
+  g_autoptr (GError) error = NULL;
+  
+  gtask = user_data;
+
+  gtd_provider_remove_task_finish (GTD_PROVIDER (object), result, &error);
+
+  if (error)
+    {
+      g_warning ("Error removing task: %s", error->message);
+      return;
+    }
+
+  new_task = g_task_get_task_data (gtask);
+  g_task_return_pointer (gtask, g_object_ref (new_task), g_object_unref);
+}
+
 static void
 on_task_updated_cb (GObject      *object,
                     GAsyncResult *result,
@@ -205,6 +234,56 @@ on_task_updated_cb (GObject      *object,
     }
 }
 
+static void
+on_import_new_task_added_cb (GObject      *object,
+                             GAsyncResult *result,
+                             gpointer      user_data)
+{
+  g_autoptr (GtdTask) new_task = NULL;
+  g_autoptr (GError) error = NULL;
+  GTask *gtask;
+  GtdProvider *provider;
+  GtdTask *importing_task;
+  GtdTaskList *list;
+  ImportingTaskData *data;
+
+  GTD_ENTRY;
+
+  data = user_data;
+  gtask = data->gtask;
+  importing_task = data->task;
+
+  new_task = gtd_provider_create_task_finish (GTD_PROVIDER (object), result, &error);
+  g_task_set_task_data (gtask, g_object_ref (new_task), g_object_unref);
+  list = gtd_task_get_list (new_task);
+
+  if (error)
+    {
+      g_warning ("Error creating task: %s", error->message);
+      GTD_RETURN ();
+    }
+  
+  gtd_task_set_complete (new_task, gtd_task_get_complete (importing_task));
+  gtd_task_set_description (new_task, gtd_task_get_description (importing_task));
+  gtd_task_set_due_date (new_task, gtd_task_get_due_date (importing_task));
+  gtd_task_set_important (new_task, gtd_task_get_important (importing_task));
+  gtd_task_set_title (new_task, gtd_task_get_title (importing_task));
+
+  gtd_task_list_update_task (list, new_task);
+
+  provider = gtd_task_get_provider (importing_task);
+
+  gtd_provider_remove_task (provider,
+                            importing_task,
+                            NULL,
+                            on_import_old_task_removed_cb,
+                            gtask);
+
+  g_free (data);
+  
+  GTD_EXIT;
+}
+
 static gint
 compare_tasks_cb (gconstpointer a,
                   gconstpointer b,
@@ -439,6 +518,7 @@ gtd_task_list_class_init (GtdTaskListClass *klass)
                                                     "Whether the list is archived or not",
                                                     FALSE,
                                                     G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | 
G_PARAM_EXPLICIT_NOTIFY);
+
   /**
    * GtdTaskList::color:
    *
@@ -1000,6 +1080,56 @@ gtd_task_list_set_archived (GtdTaskList *self,
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ARCHIVED]);
 }
 
+/**
+ * gtd_task_list_import_task:
+ * @self: a #GtdTaskList
+ * @task: a #GtdTask
+ *
+ * Imports task into @self
+ */
+void
+gtd_task_list_import_task (GtdTaskList         *self,
+                           GtdTask             *task,
+                           GCancellable        *cancellable,
+                           GAsyncReadyCallback  callback,
+                           gpointer             user_data)
+{
+  g_autoptr (GTask) gtask = NULL;
+  GtdProvider *provider;
+  ImportingTaskData *data;
+
+  g_return_if_fail (GTD_IS_TASK_LIST (self));
+
+  gtask = g_task_new (self, cancellable, callback, user_data);
+  g_task_set_source_tag (gtask, gtd_task_list_import_task);
+
+  provider = gtd_task_get_provider (task);
+
+  data = g_new0 (ImportingTaskData, 1);
+  data->gtask = g_object_ref (gtask);
+  data->task = g_object_ref (task);
+
+  gtd_provider_create_task (provider,
+                            self,
+                            gtd_task_get_title (task),
+                            gtd_task_get_due_date (task),
+                            NULL,
+                            on_import_new_task_added_cb,
+                            data);
+}
+
+GTask *
+gtd_task_list_import_task_finish (GtdTaskList   *self,
+                                  GAsyncResult  *result,
+                                  GError       **error)
+{
+  g_return_val_if_fail (g_task_is_valid (result, self), NULL);
+  g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) == gtd_task_list_import_task, NULL);
+
+  return g_task_propagate_pointer (G_TASK (result), error);
+}
+
+
 /**
  * gtd_task_list_is_inbox:
  * @self: a #GtdTaskList
diff --git a/src/core/gtd-task-list.h b/src/core/gtd-task-list.h
index 6fab1a94..6f064909 100644
--- a/src/core/gtd-task-list.h
+++ b/src/core/gtd-task-list.h
@@ -21,6 +21,7 @@
 
 #include <glib-object.h>
 #include <gtk/gtk.h>
+#include <glib.h>
 
 #include "gtd-object.h"
 #include "gtd-types.h"
@@ -100,6 +101,16 @@ gboolean                gtd_task_list_get_archived              (GtdTaskList
 void                    gtd_task_list_set_archived              (GtdTaskList            *self,
                                                                  gboolean                archived);
 
+void                    gtd_task_list_import_task               (GtdTaskList            *self,
+                                                                 GtdTask                *task,
+                                                                 GCancellable           *cancellable,
+                                                                 GAsyncReadyCallback     callback,
+                                                                 gpointer                user_data);
+
+GTask *                 gtd_task_list_import_task_finish        (GtdTaskList            *self,
+                                                                 GAsyncResult           *result,
+                                                                 GError                **error);
+
 gboolean                gtd_task_list_is_inbox                  (GtdTaskList            *self);
 
 G_END_DECLS


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