Hi guys! Here goes the patch to close: http://bugs.gnome.org/show_bug.cgi?id=143609 that closes all the bugs for undo system targeted to 0.12. I will commit it in a few minutes. Cheers -- Alvaro
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/planner/ChangeLog,v
retrieving revision 1.173
diff -u -b -B -p -r1.173 ChangeLog
--- ChangeLog 25 Jun 2004 11:53:58 -0000 1.173
+++ ChangeLog 26 Jun 2004 04:21:39 -0000
@@ -1,3 +1,10 @@
+2004-06-26 Alvaro del Castillo <acs barrapunto com>
+
+ * libplanner/mrp-object.c: Fix in mrp_object_get_property API doc.
+ * src/planner-property-dialog.c: Implemented recovering properties
+ values for tasks and resources when you undo a remove custom
+ property operation. Fixes #143609.
+
2004-06-25 Richard Hult <richard imendio com>
* src/planner-ttable-row.c: (recalc_bounds),
Index: libplanner/mrp-object.c
===================================================================
RCS file: /cvs/gnome/planner/libplanner/mrp-object.c,v
retrieving revision 1.7
diff -u -b -B -p -r1.7 mrp-object.c
--- libplanner/mrp-object.c 7 Jun 2004 22:36:26 -0000 1.7
+++ libplanner/mrp-object.c 26 Jun 2004 04:21:42 -0000
@@ -219,8 +219,8 @@ mrp_object_set_property (MrpObject *obje
/**
* mrp_object_get_property:
* @object: an #MrpObject
- * @property: the property to set
- * @value: the value to set
+ * @property: the property to get
+ * @value: the value to get
*
* Gets a custom property. This is mostly for language bindings. C programmers
* should use mrp_object_get instead.
Index: src/planner-property-dialog.c
===================================================================
RCS file: /cvs/gnome/planner/src/planner-property-dialog.c,v
retrieving revision 1.4
diff -u -b -B -p -r1.4 planner-property-dialog.c
--- src/planner-property-dialog.c 21 Jun 2004 10:21:29 -0000 1.4
+++ src/planner-property-dialog.c 26 Jun 2004 04:21:44 -0000
@@ -74,14 +74,17 @@ typedef struct {
typedef struct {
PlannerCmd base;
- PlannerWindow *window;
MrpProject *project;
gchar *name;
+ MrpProperty *property;
MrpPropertyType type;
gchar *label_text;
gchar *description;
GType owner;
gboolean user_defined;
+
+ GHashTable *tasks;
+ GHashTable *resources;
} PropertyCmdRemove;
typedef struct {
@@ -626,12 +629,9 @@ property_cmd_add_undo (PlannerCmd *cmd_b
cmd = (PropertyCmdAdd*) cmd_base;
- /* FIXME: why is the NULL check here? */
- if (cmd->name != NULL) {
mrp_project_remove_property (cmd->project,
cmd->owner,
cmd->name);
- }
}
@@ -695,6 +695,31 @@ property_cmd_remove_do (PlannerCmd *cmd_
return FALSE;
}
+ /* First we need to save the value of the property */
+ if (cmd->owner == MRP_TYPE_TASK && g_hash_table_size (cmd->tasks) == 0) {
+ GList *l, *tasks = mrp_project_get_all_tasks (cmd->project);
+
+ /* ref tasks */
+ for (l = tasks; l; l = l->next) {
+ GValue *value = g_new0 (GValue, 1);
+ g_value_init (value, G_PARAM_SPEC_VALUE_TYPE (cmd->property));
+ mrp_object_get_property (l->data, cmd->property, value);
+ g_hash_table_insert (cmd->tasks, g_object_ref (l->data), value);
+ }
+
+ }
+ else if (cmd->owner == MRP_TYPE_RESOURCE && g_hash_table_size (cmd->resources) == 0) {
+ GList *l, *resources = mrp_project_get_resources (cmd->project);
+
+ for (l = resources; l; l = l->next) {
+ GValue *value = g_new0 (GValue, 1);
+ g_value_init (value, G_PARAM_SPEC_VALUE_TYPE (cmd->property));
+ mrp_object_get_property (l->data, cmd->property, value);
+ g_hash_table_insert (cmd->resources, g_object_ref (l->data), value);
+ }
+
+ }
+
mrp_project_remove_property (cmd->project,
cmd->owner,
cmd->name);
@@ -703,16 +728,29 @@ property_cmd_remove_do (PlannerCmd *cmd_
}
static void
+property_hash_recover (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ PropertyCmdRemove *cmd = (PropertyCmdRemove*) user_data;
+
+ g_assert (MRP_IS_TASK (key) || MRP_IS_RESOURCE (key));
+ g_assert (G_IS_VALUE (value));
+
+ mrp_object_set_property (key, cmd->property, value);
+
+}
+
+static void
property_cmd_remove_undo (PlannerCmd *cmd_base)
{
PropertyCmdRemove *cmd;
- MrpProperty *property;
cmd = (PropertyCmdRemove*) cmd_base;
- /* FIXME: why is this check here? */
- if (cmd->name != NULL) {
- property = mrp_property_new (cmd->name,
+ mrp_property_unref (cmd->property);
+
+ cmd->property = mrp_property_new (cmd->name,
cmd->type,
cmd->label_text,
cmd->description,
@@ -720,9 +758,20 @@ property_cmd_remove_undo (PlannerCmd *cm
mrp_project_add_property (cmd->project,
cmd->owner,
- property,
+ cmd->property,
cmd->user_defined);
- }
+
+ g_hash_table_foreach (cmd->tasks, property_hash_recover, cmd);
+ g_hash_table_foreach (cmd->resources, property_hash_recover, cmd);
+}
+
+static void
+property_hash_free (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ g_object_unref (key);
+ g_value_unset ((GValue *) value);
}
static void
@@ -732,9 +781,18 @@ property_cmd_remove_free (PlannerCmd *cm
cmd = (PropertyCmdRemove*) cmd_base;
+ mrp_property_unref (cmd->property);
+
+ g_hash_table_foreach (cmd->tasks, property_hash_free, NULL);
+ g_hash_table_destroy (cmd->tasks);
+ g_hash_table_foreach (cmd->resources, property_hash_free, NULL);
+ g_hash_table_destroy (cmd->resources);
+
g_free (cmd->name);
g_free (cmd->label_text);
g_free (cmd->description);
+
+ g_object_unref (cmd->project);
}
static PlannerCmd *
@@ -755,8 +813,7 @@ property_cmd_remove (PlannerWindow *wind
cmd = (PropertyCmdRemove *) cmd_base;
- cmd->window = window;
- cmd->project = project;
+ cmd->project = g_object_ref (project);
cmd->owner = owner;
cmd->name = g_strdup (name);
@@ -764,10 +821,14 @@ property_cmd_remove (PlannerWindow *wind
name,
owner);
+ cmd->property = mrp_property_ref (property);
cmd->type = mrp_property_get_property_type (property);
cmd->description = g_strdup (mrp_property_get_description (property));
cmd->label_text = g_strdup ( mrp_property_get_label (property));
cmd->user_defined = mrp_property_get_user_defined (property);
+
+ cmd->tasks = g_hash_table_new (NULL, NULL);
+ cmd->resources = g_hash_table_new (NULL, NULL);
planner_cmd_manager_insert_and_do (planner_window_get_cmd_manager (window),
cmd_base);
Attachment:
signature.asc
Description: Esta parte del mensaje =?ISO-8859-1?Q?est=E1?= firmada digitalmente