[gimp] app: add signal GimpImage::update_vectors() and have the image manage updates
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: add signal GimpImage::update_vectors() and have the image manage updates
- Date: Fri, 17 Sep 2010 09:35:20 +0000 (UTC)
commit 6bce0641d4a92877310705819696afd9d38f82d2
Author: Michael Natterer <mitch gimp org>
Date: Fri Sep 17 11:31:57 2010 +0200
app: add signal GimpImage::update_vectors() and have the image manage updates
...just as we do for drawables. Connect to adding, removing, modifying
and toggling visibility of all vectors and emit "update-vectors"
accordingly. Add an update-vectors signal handler to GimpDisplayShell
and remove all other vectors handlers.
app/core/gimpimage-private.h | 4 +
app/core/gimpimage.c | 112 +++++++++++++++++++++++++++++
app/core/gimpimage.h | 5 ++
app/display/gimpdisplayshell-handlers.c | 117 +++++-------------------------
app/display/gimpdisplayshell.h | 4 -
5 files changed, 141 insertions(+), 101 deletions(-)
---
diff --git a/app/core/gimpimage-private.h b/app/core/gimpimage-private.h
index 92e5aed..f05c5e0 100644
--- a/app/core/gimpimage-private.h
+++ b/app/core/gimpimage-private.h
@@ -78,6 +78,10 @@ struct _GimpImagePrivate
GQuark channel_name_changed_handler;
GQuark channel_color_changed_handler;
+ GimpTreeHandler *vectors_freeze_handler;
+ GimpTreeHandler *vectors_thaw_handler;
+ GimpTreeHandler *vectors_visible_handler;
+
GimpLayer *floating_sel; /* the FS layer */
GimpChannel *selection_mask; /* the selection mask channel */
diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c
index c67bf80..8f914b2 100644
--- a/app/core/gimpimage.c
+++ b/app/core/gimpimage.c
@@ -63,6 +63,7 @@
#include "gimpsamplepoint.h"
#include "gimpselection.h"
#include "gimptemplate.h"
+#include "gimptreehandler.h"
#include "gimpundostack.h"
#include "file/file-utils.h"
@@ -101,6 +102,7 @@ enum
EXPORTED,
UPDATE_GUIDE,
UPDATE_SAMPLE_POINT,
+ UPDATE_VECTORS,
SAMPLE_POINT_ADDED,
SAMPLE_POINT_REMOVED,
PARASITE_ATTACHED,
@@ -189,6 +191,18 @@ static void gimp_image_channel_name_changed (GimpChannel *channel,
GimpImage *image);
static void gimp_image_channel_color_changed (GimpChannel *channel,
GimpImage *image);
+static void gimp_image_vectors_freeze (GimpVectors *vectors,
+ GimpImage *image);
+static void gimp_image_vectors_thaw (GimpVectors *vectors,
+ GimpImage *image);
+static void gimp_image_vectors_visible (GimpVectors *vectors,
+ GimpImage *image);
+static void gimp_image_vectors_add (GimpContainer *container,
+ GimpVectors *vectors,
+ GimpImage *image);
+static void gimp_image_vectors_remove (GimpContainer *container,
+ GimpVectors *vectors,
+ GimpImage *image);
static void gimp_image_active_layer_notify (GimpItemTree *tree,
const GParamSpec *pspec,
GimpImage *image);
@@ -428,6 +442,16 @@ gimp_image_class_init (GimpImageClass *klass)
G_TYPE_NONE, 1,
G_TYPE_POINTER);
+ gimp_image_signals[UPDATE_VECTORS] =
+ g_signal_new ("update-vectors",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GimpImageClass, update_vectors),
+ NULL, NULL,
+ gimp_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1,
+ GIMP_TYPE_VECTORS);
+
gimp_image_signals[SAMPLE_POINT_ADDED] =
g_signal_new ("sample-point-added",
G_TYPE_FROM_CLASS (klass),
@@ -529,6 +553,7 @@ gimp_image_class_init (GimpImageClass *klass)
klass->exported = NULL;
klass->update_guide = NULL;
klass->update_sample_point = NULL;
+ klass->update_vectors = NULL;
klass->sample_point_added = NULL;
klass->sample_point_removed = NULL;
klass->parasite_attached = NULL;
@@ -678,6 +703,26 @@ gimp_image_init (GimpImage *image)
G_CALLBACK (gimp_image_channel_remove),
image);
+ private->vectors_freeze_handler =
+ gimp_tree_handler_connect (private->vectors->container, "freeze",
+ G_CALLBACK (gimp_image_vectors_freeze),
+ image);
+ private->vectors_thaw_handler =
+ gimp_tree_handler_connect (private->vectors->container, "thaw",
+ G_CALLBACK (gimp_image_vectors_thaw),
+ image);
+ private->vectors_visible_handler =
+ gimp_tree_handler_connect (private->vectors->container, "visibility-changed",
+ G_CALLBACK (gimp_image_vectors_visible),
+ image);
+
+ g_signal_connect (private->vectors->container, "add",
+ G_CALLBACK (gimp_image_vectors_add),
+ image);
+ g_signal_connect (private->vectors->container, "remove",
+ G_CALLBACK (gimp_image_vectors_remove),
+ image);
+
private->floating_sel = NULL;
private->selection_mask = NULL;
@@ -879,6 +924,22 @@ gimp_image_dispose (GObject *object)
gimp_image_channel_remove,
image);
+ gimp_tree_handler_disconnect (private->vectors_freeze_handler);
+ private->vectors_freeze_handler = NULL;
+
+ gimp_tree_handler_disconnect (private->vectors_thaw_handler);
+ private->vectors_thaw_handler = NULL;
+
+ gimp_tree_handler_disconnect (private->vectors_visible_handler);
+ private->vectors_visible_handler = NULL;
+
+ g_signal_handlers_disconnect_by_func (private->vectors->container,
+ gimp_image_vectors_add,
+ image);
+ g_signal_handlers_disconnect_by_func (private->vectors->container,
+ gimp_image_vectors_remove,
+ image);
+
gimp_container_foreach (private->layers->container,
(GFunc) gimp_item_removed, NULL);
gimp_container_foreach (private->channels->container,
@@ -1380,6 +1441,46 @@ gimp_image_channel_color_changed (GimpChannel *channel,
}
static void
+gimp_image_vectors_freeze (GimpVectors *vectors,
+ GimpImage *image)
+{
+ /* do nothing */
+}
+
+static void
+gimp_image_vectors_thaw (GimpVectors *vectors,
+ GimpImage *image)
+{
+ if (gimp_item_get_visible (GIMP_ITEM (vectors)))
+ gimp_image_update_vectors (image, vectors);
+}
+
+static void
+gimp_image_vectors_visible (GimpVectors *vectors,
+ GimpImage *image)
+{
+ gimp_image_update_vectors (image, vectors);
+}
+
+static void
+gimp_image_vectors_add (GimpContainer *container,
+ GimpVectors *vectors,
+ GimpImage *image)
+{
+ if (gimp_item_get_visible (GIMP_ITEM (vectors)))
+ gimp_image_update_vectors (image, vectors);
+}
+
+static void
+gimp_image_vectors_remove (GimpContainer *container,
+ GimpVectors *vectors,
+ GimpImage *image)
+{
+ if (gimp_item_get_visible (GIMP_ITEM (vectors)))
+ gimp_image_update_vectors (image, vectors);
+}
+
+static void
gimp_image_active_layer_notify (GimpItemTree *tree,
const GParamSpec *pspec,
GimpImage *image)
@@ -2009,6 +2110,17 @@ gimp_image_update_sample_point (GimpImage *image,
}
void
+gimp_image_update_vectors (GimpImage *image,
+ GimpVectors *vectors)
+{
+ g_return_if_fail (GIMP_IS_IMAGE (image));
+ g_return_if_fail (GIMP_IS_VECTORS (vectors));
+
+ g_signal_emit (image, gimp_image_signals[UPDATE_VECTORS], 0,
+ vectors);
+}
+
+void
gimp_image_sample_point_added (GimpImage *image,
GimpSamplePoint *sample_point)
{
diff --git a/app/core/gimpimage.h b/app/core/gimpimage.h
index b792623..36c9828 100644
--- a/app/core/gimpimage.h
+++ b/app/core/gimpimage.h
@@ -135,6 +135,8 @@ struct _GimpImageClass
GimpGuide *guide);
void (* update_sample_point) (GimpImage *image,
GimpSamplePoint *sample_point);
+ void (* update_vectors) (GimpImage *image,
+ GimpVectors *vectors);
void (* sample_point_added) (GimpImage *image,
GimpSamplePoint *sample_point);
void (* sample_point_removed) (GimpImage *image,
@@ -251,6 +253,9 @@ void gimp_image_update_guide (GimpImage *image,
GimpGuide *guide);
void gimp_image_update_sample_point (GimpImage *image,
GimpSamplePoint *sample_point);
+void gimp_image_update_vectors (GimpImage *image,
+ GimpVectors *vectors);
+
void gimp_image_sample_point_added (GimpImage *image,
GimpSamplePoint *sample_point);
void gimp_image_sample_point_removed (GimpImage *image,
diff --git a/app/display/gimpdisplayshell-handlers.c b/app/display/gimpdisplayshell-handlers.c
index cf80fa3..f080b74 100644
--- a/app/display/gimpdisplayshell-handlers.c
+++ b/app/display/gimpdisplayshell-handlers.c
@@ -93,6 +93,9 @@ static void gimp_display_shell_update_guide_handler (GimpImage *i
static void gimp_display_shell_update_sample_point_handler(GimpImage *image,
GimpSamplePoint *sample_point,
GimpDisplayShell *shell);
+static void gimp_display_shell_update_vectors_handler (GimpImage *image,
+ GimpVectors *vectors,
+ GimpDisplayShell *shell);
static void gimp_display_shell_invalidate_preview_handler (GimpImage *image,
GimpDisplayShell *shell);
static void gimp_display_shell_profile_changed_handler (GimpColorManaged *image,
@@ -107,19 +110,6 @@ static void gimp_display_shell_exported_handler (GimpImage *i
static void gimp_display_shell_active_vectors_handler (GimpImage *image,
GimpDisplayShell *shell);
-static void gimp_display_shell_vectors_freeze_handler (GimpVectors *vectors,
- GimpDisplayShell *shell);
-static void gimp_display_shell_vectors_thaw_handler (GimpVectors *vectors,
- GimpDisplayShell *shell);
-static void gimp_display_shell_vectors_visible_handler (GimpVectors *vectors,
- GimpDisplayShell *shell);
-static void gimp_display_shell_vectors_add_handler (GimpContainer *container,
- GimpVectors *vectors,
- GimpDisplayShell *shell);
-static void gimp_display_shell_vectors_remove_handler (GimpContainer *container,
- GimpVectors *vectors,
- GimpDisplayShell *shell);
-
static void gimp_display_shell_check_notify_handler (GObject *config,
GParamSpec *param_spec,
GimpDisplayShell *shell);
@@ -148,14 +138,12 @@ static void gimp_display_shell_quality_notify_handler (GObject *c
void
gimp_display_shell_connect (GimpDisplayShell *shell)
{
- GimpImage *image;
- GimpContainer *vectors;
+ GimpImage *image;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
g_return_if_fail (GIMP_IS_DISPLAY (shell->display));
- image = gimp_display_get_image (shell->display);
- vectors = gimp_image_get_vectors (image);
+ image = gimp_display_get_image (shell->display);
g_return_if_fail (GIMP_IS_IMAGE (image));
@@ -192,6 +180,9 @@ gimp_display_shell_connect (GimpDisplayShell *shell)
g_signal_connect (image, "update-sample-point",
G_CALLBACK (gimp_display_shell_update_sample_point_handler),
shell);
+ g_signal_connect (image, "update-vectors",
+ G_CALLBACK (gimp_display_shell_update_vectors_handler),
+ shell);
g_signal_connect (image, "invalidate-preview",
G_CALLBACK (gimp_display_shell_invalidate_preview_handler),
shell);
@@ -209,26 +200,6 @@ gimp_display_shell_connect (GimpDisplayShell *shell)
G_CALLBACK (gimp_display_shell_active_vectors_handler),
shell);
- shell->vectors_freeze_handler =
- gimp_tree_handler_connect (vectors, "freeze",
- G_CALLBACK (gimp_display_shell_vectors_freeze_handler),
- shell);
- shell->vectors_thaw_handler =
- gimp_tree_handler_connect (vectors, "thaw",
- G_CALLBACK (gimp_display_shell_vectors_thaw_handler),
- shell);
- shell->vectors_visible_handler =
- gimp_tree_handler_connect (vectors, "visibility-changed",
- G_CALLBACK (gimp_display_shell_vectors_visible_handler),
- shell);
-
- g_signal_connect (vectors, "add",
- G_CALLBACK (gimp_display_shell_vectors_add_handler),
- shell);
- g_signal_connect (vectors, "remove",
- G_CALLBACK (gimp_display_shell_vectors_remove_handler),
- shell);
-
g_signal_connect (shell->display->config,
"notify::transparency-size",
G_CALLBACK (gimp_display_shell_check_notify_handler),
@@ -297,8 +268,7 @@ gimp_display_shell_connect (GimpDisplayShell *shell)
void
gimp_display_shell_disconnect (GimpDisplayShell *shell)
{
- GimpImage *image;
- GimpContainer *vectors;
+ GimpImage *image;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
g_return_if_fail (GIMP_IS_DISPLAY (shell->display));
@@ -307,8 +277,6 @@ gimp_display_shell_disconnect (GimpDisplayShell *shell)
g_return_if_fail (GIMP_IS_IMAGE (image));
- vectors = gimp_image_get_vectors (image);
-
gimp_display_shell_icon_update_stop (shell);
g_signal_handlers_disconnect_by_func (shell->display->config,
@@ -336,22 +304,6 @@ gimp_display_shell_disconnect (GimpDisplayShell *shell)
gimp_display_shell_check_notify_handler,
shell);
- g_signal_handlers_disconnect_by_func (vectors,
- gimp_display_shell_vectors_remove_handler,
- shell);
- g_signal_handlers_disconnect_by_func (vectors,
- gimp_display_shell_vectors_add_handler,
- shell);
-
- gimp_tree_handler_disconnect (shell->vectors_visible_handler);
- shell->vectors_visible_handler = NULL;
-
- gimp_tree_handler_disconnect (shell->vectors_thaw_handler);
- shell->vectors_thaw_handler = NULL;
-
- gimp_tree_handler_disconnect (shell->vectors_freeze_handler);
- shell->vectors_freeze_handler = NULL;
-
g_signal_handlers_disconnect_by_func (image,
gimp_display_shell_active_vectors_handler,
shell);
@@ -375,6 +327,9 @@ gimp_display_shell_disconnect (GimpDisplayShell *shell)
gimp_display_shell_update_sample_point_handler,
shell);
g_signal_handlers_disconnect_by_func (image,
+ gimp_display_shell_update_vectors_handler,
+ shell);
+ g_signal_handlers_disconnect_by_func (image,
gimp_display_shell_quick_mask_changed_handler,
shell);
g_signal_handlers_disconnect_by_func (image,
@@ -520,6 +475,14 @@ gimp_display_shell_update_sample_point_handler (GimpImage *image,
}
static void
+gimp_display_shell_update_vectors_handler (GimpImage *image,
+ GimpVectors *vectors,
+ GimpDisplayShell *shell)
+{
+ gimp_display_shell_expose_vectors (shell, vectors);
+}
+
+static void
gimp_display_shell_size_changed_detailed_handler (GimpImage *image,
gint previous_origin_x,
gint previous_origin_y,
@@ -622,46 +585,6 @@ gimp_display_shell_active_vectors_handler (GimpImage *image,
}
static void
-gimp_display_shell_vectors_freeze_handler (GimpVectors *vectors,
- GimpDisplayShell *shell)
-{
- /* do nothing */
-}
-
-static void
-gimp_display_shell_vectors_thaw_handler (GimpVectors *vectors,
- GimpDisplayShell *shell)
-{
- if (gimp_item_get_visible (GIMP_ITEM (vectors)))
- gimp_display_shell_expose_vectors (shell, vectors);
-}
-
-static void
-gimp_display_shell_vectors_visible_handler (GimpVectors *vectors,
- GimpDisplayShell *shell)
-{
- gimp_display_shell_expose_vectors (shell, vectors);
-}
-
-static void
-gimp_display_shell_vectors_add_handler (GimpContainer *container,
- GimpVectors *vectors,
- GimpDisplayShell *shell)
-{
- if (gimp_item_get_visible (GIMP_ITEM (vectors)))
- gimp_display_shell_expose_vectors (shell, vectors);
-}
-
-static void
-gimp_display_shell_vectors_remove_handler (GimpContainer *container,
- GimpVectors *vectors,
- GimpDisplayShell *shell)
-{
- if (gimp_item_get_visible (GIMP_ITEM (vectors)))
- gimp_display_shell_expose_vectors (shell, vectors);
-}
-
-static void
gimp_display_shell_check_notify_handler (GObject *config,
GParamSpec *param_spec,
GimpDisplayShell *shell)
diff --git a/app/display/gimpdisplayshell.h b/app/display/gimpdisplayshell.h
index 63a6e24..3b3d313 100644
--- a/app/display/gimpdisplayshell.h
+++ b/app/display/gimpdisplayshell.h
@@ -166,10 +166,6 @@ struct _GimpDisplayShell
gint paused_count;
- GimpTreeHandler *vectors_freeze_handler;
- GimpTreeHandler *vectors_thaw_handler;
- GimpTreeHandler *vectors_visible_handler;
-
gboolean zoom_on_resize;
gboolean show_transform_preview;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]