From f6314b48969f62912f2a463d13b75f723c5e637c Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Fri, 1 Oct 2010 08:59:56 +0200 Subject: [PATCH] app: add GimpCanvasProxyGroup which is a group that keeps a mapping between arbitrary pointers and canvas items. No MVC whatsoever yet, just a simple hash table. --- app/display/Makefile.am | 2 + app/display/gimpcanvasproxygroup.c | 203 +++++++++++++++++++++++++++++ app/display/gimpcanvasproxygroup.h | 64 +++++++++ 3 files changed, 269 insertions(+) create mode 100644 app/display/gimpcanvasproxygroup.c create mode 100644 app/display/gimpcanvasproxygroup.h diff --git a/app/display/Makefile.am b/app/display/Makefile.am index 6e44f88017..5d45ccdf91 100644 --- a/app/display/Makefile.am +++ b/app/display/Makefile.am @@ -37,6 +37,8 @@ libappdisplay_a_sources = \ gimpcanvasline.h \ gimpcanvaspolygon.c \ gimpcanvaspolygon.h \ + gimpcanvasproxygroup.c \ + gimpcanvasproxygroup.h \ gimpcanvasrectangle.c \ gimpcanvasrectangle.h \ gimpcanvassamplepoint.c \ diff --git a/app/display/gimpcanvasproxygroup.c b/app/display/gimpcanvasproxygroup.c new file mode 100644 index 0000000000..e190359ed8 --- /dev/null +++ b/app/display/gimpcanvasproxygroup.c @@ -0,0 +1,203 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimpcanvasproxygroup.c + * Copyright (C) 2010 Michael Natterer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "config.h" + +#include +#include + +#include "libgimpbase/gimpbase.h" +#include "libgimpmath/gimpmath.h" + +#include "display-types.h" + +#include "gimpcanvas.h" +#include "gimpcanvasproxygroup.h" +#include "gimpdisplayshell.h" +#include "gimpdisplayshell-style.h" +#include "gimpdisplayshell-transform.h" + + +enum +{ + PROP_0 +}; + + +typedef struct _GimpCanvasProxyGroupPrivate GimpCanvasProxyGroupPrivate; + +struct _GimpCanvasProxyGroupPrivate +{ + GHashTable *proxy_hash; +}; + +#define GET_PRIVATE(proxy_group) \ + G_TYPE_INSTANCE_GET_PRIVATE (proxy_group, \ + GIMP_TYPE_CANVAS_PROXY_GROUP, \ + GimpCanvasProxyGroupPrivate) + + +/* local function prototypes */ + +static void gimp_canvas_proxy_group_finalize (GObject *object); +static void gimp_canvas_proxy_group_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec); +static void gimp_canvas_proxy_group_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec); + + +G_DEFINE_TYPE (GimpCanvasProxyGroup, gimp_canvas_proxy_group, + GIMP_TYPE_CANVAS_GROUP) + +#define parent_class gimp_canvas_proxy_group_parent_class + + +static void +gimp_canvas_proxy_group_class_init (GimpCanvasProxyGroupClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = gimp_canvas_proxy_group_finalize; + object_class->set_property = gimp_canvas_proxy_group_set_property; + object_class->get_property = gimp_canvas_proxy_group_get_property; + + g_type_class_add_private (klass, sizeof (GimpCanvasProxyGroupPrivate)); +} + +static void +gimp_canvas_proxy_group_init (GimpCanvasProxyGroup *proxy_group) +{ + GimpCanvasProxyGroupPrivate *private = GET_PRIVATE (proxy_group); + + private->proxy_hash = g_hash_table_new (g_direct_hash, g_direct_equal); +} + +static void +gimp_canvas_proxy_group_finalize (GObject *object) +{ + GimpCanvasProxyGroupPrivate *private = GET_PRIVATE (object); + + if (private->proxy_hash) + { + g_hash_table_unref (private->proxy_hash); + private->proxy_hash = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gimp_canvas_proxy_group_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + /* GimpCanvasProxyGroupPrivate *private = GET_PRIVATE (object); */ + + switch (property_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gimp_canvas_proxy_group_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + /* GimpCanvasProxyGroupPrivate *private = GET_PRIVATE (object); */ + + switch (property_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +GimpCanvasItem * +gimp_canvas_proxy_group_new (void) +{ + return g_object_new (GIMP_TYPE_CANVAS_PROXY_GROUP, NULL); +} + +void +gimp_canvas_proxy_group_add_item (GimpCanvasProxyGroup *group, + gpointer object, + GimpCanvasItem *proxy_item) +{ + GimpCanvasProxyGroupPrivate *private; + + g_return_if_fail (GIMP_IS_CANVAS_GROUP (group)); + g_return_if_fail (object != NULL); + g_return_if_fail (GIMP_IS_CANVAS_ITEM (proxy_item)); + g_return_if_fail (GIMP_CANVAS_ITEM (group) != proxy_item); + + private = GET_PRIVATE (group); + + g_return_if_fail (g_hash_table_lookup (private->proxy_hash, object) == + NULL); + + g_hash_table_insert (private->proxy_hash, object, proxy_item); + + gimp_canvas_group_add_item (GIMP_CANVAS_GROUP (group), proxy_item); +} + +void +gimp_canvas_proxy_group_remove_item (GimpCanvasProxyGroup *group, + gpointer object, + GimpCanvasItem *proxy_item) +{ + GimpCanvasProxyGroupPrivate *private; + + g_return_if_fail (GIMP_IS_CANVAS_GROUP (group)); + g_return_if_fail (object != NULL); + g_return_if_fail (GIMP_IS_CANVAS_ITEM (proxy_item)); + + private = GET_PRIVATE (group); + + g_return_if_fail (g_hash_table_lookup (private->proxy_hash, object) == + proxy_item); + + g_hash_table_remove (private->proxy_hash, object); + + gimp_canvas_group_remove_item (GIMP_CANVAS_GROUP (group), proxy_item); +} + +GimpCanvasItem * +gimp_canvas_proxy_group_get_item (GimpCanvasProxyGroup *group, + gpointer object) +{ + GimpCanvasProxyGroupPrivate *private; + + g_return_val_if_fail (GIMP_IS_CANVAS_GROUP (group), NULL); + g_return_val_if_fail (object != NULL, NULL); + + private = GET_PRIVATE (group); + + return g_hash_table_lookup (private->proxy_hash, object); +} diff --git a/app/display/gimpcanvasproxygroup.h b/app/display/gimpcanvasproxygroup.h new file mode 100644 index 0000000000..0b29039f3e --- /dev/null +++ b/app/display/gimpcanvasproxygroup.h @@ -0,0 +1,64 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimpcanvasproxygroup.h + * Copyright (C) 2010 Michael Natterer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef __GIMP_CANVAS_PROXY_GROUP_H__ +#define __GIMP_CANVAS_PROXY_GROUP_H__ + + +#include "gimpcanvasgroup.h" + + +#define GIMP_TYPE_CANVAS_PROXY_GROUP (gimp_canvas_proxy_group_get_type ()) +#define GIMP_CANVAS_PROXY_GROUP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_CANVAS_PROXY_GROUP, GimpCanvasProxyGroup)) +#define GIMP_CANVAS_PROXY_GROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_CANVAS_PROXY_GROUP, GimpCanvasProxyGroupClass)) +#define GIMP_IS_CANVAS_PROXY_GROUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_CANVAS_PROXY_GROUP)) +#define GIMP_IS_CANVAS_PROXY_GROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_CANVAS_PROXY_GROUP)) +#define GIMP_CANVAS_PROXY_GROUP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_CANVAS_PROXY_GROUP, GimpCanvasProxyGroupClass)) + + +typedef struct _GimpCanvasProxyGroup GimpCanvasProxyGroup; +typedef struct _GimpCanvasProxyGroupClass GimpCanvasProxyGroupClass; + +struct _GimpCanvasProxyGroup +{ + GimpCanvasGroup parent_instance; +}; + +struct _GimpCanvasProxyGroupClass +{ + GimpCanvasGroupClass parent_class; +}; + + +GType gimp_canvas_proxy_group_get_type (void) G_GNUC_CONST; + +GimpCanvasItem * gimp_canvas_proxy_group_new (void); + +void gimp_canvas_proxy_group_add_item (GimpCanvasProxyGroup *group, + gpointer object, + GimpCanvasItem *proxy_item); +void gimp_canvas_proxy_group_remove_item (GimpCanvasProxyGroup *group, + gpointer object, + GimpCanvasItem *proxy_item); +GimpCanvasItem * gimp_canvas_proxy_group_get_item (GimpCanvasProxyGroup *group, + gpointer object); + + +#endif /* __GIMP_CANVAS_PROXY_GROUP_H__ */ -- GitLab