[gnome-todo] task-list: Add gtd_task_list_import_task
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-todo] task-list: Add gtd_task_list_import_task
- Date: Tue, 28 Jun 2022 21:59:42 +0000 (UTC)
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]