Re: [Planner Dev] New patch: undo for editing custom task properties
- From: Alvaro del Castillo <acs lambdaux com>
- To: "lincoln phipps openmutual net" <lincoln phipps openmutual net>
- Cc: Planner Project Manager - Development List <planner-dev lists imendio com>
- Subject: Re: [Planner Dev] New patch: undo for editing custom task properties
- Date: Thu, 13 May 2004 11:53:21 +0000
Hi!
El jue, 13-05-2004 a las 07:48, lincoln phipps openmutual net escribió:
> Acs,
> I see this is just altering the values. This is really
> cool as the patch I'm working on handles the add/remove and re-label
> of the custom property itself (i..e the actuall column) but I hadn't
> done anything on the values (except for the custom project property
> values (i.e. in the Project dialog).
>
Yes, it only undo/redo the custom properties values :)
> I'll build/test the two patches (this and mine) together
> as I'll probably look at what you've done to restore a whole
> project worth of properties when a property (column) is deleted
> i.e. every task gets its custom property value deleted.
>
Ok!
Have you seen the patch for linking arrows in gantt chart when undo/redo
task removes? I have tested it a little more and it seems that emiting a
signals when the children are removed don't create new problems, but we
need more testing with big projects full of children and links between
them :)
Cheers
> Lincoln.
>
> Alvaro del Castillo wrote:
> > Hi guys!
> >
> > With a code very similar to the undo editing custom properties in
> > resources, I have implemented also the undo editing custom properties
> > for tasks.
> >
> > In the two cases it isn't implemented the editing if the custom property
> > is a DATE, something that the custom property dialog doesn't allow
> > currently, so right now it isn't a problem but will be if we let the
> > user create custom properties that are dates.
> >
> > In the task tree only remains the reset constraint to be undoable. And
> > then, I will focus in the task editor dialog, very similar work to the
> > resource editor dialog in which I have worked in the past.
> >
> > I will test next days the last patch I sent for the bug:
> >
> > http://bugs.gnome.org/show_bug.cgi?id=141346
> >
> > Cheers
> >
> >
> >
> > ------------------------------------------------------------------------
> >
> > Index: src/planner-task-tree.c
> > ===================================================================
> > RCS file: /cvs/gnome/planner/src/planner-task-tree.c,v
> > retrieving revision 1.24
> > diff -u -b -B -p -r1.24 planner-task-tree.c
> > --- src/planner-task-tree.c 9 May 2004 08:02:14 -0000 1.24
> > +++ src/planner-task-tree.c 13 May 2004 05:28:11 -0000
> > @@ -75,7 +75,7 @@ struct _PlannerTaskTreePriv {
> > };
> >
> > typedef struct {
> > - GtkTreeView *tree;
> > + PlannerTaskTree *tree;
> > MrpProperty *property;
> > } ColPropertyData;
> >
> > @@ -1128,6 +1138,98 @@ task_cmd_unlink (PlannerTaskTree *tree,
> > return cmd_base;
> > }
> >
> > +typedef struct {
> > + PlannerCmd base;
> > +
> > + MrpTask *task;
> > + MrpProperty *property;
> > + GValue *value;
> > + GValue *old_value;
> > +} TaskCmdEditCustomProperty;
> > +
> > +static gboolean
> > +task_cmd_edit_custom_property_do (PlannerCmd *cmd_base)
> > +{
> > + TaskCmdEditCustomProperty *cmd;
> > + cmd = (TaskCmdEditCustomProperty*) cmd_base;
> > +
> > + mrp_object_set_property (MRP_OBJECT (cmd->task),
> > + cmd->property,
> > + cmd->value);
> > +
> > + return TRUE;
> > +}
> > +
> > +static void
> > +task_cmd_edit_custom_property_undo (PlannerCmd *cmd_base)
> > +{
> > + TaskCmdEditCustomProperty *cmd;
> > +
> > + cmd = (TaskCmdEditCustomProperty*) cmd_base;
> > +
> > + /* FIXME: delay in the UI when setting the property */
> > + mrp_object_set_property (MRP_OBJECT (cmd->task),
> > + cmd->property,
> > + cmd->old_value);
> > +
> > +}
> > +
> > +static void
> > +task_cmd_edit_custom_property_free (PlannerCmd *cmd_base)
> > +{
> > + TaskCmdEditCustomProperty *cmd;
> > +
> > + cmd = (TaskCmdEditCustomProperty*) cmd_base;
> > +
> > + g_value_unset (cmd->value);
> > + g_value_unset (cmd->old_value);
> > +
> > + g_object_unref (cmd->task);
> > +}
> > +
> > +static PlannerCmd *
> > +task_cmd_edit_custom_property (PlannerTaskTree *tree,
> > + MrpTask *task,
> > + MrpProperty *property,
> > + const GValue *value)
> > +{
> > + PlannerCmd *cmd_base;
> > + PlannerTaskTreePriv *priv = tree->priv;
> > + TaskCmdEditCustomProperty *cmd;
> > +
> > + cmd = g_new0 (TaskCmdEditCustomProperty, 1);
> > +
> > + cmd_base = (PlannerCmd*) cmd;
> > +
> > + cmd_base->label = g_strdup (_("Edit task custom property"));
> > + cmd_base->do_func = task_cmd_edit_custom_property_do;
> > + cmd_base->undo_func = task_cmd_edit_custom_property_undo;
> > + cmd_base->free_func = task_cmd_edit_custom_property_free;
> > +
> > + cmd->property = property;
> > + cmd->task = g_object_ref (task);
> > +
> > + cmd->value = g_new0 (GValue, 1);
> > + g_value_init (cmd->value, G_VALUE_TYPE (value));
> > + g_value_copy (value, cmd->value);
> > +
> > + cmd->old_value = g_new0 (GValue, 1);
> > + g_value_init (cmd->old_value, G_VALUE_TYPE (value));
> > +
> > + mrp_object_get_property (MRP_OBJECT (cmd->task),
> > + cmd->property,
> > + cmd->old_value);
> > +
> > + /* FIXME: if old and new value are the same, do nothing
> > + How we can compare values?
> > + */
> > +
> > + planner_cmd_manager_insert_and_do (planner_window_get_cmd_manager (priv->main_window),
> > + cmd_base);
> > +
> > + return cmd_base;
> > +}
> > +
> >
> > GType
> > planner_task_tree_get_type (void)
> > @@ -2028,31 +2130,16 @@ task_tree_property_data_func (GtkTreeVie
> > g_free (svalue);
> > }
> >
> > -static void
> > -task_tree_property_value_edited (GtkCellRendererText *cell,
> > - gchar *path_str,
> > +static GValue
> > +task_view_custom_property_set_value (MrpProperty *property,
> > gchar *new_text,
> > - ColPropertyData *data)
> > + GtkCellRendererText *cell)
> > {
> > - GtkTreePath *path;
> > - GtkTreeIter iter;
> > - GtkTreeModel *model;
> > - MrpProperty *property;
> > - MrpPropertyType type;
> > - MrpTask *task;
> > PlannerCellRendererDate *date;
> > + GValue value = { 0 };
> > + MrpPropertyType type;
> > gfloat fvalue;
> >
> > - /* FIXME: undo */
> > -
> > - model = gtk_tree_view_get_model (data->tree);
> > - property = data->property;
> > -
> > - path = gtk_tree_path_new_from_string (path_str);
> > - gtk_tree_model_get_iter (model, &iter, path);
> > -
> > - task = planner_gantt_model_get_task (PLANNER_GANTT_MODEL (model), &iter);
> > -
> > /* FIXME: implement mrp_object_set_property like
> > * g_object_set_property that takes a GValue.
> > */
> > @@ -2060,47 +2147,43 @@ task_tree_property_value_edited (GtkCell
> >
> > switch (type) {
> > case MRP_PROPERTY_TYPE_STRING:
> > - mrp_object_set (MRP_OBJECT (task),
> > - mrp_property_get_name (property),
> > - new_text,
> > - NULL);
> > + g_value_init (&value, G_TYPE_STRING);
> > + g_value_set_string (&value, new_text);
> > +
> > break;
> > case MRP_PROPERTY_TYPE_INT:
> > - mrp_object_set (MRP_OBJECT (task),
> > - mrp_property_get_name (property),
> > - atoi (new_text),
> > - NULL);
> > + g_value_init (&value, G_TYPE_INT);
> > + g_value_set_int (&value, atoi (new_text));
> > +
> > break;
> > case MRP_PROPERTY_TYPE_FLOAT:
> > fvalue = g_ascii_strtod (new_text, NULL);
> > - mrp_object_set (MRP_OBJECT (task),
> > - mrp_property_get_name (property),
> > - fvalue,
> > - NULL);
> > + g_value_init (&value, G_TYPE_FLOAT);
> > + g_value_set_float (&value, fvalue);
> > +
> > break;
> >
> > case MRP_PROPERTY_TYPE_DURATION:
> > /* FIXME: support reading units etc... */
> > - mrp_object_set (MRP_OBJECT (task),
> > - mrp_property_get_name (property),
> > - atoi (new_text) *8*60*60,
> > - NULL);
> > + g_value_init (&value, G_TYPE_INT);
> > + g_value_set_int (&value, atoi (new_text) *8*60*60);
> > +
> > break;
> >
> >
> > case MRP_PROPERTY_TYPE_DATE:
> > date = PLANNER_CELL_RENDERER_DATE (cell);
> > - mrp_object_set (MRP_OBJECT (task),
> > + /* FIXME: Currently custom properties can't be dates. Why? */
> > + /* mrp_object_set (MRP_OBJECT (task),
> > mrp_property_get_name (property),
> > &(date->time),
> > - NULL);
> > + NULL);*/
> > break;
> > case MRP_PROPERTY_TYPE_COST:
> > fvalue = g_ascii_strtod (new_text, NULL);
> > - mrp_object_set (MRP_OBJECT (task),
> > - mrp_property_get_name (property),
> > - fvalue,
> > - NULL);
> > + g_value_init (&value, G_TYPE_FLOAT);
> > + g_value_set_float (&value, fvalue);
> > +
> > break;
> >
> > default:
> > @@ -2108,6 +2191,37 @@ task_tree_property_value_edited (GtkCell
> > break;
> > }
> >
> > + return value;
> > +}
> > +
> > +static void
> > +task_tree_property_value_edited (GtkCellRendererText *cell,
> > + gchar *path_str,
> > + gchar *new_text,
> > + ColPropertyData *data)
> > +{
> > + PlannerCmd *cmd;
> > + GtkTreePath *path;
> > + GtkTreeIter iter;
> > + GtkTreeModel *model;
> > + MrpProperty *property;
> > + MrpTask *task;
> > + GValue value = { 0 };
> > +
> > + model = gtk_tree_view_get_model (GTK_TREE_VIEW (data->tree));
> > + property = data->property;
> > +
> > + path = gtk_tree_path_new_from_string (path_str);
> > + gtk_tree_model_get_iter (model, &iter, path);
> > +
> > + task = planner_gantt_model_get_task (PLANNER_GANTT_MODEL (model), &iter);
> > +
> > + value = task_view_custom_property_set_value (property, new_text, cell);
> > +
> > + cmd = task_cmd_edit_custom_property (data->tree, task, property, &value);
> > +
> > + g_value_unset (&value);
> > +
> > gtk_tree_path_free (path);
> > }
> >
> > @@ -2168,7 +2282,7 @@ task_tree_property_added (MrpProject
> > g_hash_table_insert (priv->property_to_column, property, col);
> >
> > data->property = property;
> > - data->tree = tree;
> > + data->tree = task_tree;
> >
> > gtk_tree_view_column_pack_start (col, cell, TRUE);
> >
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Planner-dev mailing list
> > Planner-dev lists imendio com
> > http://lists.imendio.com/mailman/listinfo/planner-dev
--
Alvaro del Castillo San Félix
Lambdaux Software Services S.R.L.
Universidad Rey Juan Carlos
Centro de Apoyo Tecnológico
C/ Tulipán sn 28933 Mostoles, Madrid-Spain
www.lambdaux.com
acs lambdaux com
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]