Hi guys! Here goes a new patch to undo adding/removing predecessors from the task dialog. The code is the same we use in planner-task-tree to do the same operation, so I have moved the code from planner-task-tree to planner-task-dialog and share between them. The problems with phantoms arrows in the gantt view appear so we will need debugging time and solve the open bug with a patch: http://bugs.gnome.org/show_bug.cgi?id=141346 I feel they are related. This bug isn't in 0.12 release bugs. I think we need to solve it before releasing 0.12 because strange things happens in the gantt chart using the undo/redo system so the user will stop to use it. Cheers -- Alvaro
Index: src/planner-task-dialog.c =================================================================== RCS file: /cvs/gnome/planner/src/planner-task-dialog.c,v retrieving revision 1.14 diff -u -b -B -p -r1.14 planner-task-dialog.c --- src/planner-task-dialog.c 7 Jun 2004 06:30:57 -0000 1.14 +++ src/planner-task-dialog.c 8 Jun 2004 04:49:19 -0000 @@ -754,6 +754,155 @@ task_cmd_assign_units (PlannerWindow *ma return cmd_base; } +/* link and unlink shared with planner-task-tree.c */ +static gboolean +task_cmd_link_do (PlannerCmd *cmd_base) +{ + TaskCmdLink *cmd; + GError *error = NULL; + MrpRelation *relation; + gboolean retval; + + cmd = (TaskCmdLink *) cmd_base; + + relation = mrp_task_add_predecessor (cmd->after, + cmd->before, + cmd->relationship, + cmd->lag, + &error); + if (!error) { + retval = TRUE; + } else { + cmd->error = error; + retval = FALSE; + } + + return retval; +} + +static void +task_cmd_link_undo (PlannerCmd *cmd_base) +{ + TaskCmdLink *cmd; + + cmd = (TaskCmdLink*) cmd_base; + + mrp_task_remove_predecessor (cmd->after, cmd->before); +} + +static void +task_cmd_link_free (PlannerCmd *cmd_base) +{ + TaskCmdLink *cmd; + + cmd = (TaskCmdLink *) cmd_base; + + g_object_unref (cmd->project); + g_object_unref (cmd->before); + g_object_unref (cmd->after); +} + + +PlannerCmd * +planner_task_cmd_link (PlannerWindow *main_window, + MrpTask *before, + MrpTask *after, + MrpRelationType relationship, + glong lag, + GError **error) +{ + PlannerCmd *cmd_base; + TaskCmdLink *cmd; + + cmd = g_new0 (TaskCmdLink, 1); + + cmd_base = (PlannerCmd*) cmd; + cmd_base->label = g_strdup (_("Link task")); + cmd_base->do_func = task_cmd_link_do; + cmd_base->undo_func = task_cmd_link_undo; + cmd_base->free_func = task_cmd_link_free; + + cmd->project = g_object_ref (planner_window_get_project (main_window)); + + cmd->before = g_object_ref (before); + cmd->after = g_object_ref (after); + cmd->relationship = relationship; + cmd->lag = lag; + + planner_cmd_manager_insert_and_do (planner_window_get_cmd_manager + (main_window), + cmd_base); + + if (cmd->error) { + g_propagate_error (error, cmd->error); + return NULL; + } + + return cmd_base; +} + +static gboolean +task_cmd_unlink_do (PlannerCmd *cmd_base) +{ + TaskCmdLink *cmd; + + cmd = (TaskCmdLink*) cmd_base; + + if (g_getenv ("PLANNER_DEBUG_UNDO_TASK")) { + g_message ("Removing the link ..."); + } + + mrp_task_remove_predecessor (cmd->after, cmd->before); + + return TRUE; +} + +static void +task_cmd_unlink_undo (PlannerCmd *cmd_base) +{ + TaskCmdLink *cmd; + GError *error; + MrpRelation *relation; + + cmd = (TaskCmdLink *) cmd_base; + + relation = mrp_task_add_predecessor (cmd->after, + cmd->before, + cmd->relationship, + cmd->lag, + &error); + g_assert (relation); +} + +PlannerCmd * +planner_task_cmd_unlink (PlannerWindow *main_window, + MrpRelation *relation) +{ + PlannerCmd *cmd_base; + TaskCmdLink *cmd; + + cmd = g_new0 (TaskCmdLink, 1); + + cmd_base = (PlannerCmd*) cmd; + cmd_base->label = g_strdup (_("Unlink task")); + cmd_base->do_func = task_cmd_unlink_do; + cmd_base->undo_func = task_cmd_unlink_undo; + cmd_base->free_func = task_cmd_link_free; + + cmd->project = g_object_ref (planner_window_get_project (main_window)); + + cmd->before = g_object_ref (mrp_relation_get_predecessor (relation)); + cmd->after = g_object_ref (mrp_relation_get_successor (relation)); + cmd->relationship = mrp_relation_get_relation_type (relation); + cmd->lag = mrp_relation_get_lag (relation); + + 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) { @@ -1518,7 +1667,8 @@ task_dialog_task_child_added_or_removed_ } static GtkWidget * -task_dialog_predecessor_dialog_new (MrpTask *task) +task_dialog_predecessor_dialog_new (MrpTask *task, + PlannerWindow *main_window) { MrpProject *project; GladeXML *glade; @@ -1533,8 +1683,9 @@ task_dialog_predecessor_dialog_new (MrpT NULL); dialog = glade_xml_get_widget (glade, "add_predecessor_dialog"); - g_object_set_data (G_OBJECT (dialog), "task_main", task); + g_object_set_data (G_OBJECT (dialog), "task_main", task); + g_object_set_data (G_OBJECT (dialog), "main_window", main_window); w = glade_xml_get_widget (glade, "predecessor_combo"); g_object_set_data (G_OBJECT (dialog), "predecessor_combo", w); @@ -1575,6 +1726,8 @@ static void task_dialog_new_pred_ok_clicked_cb (GtkWidget *button, GtkWidget *dialog) { + PlannerWindow *main_window; + PlannerCmd *cmd; GtkWidget *w; GError *error = NULL; MrpTask *task_main; @@ -1584,6 +1737,8 @@ task_dialog_new_pred_ok_clicked_cb (GtkW gint pred_type; gchar *str; + main_window = g_object_get_data (G_OBJECT (dialog), "main_window"); + task_main = g_object_get_data (G_OBJECT (dialog), "task_main"); mrp_object_get (task_main, "project", &project, NULL); @@ -1606,11 +1761,10 @@ task_dialog_new_pred_ok_clicked_cb (GtkW mrp_object_get (MRP_OBJECT (new_task_pred), "name", &str, NULL); - if (!mrp_task_add_predecessor (task_main, - new_task_pred, - pred_type, - lag, - &error)) { + cmd = planner_task_cmd_link (main_window, new_task_pred, task_main, + pred_type, lag, &error); + + if (!cmd) { GtkWidget *err_dialog; err_dialog = gtk_message_dialog_new (GTK_WINDOW (dialog), @@ -1642,7 +1796,7 @@ task_dialog_add_predecessor_cb (GtkWidge { GtkWidget *dialog; - dialog = task_dialog_predecessor_dialog_new (data->task); + dialog = task_dialog_predecessor_dialog_new (data->task, data->main_window); gtk_widget_show (dialog); } @@ -1652,6 +1806,7 @@ task_dialog_remove_predecessor_cb (GtkWi { GtkTreeView *tree; MrpTask *predecessor; + MrpRelation *relation; PlannerPredecessorModel *model; GtkTreeSelection *selection; GtkTreeIter iter; @@ -1665,7 +1820,9 @@ task_dialog_remove_predecessor_cb (GtkWi } predecessor = MRP_TASK (planner_list_model_get_object (PLANNER_LIST_MODEL (model), &iter)); - mrp_task_remove_predecessor (data->task, predecessor); + /* mrp_task_remove_predecessor (data->task, predecessor); */ + relation = mrp_task_get_relation (data->task, predecessor); + planner_task_cmd_unlink (data->main_window, relation); } static void Index: src/planner-task-dialog.h =================================================================== RCS file: /cvs/gnome/planner/src/planner-task-dialog.h,v retrieving revision 1.3 diff -u -b -B -p -r1.3 planner-task-dialog.h --- src/planner-task-dialog.h 27 Apr 2004 18:58:02 -0000 1.3 +++ src/planner-task-dialog.h 8 Jun 2004 04:49:19 -0000 @@ -38,6 +38,28 @@ GtkWidget * planner_task_dialog_new (Pla MrpTask *task, PlannerTaskDialogPage page); +/* Undo operation shared with planner-task-tree.c */ +typedef struct { + PlannerCmd base; + + MrpProject *project; + MrpTask *before; + MrpTask *after; + MrpRelationType relationship; + glong lag; + GError *error; +} TaskCmdLink; + +PlannerCmd * planner_task_cmd_link (PlannerWindow *main_window, + MrpTask *before, + MrpTask *after, + MrpRelationType relationship, + glong lag, + GError **error); + +PlannerCmd * planner_task_cmd_unlink (PlannerWindow *main_window, + MrpRelation *relation); + #endif /* __PLANNER_TASK_DIALOG_H__ */ Index: src/planner-task-tree.c =================================================================== RCS file: /cvs/gnome/planner/src/planner-task-tree.c,v retrieving revision 1.27 diff -u -b -B -p -r1.27 planner-task-tree.c --- src/planner-task-tree.c 4 Jun 2004 05:10:20 -0000 1.27 +++ src/planner-task-tree.c 8 Jun 2004 04:49:26 -0000 @@ -1043,166 +1043,6 @@ task_cmd_move (PlannerTaskTree *tree, typedef struct { PlannerCmd base; - MrpProject *project; - MrpTask *before; - MrpTask *after; - MrpRelationType relationship; - glong lag; - GError *error; -} TaskCmdLink; - -static gboolean -task_cmd_link_do (PlannerCmd *cmd_base) -{ - TaskCmdLink *cmd; - GError *error = NULL; - MrpRelation *relation; - gboolean retval; - - cmd = (TaskCmdLink *) cmd_base; - - relation = mrp_task_add_predecessor (cmd->after, - cmd->before, - cmd->relationship, - cmd->lag, - &error); - if (!error) { - retval = TRUE; - } else { - cmd->error = error; - retval = FALSE; - } - - return retval; -} - -static void -task_cmd_link_undo (PlannerCmd *cmd_base) -{ - TaskCmdLink *cmd; - - cmd = (TaskCmdLink*) cmd_base; - - mrp_task_remove_predecessor (cmd->after, cmd->before); -} - -static void -task_cmd_link_free (PlannerCmd *cmd_base) -{ - TaskCmdLink *cmd; - - cmd = (TaskCmdLink *) cmd_base; - - g_object_unref (cmd->project); - g_object_unref (cmd->before); - g_object_unref (cmd->after); -} - - -PlannerCmd * -planner_task_tree_task_cmd_link (PlannerTaskTree *tree, - MrpTask *before, - MrpTask *after, - MrpRelationType relationship, - glong lag, - GError **error) -{ - PlannerTaskTreePriv *priv = tree->priv; - PlannerCmd *cmd_base; - TaskCmdLink *cmd; - - cmd = g_new0 (TaskCmdLink, 1); - - cmd_base = (PlannerCmd*) cmd; - cmd_base->label = g_strdup (_("Link task")); - cmd_base->do_func = task_cmd_link_do; - cmd_base->undo_func = task_cmd_link_undo; - cmd_base->free_func = task_cmd_link_free; - - cmd->project = g_object_ref (tree->priv->project); - - cmd->before = g_object_ref (before); - cmd->after = g_object_ref (after); - cmd->relationship = relationship; - cmd->lag = lag; - - planner_cmd_manager_insert_and_do (planner_window_get_cmd_manager - (priv->main_window), - cmd_base); - - if (cmd->error) { - g_propagate_error (error, cmd->error); - return NULL; - } - - return cmd_base; -} - -static gboolean -task_cmd_unlink_do (PlannerCmd *cmd_base) -{ - TaskCmdLink *cmd; - - cmd = (TaskCmdLink*) cmd_base; - - if (g_getenv ("PLANNER_DEBUG_UNDO_TASK")) { - g_message ("Removing the link ..."); - } - - mrp_task_remove_predecessor (cmd->after, cmd->before); - - return TRUE; -} - -static void -task_cmd_unlink_undo (PlannerCmd *cmd_base) -{ - TaskCmdLink *cmd; - GError *error; - MrpRelation *relation; - - cmd = (TaskCmdLink *) cmd_base; - - relation = mrp_task_add_predecessor (cmd->after, - cmd->before, - cmd->relationship, - cmd->lag, - &error); - g_assert (relation); -} - -static PlannerCmd * -task_cmd_unlink (PlannerTaskTree *tree, - MrpRelation *relation) -{ - PlannerTaskTreePriv *priv = tree->priv; - PlannerCmd *cmd_base; - TaskCmdLink *cmd; - - cmd = g_new0 (TaskCmdLink, 1); - - cmd_base = (PlannerCmd*) cmd; - cmd_base->label = g_strdup (_("Unlink task")); - cmd_base->do_func = task_cmd_unlink_do; - cmd_base->undo_func = task_cmd_unlink_undo; - cmd_base->free_func = task_cmd_link_free; - - cmd->project = g_object_ref (tree->priv->project); - - cmd->before = g_object_ref (mrp_relation_get_predecessor (relation)); - cmd->after = g_object_ref (mrp_relation_get_successor (relation)); - cmd->relationship = mrp_relation_get_relation_type (relation); - cmd->lag = mrp_relation_get_lag (relation); - - planner_cmd_manager_insert_and_do (planner_window_get_cmd_manager - (priv->main_window), - cmd_base); - return cmd_base; -} - -typedef struct { - PlannerCmd base; - MrpTask *task; MrpProperty *property; GValue *value; @@ -3018,7 +2858,7 @@ planner_task_tree_unlink_task (PlannerTa /* mrp_task_remove_predecessor ( task, mrp_relation_get_predecessor (relation)); */ - task_cmd_unlink (tree, relation); + planner_task_cmd_unlink (tree->priv->main_window, relation); } g_list_free (relations); @@ -3030,7 +2870,7 @@ planner_task_tree_unlink_task (PlannerTa /* mrp_task_remove_predecessor ( mrp_relation_get_successor (relation), task); */ - task_cmd_unlink (tree, relation); + planner_task_cmd_unlink (tree->priv->main_window, relation); } g_list_free (relations); @@ -3062,7 +2902,7 @@ planner_task_tree_link_tasks (PlannerTas task = l->data; - cmd = planner_task_tree_task_cmd_link (tree, task, target_task, + cmd = planner_task_cmd_link (tree->priv->main_window, task, target_task, relationship, 0, &error); /* cmd = mrp_task_add_predecessor (target_task,
Attachment:
signature.asc
Description: Esta parte del mensaje =?ISO-8859-1?Q?est=E1?= firmada digitalmente