Implemented better signal handling for property-changed events.

The XMPModel listens now on the row-changed event and checks if the row
belong to a property or schema change. If a property change occured a
detailed property-changed signal is emitted. A detailed schema-changed
signal is currently not emitted, because not implemented.
This commit is contained in:
Roman Joost 2009-09-26 20:49:04 +10:00 committed by Sven Neumann
parent a13e4692fb
commit 3705c85e1e
3 changed files with 70 additions and 20 deletions

View File

@ -31,6 +31,19 @@
#include "xmp-parse.h"
#include "xmp-model.h"
/* Used for converting row-changed events into property-changed and
* schema-changed events.*/
#define XMP_MODEL_SCHEMA 0
#define XMP_MODEL_PROPERTY 1
/* local function declarations */
static void tree_model_row_changed (GtkTreeModel *model,
GtkTreePath *path,
GtkTreeIter *iter,
gpointer user_data);
static XMPSchema * find_xmp_schema_by_iter (XMPModel *xmp_model,
GtkTreeIter *iter);
enum
{
@ -90,6 +103,10 @@ xmp_model_init (XMPModel *xmp_model)
xmp_model->custom_schemas = NULL;
xmp_model->custom_properties = NULL;
xmp_model->cached_schema = NULL;
g_signal_connect (GTK_TREE_MODEL (xmp_model), "row-changed",
G_CALLBACK (tree_model_row_changed),
NULL);
}
static void
@ -168,10 +185,53 @@ xmp_model_is_empty (XMPModel *xmp_model)
&iter);
}
/* translate a row-changed event into a property-changed or
* schema-changed event with the detail.
*/
static void
tree_model_row_changed (GtkTreeModel *model,
GtkTreePath *path,
GtkTreeIter *iter,
gpointer user_data)
{
gint depth;
XMPSchema *schema;
/* 1. check which iter depth the change was: 0 for schema 1 for
* property? */
depth = gtk_tree_store_iter_depth (GTK_TREE_STORE (model), iter);
if (depth == XMP_MODEL_SCHEMA)
{
/* 2. If a schema has changed, emit a schema changed signal */
}
if (depth == XMP_MODEL_PROPERTY)
{
schema = find_xmp_schema_by_iter (XMP_MODEL (model), iter);
xmp_model_property_changed (XMP_MODEL (model), schema, iter);
}
}
static XMPSchema *
find_xmp_schema_by_iter (XMPModel *xmp_model,
GtkTreeIter *child)
{
GtkTreeIter parent;
XMPSchema *schema;
if (! gtk_tree_model_iter_parent (GTK_TREE_MODEL (xmp_model), &parent, child))
return NULL;
gtk_tree_model_get (GTK_TREE_MODEL (xmp_model), &parent,
COL_XMP_TYPE_XREF, &schema,
-1);
return schema;
}
/* check if the given schema_uri matches a known schema; else return NULL */
static XMPSchema *
find_xmp_schema (XMPModel *xmp_model,
const gchar *schema_uri)
find_xmp_schema_by_uri (XMPModel *xmp_model,
const gchar *schema_uri)
{
int i;
GSList *list;
@ -392,9 +452,7 @@ parse_start_schema (XMPParseContext *context,
XMPSchema *schema;
g_return_val_if_fail (xmp_model != NULL, NULL);
schema = find_xmp_schema (xmp_model, ns_uri);
schema = find_xmp_schema_by_uri (xmp_model, ns_uri);
if (schema == NULL)
{
/* add schema to custom_schemas */
@ -521,7 +579,6 @@ parse_set_property (XMPParseContext *context,
COL_XMP_WEIGHT, PANGO_WEIGHT_NORMAL,
COL_XMP_WEIGHT_SET, FALSE,
-1);
xmp_model_property_changed (xmp_model, schema, &child_iter);
break;
case XMP_PTYPE_RESOURCE:
@ -859,9 +916,7 @@ xmp_model_get_scalar_property (XMPModel *xmp_model,
g_return_val_if_fail (xmp_model != NULL, NULL);
g_return_val_if_fail (schema_name != NULL, NULL);
g_return_val_if_fail (property_name != NULL, NULL);
schema = find_xmp_schema (xmp_model, schema_name);
schema = find_xmp_schema_by_uri (xmp_model, schema_name);
if (! schema)
schema = find_xmp_schema_prefix (xmp_model, schema_name);
@ -930,9 +985,7 @@ xmp_model_set_scalar_property (XMPModel *xmp_model,
g_return_val_if_fail (schema_name != NULL, FALSE);
g_return_val_if_fail (property_name != NULL, FALSE);
g_return_val_if_fail (property_value != NULL, FALSE);
schema = find_xmp_schema (xmp_model, schema_name);
schema = find_xmp_schema_by_uri (xmp_model, schema_name);
if (! schema)
schema = find_xmp_schema_prefix (xmp_model, schema_name);
@ -981,8 +1034,6 @@ xmp_model_set_scalar_property (XMPModel *xmp_model,
COL_XMP_WEIGHT, PANGO_WEIGHT_NORMAL,
COL_XMP_WEIGHT_SET, FALSE,
-1);
xmp_model_property_changed (xmp_model, schema, &child_iter);
return TRUE;
}

View File

@ -25,8 +25,8 @@ G_BEGIN_DECLS
#include <glib-object.h>
#define GIMP_TYPE_XMP_MODEL (xmp_model_get_type ())
#define XMP_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_XMP_MODEL, XMPModel))
#define XMP_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_XMP_MODEL, XMPModelClass))
#define XMP_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_XMP_MODEL, XMPModel))
#define XMP_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_XMP_MODEL, XMPModelClass))
#define GIMP_IS_XMP_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_XMP_MODEL))
#define GIMP_IS_XMP_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_XMP_MODEL))
#define GIMP_XMP_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_XMP_MODEL, XMPModelClass))
@ -114,6 +114,7 @@ gboolean xmp_model_set_scalar_property (XMPModel *xmp_model,
const gchar *property_name,
const gchar *property_value);
/* Signals */
void xmp_model_property_changed (XMPModel *xmp_model,
XMPSchema *schema,

View File

@ -122,7 +122,7 @@ scan_file (const gchar *filename)
gsize length;
GError *error;
XMPParseContext *context;
// XMPModel *xmp_model = xmp_model_new ();
XMPModel *xmp_model = xmp_model_new ();
g_print ("\nFile: %s\n", filename);
error = NULL;
@ -143,16 +143,14 @@ scan_file (const gchar *filename)
/*
* used for testing the XMPModel
*
*/
g_signal_connect (xmp_model, "property-changed::xmpMM:DocumentID",
G_CALLBACK (property_changed), NULL);
if (! xmp_model_parse_file (xmp_model, filename, &error))
{
xmp_model_free (xmp_model);
return 1;
}
*/
if (! xmp_parse_context_parse (context, contents, length, NULL))
{