[Planner Dev] New patch: undo for editing custom task properties
- From: Alvaro del Castillo <acs lambdaux com>
- To: Planner Project Manager - Development List <planner-dev lists imendio com>
- Subject: [Planner Dev] New patch: undo for editing custom task properties
- Date: Thu, 13 May 2004 07:39:32 +0000
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
--
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
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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]