[libgda] Added the GdauiSet::source-model-changed signal



commit 590bb5067d1ee94799c97d7465584aba0c900833
Author: Vivien Malerba <malerba gnome-db org>
Date:   Wed Jul 28 17:37:00 2010 +0200

    Added the GdauiSet::source-model-changed signal
    
    the only visible user visible change there is in the GdauiEntryCombo
    widget

 libgda-ui/data-entries/gdaui-entry-combo.c |   27 ++++++++++++++++-
 libgda-ui/gdaui-set.c                      |   44 ++++++++++++++++++++++++++-
 libgda-ui/gdaui-set.h                      |    3 +-
 3 files changed, 70 insertions(+), 4 deletions(-)
---
diff --git a/libgda-ui/data-entries/gdaui-entry-combo.c b/libgda-ui/data-entries/gdaui-entry-combo.c
index 6ec77a2..1bd1799 100644
--- a/libgda-ui/data-entries/gdaui-entry-combo.c
+++ b/libgda-ui/data-entries/gdaui-entry-combo.c
@@ -238,6 +238,25 @@ gdaui_entry_combo_new (GdauiSet *paramlist, GdauiSetSource *source)
 	return GTK_WIDGET (obj);
 }
 
+static void
+uiset_source_model_changed_cb (GdauiSet *paramlist, GdauiSetSource *source, GdauiEntryCombo* combo)
+{
+	if (source == combo->priv->source) {
+		GSList *list, *values = NULL;
+		for (list = source->source->nodes; list; list = list->next) {
+			const GValue *cvalue;
+			cvalue = gda_holder_get_value (GDA_SET_NODE (list->data)->holder);
+			values = g_slist_append (values, (GValue *) cvalue);
+		}
+		gdaui_combo_set_model (GDAUI_COMBO (combo->priv->combo_entry),
+				       source->source->data_model,
+				       combo->priv->source->shown_n_cols, 
+				       combo->priv->source->shown_cols_index);
+		_gdaui_combo_set_selected_ext (GDAUI_COMBO (combo->priv->combo_entry), values, NULL);
+		g_slist_free (values);
+	}
+}
+
 /*
  * _gdaui_entry_combo_construct
  * @combo: a #GdauiEntryCombo object to be construced
@@ -262,6 +281,8 @@ void _gdaui_entry_combo_construct (GdauiEntryCombo* combo, GdauiSet *paramlist,
 	combo->priv->paramlist = paramlist;
 	combo->priv->source = source;
 	g_object_ref (G_OBJECT (paramlist));
+	g_signal_connect (paramlist, "source-model-changed",
+			  G_CALLBACK (uiset_source_model_changed_cb), combo);
 
 	/* create the ComboNode structures, 
 	 * and use the values provided by the parameters to display the correct row */
@@ -318,8 +339,12 @@ gdaui_entry_combo_dispose (GObject *object)
 	combo = GDAUI_ENTRY_COMBO (object);
 
 	if (combo->priv) {
-		if (combo->priv->paramlist) 
+		if (combo->priv->paramlist) {
+			g_signal_handlers_disconnect_by_func (combo->priv->paramlist,
+							      G_CALLBACK (uiset_source_model_changed_cb),
+							      combo);
 			g_object_unref (combo->priv->paramlist);
+		}
 
 		if (combo->priv->combo_nodes) {
 			GSList *list;
diff --git a/libgda-ui/gdaui-set.c b/libgda-ui/gdaui-set.c
index 7b65a0b..2a353c8 100644
--- a/libgda-ui/gdaui-set.c
+++ b/libgda-ui/gdaui-set.c
@@ -1,6 +1,6 @@
 /* gdaui-set.c
  *
- * Copyright (C) 2009 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2010 Vivien Malerba <malerba gnome-db org>
  *
  * This Library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public License as
@@ -38,6 +38,7 @@ static void gdaui_set_get_property (GObject *object,
 				    GParamSpec *pspec);
 
 static void wrapped_set_public_data_changed_cb (GdaSet *wset, GdauiSet *set);
+static void wrapped_set_source_model_changed_cb (GdaSet *wset, GdaSetSource *source, GdauiSet *set);
 static void clean_public_data (GdauiSet *set);
 static void compute_public_data (GdauiSet *set);
 static void compute_shown_columns_index (GdauiSetSource *dsource);
@@ -61,10 +62,11 @@ enum {
 /* signals */
 enum {
 	PUBLIC_DATA_CHANGED,
+	SOURCE_MODEL_CHANGED,
 	LAST_SIGNAL
 };
 
-static gint gdaui_set_signals[LAST_SIGNAL] = { 0 };
+static gint gdaui_set_signals[LAST_SIGNAL] = { 0, 0 };
 
 GType
 _gdaui_set_get_type (void)
@@ -103,6 +105,8 @@ gdaui_set_class_init (GdauiSetClass *class)
          * @set: the #GdauiSet
          * 
          * Gets emitted when @set's public data (#GdauiSetGroup or #GdauiSetSource values) have changed
+	 *
+	 * Since: 4.2
          */
         gdaui_set_signals[PUBLIC_DATA_CHANGED] =
                 g_signal_new ("public-data-changed",
@@ -111,8 +115,24 @@ gdaui_set_class_init (GdauiSetClass *class)
                               G_STRUCT_OFFSET (GdauiSetClass, public_data_changed),
                               NULL, NULL,
                               _gdaui_marshal_VOID__VOID, G_TYPE_NONE, 0);
+	/**
+         * GdauiSet::source-model-changed
+         * @set: the #GdauiSet
+         * 
+         * Gets emitted when the data model used in @set's #GdauiSetSource has changed
+	 *
+	 * Since: 4.2
+         */
+        gdaui_set_signals[SOURCE_MODEL_CHANGED] =
+                g_signal_new ("source-model-changed",
+                              G_TYPE_FROM_CLASS (object_class),
+                              G_SIGNAL_RUN_FIRST,
+                              G_STRUCT_OFFSET (GdauiSetClass, public_data_changed),
+                              NULL, NULL,
+                              _gdaui_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER);
 
         class->public_data_changed = NULL;
+        class->source_model_changed = NULL;
 
 	/* Properties */
         object_class->set_property = gdaui_set_set_property;
@@ -160,6 +180,9 @@ gdaui_set_dispose (GObject *object)
                 if (set->priv->set) {
                         g_signal_handlers_disconnect_by_func (G_OBJECT (set->priv->set),
                                                               G_CALLBACK (wrapped_set_public_data_changed_cb), set);
+                        g_signal_handlers_disconnect_by_func (G_OBJECT (set->priv->set),
+                                                              G_CALLBACK (wrapped_set_source_model_changed_cb), set);
+
                         g_object_unref (set->priv->set);
                         set->priv->set = NULL;
                 }
@@ -192,6 +215,8 @@ gdaui_set_set_property (GObject *object,
 			compute_public_data (set);
 			g_signal_connect (set->priv->set, "public-data-changed",
 					  G_CALLBACK (wrapped_set_public_data_changed_cb), set);
+			g_signal_connect (set->priv->set, "source-model-changed",
+					  G_CALLBACK (wrapped_set_source_model_changed_cb), set);
 		}
 		break;
 	default:
@@ -209,6 +234,21 @@ wrapped_set_public_data_changed_cb (GdaSet *wset, GdauiSet *set)
 }
 
 static void
+wrapped_set_source_model_changed_cb (GdaSet *wset, GdaSetSource *source, GdauiSet *set)
+{
+	GdauiSetSource *uisource;
+	GSList *list;
+	for (list = set->sources_list; list; list = list->next) {
+		if (((GdauiSetSource*) list->data)->source == source) {
+			uisource = (GdauiSetSource*) list->data;
+			break;
+		}
+	}
+	if (uisource)
+		g_signal_emit (set, gdaui_set_signals[SOURCE_MODEL_CHANGED], 0, uisource);
+}
+
+static void
 clean_public_data (GdauiSet *set)
 {
 	GSList *list;
diff --git a/libgda-ui/gdaui-set.h b/libgda-ui/gdaui-set.h
index 705e7e9..7fa86c1 100644
--- a/libgda-ui/gdaui-set.h
+++ b/libgda-ui/gdaui-set.h
@@ -88,6 +88,7 @@ struct _GdauiSetClass
 {
 	GObjectClass       parent_class;
 	void             (*public_data_changed)   (GdauiSet *set);
+	void             (*source_model_changed)  (GdauiSet *set, GdauiSetSource *source);
 };
 
 /* 
@@ -96,7 +97,7 @@ struct _GdauiSetClass
 GType             _gdaui_set_get_type            (void) G_GNUC_CONST;
 
 GdauiSet         *_gdaui_set_new                 (GdaSet *set);
-GdauiSetGroup    *_gdaui_set_get_group          (GdauiSet *dbset, GdaHolder *holder);
+GdauiSetGroup    *_gdaui_set_get_group           (GdauiSet *dbset, GdaHolder *holder);
 
 G_END_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]