aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy-gtk
diff options
context:
space:
mode:
Diffstat (limited to 'libempathy-gtk')
-rw-r--r--libempathy-gtk/empathy-contact-blocking-dialog.c88
1 files changed, 62 insertions, 26 deletions
diff --git a/libempathy-gtk/empathy-contact-blocking-dialog.c b/libempathy-gtk/empathy-contact-blocking-dialog.c
index c378db3f6..81fd4d99b 100644
--- a/libempathy-gtk/empathy-contact-blocking-dialog.c
+++ b/libempathy-gtk/empathy-contact-blocking-dialog.c
@@ -46,12 +46,17 @@ G_DEFINE_TYPE (EmpathyContactBlockingDialog, empathy_contact_blocking_dialog,
struct _EmpathyContactBlockingDialogPrivate
{
- GHashTable *channels; /* TpConnection* -> TpChannel* */
+ /* a map of all active connections to their 'deny' channel */
+ GHashTable *channels; /* reffed TpConnection* -> reffed TpChannel* */
+
+ guint block_account_changed;
+
GtkListStore *blocked_contacts;
GtkListStore *completion_contacts;
GtkTreeSelection *selection;
GtkWidget *account_chooser;
+ GtkWidget *add_button;
GtkWidget *add_contact_entry;
GtkWidget *remove_button;
};
@@ -86,6 +91,40 @@ contact_blocking_dialog_filter_account_chooser (TpAccount *account,
callback (enable, callback_data);
}
+static void contact_blocking_dialog_account_changed (GtkWidget *,
+ EmpathyContactBlockingDialog *);
+
+static void
+contact_blocking_dialog_refilter_account_chooser (
+ EmpathyContactBlockingDialog *self)
+{
+ EmpathyAccountChooser *chooser =
+ EMPATHY_ACCOUNT_CHOOSER (self->priv->account_chooser);
+ TpConnection *conn;
+ gboolean enabled;
+
+ DEBUG ("Refiltering account chooser");
+
+ /* set the filter to refilter the account chooser */
+ self->priv->block_account_changed++;
+ empathy_account_chooser_set_filter (chooser,
+ contact_blocking_dialog_filter_account_chooser, self);
+ self->priv->block_account_changed--;
+
+ conn = empathy_account_chooser_get_connection (chooser);
+ enabled = (empathy_account_chooser_get_account (chooser) != NULL &&
+ conn != NULL &&
+ g_hash_table_lookup (self->priv->channels, conn) != NULL);
+
+ if (!enabled)
+ DEBUG ("No account selected");
+
+ gtk_widget_set_sensitive (self->priv->add_button, enabled);
+ gtk_widget_set_sensitive (self->priv->add_contact_entry, enabled);
+
+ contact_blocking_dialog_account_changed (self->priv->account_chooser, self);
+}
+
static void contact_blocking_dialog_inspected_handles (TpConnection *,
const char **, const GError *, gpointer, GObject *);
@@ -154,11 +193,7 @@ contact_blocking_dialog_connection_status_changed (TpAccount *account,
/* remove the channel from the hash table */
g_hash_table_remove (self->priv->channels, conn);
-
- /* set the filter again to refilter the account list */
- empathy_account_chooser_set_filter (
- EMPATHY_ACCOUNT_CHOOSER (self->priv->account_chooser),
- contact_blocking_dialog_filter_account_chooser, self);
+ contact_blocking_dialog_refilter_account_chooser (self);
break;
case TP_CONNECTION_STATUS_CONNECTING:
@@ -365,11 +400,7 @@ contact_blocking_dialog_deny_channel_prepared (GObject *channel,
g_hash_table_insert (self->priv->channels,
g_object_ref (conn), channel);
-
- /* set the filter again to refilter the account list */
- empathy_account_chooser_set_filter (
- EMPATHY_ACCOUNT_CHOOSER (self->priv->account_chooser),
- contact_blocking_dialog_filter_account_chooser, self);
+ contact_blocking_dialog_refilter_account_chooser (self);
g_signal_connect (channel, "group-members-changed",
G_CALLBACK (contact_blocking_dialog_deny_channel_members_changed), self);
@@ -523,18 +554,24 @@ contact_blocking_dialog_account_changed (GtkWidget *account_chooser,
EmpathyTpContactList *contact_list;
GList *members, *ptr;
- if (conn == NULL)
+ if (self->priv->block_account_changed > 0)
return;
- DEBUG ("Account changed: %s", get_pretty_conn_name (conn));
-
/* clear the lists of contacts */
gtk_list_store_clear (self->priv->blocked_contacts);
gtk_list_store_clear (self->priv->completion_contacts);
+ if (conn == NULL)
+ return;
+
+ DEBUG ("Account changed: %s", get_pretty_conn_name (conn));
+
/* load the deny list */
channel = g_hash_table_lookup (self->priv->channels, conn);
+ if (channel == NULL)
+ return;
+
g_return_if_fail (TP_IS_CHANNEL (channel));
blocked = tp_intset_to_array (tp_channel_group_get_members (channel));
@@ -632,6 +669,7 @@ empathy_contact_blocking_dialog_init (EmpathyContactBlockingDialog *self)
gui = empathy_builder_get_file (filename,
"contents", &contents,
"account-hbox", &account_hbox,
+ "add-button", &self->priv->add_button,
"add-contact-entry", &self->priv->add_contact_entry,
"blocked-contacts", &self->priv->blocked_contacts,
"blocked-contacts-view", &blocked_contacts_view,
@@ -650,18 +688,6 @@ empathy_contact_blocking_dialog_init (EmpathyContactBlockingDialog *self)
contents);
gtk_widget_show (contents);
- /* add the account chooser */
- self->priv->account_chooser = empathy_account_chooser_new ();
- empathy_account_chooser_set_filter (
- EMPATHY_ACCOUNT_CHOOSER (self->priv->account_chooser),
- contact_blocking_dialog_filter_account_chooser, self);
- g_signal_connect (self->priv->account_chooser, "changed",
- G_CALLBACK (contact_blocking_dialog_account_changed), self);
-
- gtk_box_pack_start (GTK_BOX (account_hbox), self->priv->account_chooser,
- TRUE, TRUE, 0);
- gtk_widget_show (self->priv->account_chooser);
-
/* set up the tree selection */
self->priv->selection = gtk_tree_view_get_selection (
GTK_TREE_VIEW (blocked_contacts_view));
@@ -680,6 +706,16 @@ empathy_contact_blocking_dialog_init (EmpathyContactBlockingDialog *self)
g_object_unref (completion);
g_object_unref (self->priv->completion_contacts);
+ /* add the account chooser */
+ self->priv->account_chooser = empathy_account_chooser_new ();
+ contact_blocking_dialog_refilter_account_chooser (self);
+ g_signal_connect (self->priv->account_chooser, "changed",
+ G_CALLBACK (contact_blocking_dialog_account_changed), self);
+
+ gtk_box_pack_start (GTK_BOX (account_hbox), self->priv->account_chooser,
+ TRUE, TRUE, 0);
+ gtk_widget_show (self->priv->account_chooser);
+
/* prepare the account manager */
am = tp_account_manager_dup ();
tp_proxy_prepare_async (am, NULL, contact_blocking_dialog_am_prepared, self);