aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilip Withnall <philip.withnall@collabora.co.uk>2010-08-30 17:06:03 +0800
committerPhilip Withnall <philip.withnall@collabora.co.uk>2010-08-30 18:05:23 +0800
commit788b62fd3efbfefcd2788772693af497d0123dc6 (patch)
tree49f092ee1d69a0b3914417fd0071e4732607085c
parent7373f750b996baae4d229952a4e2a0140820487c (diff)
downloadgsoc2013-empathy-788b62fd3efbfefcd2788772693af497d0123dc6.tar
gsoc2013-empathy-788b62fd3efbfefcd2788772693af497d0123dc6.tar.gz
gsoc2013-empathy-788b62fd3efbfefcd2788772693af497d0123dc6.tar.bz2
gsoc2013-empathy-788b62fd3efbfefcd2788772693af497d0123dc6.tar.lz
gsoc2013-empathy-788b62fd3efbfefcd2788772693af497d0123dc6.tar.xz
gsoc2013-empathy-788b62fd3efbfefcd2788772693af497d0123dc6.tar.zst
gsoc2013-empathy-788b62fd3efbfefcd2788772693af497d0123dc6.zip
Force all toggle buttons in the linking UI to update on each toggle event
This ensures that the toggle buttons for different instances of the same Individual in the list always display in the correct state. Closes: bgo#628123
-rw-r--r--libempathy-gtk/empathy-individual-linker.c44
1 files changed, 39 insertions, 5 deletions
diff --git a/libempathy-gtk/empathy-individual-linker.c b/libempathy-gtk/empathy-individual-linker.c
index 94c95cbdc..a44e0bf11 100644
--- a/libempathy-gtk/empathy-individual-linker.c
+++ b/libempathy-gtk/empathy-individual-linker.c
@@ -66,6 +66,8 @@ typedef struct {
EmpathyIndividualView *individual_view; /* child widget */
GtkWidget *preview_widget; /* child widget */
EmpathyPersonaStore *persona_store; /* owned */
+ GtkTreeViewColumn *toggle_column; /* child widget */
+ GtkCellRenderer *toggle_renderer; /* child widget */
FolksIndividual *start_individual; /* owned, allow-none */
FolksIndividual *new_individual; /* owned, allow-none */
@@ -118,6 +120,21 @@ contact_toggle_cell_data_func (GtkTreeViewColumn *tree_column,
}
static void
+update_toggle_renderers (EmpathyIndividualLinker *self)
+{
+ EmpathyIndividualLinkerPriv *priv = GET_PRIV (self);
+
+ /* Re-setting the cell data func to the same function causes a refresh of the
+ * entire column, ensuring that each toggle button is correctly active or
+ * inactive. This is necessary because one Individual might appear multiple
+ * times in the list (in different groups), so toggling one instance of the
+ * Individual should toggle all of them. */
+ gtk_tree_view_column_set_cell_data_func (priv->toggle_column,
+ priv->toggle_renderer,
+ (GtkTreeCellDataFunc) contact_toggle_cell_data_func, self, NULL);
+}
+
+static void
link_individual (EmpathyIndividualLinker *self,
FolksIndividual *individual)
{
@@ -137,6 +154,11 @@ link_individual (EmpathyIndividualLinker *self,
g_list_copy (folks_individual_get_personas (individual)));
folks_individual_set_personas (priv->new_individual, new_persona_list);
g_list_free (new_persona_list);
+
+ /* Update the toggle renderers, so that if this Individual is listed in
+ * another group in the EmpathyIndividualView, the toggle button for that
+ * group is updated. */
+ update_toggle_renderers (self);
}
static void
@@ -166,6 +188,11 @@ unlink_individual (EmpathyIndividualLinker *self,
new_persona_list = g_list_reverse (new_persona_list);
folks_individual_set_personas (priv->new_individual, new_persona_list);
g_list_free (new_persona_list);
+
+ /* Update the toggle renderers, so that if this Individual is listed in
+ * another group in the EmpathyIndividualView, the toggle button for that
+ * group is updated. */
+ update_toggle_renderers (self);
}
static void
@@ -296,7 +323,6 @@ set_up (EmpathyIndividualLinker *self)
{
EmpathyIndividualLinkerPriv *priv;
EmpathyIndividualManager *individual_manager;
- GtkCellRenderer *cell_renderer;
GtkWidget *top_vbox;
GtkPaned *paned;
GtkWidget *label, *scrolled_window, *search_bar;
@@ -348,12 +374,20 @@ set_up (EmpathyIndividualLinker *self)
(GCallback) individual_view_drag_persona_received_cb, self);
/* Add a checkbox column to the selector */
- cell_renderer = gtk_cell_renderer_toggle_new ();
- g_signal_connect (cell_renderer, "toggled", (GCallback) row_toggled_cb, self);
- gtk_tree_view_insert_column_with_data_func (
- GTK_TREE_VIEW (priv->individual_view), 0, NULL, cell_renderer,
+ priv->toggle_renderer = gtk_cell_renderer_toggle_new ();
+ g_signal_connect (priv->toggle_renderer, "toggled",
+ (GCallback) row_toggled_cb, self);
+
+ priv->toggle_column = gtk_tree_view_column_new ();
+ gtk_tree_view_column_pack_start (priv->toggle_column, priv->toggle_renderer,
+ FALSE);
+ gtk_tree_view_column_set_cell_data_func (priv->toggle_column,
+ priv->toggle_renderer,
(GtkTreeCellDataFunc) contact_toggle_cell_data_func, self, NULL);
+ gtk_tree_view_insert_column (GTK_TREE_VIEW (priv->individual_view),
+ priv->toggle_column, 0);
+
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);