[gimp] Make use of the XMPModel widget interface.
- From: Roman Joost <romanofski src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Make use of the XMPModel widget interface.
- Date: Fri, 14 May 2010 08:21:35 +0000 (UTC)
commit 45a8d2c63ce83a1757840edff383a7280820e8a7
Author: Roman Joost <roman bromeco de>
Date: Sun May 9 21:53:22 2010 +1000
Make use of the XMPModel widget interface.
The GtkEntry is re-factored to use the XMPModel based interface.
plug-ins/metadata/gimpxmpmodelentry.c | 230 ++++----------------------------
plug-ins/metadata/gimpxmpmodelentry.h | 17 ++-
plug-ins/metadata/gimpxmpmodeltext.c | 4 +-
plug-ins/metadata/gimpxmpmodelwidget.c | 45 ++++++-
4 files changed, 77 insertions(+), 219 deletions(-)
---
diff --git a/plug-ins/metadata/gimpxmpmodelentry.c b/plug-ins/metadata/gimpxmpmodelentry.c
index c935813..0a62c0c 100644
--- a/plug-ins/metadata/gimpxmpmodelentry.c
+++ b/plug-ins/metadata/gimpxmpmodelentry.c
@@ -25,77 +25,37 @@
#include "xmp-schemas.h"
#include "xmp-model.h"
+#include "gimpxmpmodelwidget.h"
#include "gimpxmpmodelentry.h"
-enum
-{
- PROP_0,
- PROP_SCHEMA_URI,
- PROP_PROPERTY_NAME,
- PROP_XMPMODEL
-};
-
-typedef struct
-{
- const gchar *schema_uri;
- const gchar *property_name;
- XMPModel *xmp_model;
-} GimpXmpModelEntryPrivate;
+static void gimp_xmp_model_entry_iface_init (GimpXmpModelWidgetInterface *iface);
+static void gimp_xmp_model_entry_set_text (GimpXmpModelWidget *widget,
+ const gchar *tree_value);
-static void gimp_xmp_model_entry_set_property (GObject *object,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec);
-static void gimp_xmp_model_entry_get_property (GObject *object,
- guint property_id,
- GValue *value,
- GParamSpec *pspec);
-static void gimp_entry_xmp_model_changed (XMPModel *xmp_model,
- GtkTreeIter *iter,
- gpointer *user_data);
+static void gimp_xmp_model_entry_changed (GimpXmpModelEntry *entry);
-static void gimp_xmp_model_entry_entry_changed (GimpXmpModelEntry *widget);
-const gchar * find_schema_prefix (const gchar *schema_uri);
-static void set_property_edit_icon (GimpXmpModelEntry *entry,
- GtkTreeIter *iter);
+G_DEFINE_TYPE_WITH_CODE (GimpXmpModelEntry, gimp_xmp_model_entry,
+ GTK_TYPE_ENTRY,
+ G_IMPLEMENT_INTERFACE (GIMP_TYPE_XMP_MODEL_WIDGET,
+ gimp_xmp_model_entry_iface_init))
-G_DEFINE_TYPE (GimpXmpModelEntry, gimp_xmp_model_entry, GTK_TYPE_ENTRY)
-
#define parent_class gimp_xmp_model_entry_parent_class
-#define GIMP_XMP_MODEL_ENTRY_GET_PRIVATE(obj) \
- ((GimpXmpModelEntryPrivate *) GIMP_XMP_MODEL_ENTRY (obj)->priv)
-
static GObject *
gimp_xmp_model_entry_constructor (GType type,
guint n_params,
GObjectConstructParam *params)
{
- GObject *obj;
- GimpXmpModelEntry *entry;
- GimpXmpModelEntryPrivate *priv;
- gchar *signal;
+ GObject *obj;
obj = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params);
- entry = GIMP_XMP_MODEL_ENTRY (obj);
-
- priv = GIMP_XMP_MODEL_ENTRY_GET_PRIVATE (entry);
-
- signal = g_strdup_printf ("property-changed::%s:%s",
- find_schema_prefix (priv->schema_uri),
- priv->property_name);
-
- g_signal_connect (priv->xmp_model, signal,
- G_CALLBACK (gimp_entry_xmp_model_changed),
- entry);
-
- g_free (signal);
+ gimp_xmp_model_widget_constructor (obj);
return obj;
}
@@ -106,179 +66,37 @@ gimp_xmp_model_entry_class_init (GimpXmpModelEntryClass *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->constructor = gimp_xmp_model_entry_constructor;
- object_class->set_property = gimp_xmp_model_entry_set_property;
- object_class->get_property = gimp_xmp_model_entry_get_property;
-
- g_object_class_install_property (object_class, PROP_SCHEMA_URI,
- g_param_spec_string ("schema-uri", NULL, NULL,
- NULL,
- G_PARAM_CONSTRUCT_ONLY |
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class, PROP_PROPERTY_NAME,
- g_param_spec_string ("property-name", NULL, NULL,
- NULL,
- G_PARAM_CONSTRUCT_ONLY |
- G_PARAM_READWRITE));
+ object_class->set_property = gimp_xmp_model_widget_set_property;
+ object_class->get_property = gimp_xmp_model_widget_get_property;
- g_object_class_install_property (object_class, PROP_XMPMODEL,
- g_param_spec_object ("xmp-model", NULL, NULL,
- GIMP_TYPE_XMP_MODEL,
- G_PARAM_CONSTRUCT_ONLY |
- GIMP_PARAM_READWRITE));
-
- g_type_class_add_private (klass, sizeof (GimpXmpModelEntryPrivate));
+ gimp_xmp_model_widget_install_properties (object_class);
}
static void
gimp_xmp_model_entry_init (GimpXmpModelEntry *entry)
{
- entry->priv = G_TYPE_INSTANCE_GET_PRIVATE (entry,
- GIMP_TYPE_XMP_MODEL_ENTRY,
- GimpXmpModelEntryPrivate);
-
g_signal_connect (entry, "changed",
- G_CALLBACK (gimp_xmp_model_entry_entry_changed),
+ G_CALLBACK (gimp_xmp_model_entry_changed),
NULL);
}
static void
-gimp_xmp_model_entry_set_property (GObject *object,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GimpXmpModelEntryPrivate *priv = GIMP_XMP_MODEL_ENTRY_GET_PRIVATE (object);
-
- switch (property_id)
- {
- case PROP_SCHEMA_URI:
- priv->schema_uri = g_value_dup_string (value);
- break;
-
- case PROP_PROPERTY_NAME:
- priv->property_name = g_value_dup_string (value);
- break;
-
- case PROP_XMPMODEL:
- priv->xmp_model = g_value_dup_object (value);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-gimp_xmp_model_entry_get_property (GObject *object,
- guint property_id,
- GValue *value,
- GParamSpec *pspec)
+gimp_xmp_model_entry_iface_init (GimpXmpModelWidgetInterface *iface)
{
- GimpXmpModelEntryPrivate *priv = GIMP_XMP_MODEL_ENTRY_GET_PRIVATE (object);
-
- switch (property_id)
- {
- case PROP_SCHEMA_URI:
- g_value_set_string (value, priv->schema_uri);
- break;
-
- case PROP_PROPERTY_NAME:
- g_value_set_string (value, priv->property_name);
- break;
-
- case PROP_XMPMODEL:
- g_value_set_object (value, priv->xmp_model);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
+ iface->widget_set_text = gimp_xmp_model_entry_set_text;
}
static void
-gimp_entry_xmp_model_changed (XMPModel *xmp_model,
- GtkTreeIter *iter,
- gpointer *user_data)
+gimp_xmp_model_entry_set_text (GimpXmpModelWidget *widget,
+ const gchar *tree_value)
{
- GimpXmpModelEntry *entry = GIMP_XMP_MODEL_ENTRY (user_data);
- GimpXmpModelEntryPrivate *priv = GIMP_XMP_MODEL_ENTRY_GET_PRIVATE (entry);
- const gchar *tree_value;
- const gchar *property_name;
- GdkPixbuf *icon;
-
- gtk_tree_model_get (GTK_TREE_MODEL (xmp_model), iter,
- COL_XMP_NAME, &property_name,
- COL_XMP_VALUE, &tree_value,
- COL_XMP_EDIT_ICON, &icon,
- -1);
-
- if (! strcmp (priv->property_name, property_name))
- gtk_entry_set_text (GTK_ENTRY (entry), tree_value);
-
- if (icon == NULL)
- set_property_edit_icon (entry, iter);
-
- return;
+ gtk_entry_set_text (GTK_ENTRY (widget), tree_value);
}
-
static void
-gimp_xmp_model_entry_entry_changed (GimpXmpModelEntry *entry)
+gimp_xmp_model_entry_changed (GimpXmpModelEntry *entry)
{
- GimpXmpModelEntryPrivate *priv = GIMP_XMP_MODEL_ENTRY_GET_PRIVATE (entry);
-
- xmp_model_set_scalar_property (priv->xmp_model,
- priv->schema_uri,
- priv->property_name,
- gtk_entry_get_text (GTK_ENTRY (entry)));
-}
-
-/* find the schema prefix for the given URI */
-const gchar*
-find_schema_prefix (const gchar *schema_uri)
-{
- int i;
-
- for (i = 0; xmp_schemas[i].uri != NULL; ++i)
- {
- if (! strcmp (xmp_schemas[i].uri, schema_uri))
- return xmp_schemas[i].prefix;
- }
- return NULL;
-}
-
-static void
-set_property_edit_icon (GimpXmpModelEntry *entry,
- GtkTreeIter *iter)
-{
- GimpXmpModelEntryPrivate *priv = GIMP_XMP_MODEL_ENTRY_GET_PRIVATE (entry);
- GdkPixbuf *icon;
- gboolean editable;
-
- gtk_tree_model_get (GTK_TREE_MODEL (priv->xmp_model), iter,
- COL_XMP_EDITABLE, &editable,
- COL_XMP_EDIT_ICON, &icon,
- -1);
-
- if (editable == XMP_AUTO_UPDATE)
- {
- icon = gtk_widget_render_icon (GTK_WIDGET (entry), GIMP_STOCK_WILBER,
- GTK_ICON_SIZE_MENU, NULL);
- gtk_tree_store_set (GTK_TREE_STORE (priv->xmp_model), iter,
- COL_XMP_EDIT_ICON, icon,
- -1);
- }
- else if (editable == TRUE)
- {
- icon = gtk_widget_render_icon (GTK_WIDGET (entry), GTK_STOCK_EDIT,
- GTK_ICON_SIZE_MENU, NULL);
- gtk_tree_store_set (GTK_TREE_STORE (priv->xmp_model), iter,
- COL_XMP_EDIT_ICON, icon,
- -1);
- }
-
- return;
+ const gchar *value = gtk_entry_get_text (GTK_ENTRY (entry));
+ gimp_xmp_model_widget_changed (GIMP_XMP_MODEL_WIDGET (entry),
+ value);
}
diff --git a/plug-ins/metadata/gimpxmpmodelentry.h b/plug-ins/metadata/gimpxmpmodelentry.h
index 601634d..0acb8f4 100644
--- a/plug-ins/metadata/gimpxmpmodelentry.h
+++ b/plug-ins/metadata/gimpxmpmodelentry.h
@@ -37,6 +37,11 @@ typedef struct _GimpXmpModelEntryClass GimpXmpModelEntryClass;
struct _GimpXmpModelEntryClass
{
GtkEntryClass parent_class;
+
+ void (*gimp_xmp_model_set_text) (GimpXmpModelEntry *entry,
+ const gchar *value);
+
+ const gchar * (*gimp_xmp_model_get_text) (GimpXmpModelEntry *entry);
};
struct _GimpXmpModelEntry
@@ -46,12 +51,16 @@ struct _GimpXmpModelEntry
};
-GType gimp_xmp_model_entry_get_type (void) G_GNUC_CONST;
+GType gimp_xmp_model_entry_get_type (void) G_GNUC_CONST;
+
+GtkWidget * gimp_xmp_model_entry_new (const gchar *schema_uri,
+ const gchar *property,
+ XMPModel *xmp_model);
-GtkWidget * gimp_xmp_model_entry_new (const gchar *schema_uri,
- const gchar *property,
- XMPModel *xmp_model);
+void gimp_xmp_model_set_text (GimpXmpModelEntry *entry,
+ const gchar *value);
+const gchar * gimp_xmp_model_get_text (GimpXmpModelEntry *entry);
G_END_DECLS
diff --git a/plug-ins/metadata/gimpxmpmodeltext.c b/plug-ins/metadata/gimpxmpmodeltext.c
index fe12124..8f683ec 100644
--- a/plug-ins/metadata/gimpxmpmodeltext.c
+++ b/plug-ins/metadata/gimpxmpmodeltext.c
@@ -48,8 +48,8 @@ G_DEFINE_TYPE_WITH_CODE (GimpXmpModelText, gimp_xmp_model_text,
static GObject *
gimp_xmp_model_text_constructor (GType type,
- guint n_params,
- GObjectConstructParam *params)
+ guint n_params,
+ GObjectConstructParam *params)
{
GObject *obj;
diff --git a/plug-ins/metadata/gimpxmpmodelwidget.c b/plug-ins/metadata/gimpxmpmodelwidget.c
index dea298f..726bac9 100644
--- a/plug-ins/metadata/gimpxmpmodelwidget.c
+++ b/plug-ins/metadata/gimpxmpmodelwidget.c
@@ -1,4 +1,5 @@
-/* gimpxmpmodelwidget.c - interface definition for xmpmodel gtkwidgets
+/* gimpxmpmodelwidget.c - interface definition for XMPModel bound
+ * GTKWidgets
*
* Copyright (C) 2010, Róman Joost <romanofski gimp org>
*
@@ -47,7 +48,7 @@ static void gimp_xmp_model_widget_iface_base_init (GimpXmpModelWidgetInter
static GimpXmpModelWidgetPrivate *
gimp_xmp_model_widget_get_private (GimpXmpModelWidget *widget);
-static void gimp_widget_xmp_model_changed (XMPModel *xmp_model,
+static void gimp_xmp_model_widget_xmpmodel_changed (XMPModel *xmp_model,
GtkTreeIter *iter,
gpointer *user_data);
@@ -57,6 +58,7 @@ void set_property_edit_icon (GtkWidget *wid
XMPModel *xmp_model,
GtkTreeIter *iter);
+
GType
gimp_xmp_model_widget_interface_get_type (void)
{
@@ -149,7 +151,7 @@ gimp_xmp_model_widget_constructor (GObject *object)
priv->property_name);
g_signal_connect (priv->xmp_model, signal,
- G_CALLBACK (gimp_widget_xmp_model_changed),
+ G_CALLBACK (gimp_xmp_model_widget_xmpmodel_changed),
widget);
g_free (signal);
@@ -237,10 +239,20 @@ gimp_xmp_model_widget_get_private (GimpXmpModelWidget *widget)
return private;
}
+/**
+ * gimp_xmp_model_widget_xmpmodel_changed:
+ * @xmp_model: XMPModel this widget is bound to.
+ * @iter: The iter which points to the last change in the XMPModel
+ * @user_data: which should be the GtkWidget displaying the value.
+ *
+ * If the XMPModel has been changed, the GtkWidget needs to be updated.
+ * This method updates the corresponding GtkWidget with the new value
+ * from the XMPModel.
+ **/
static void
-gimp_widget_xmp_model_changed (XMPModel *xmp_model,
- GtkTreeIter *iter,
- gpointer *user_data)
+gimp_xmp_model_widget_xmpmodel_changed (XMPModel *xmp_model,
+ GtkTreeIter *iter,
+ gpointer *user_data)
{
GimpXmpModelWidget *widget = GIMP_XMP_MODEL_WIDGET (user_data);
GimpXmpModelWidgetPrivate *priv = GIMP_XMP_MODEL_WIDGET_GET_PRIVATE (widget);
@@ -263,6 +275,14 @@ gimp_widget_xmp_model_changed (XMPModel *xmp_model,
return;
}
+/**
+ * gimp_xmp_model_widget_set_text:
+ * @widget: The GtkWidget where the new value is set.
+ * @tree_value: The new string which will be set on the widget.
+ *
+ * This method sets the new value on the GtkWidget implementing the
+ * #GimpXmpModelWidgetInterface.
+ **/
void
gimp_xmp_model_widget_set_text (GimpXmpModelWidget *widget,
const gchar *tree_value)
@@ -275,9 +295,16 @@ gimp_xmp_model_widget_set_text (GimpXmpModelWidget *widget,
iface->widget_set_text (widget, tree_value);
}
+/**
+ * gimp_xmp_model_widget_changed:
+ * @widget: The GtkWidget which was changed.
+ * @value: The new string from the GtkWidget.
+ *
+ * If the GtkWidget was changed, a new value is set in the #XMPModel.
+ **/
void
gimp_xmp_model_widget_changed (GimpXmpModelWidget *widget,
- const gchar *value)
+ const gchar *value)
{
GimpXmpModelWidgetPrivate *priv = GIMP_XMP_MODEL_WIDGET_GET_PRIVATE (widget);
@@ -287,6 +314,10 @@ gimp_xmp_model_widget_changed (GimpXmpModelWidget *widget,
value);
}
+/**
+ * utility methods
+ **/
+
/* find the schema prefix for the given URI */
const gchar*
find_schema_prefix (const gchar *schema_uri)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]