summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJamie Murphy <hello@itsjamie.dev>2022-10-08 16:15:27 -0700
committerJamie Murphy <hello@itsjamie.dev>2022-10-08 16:15:27 -0700
commitbb61eedb181a044da592d5753a89c01646a608b6 (patch)
treea0086c97d37985a820d1ecb39d507aeb2b605c80 /src
parentcc6bf6490f6a1f4918498595ae3f7ddcfecf5781 (diff)
downloadgnome-todo-bb61eedb181a044da592d5753a89c01646a608b6.tar.gz
edit-pane: Don't set Due Date until disposal of edit pane
Should fix #469 and #472. My guess is setting the due date is internally recreating the task, although I cannot confirm at the moment. Setting the due date as the EditPane is being disposed of (and as the active task is already being cleared) seems to fix this bug
Diffstat (limited to 'src')
-rw-r--r--src/gui/gtd-edit-pane.c64
-rw-r--r--src/gui/gtd-edit-pane.h2
-rw-r--r--src/gui/gtd-task-row.c8
3 files changed, 46 insertions, 28 deletions
diff --git a/src/gui/gtd-edit-pane.c b/src/gui/gtd-edit-pane.c
index 20c3e575..347bd476 100644
--- a/src/gui/gtd-edit-pane.c
+++ b/src/gui/gtd-edit-pane.c
@@ -1,6 +1,7 @@
/* gtd-edit-pane.c
*
* Copyright (C) 2015-2020 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
+ * Copyright (C) 2022 Jamie Murphy <hello@itsjamie.dev>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -72,14 +73,12 @@ static void on_date_selected_cb (GtkCalendar
*/
static void
-update_date_widgets (GtdEditPane *self)
+update_date_widgets (GtdEditPane *self, GDateTime *dt)
{
- g_autoptr (GDateTime) dt = NULL;
gchar *text;
g_return_if_fail (GTD_IS_EDIT_PANE (self));
- dt = self->task ? gtd_task_get_due_date (self->task) : NULL;
text = dt ? g_date_time_format (dt, "%x") : NULL;
g_signal_handlers_block_by_func (self->calendar, on_date_selected_cb, self);
@@ -109,11 +108,8 @@ on_date_popover_closed_cb (GtdEditPane *self)
if (!self->new_date || !self->task)
return;
- gtd_task_set_due_date (self->task, self->new_date);
text = g_date_time_format (self->new_date, "%x");
-
gtk_menu_button_set_label (self->date_button, text);
- g_clear_pointer (&self->new_date, g_date_time_unref);
g_signal_emit (self, signals[CHANGED], 0);
}
@@ -151,9 +147,9 @@ on_no_date_button_clicked_cb (GtkButton *button,
GTD_ENTRY;
g_clear_pointer (&self->new_date, g_date_time_unref);
- gtd_task_set_due_date (self->task, NULL);
+ self->new_date = NULL;
gtk_calendar_clear_marks (GTK_CALENDAR (self->calendar));
- update_date_widgets (self);
+ update_date_widgets (self, self->new_date);
g_signal_emit (self, signals[CHANGED], 0);
@@ -168,19 +164,8 @@ on_today_button_clicked_cb (GtkButton *button,
GTD_ENTRY;
- gtd_task_set_due_date (self->task, new_dt);
- update_date_widgets (self);
-
- g_signal_emit (self, signals[CHANGED], 0);
-
- GTD_EXIT;
-}
-
-static void
-on_priority_changed_cb (GtkComboBox *combobox,
- GtdEditPane *self)
-{
- GTD_ENTRY;
+ self->new_date = g_date_time_ref (new_dt);
+ update_date_widgets (self, self->new_date);
g_signal_emit (self, signals[CHANGED], 0);
@@ -199,8 +184,19 @@ on_tomorrow_button_clicked_cb (GtkButton *button,
current_date = g_date_time_new_now_local ();
new_dt = g_date_time_add_days (current_date, 1);
- gtd_task_set_due_date (self->task, new_dt);
- update_date_widgets (self);
+ self->new_date = g_date_time_ref (new_dt);
+ update_date_widgets (self, self->new_date);
+
+ g_signal_emit (self, signals[CHANGED], 0);
+
+ GTD_EXIT;
+}
+
+static void
+on_priority_changed_cb (GtkComboBox *combobox,
+ GtdEditPane *self)
+{
+ GTD_ENTRY;
g_signal_emit (self, signals[CHANGED], 0);
@@ -374,9 +370,6 @@ gtd_edit_pane_dispose (GObject *object)
{
GtdEditPane *self = (GtdEditPane *) object;
- if (self->task && self->new_date)
- gtd_task_set_due_date (self->task, self->new_date);
-
g_clear_pointer (&self->new_date, g_date_time_unref);
g_clear_object (&self->task);
@@ -543,7 +536,6 @@ gtd_edit_pane_set_task (GtdEditPane *self,
if (self->task && self->new_date)
{
- gtd_task_set_due_date (self->task, self->new_date);
g_clear_pointer (&self->new_date, g_date_time_unref);
}
@@ -559,7 +551,7 @@ gtd_edit_pane_set_task (GtdEditPane *self,
g_signal_handlers_block_by_func (buffer, on_text_buffer_changed_cb, self);
/* due date */
- update_date_widgets (self);
+ update_date_widgets (self, gtd_task_get_due_date (self->task));
/* description */
gtk_text_buffer_set_text (buffer, gtd_task_get_description (task), -1);
@@ -577,6 +569,22 @@ gtd_edit_pane_set_task (GtdEditPane *self,
g_object_notify (G_OBJECT (self), "task");
}
+/**
+ * gtd_edit_pane_get_new_date_time:
+ * @self: a #GtdEditPane
+ *
+ * Retrieves the newly set #GDateTime of %self, or %NULL if none is set.
+ *
+ * Returns: (transfer none): the current #GDateTime set in %self.
+ */
+GDateTime*
+gtd_edit_pane_get_new_date_time (GtdEditPane *self)
+{
+ g_return_val_if_fail (GTD_IS_EDIT_PANE (self), NULL);
+
+ return self->new_date;
+}
+
void
gtd_edit_pane_set_markdown_renderer (GtdEditPane *self,
GtdMarkdownRenderer *renderer)
diff --git a/src/gui/gtd-edit-pane.h b/src/gui/gtd-edit-pane.h
index f02c382b..fefaf9c1 100644
--- a/src/gui/gtd-edit-pane.h
+++ b/src/gui/gtd-edit-pane.h
@@ -37,6 +37,8 @@ GtdTask* gtd_edit_pane_get_task (GtdEditPane
void gtd_edit_pane_set_task (GtdEditPane *self,
GtdTask *task);
+GDateTime* gtd_edit_pane_get_new_date_time (GtdEditPane *self);
+
void gtd_edit_pane_set_markdown_renderer (GtdEditPane *self,
GtdMarkdownRenderer *renderer);
diff --git a/src/gui/gtd-task-row.c b/src/gui/gtd-task-row.c
index ed9368b0..b6411c89 100644
--- a/src/gui/gtd-task-row.c
+++ b/src/gui/gtd-task-row.c
@@ -783,6 +783,14 @@ gtd_task_row_set_active (GtdTaskRow *self,
}
else if (!active && self->edit_pane)
{
+
+ /* For some reason, setting the due date before closing the Edit Row has
+ * the potential to cause the Task List to update, causing the active task row
+ * to become corrupted, and crash Endeavour. My guess is this is an upstream
+ * behaviour, so work around it by setting the task due date during close */
+ gtd_task_set_due_date (self->task,
+ gtd_edit_pane_get_new_date_time (self->edit_pane));
+
GTD_TRACE_MSG ("Destroying edit pane");
gtk_revealer_set_child (GTK_REVEALER (self->edit_panel_revealer), NULL);