diff options
Diffstat (limited to 'src/empathy-roster-window.c')
-rw-r--r-- | src/empathy-roster-window.c | 150 |
1 files changed, 146 insertions, 4 deletions
diff --git a/src/empathy-roster-window.c b/src/empathy-roster-window.c index 34c2c2952..38adf45fa 100644 --- a/src/empathy-roster-window.c +++ b/src/empathy-roster-window.c @@ -125,6 +125,8 @@ struct _EmpathyRosterWindowPriv { GtkWidget *no_entry_label; GtkWidget *button_account_settings; GtkWidget *button_online; + GtkWidget *button_show_offline; + GtkWidget *button_add_contact; GtkWidget *spinner_loading; GtkWidget *tooltip_widget; @@ -393,14 +395,56 @@ button_online_clicked_cb (GtkButton *button, g_object_unref (mgr); } +static void +button_show_offline_clicked_cb (GtkButton *button, + EmpathyRosterWindow *self) +{ + g_settings_set_boolean (self->priv->gsettings_ui, + EMPATHY_PREFS_UI_SHOW_OFFLINE, TRUE); +} + +static void +button_add_contact_clicked_cb (GtkButton *button, + EmpathyRosterWindow *self) +{ + empathy_new_individual_dialog_show (GTK_WINDOW (self)); +} + typedef enum { PAGE_MESSAGE_FLAG_NONE = 0, PAGE_MESSAGE_FLAG_ACCOUNTS = 1 << 0, PAGE_MESSAGE_FLAG_SPINNER = 1 << 2, PAGE_MESSAGE_FLAG_ONLINE = 1 << 3, + PAGE_MESSAGE_FLAG_SHOW_OFFLINE = 1 << 4, + PAGE_MESSAGE_FLAG_ADD_CONTACT = 1 << 5, } PageMessageFlags; +static gboolean +can_add_contact (EmpathyRosterWindow *self) +{ + GList *accounts, *l; + gboolean result = FALSE; + + accounts = tp_account_manager_dup_valid_accounts ( + self->priv->account_manager); + for (l = accounts; l != NULL && !result; l = g_list_next (l)) + { + TpAccount *account = TP_ACCOUNT (l->data); + TpConnection *conn; + + conn = tp_account_get_connection (account); + if (conn == NULL) + continue; + + if (tp_connection_get_can_change_contact_list (conn)) + result = TRUE; + } + + g_list_free_full (accounts, g_object_unref); + return result; +} + static void display_page_message (EmpathyRosterWindow *self, const gchar *msg, @@ -429,6 +473,14 @@ display_page_message (EmpathyRosterWindow *self, (flags & PAGE_MESSAGE_FLAG_SPINNER) != 0); gtk_widget_set_visible (self->priv->button_online, (flags & PAGE_MESSAGE_FLAG_ONLINE) != 0); + gtk_widget_set_visible (self->priv->button_show_offline, + (flags & PAGE_MESSAGE_FLAG_SHOW_OFFLINE) != 0); + gtk_widget_set_visible (self->priv->button_add_contact, + (flags & PAGE_MESSAGE_FLAG_ADD_CONTACT) != 0); + + if ((flags & PAGE_MESSAGE_FLAG_ADD_CONTACT) != 0) + gtk_widget_set_sensitive (self->priv->button_add_contact, + can_add_contact (self)); gtk_notebook_set_current_page (GTK_NOTEBOOK (self->priv->notebook), PAGE_MESSAGE); @@ -605,6 +657,54 @@ roster_window_error_add_stock_button (GtkInfoBar *info_bar, gtk_info_bar_add_action_widget (info_bar, button, response_id); } +#ifdef HAVE_UOA +static const gchar * +uoa_account_display_string (TpAccount *account) +{ + const gchar *service; + + service = tp_account_get_service (account); + + /* Use well known service name, if available */ + if (!tp_strdiff (service, "windows-live")) + return _("Windows Live"); + else if (!tp_strdiff (service, "google-talk")) + return _("Google Talk"); + else if (!tp_strdiff (service, "facebook")) + return _("Facebook"); + + return tp_account_get_display_name (account); +} + +static void +roster_window_uoa_auth_error (EmpathyRosterWindow *self, + TpAccount *account) +{ + GtkWidget *info_bar; + GtkWidget *image; + GtkWidget *button; + gchar *str; + + /* translators: %s is an account name like 'Facebook' or 'Google Talk' */ + str = g_strdup_printf (_("%s account requires authorisation"), + uoa_account_display_string (account)); + + info_bar = roster_window_error_create_info_bar (self, account, + GTK_MESSAGE_OTHER, str); + g_free (str); + + image = gtk_image_new_from_icon_name ("credentials-preferences", + GTK_ICON_SIZE_BUTTON); + button = gtk_button_new (); + gtk_button_set_image (GTK_BUTTON (button), image); + gtk_widget_set_tooltip_text (button, _("Online Accounts")); + gtk_widget_show (button); + + gtk_info_bar_add_action_widget (GTK_INFO_BAR (info_bar), button, + ERROR_RESPONSE_EDIT); +} +#endif + static void roster_window_error_display (EmpathyRosterWindow *self, TpAccount *account) @@ -620,6 +720,17 @@ roster_window_error_display (EmpathyRosterWindow *self, if (user_requested) return; +#ifdef HAVE_UOA + if (!tp_strdiff (TP_ERROR_STR_AUTHENTICATION_FAILED, + tp_account_get_detailed_error (account, NULL)) && + !tp_strdiff (tp_account_get_storage_provider (account), + EMPATHY_UOA_PROVIDER)) + { + roster_window_uoa_auth_error (self, account); + return; + } +#endif + str = g_markup_printf_escaped ("<b>%s</b>\n%s", tp_account_get_display_name (account), error_message); @@ -657,6 +768,7 @@ roster_window_update_status (EmpathyRosterWindow *self) { gboolean connected, connecting; GList *l; + GAction *action; connected = empathy_account_manager_get_accounts_connected (&connecting); @@ -675,6 +787,10 @@ roster_window_update_status (EmpathyRosterWindow *self) /* Update widgets sensibility */ for (l = self->priv->actions_connected; l; l = l->next) g_simple_action_set_enabled (l->data, connected); + + action = g_action_map_lookup_action (G_ACTION_MAP (self), "chat_add_contact"); + if (!can_add_contact (self)) + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); } static void @@ -932,13 +1048,17 @@ empathy_roster_window_finalize (GObject *window) static gboolean roster_window_key_press_event_cb (GtkWidget *window, GdkEventKey *event, - gpointer user_data) + EmpathyRosterWindow *self) { if (event->keyval == GDK_KEY_T && event->state & GDK_SHIFT_MASK && event->state & GDK_CONTROL_MASK) empathy_chat_manager_call_undo_closed_chat (); + if (event->keyval == GDK_KEY_f + && event->state & GDK_CONTROL_MASK) + gtk_widget_show (self->priv->search_bar); + return FALSE; } @@ -1567,8 +1687,13 @@ set_notebook_page (EmpathyRosterWindow *self) } else { - display_page_message (self, _("No online contacts"), - PAGE_MESSAGE_FLAG_NONE); + if (g_settings_get_boolean (self->priv->gsettings_ui, + EMPATHY_PREFS_UI_SHOW_OFFLINE)) + display_page_message (self, _("You haven't added any contact yet"), + PAGE_MESSAGE_FLAG_ADD_CONTACT); + else + display_page_message (self, _("No online contacts"), + PAGE_MESSAGE_FLAG_SHOW_OFFLINE); } goto out; } @@ -2087,6 +2212,14 @@ roster_window_most_available_presence_changed_cb (TpAccountManager *manager, } static void +show_offline_changed_cb (GSettings *settings, + const gchar *key, + EmpathyRosterWindow *self) +{ + set_notebook_page (self); +} + +static void empathy_roster_window_init (EmpathyRosterWindow *self) { GtkBuilder *gui; @@ -2127,6 +2260,8 @@ empathy_roster_window_init (EmpathyRosterWindow *self) "roster_scrolledwindow", &sw, "button_account_settings", &self->priv->button_account_settings, "button_online", &self->priv->button_online, + "button_show_offline", &self->priv->button_show_offline, + "button_add_contact", &self->priv->button_add_contact, "spinner_loading", &self->priv->spinner_loading, NULL); g_free (filename); @@ -2135,7 +2270,7 @@ empathy_roster_window_init (EmpathyRosterWindow *self) gtk_widget_show (self->priv->main_vbox); g_signal_connect (self, "key-press-event", - G_CALLBACK (roster_window_key_press_event_cb), NULL); + G_CALLBACK (roster_window_key_press_event_cb), self); g_object_unref (gui); @@ -2278,6 +2413,9 @@ empathy_roster_window_init (EmpathyRosterWindow *self) g_settings_bind (self->priv->gsettings_ui, EMPATHY_PREFS_UI_SHOW_OFFLINE, self->priv->view, "show-offline", G_SETTINGS_BIND_GET); + tp_g_signal_connect_object (self->priv->gsettings_ui, + "changed::" EMPATHY_PREFS_UI_SHOW_OFFLINE, + G_CALLBACK (show_offline_changed_cb), self, 0); g_settings_bind (self->priv->gsettings_ui, EMPATHY_PREFS_UI_SHOW_GROUPS, self->priv->view, "show-groups", G_SETTINGS_BIND_GET); @@ -2289,6 +2427,10 @@ empathy_roster_window_init (EmpathyRosterWindow *self) G_CALLBACK (button_account_settings_clicked_cb), self); g_signal_connect (self->priv->button_online, "clicked", G_CALLBACK (button_online_clicked_cb), self); + g_signal_connect (self->priv->button_show_offline, "clicked", + G_CALLBACK (button_show_offline_clicked_cb), self); + g_signal_connect (self->priv->button_add_contact, "clicked", + G_CALLBACK (button_add_contact_clicked_cb), self); } GtkWidget * |