[gimp] Registered new GimpXMPModelEntry, connected it with the XMPModel.
- From: Sven Neumann <neo src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gimp] Registered new GimpXMPModelEntry, connected it with the XMPModel.
- Date: Sun, 27 Dec 2009 12:42:38 +0000 (UTC)
commit a13e4692fb313f02025b25cc8b13f5be2736a45a
Author: Roman Joost <romanofski gimp org>
Date: Thu Jul 23 20:53:35 2009 +1000
Registered new GimpXMPModelEntry, connected it with the XMPModel.
The new entry widget now makes use of the detailed signal from the
XMPModel.
plug-ins/metadata/Makefile.am | 11 +++
plug-ins/metadata/gimpxmpmodelentry.c | 146 +++++++++++++++++++++++++++++++++
plug-ins/metadata/gimpxmpmodelentry.h | 55 ++++++++++++
plug-ins/metadata/interface.c | 56 +++++++------
4 files changed, 244 insertions(+), 24 deletions(-)
---
diff --git a/plug-ins/metadata/Makefile.am b/plug-ins/metadata/Makefile.am
index 5ea7046..4d315a9 100644
--- a/plug-ins/metadata/Makefile.am
+++ b/plug-ins/metadata/Makefile.am
@@ -1,5 +1,6 @@
## Process this file with automake to produce Makefile.in
+libgimpxmpmodelentry = libgimpxmpmodelentry.a
libgimpui = $(top_builddir)/libgimp/libgimpui-$(GIMP_API_VERSION).la
libgimpwidgets = $(top_builddir)/libgimpwidgets/libgimpwidgets-$(GIMP_API_VERSION).la
libgimp = $(top_builddir)/libgimp/libgimp-$(GIMP_API_VERSION).la
@@ -14,6 +15,14 @@ endif
AM_LDFLAGS = $(mwindows)
+noinst_LIBRARIES = libgimpxmpmodelentry.a
+
+libgimpxmpmodelentry_a_SOURCES = \
+ gimpxmpmodelentry.h \
+ gimpxmpmodelentry.c \
+ xmp-model.c \
+ xmp-model.h
+
libexecdir = $(gimpplugindir)/plug-ins
libexec_PROGRAMS = metadata
@@ -61,6 +70,8 @@ INCLUDES = \
-I$(includedir)
LDADD = \
+ $(libgimpxmpmodelentry) \
+ $(libgimp) \
$(libgimpui) \
$(libgimpwidgets) \
$(libgimp) \
diff --git a/plug-ins/metadata/gimpxmpmodelentry.c b/plug-ins/metadata/gimpxmpmodelentry.c
new file mode 100644
index 0000000..950200e
--- /dev/null
+++ b/plug-ins/metadata/gimpxmpmodelentry.c
@@ -0,0 +1,146 @@
+/* gimpxmpmodelentry.c - custom entry widget linked to the xmp model
+ *
+ * Copyright (C) 2009, Róman Joost <romanofski gimp org>
+ *
+ * This library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <string.h>
+
+#include <gtk/gtk.h>
+
+#include "xmp-schemas.h"
+#include "xmp-model.h"
+
+#include "gimpxmpmodelentry.h"
+
+
+static void gimp_xmp_model_entry_init (GimpXMPModelEntry *entry);
+
+static void gimp_entry_xmp_model_changed (XMPModel *xmp_model,
+ GtkTreeIter *iter,
+ gpointer *user_data);
+
+static void entry_changed (GimpXMPModelEntry *widget);
+
+const gchar* find_schema_prefix (const gchar *schema_uri);
+
+
+
+G_DEFINE_TYPE (GimpXMPModelEntry, gimp_xmp_model_entry, GTK_TYPE_ENTRY)
+
+#define parent_class gimp_xmp_model_entry_parent_class
+
+
+static void
+gimp_xmp_model_entry_class_init (GimpXMPModelEntryClass *klass)
+{
+}
+
+static void
+gimp_xmp_model_entry_init (GimpXMPModelEntry *entry)
+{
+ entry->schema_uri = NULL;
+ entry->property_name = NULL;
+ entry->xmp_model = NULL;
+
+ g_signal_connect (entry, "changed",
+ G_CALLBACK (entry_changed), NULL);
+}
+
+/**
+ * gimp_xmp_model_entry_new:
+ * @schema_uri: the XMP schema_uri this entry belongs to
+ * @property_name: the property name this entry changes in the XMP model
+ * @xmp_model: the xmp_model for itself
+ *
+ * Returns: a new #GimpXMPModelEntry widget
+ *
+ **/
+GtkWidget*
+gimp_xmp_model_entry_new (const gchar *schema_uri,
+ const gchar *property_name,
+ XMPModel *xmp_model)
+{
+ GimpXMPModelEntry *entry;
+ const gchar *value;
+ const gchar *signal;
+ const gchar *signal_detail;
+ const gchar *schema_prefix;
+
+ entry = g_object_new (GIMP_TYPE_XMP_MODEL_ENTRY, NULL);
+ entry->schema_uri = schema_uri;
+ entry->property_name = property_name;
+ entry->xmp_model = xmp_model;
+
+ value = xmp_model_get_scalar_property (xmp_model, schema_uri, property_name);
+ if (value != NULL)
+ gtk_entry_set_text (GTK_ENTRY (entry), value);
+ else
+ gtk_entry_set_text (GTK_ENTRY (entry), "");
+
+ schema_prefix = find_schema_prefix (schema_uri);
+ signal_detail = g_strjoin (":", schema_prefix, property_name, NULL);
+ signal = g_strjoin ("::", "property-changed", signal_detail, NULL);
+
+ g_signal_connect (xmp_model, signal,
+ G_CALLBACK (gimp_entry_xmp_model_changed),
+ entry);
+ return GTK_WIDGET (entry);
+}
+
+static void
+gimp_entry_xmp_model_changed (XMPModel *xmp_model,
+ GtkTreeIter *iter,
+ gpointer *user_data)
+{
+ GimpXMPModelEntry *entry = GIMP_XMP_MODEL_ENTRY (user_data);
+ const gchar *tree_value;
+ const gchar *property_name;
+
+ gtk_tree_model_get (GTK_TREE_MODEL (xmp_model), iter,
+ COL_XMP_NAME, &property_name,
+ COL_XMP_VALUE, &tree_value,
+ -1);
+ if (! strcmp (entry->property_name, property_name))
+ gtk_entry_set_text (GTK_ENTRY (entry), tree_value);
+
+ return;
+}
+
+
+static void
+entry_changed (GimpXMPModelEntry *entry)
+{
+ xmp_model_set_scalar_property (entry->xmp_model,
+ entry->schema_uri,
+ entry->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;
+}
diff --git a/plug-ins/metadata/gimpxmpmodelentry.h b/plug-ins/metadata/gimpxmpmodelentry.h
new file mode 100644
index 0000000..76f1908
--- /dev/null
+++ b/plug-ins/metadata/gimpxmpmodelentry.h
@@ -0,0 +1,55 @@
+/* gimpxmpmodelentry.h - custom entry widget linked to the xmp model
+ *
+ * Copyright (C) 2009, Róman Joost <romanofski gimp org>
+ *
+ * This library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GIMP_XMP_MODEL_ENTRY_H__
+#define __GIMP_XMP_MODEL_ENTRY_H__
+
+G_BEGIN_DECLS
+
+#define GIMP_TYPE_XMP_MODEL_ENTRY (gimp_xmp_model_entry_get_type ())
+#define GIMP_XMP_MODEL_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_XMP_MODEL_ENTRY, GimpXMPModelEntry))
+
+
+typedef struct _GimpXMPModelEntry GimpXMPModelEntry;
+typedef struct _GimpXMPModelEntryClass GimpXMPModelEntryClass;
+
+struct _GimpXMPModelEntry
+{
+ GtkEntry parent_instance;
+
+ const gchar *schema_uri;
+ const gchar *property_name;
+ XMPModel *xmp_model;
+};
+
+struct _GimpXMPModelEntryClass
+{
+ GtkEntryClass parent_class;
+};
+
+
+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);
+
+G_END_DECLS
+
+#endif /* __GIMP_XMP_MODEL_ENTRY_H__ */
diff --git a/plug-ins/metadata/interface.c b/plug-ins/metadata/interface.c
index 8cf9614..a2569db 100644
--- a/plug-ins/metadata/interface.c
+++ b/plug-ins/metadata/interface.c
@@ -53,6 +53,7 @@
#include "interface.h"
#include "metadata.h"
#include "xmp-encode.h"
+#include "gimpxmpmodelentry.h"
#define RESPONSE_IMPORT 1
@@ -69,10 +70,10 @@ typedef struct
} MetadataGui;
static void
-value_edited (GtkCellRendererText *cell,
- const gchar *path_string,
- const gchar *new_text,
- gpointer data)
+tree_value_edited (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ gpointer data)
{
GtkTreeModel *model = data;
GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
@@ -86,8 +87,8 @@ value_edited (GtkCellRendererText *cell,
/* FIXME: update value[] array */
/* FIXME: check widget xref and update other widget if not NULL */
gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
- COL_XMP_VALUE, new_text,
- -1);
+ COL_XMP_VALUE, new_text,
+ -1);
gtk_tree_path_free (path);
}
@@ -136,7 +137,7 @@ add_view_columns (GtkTreeView *treeview)
g_object_set (renderer, "xalign", 0.0, NULL);
g_signal_connect (renderer, "edited",
- G_CALLBACK (value_edited), model);
+ G_CALLBACK (tree_value_edited), model);
col_offset =
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
-1, _("Value"),
@@ -195,6 +196,7 @@ typedef struct
const gchar *schema;
const gchar *property_name;
GSList *widget_list;
+ MetadataGui *mgui;
} WidgetXRef;
static void
@@ -203,13 +205,18 @@ entry_changed (GtkEntry *entry,
{
WidgetXRef *xref = user_data;
- g_print ("XMP: %s %p %p %s\n", xref->property_name, entry, user_data, gtk_entry_get_text (entry)); /* FIXME */
+ xmp_model_set_scalar_property (xref->mgui->xmp_model,
+ xref->schema,
+ xref->property_name,
+ gtk_entry_get_text (entry));
+ update_icons (xref->mgui);
}
static void
register_entry_xref (GtkWidget *entry,
const gchar *schema,
- const gchar *property_name)
+ const gchar *property_name,
+ MetadataGui *mgui)
{
WidgetXRef *xref;
@@ -217,13 +224,14 @@ register_entry_xref (GtkWidget *entry,
xref->schema = schema;
xref->property_name = property_name;
xref->widget_list = g_slist_prepend (NULL, entry);
+ xref->mgui = mgui;
g_signal_connect (GTK_ENTRY (entry), "changed",
- G_CALLBACK (entry_changed), xref);
+ G_CALLBACK (entry_changed), xref);
}
static void
text_changed (GtkTextBuffer *text_buffer,
- gpointer user_data)
+ gpointer user_data)
{
WidgetXRef *xref = user_data;
GtkTextIter start;
@@ -245,11 +253,12 @@ register_text_xref (GtkTextBuffer *text_buffer,
xref->property_name = property_name;
xref->widget_list = g_slist_prepend (NULL, text_buffer);
g_signal_connect (GTK_TEXT_BUFFER (text_buffer), "changed",
- G_CALLBACK (text_changed), xref);
+ G_CALLBACK (text_changed), xref);
}
static void
-add_description_tab (GtkWidget *notebook)
+add_description_tab (GtkWidget *notebook,
+ MetadataGui *mgui)
{
GtkWidget *frame;
GtkWidget *table;
@@ -262,7 +271,7 @@ add_description_tab (GtkWidget *notebook)
gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame,
gtk_label_new (_("Description")));
gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
- /* gtk_widget_show (frame); */
+ gtk_widget_show (frame);
table = gtk_table_new (5, 2, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 6);
@@ -270,17 +279,16 @@ add_description_tab (GtkWidget *notebook)
gtk_container_add (GTK_CONTAINER (frame), table);
/* gtk_widget_show (table); */
- entry = gtk_entry_new ();
- register_entry_xref (entry, XMP_SCHEMA_DUBLIN_CORE, "title");
+ entry = gimp_xmp_model_entry_new (XMP_SCHEMA_DUBLIN_CORE, "title", mgui->xmp_model);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 0,
- _("Image _title:"), 0.0, 0.5,
- entry, 1, FALSE);
+ _("Image _title:"), 0.0, 0.5,
+ entry, 1, FALSE);
- entry = gtk_entry_new ();
- register_entry_xref (entry, XMP_SCHEMA_DUBLIN_CORE, "creator");
+ entry = gimp_xmp_model_entry_new (XMP_SCHEMA_DUBLIN_CORE, "creator", mgui->xmp_model);
+ //register_entry_xref (entry, XMP_SCHEMA_DUBLIN_CORE, "creator", mgui);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
- _("_Author:"), 0.0, 0.5,
- entry, 1, FALSE);
+ _("_Author:"), 0.0, 0.5,
+ entry, 1, FALSE);
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window),
@@ -302,7 +310,7 @@ add_description_tab (GtkWidget *notebook)
scrolled_window, 1, FALSE);
entry = gtk_entry_new ();
- register_entry_xref (entry, XMP_SCHEMA_PHOTOSHOP, "CaptionWriter");
+ register_entry_xref (entry, XMP_SCHEMA_PHOTOSHOP, "CaptionWriter", mgui);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 3,
_("Description _writer:"), 0.0, 0.5,
entry, 1, FALSE);
@@ -697,7 +705,7 @@ metadata_dialog (gint32 image_ID,
mgui.run_ok = FALSE;
/* add the tabs to the notebook */
- add_description_tab (notebook);
+ add_description_tab (notebook, &mgui);
add_copyright_tab (notebook);
add_origin_tab (notebook);
add_camera1_tab (notebook);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]