diff options
author | Jamie Murphy <hello@itsjamie.dev> | 2022-10-08 16:15:27 -0700 |
---|---|---|
committer | Jamie Murphy <hello@itsjamie.dev> | 2022-10-08 16:15:27 -0700 |
commit | bb61eedb181a044da592d5753a89c01646a608b6 (patch) | |
tree | a0086c97d37985a820d1ecb39d507aeb2b605c80 /src | |
parent | cc6bf6490f6a1f4918498595ae3f7ddcfecf5781 (diff) | |
download | gnome-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.c | 64 | ||||
-rw-r--r-- | src/gui/gtd-edit-pane.h | 2 | ||||
-rw-r--r-- | src/gui/gtd-task-row.c | 8 |
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); |