Emit HildonTouchSelector:changed when a selected row changes
authorClaudio Saavedra <csaavedra@igalia.com>
Tue, 5 May 2009 11:35:46 +0000 (14:35 +0300)
committerClaudio Saavedra <csaavedra@igalia.com>
Tue, 5 May 2009 12:14:58 +0000 (15:14 +0300)
* hildon/hildon-touch-selector.c
(+on_row_changed): Emit HildonTouchSelector:changed when the
contents of a selected row change.
(_create_new_column), (_hildon_touch_selector_set_model): connect
to GtkTreeModel:row-changed on a newly set model.

Fixes: NB#114253 (HildonPickerButton not refreshing its value)

ChangeLog
hildon/hildon-touch-selector.c

index 2616def..b989f6b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2009-05-05  Claudio Saavedra  <csaavedra@igalia.com>
+
+       * hildon/hildon-touch-selector.c
+       (+on_row_changed): Emit HildonTouchSelector:changed when the
+       contents of a selected row change.
+       (_create_new_column), (_hildon_touch_selector_set_model): connect
+       to GtkTreeModel:row-changed on a newly set model.
+
+       Fixes: NB#114253 (HildonPickerButton not refreshing its value)
+
 2009-05-05  Alberto Garcia  <agarcia@igalia.com>
 
        Based on a patch by Mox Soini (ext-mox.soini@nokia.com)
index 4ab005d..6a4d323 100644 (file)
@@ -261,6 +261,12 @@ static gboolean
 on_realize_cb                                  (GtkWidget *widget,
                                                 gpointer data);
 static void
+on_row_changed                                 (GtkTreeModel *model,
+                                                GtkTreePath *path,
+                                                GtkTreeIter *iter,
+                                                gpointer userdata);
+
+static void
 hildon_touch_selector_scroll_to (HildonTouchSelectorColumn *column,
                                  GtkTreeView *tv,
                                  GtkTreePath *path);
@@ -710,6 +716,8 @@ _create_new_column (HildonTouchSelector * selector,
   GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (tv), GTK_CAN_FOCUS);
 
   gtk_tree_view_set_model (tv, model);
+  g_signal_connect (model, "row-changed",
+                    G_CALLBACK (on_row_changed), selector);
   gtk_tree_view_set_rules_hint (tv, TRUE);
 
   gtk_tree_view_append_column (GTK_TREE_VIEW (tv), tree_column);
@@ -1815,6 +1823,31 @@ hildon_touch_selector_get_model (HildonTouchSelector * selector, gint column)
 }
 
 static void
+on_row_changed (GtkTreeModel *model,
+                GtkTreePath *path,
+                GtkTreeIter *iter,
+                gpointer userdata)
+{
+  HildonTouchSelector *selector;
+  HildonTouchSelectorColumn *current_column;
+
+  gint column = 0;
+  GSList *col;
+
+  selector = HILDON_TOUCH_SELECTOR (userdata);
+
+  for (col = selector->priv->columns; col != NULL; col = col->next) {
+    current_column = HILDON_TOUCH_SELECTOR_COLUMN (col->data);
+    if (current_column->priv->model == model &&
+        gtk_tree_selection_path_is_selected (gtk_tree_view_get_selection (current_column->priv->tree_view),
+                                             path)) {
+      hildon_touch_selector_emit_value_changed (selector, column);
+    }
+    column ++;
+  }
+}
+
+static void
 _hildon_touch_selector_set_model (HildonTouchSelector * selector,
                                   gint column, GtkTreeModel * model)
 {
@@ -1823,9 +1856,15 @@ _hildon_touch_selector_set_model (HildonTouchSelector * selector,
   current_column =
     HILDON_TOUCH_SELECTOR_COLUMN (g_slist_nth_data (selector->priv->columns, column));
 
+  if (current_column->priv->model) {
+    g_signal_handlers_disconnect_by_func (current_column->priv->model,
+                                          on_row_changed, selector);
+  }
   current_column->priv->model = model;
   gtk_tree_view_set_model (current_column->priv->tree_view,
                            current_column->priv->model);
+  g_signal_connect (model, "row-changed",
+                    G_CALLBACK (on_row_changed), selector);
 }
 
 /**