Hi guys! Here goes the first patch for undoing in task dialog. It covers the first page in the notebook that implements the dialog. Also, some memory leaks fixed. Cheers -- Alvaro
Index: src/planner-gantt-row.c =================================================================== RCS file: /cvs/gnome/planner/src/planner-gantt-row.c,v retrieving revision 1.11 diff -u -b -B -p -r1.11 planner-gantt-row.c Index: src/planner-resource-view.c =================================================================== RCS file: /cvs/gnome/planner/src/planner-resource-view.c,v retrieving revision 1.19 diff -u -b -B -p -r1.19 planner-resource-view.c --- src/planner-resource-view.c 3 May 2004 05:23:52 -0000 1.19 +++ src/planner-resource-view.c 1 Jun 2004 05:37:14 -0000 @@ -1327,12 +1327,12 @@ resource_cmd_edit_property_free (Planner g_value_unset (cmd->value); g_value_unset (cmd->old_value); + g_free (cmd->value); + g_free (cmd->old_value); g_object_unref (cmd->resource); g_free (cmd->property); - g_free (cmd_base->label); - g_free (cmd); } static PlannerCmd * Index: src/planner-task-dialog.c =================================================================== RCS file: /cvs/gnome/planner/src/planner-task-dialog.c,v retrieving revision 1.10 diff -u -b -B -p -r1.10 planner-task-dialog.c --- src/planner-task-dialog.c 27 Apr 2004 18:58:02 -0000 1.10 +++ src/planner-task-dialog.c 1 Jun 2004 05:37:19 -0000 @@ -3,7 +3,7 @@ * Copyright (C) 2002-2003 CodeFactory AB * Copyright (C) 2002-2003 Richard Hult <richard imendio com> * Copyright (C) 2002 Mikael Hallendal <micke imendio com> - * Copyright (C) 2002 Alvaro del Castillo <acs barrapunto com> + * Copyright (C) 2002-2004 Alvaro del Castillo <acs barrapunto com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -65,6 +65,12 @@ static void task_dialog_task_name_chang GtkWidget *dialog); static void task_dialog_name_changed_cb (GtkWidget *w, DialogData *data); +static gboolean task_dialog_name_focus_in_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data); +static gboolean task_dialog_name_focus_out_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data); static void task_dialog_task_type_changed_cb (MrpTask *task, GParamSpec *pspec, GtkWidget *dialog); @@ -80,21 +86,45 @@ static void task_dialog_task_work_chang GtkWidget *dialog); static void task_dialog_work_changed_cb (GtkWidget *w, DialogData *data); +static gboolean task_dialog_work_focus_in_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data); +static gboolean task_dialog_work_focus_out_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data); static void task_dialog_task_duration_changed_cb (MrpTask *task, GParamSpec *pspec, GtkWidget *dialog); static void task_dialog_duration_changed_cb (GtkWidget *w, DialogData *data); +static gboolean task_dialog_duration_focus_in_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data); +static gboolean task_dialog_duration_focus_out_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data); static void task_dialog_task_complete_changed_cb (MrpTask *task, GParamSpec *pspec, GtkWidget *dialog); static void task_dialog_complete_changed_cb (GtkWidget *w, DialogData *data); +static gboolean task_dialog_complete_focus_in_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data); +static gboolean task_dialog_complete_focus_out_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data); static void task_dialog_task_priority_changed_cb (MrpTask *task, GParamSpec *pspec, GtkWidget *dialog); static void task_dialog_priority_changed_cb (GtkWidget *w, DialogData *data); +static gboolean task_dialog_priority_focus_in_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data); +static gboolean task_dialog_priority_focus_out_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data); static void task_dialog_task_note_changed_cb (MrpTask *task, GParamSpec *pspec, GtkWidget *dialog); @@ -155,6 +185,15 @@ static GHashTable *dialogs = NULL; #define DIALOG_GET_DATA(d) g_object_get_data ((GObject*)d, "data") +typedef struct { + PlannerCmd base; + + MrpTask *task; + gchar *property; + GValue *value; + GValue *old_value; +} TaskCmdEditProperty; + static void task_dialog_setup_option_menu (GtkWidget *option_menu, GCallback func, @@ -282,6 +321,83 @@ task_dialog_setup_task_combo (GtkCombo * combo); } +static gboolean +task_cmd_edit_property_do (PlannerCmd *cmd_base) +{ + TaskCmdEditProperty *cmd; + + cmd = (TaskCmdEditProperty*) cmd_base; + + g_object_set_property (G_OBJECT (cmd->task), + cmd->property, + cmd->value); + + return TRUE; +} + +static void +task_cmd_edit_property_undo (PlannerCmd *cmd_base) +{ + TaskCmdEditProperty *cmd; + + cmd = (TaskCmdEditProperty*) cmd_base; + + g_object_set_property (G_OBJECT (cmd->task), + cmd->property, + cmd->old_value); +} + +static void +task_cmd_edit_property_free (PlannerCmd *cmd_base) +{ + TaskCmdEditProperty *cmd; + + cmd = (TaskCmdEditProperty*) cmd_base; + + g_value_unset (cmd->value); + g_value_unset (cmd->old_value); + + g_free (cmd->property); + g_object_unref (cmd->task); +} + +static PlannerCmd * +task_cmd_edit_property_focus (PlannerWindow *main_window, + MrpTask *task, + const gchar *property, + const GValue *focus_in_value) +{ + PlannerCmd *cmd_base; + TaskCmdEditProperty *cmd; + + cmd = g_new0 (TaskCmdEditProperty, 1); + + cmd_base = (PlannerCmd*) cmd; + + cmd_base->label = g_strdup (_("Edit task property from dialog")); + cmd_base->do_func = task_cmd_edit_property_do; + cmd_base->undo_func = task_cmd_edit_property_undo; + cmd_base->free_func = task_cmd_edit_property_free; + + cmd->property = g_strdup (property); + cmd->task = g_object_ref (task); + + cmd->value = g_new0 (GValue, 1); + g_value_init (cmd->value, G_VALUE_TYPE (focus_in_value)); + g_object_get_property (G_OBJECT (cmd->task), + cmd->property, + cmd->value); + + cmd->old_value = g_new0 (GValue, 1); + g_value_init (cmd->old_value, G_VALUE_TYPE (focus_in_value)); + g_value_copy (focus_in_value, cmd->old_value); + + planner_cmd_manager_insert_and_do (planner_window_get_cmd_manager (main_window), + cmd_base); + + return cmd_base; +} + static void task_dialog_close_clicked_cb (GtkWidget *w, DialogData *data) { @@ -342,6 +458,45 @@ task_dialog_name_changed_cb (GtkWidget * data->dialog); } +static gboolean +task_dialog_name_focus_out_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data) +{ + gchar *focus_in_name; + GValue value = { 0 }; + PlannerCmd *cmd; + + g_assert (MRP_IS_TASK (data->task)); + + focus_in_name = g_object_get_data (G_OBJECT (data->task),"focus_in_name"); + + g_value_init (&value, G_TYPE_STRING); + g_value_set_string (&value, focus_in_name); + + cmd = task_cmd_edit_property_focus (data->main_window, + data->task, "name", &value); + + g_free (focus_in_name); + + return FALSE; +} + +static gboolean +task_dialog_name_focus_in_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data) +{ + gchar *name; + + name = g_strdup (gtk_entry_get_text (GTK_ENTRY (w))); + + g_object_set_data (G_OBJECT (data->task), + "focus_in_name", (gpointer) name); + + return FALSE; +} + static void task_dialog_task_type_changed_cb (MrpTask *task, GParamSpec *pspec, GtkWidget *dialog) { @@ -510,6 +665,68 @@ task_dialog_work_changed_cb (GtkWidget data->dialog); } +static gboolean +task_dialog_work_focus_out_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data) +{ + MrpProject *project; + MrpCalendar *calendar; + gint work; + gint current_work; + gint work_per_day; + gdouble *focus_in_work; + GValue value = { 0 }; + PlannerCmd *cmd; + + g_assert (MRP_IS_TASK (data->task)); + + g_object_get (data->task, "project", &project, NULL); + calendar = mrp_project_get_calendar (project); + work_per_day = mrp_calendar_day_get_total_work (calendar, + mrp_day_get_work ()); + + focus_in_work = g_object_get_data (G_OBJECT (data->task), "focus_in_work"); + + gtk_spin_button_update (GTK_SPIN_BUTTON (w)); + current_work = gtk_spin_button_get_value (GTK_SPIN_BUTTON (w)) * work_per_day; + work = (*focus_in_work) * work_per_day; + + if (work == current_work) { + g_free (focus_in_work); + return FALSE; + } + + g_object_set (data->task, "work", current_work, NULL); + + g_value_init (&value, G_TYPE_INT); + g_value_set_int (&value, work); + + cmd = task_cmd_edit_property_focus (data->main_window, + data->task, "work", &value); + + g_free (focus_in_work); + + return FALSE; +} + +static gboolean +task_dialog_work_focus_in_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data) +{ + gdouble *work; + + work = g_new0 (gdouble, 1); + + *work = gtk_spin_button_get_value (GTK_SPIN_BUTTON (w)); + + g_object_set_data (G_OBJECT (data->task), + "focus_in_work", (gpointer) work); + + return FALSE; +} + static void task_dialog_task_duration_changed_cb (MrpTask *task, GParamSpec *pspec, @@ -574,6 +791,75 @@ task_dialog_duration_changed_cb (GtkWidg data->dialog); } + +/* FIXME: try to unify duration and work focus functions? */ + +static gboolean +task_dialog_duration_focus_out_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data) +{ + MrpProject *project; + MrpCalendar *calendar; + gint duration; + gint current_duration; + gint work_per_day; + gdouble *focus_in_duration; + GValue value = { 0 }; + PlannerCmd *cmd; + + g_assert (MRP_IS_TASK (data->task)); + + g_object_get (data->task, "project", &project, NULL); + calendar = mrp_project_get_calendar (project); + work_per_day = mrp_calendar_day_get_total_work (calendar, + mrp_day_get_work ()); + + focus_in_duration = g_object_get_data (G_OBJECT (data->task), "focus_in_duration"); + + /* FIXME: Why spin button isn't updated when is modified with direct entry + from keyboard with correct values? */ + gtk_spin_button_update (GTK_SPIN_BUTTON (w)); + current_duration = gtk_spin_button_get_value (GTK_SPIN_BUTTON (w)) * work_per_day; + duration = (*focus_in_duration) * work_per_day; + + if (duration == current_duration) { + g_free (focus_in_duration); + return FALSE; + } + + g_object_set (data->task, "duration", current_duration, NULL); + g_message ("Old duration %d, New duration %d", duration, current_duration); + + g_value_init (&value, G_TYPE_INT); + g_value_set_int (&value, duration); + + cmd = task_cmd_edit_property_focus (data->main_window, + data->task, "duration", &value); + + g_free (focus_in_duration); + + return FALSE; +} + +static gboolean +task_dialog_duration_focus_in_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data) +{ + gdouble *duration; + + duration = g_new0 (gdouble, 1); + + *duration = gtk_spin_button_get_value (GTK_SPIN_BUTTON (w)); + + g_object_set_data (G_OBJECT (data->task), + "focus_in_duration", (gpointer) duration); + + return FALSE; +} + + static void task_dialog_task_complete_changed_cb (MrpTask *task, GParamSpec *pspec, @@ -620,6 +906,60 @@ task_dialog_complete_changed_cb (GtkWidg data->dialog); } +static gboolean +task_dialog_complete_focus_out_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data) +{ + guint current_complete; + guint *focus_in_complete; + GValue value = { 0 }; + PlannerCmd *cmd; + + g_assert (MRP_IS_TASK (data->task)); + + focus_in_complete = g_object_get_data (G_OBJECT (data->task), "focus_in_complete"); + + gtk_spin_button_update (GTK_SPIN_BUTTON (w)); + current_complete = gtk_spin_button_get_value (GTK_SPIN_BUTTON (w)); + + if (*focus_in_complete == current_complete) { + g_free (focus_in_complete); + return FALSE; + } + + g_object_set (data->task, "percent_complete", current_complete, NULL); + + g_value_init (&value, G_TYPE_UINT); + g_value_set_uint (&value, *focus_in_complete); + + g_message ("Old complete %d, New complete %d", *focus_in_complete, current_complete); + + cmd = task_cmd_edit_property_focus (data->main_window, + data->task, "percent_complete", &value); + + g_free (focus_in_complete); + + return FALSE; +} + +static gboolean +task_dialog_complete_focus_in_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data) +{ + guint *complete; + + complete = g_new0 (guint, 1); + + *complete = gtk_spin_button_get_value (GTK_SPIN_BUTTON (w)); + + g_object_set_data (G_OBJECT (data->task), + "focus_in_complete", (gpointer) complete); + + return FALSE; +} + static void task_dialog_task_priority_changed_cb (MrpTask *task, GParamSpec *pspec, @@ -666,6 +1006,58 @@ task_dialog_priority_changed_cb (GtkWidg data->dialog); } +static gboolean +task_dialog_priority_focus_out_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data) +{ + gint current_priority; + gdouble *focus_in_priority; + GValue value = { 0 }; + PlannerCmd *cmd; + + g_assert (MRP_IS_TASK (data->task)); + + focus_in_priority = g_object_get_data (G_OBJECT (data->task), "focus_in_priority"); + + gtk_spin_button_update (GTK_SPIN_BUTTON (w)); + current_priority = gtk_spin_button_get_value (GTK_SPIN_BUTTON (w)); + + if (*focus_in_priority == current_priority) { + g_free (focus_in_priority); + return FALSE; + } + + g_object_set (data->task, "priority", current_priority, NULL); + + g_value_init (&value, G_TYPE_INT); + g_value_set_int (&value, *focus_in_priority); + + cmd = task_cmd_edit_property_focus (data->main_window, + data->task, "priority", &value); + + g_free (focus_in_priority); + + return FALSE; +} + +static gboolean +task_dialog_priority_focus_in_cb (GtkWidget *w, + GdkEventFocus *event, + DialogData *data) +{ + gint *priority; + + priority = g_new0 (gint, 1); + + *priority = gtk_spin_button_get_value (GTK_SPIN_BUTTON (w)); + + g_object_set_data (G_OBJECT (data->task), + "focus_in_priority", (gpointer) priority); + + return FALSE; +} + static void task_dialog_task_note_changed_cb (MrpTask *task, GParamSpec *pspec, @@ -1252,6 +1644,16 @@ task_dialog_setup_widgets (DialogData *d G_CALLBACK (task_dialog_name_changed_cb), data); + g_signal_connect (data->name_entry, + "focus_in_event", + G_CALLBACK (task_dialog_name_focus_in_cb), + data); + + g_signal_connect (data->name_entry, + "focus_out_event", + G_CALLBACK (task_dialog_name_focus_out_cb), + data); + data->milestone_checkbutton = glade_xml_get_widget (glade, "milestone_checkbutton"); g_object_get (data->task, "type", &type, NULL); if (type == MRP_TASK_TYPE_MILESTONE) { @@ -1280,6 +1682,15 @@ task_dialog_setup_widgets (DialogData *d "value_changed", G_CALLBACK (task_dialog_work_changed_cb), data); + g_signal_connect (data->work_spinbutton, + "focus_in_event", + G_CALLBACK (task_dialog_work_focus_in_cb), + data); + g_signal_connect (data->work_spinbutton, + "focus_out_event", + G_CALLBACK (task_dialog_work_focus_out_cb), + data); + data->duration_spinbutton = glade_xml_get_widget (glade, "duration_spinbutton"); g_object_get (data->task, "duration", &int_value, NULL); @@ -1289,6 +1700,14 @@ task_dialog_setup_widgets (DialogData *d "value_changed", G_CALLBACK (task_dialog_duration_changed_cb), data); + g_signal_connect (data->duration_spinbutton, + "focus_in_event", + G_CALLBACK (task_dialog_duration_focus_in_cb), + data); + g_signal_connect (data->duration_spinbutton, + "focus_out_event", + G_CALLBACK (task_dialog_duration_focus_out_cb), + data); data->complete_spinbutton = glade_xml_get_widget (glade, "complete_spinbutton"); @@ -1300,6 +1719,15 @@ task_dialog_setup_widgets (DialogData *d "value_changed", G_CALLBACK (task_dialog_complete_changed_cb), data); + g_signal_connect (data->complete_spinbutton, + "focus_in_event", + G_CALLBACK (task_dialog_complete_focus_in_cb), + data); + + g_signal_connect (data->complete_spinbutton, + "focus_out_event", + G_CALLBACK (task_dialog_complete_focus_out_cb), + data); data->priority_spinbutton = glade_xml_get_widget (glade, "priority_spinbutton"); g_object_get (data->task, "priority", &int_value, NULL); @@ -1308,6 +1736,16 @@ task_dialog_setup_widgets (DialogData *d "value_changed", G_CALLBACK (task_dialog_priority_changed_cb), data); + + g_signal_connect (data->priority_spinbutton, + "focus_in_event", + G_CALLBACK (task_dialog_priority_focus_in_cb), + data); + + g_signal_connect (data->priority_spinbutton, + "focus_out_event", + G_CALLBACK (task_dialog_priority_focus_out_cb), + data); data->note_textview = glade_xml_get_widget (glade, "note_textview"); Index: src/planner-task-tree.c =================================================================== RCS file: /cvs/gnome/planner/src/planner-task-tree.c,v retrieving revision 1.25 diff -u -b -B -p -r1.25 planner-task-tree.c --- src/planner-task-tree.c 18 May 2004 03:09:41 -0000 1.25 +++ src/planner-task-tree.c 1 Jun 2004 05:37:25 -0000 @@ -328,6 +328,9 @@ task_cmd_edit_property_free (PlannerCmd g_free (cmd->property); g_value_unset (cmd->value); g_value_unset (cmd->old_value); + + g_free (cmd->value); + g_free (cmd->old_value); } static PlannerCmd * @@ -1242,6 +1245,8 @@ task_cmd_edit_custom_property_free (Plan g_value_unset (cmd->value); g_value_unset (cmd->old_value); + g_free (cmd->value); + g_free (cmd->old_value); g_object_unref (cmd->task); }
Attachment:
signature.asc
Description: Esta parte del mensaje =?ISO-8859-1?Q?est=E1?= firmada digitalmente