[dia] Optional undo info by typedef ObjectChange * (* DiaCallbackFunc) (...)
- From: Hans Breuer <hans src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dia] Optional undo info by typedef ObjectChange * (* DiaCallbackFunc) (...)
- Date: Sat, 10 Sep 2011 13:29:19 +0000 (UTC)
commit 4fd757e02b1cd8ea0c16fdb6f7e5b31ef8897568
Author: Hans Breuer <hans breuer org>
Date: Sun Sep 4 20:56:30 2011 +0200
Optional undo info by typedef ObjectChange * (* DiaCallbackFunc) (...)
Callback functions registered by plug-ins can now deliver change
information for undo.
app/menus.c | 16 +++++++++++-
app/undo.c | 50 ++++++++++++++++++++++++++-----------
lib/filter.h | 8 +++---
lib/libdia.def | 3 ++
lib/objchange.c | 5 ++-
plug-ins/cairo/diacairo-print.c | 3 +-
plug-ins/cairo/diacairo-print.h | 2 +-
plug-ins/cairo/diacairo.c | 10 ++++---
plug-ins/postscript/postscript.c | 3 +-
plug-ins/python/diamodule.c | 6 +++-
plug-ins/stress/stress.c | 3 +-
plug-ins/wmf/wmf.cpp | 3 +-
12 files changed, 79 insertions(+), 33 deletions(-)
---
diff --git a/app/menus.c b/app/menus.c
index 67300f3..b902309 100644
--- a/app/menus.c
+++ b/app/menus.c
@@ -42,6 +42,7 @@
#include "widgets.h"
#include "preferences.h"
#include "filter.h"
+#include "objchange.h"
#define DIA_STOCK_GROUP "dia-stock-group"
#define DIA_STOCK_UNGROUP "dia-stock-ungroup"
@@ -1233,11 +1234,24 @@ plugin_callback (GtkWidget *widget, gpointer data)
if (cbf->callback) {
DDisplay *ddisp = NULL;
DiagramData* diadata = NULL;
+ ObjectChange *change;
/* stuff from the toolbox menu should never get a diagram to modify */
if (strncmp (cbf->menupath, TOOLBOX_MENU, strlen (TOOLBOX_MENU)) != 0) {
ddisp = ddisplay_active();
diadata = ddisp ? ddisp->diagram->data : NULL;
}
- cbf->callback (diadata, ddisp ? ddisp->diagram->filename : NULL, 0, cbf->user_data);
+ change = cbf->callback (diadata, ddisp ? ddisp->diagram->filename : NULL, 0, cbf->user_data);
+ if (change != NULL) {
+ if (ddisp) {
+ undo_object_change(ddisp->diagram, NULL, change);
+ diagram_modified(ddisp->diagram);
+ diagram_update_extents(ddisp->diagram);
+ undo_set_transactionpoint(ddisp->diagram->undo);
+ } else { /* no diagram to keep the change, throw it away */
+ if (change->free)
+ change->free(change);
+ g_free(change);
+ }
+ }
}
}
diff --git a/app/undo.c b/app/undo.c
index e6a80e5..bcdd4d3 100644
--- a/app/undo.c
+++ b/app/undo.c
@@ -851,39 +851,59 @@ struct ObjectChangeChange {
ObjectChange *obj_change;
};
-
+static void
+_connections_update_func (gpointer data, gpointer user_data)
+{
+ DiaObject *obj = data;
+ Diagram *dia = (Diagram *)user_data;
+
+ diagram_update_connections_object(dia, obj, TRUE);
+}
static void
object_change_apply(struct ObjectChangeChange *change,
Diagram *dia)
{
- object_add_updates(change->obj, dia);
+ if (change->obj)
+ object_add_updates(change->obj, dia);
+
change->obj_change->apply(change->obj_change, change->obj);
- { /* Make sure object updates its data: */
+
+ if (change->obj) {
+ /* Make sure object updates its data: */
Point p = change->obj->position;
(change->obj->ops->move)(change->obj,&p);
- }
- object_add_updates(change->obj, dia);
-
- diagram_update_connections_object(dia, change->obj, TRUE);
- properties_update_if_shown(dia, change->obj);
+ object_add_updates(change->obj, dia);
+ diagram_update_connections_object(dia, change->obj, TRUE);
+ properties_update_if_shown(dia, change->obj);
+ } else {
+ /* pretty big hammer - update all connections */
+ data_foreach_object (DIA_DIAGRAM_DATA (dia), _connections_update_func, dia);
+ diagram_add_update_all(dia);
+ }
}
static void
object_change_revert(struct ObjectChangeChange *change,
Diagram *dia)
{
- object_add_updates(change->obj, dia);
+ if (change->obj)
+ object_add_updates(change->obj, dia);
+
change->obj_change->revert(change->obj_change, change->obj);
- { /* Make sure object updates its data: */
+
+ if (change->obj) {
+ /* Make sure object updates its data: */
Point p = change->obj->position;
(change->obj->ops->move)(change->obj,&p);
- }
- object_add_updates(change->obj, dia);
-
- diagram_update_connections_object(dia, change->obj, TRUE);
- properties_update_if_shown(dia, change->obj);
+ object_add_updates(change->obj, dia);
+ diagram_update_connections_object(dia, change->obj, TRUE);
+ properties_update_if_shown(dia, change->obj);
+ } else {
+ data_foreach_object (DIA_DIAGRAM_DATA (dia), _connections_update_func, dia);
+ diagram_add_update_all(dia);
+ }
}
static void
diff --git a/lib/filter.h b/lib/filter.h
index 803d5c8..2d68691 100644
--- a/lib/filter.h
+++ b/lib/filter.h
@@ -75,10 +75,10 @@ struct _DiaImportFilter {
};
/* gets called as menu callback */
-typedef void (* DiaCallbackFunc) (DiagramData *dia,
- const gchar *filename, /* the original filename */
- guint flags, /* further additions */
- void* user_data);
+typedef ObjectChange * (* DiaCallbackFunc) (DiagramData *dia,
+ const gchar *filename, /* the original filename */
+ guint flags, /* further additions */
+ void* user_data);
struct _DiaCallbackFilter {
const gchar *action;
diff --git a/lib/libdia.def b/lib/libdia.def
index fa55e43..530cafd 100644
--- a/lib/libdia.def
+++ b/lib/libdia.def
@@ -81,6 +81,9 @@ EXPORTS
calculate_arrow_point
+ change_list_add
+ change_list_create
+
color_convert
color_equals
color_init
diff --git a/lib/objchange.c b/lib/objchange.c
index 7695e84..3530662 100644
--- a/lib/objchange.c
+++ b/lib/objchange.c
@@ -155,6 +155,7 @@ void
change_list_add (ObjectChange *change_list, ObjectChange *change)
{
ObjectChangeList *list = (ObjectChangeList *)change_list;
-
- g_ptr_array_add (list->changes, change);
+
+ if (change)
+ g_ptr_array_add (list->changes, change);
}
diff --git a/plug-ins/cairo/diacairo-print.c b/plug-ins/cairo/diacairo-print.c
index 4b4a130..2721297 100644
--- a/plug-ins/cairo/diacairo-print.c
+++ b/plug-ins/cairo/diacairo-print.c
@@ -233,7 +233,7 @@ create_print_operation (DiagramData *data, const char *name)
return operation;
}
-void
+ObjectChange *
cairo_print_callback (DiagramData *data,
const gchar *filename,
guint flags, /* further additions */
@@ -248,4 +248,5 @@ cairo_print_callback (DiagramData *data,
message_error (error->message);
g_error_free (error);
}
+ return NULL;
}
diff --git a/plug-ins/cairo/diacairo-print.h b/plug-ins/cairo/diacairo-print.h
index ffce88e..526e9bf 100644
--- a/plug-ins/cairo/diacairo-print.h
+++ b/plug-ins/cairo/diacairo-print.h
@@ -8,7 +8,7 @@ GtkPrintOperation *
create_print_operation (DiagramData *data,
const char *name);
-void
+ObjectChange *
cairo_print_callback (DiagramData *dia,
const gchar *filename,
guint flags, /* further additions */
diff --git a/plug-ins/cairo/diacairo.c b/plug-ins/cairo/diacairo.c
index 363198f..d32b630 100644
--- a/plug-ins/cairo/diacairo.c
+++ b/plug-ins/cairo/diacairo.c
@@ -453,16 +453,18 @@ static DiaExportFilter wmf_export_filter = {
FILTER_DONT_GUESS /* don't use this if not asked explicit */
};
-void
+static ObjectChange *
cairo_clipboard_callback (DiagramData *data,
const gchar *filename,
guint flags, /* further additions */
void *user_data)
{
- g_return_if_fail ((OutputKind)user_data == OUTPUT_CLIPBOARD);
- g_return_if_fail (data != NULL);
+ g_return_val_if_fail ((OutputKind)user_data == OUTPUT_CLIPBOARD, NULL);
+ g_return_val_if_fail (data != NULL, NULL);
/* filename is not necessary */
- export_data (data, filename, filename, user_data);
+ export_data (data, filename, filename, user_data);
+
+ return NULL;
}
static DiaCallbackFilter cb_clipboard = {
diff --git a/plug-ins/postscript/postscript.c b/plug-ins/postscript/postscript.c
index 9af45ac..26b2223 100644
--- a/plug-ins/postscript/postscript.c
+++ b/plug-ins/postscript/postscript.c
@@ -29,7 +29,7 @@
#include "render_eps.h"
#include "paginate_psprint.h"
-static void
+static ObjectChange *
print_callback (DiagramData *data,
const gchar *filename,
guint flags, /* further additions */
@@ -39,6 +39,7 @@ print_callback (DiagramData *data,
message_error (_("Nothing to print"));
else
diagram_print_ps (data, filename ? filename : "output.ps");
+ return NULL;
}
static DiaCallbackFilter cb_ps_print = {
diff --git a/plug-ins/python/diamodule.c b/plug-ins/python/diamodule.c
index 01a0b2e..f03c6c6 100644
--- a/plug-ins/python/diamodule.c
+++ b/plug-ins/python/diamodule.c
@@ -342,13 +342,13 @@ PyDia_RegisterImport(PyObject *self, PyObject *args)
* It needs to be registered before via Python function
* dia.register_action (or dia.register_callback)
*/
-static void
+static ObjectChange *
PyDia_callback_func (DiagramData *dia, const gchar *filename, guint flags, void *user_data)
{
PyObject *diaobj, *res, *arg, *func = user_data;
if (!func || !PyCallable_Check (func)) {
g_warning ("Callback called without valid callback function.");
- return;
+ return NULL;
}
if (dia)
@@ -369,6 +369,8 @@ PyDia_callback_func (DiagramData *dia, const gchar *filename, guint flags, void
Py_DECREF(func);
Py_XDECREF(diaobj);
+
+ return NULL;
}
static PyObject *
diff --git a/plug-ins/stress/stress.c b/plug-ins/stress/stress.c
index f746a96..1df306e 100644
--- a/plug-ins/stress/stress.c
+++ b/plug-ins/stress/stress.c
@@ -27,7 +27,7 @@
#include "stress-memory.h"
-static void
+static ObjectChange *
stress_memory_callback (DiagramData *data,
const gchar *filename,
guint flags, /* further additions */
@@ -51,6 +51,7 @@ stress_memory_callback (DiagramData *data,
} else {
message_error ("Failed to calculate available memory.");
}
+ return NULL;
}
static DiaCallbackFilter cb_stress_memory = {
diff --git a/plug-ins/wmf/wmf.cpp b/plug-ins/wmf/wmf.cpp
index 6524b0e..5a1e55d 100644
--- a/plug-ins/wmf/wmf.cpp
+++ b/plug-ins/wmf/wmf.cpp
@@ -1478,7 +1478,7 @@ static DiaExportFilter emf_export_filter = {
};
#ifdef G_OS_WIN32
-static void
+static ObjectChange *
print_callback (DiagramData *data,
const gchar *filename,
guint flags,
@@ -1488,6 +1488,7 @@ print_callback (DiagramData *data,
message_error (_("Nothing to print"));
else
diagram_print_gdi (data, filename);
+ return NULL;
}
static DiaCallbackFilter cb_gdi_print = {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]