]> git.0d.be Git - empathy.git/blobdiff - src/empathy-main-window.c
Merge commit 'jtellier/video-call-button-sensitivity'
[empathy.git] / src / empathy-main-window.c
index e92817a0be4910b3845e5b5a754a6e5a18d84b14..0e71229c5076a4ab218b1849bc318f801fa13ad6 100644 (file)
 #include <libempathy/empathy-contact-manager.h>
 #include <libempathy/empathy-status-presets.h>
 
+#include <libempathy-gtk/empathy-conf.h>
 #include <libempathy-gtk/empathy-contact-dialogs.h>
 #include <libempathy-gtk/empathy-contact-list-store.h>
 #include <libempathy-gtk/empathy-contact-list-view.h>
-#include <libempathy-gtk/empathy-presence-chooser.h>
-#include <libempathy-gtk/empathy-ui-utils.h>
 #include <libempathy-gtk/empathy-geometry.h>
-#include <libempathy-gtk/empathy-conf.h>
-#include <libempathy-gtk/empathy-log-window.h>
-#include <libempathy-gtk/empathy-new-message-dialog.h>
 #include <libempathy-gtk/empathy-gtk-enum-types.h>
+#include <libempathy-gtk/empathy-new-message-dialog.h>
+#include <libempathy-gtk/empathy-log-window.h>
+#include <libempathy-gtk/empathy-presence-chooser.h>
+#include <libempathy-gtk/empathy-sound.h>
+#include <libempathy-gtk/empathy-ui-utils.h>
 
 #include <libmissioncontrol/mission-control.h>
 
@@ -94,6 +95,12 @@ typedef struct {
        GtkWidget              *presence_chooser;
        GtkWidget              *errors_vbox;
 
+       GtkRadioAction         *sort_by_name;
+       GtkRadioAction         *sort_by_status;
+       GtkRadioAction         *normal_with_avatars;
+       GtkRadioAction         *normal_size;
+       GtkRadioAction         *compact_size;
+
        GtkUIManager           *ui_manager;
        GtkAction              *view_history;
        GtkAction              *room_join_favorites;
@@ -301,7 +308,7 @@ static void
 main_window_error_edit_clicked_cb (GtkButton         *button,
                                   EmpathyMainWindow *window)
 {
-       McAccount *account;
+       EmpathyAccount *account;
        GtkWidget *error_widget;
 
        account = g_object_get_data (G_OBJECT (button), "account");
@@ -316,7 +323,7 @@ static void
 main_window_error_clear_clicked_cb (GtkButton         *button,
                                    EmpathyMainWindow *window)
 {
-       McAccount *account;
+       EmpathyAccount *account;
        GtkWidget *error_widget;
 
        account = g_object_get_data (G_OBJECT (button), "account");
@@ -327,7 +334,7 @@ main_window_error_clear_clicked_cb (GtkButton         *button,
 
 static void
 main_window_error_display (EmpathyMainWindow *window,
-                          McAccount         *account,
+                          EmpathyAccount    *account,
                           const gchar       *message)
 {
        GtkWidget *child;
@@ -348,7 +355,7 @@ main_window_error_display (EmpathyMainWindow *window,
 
                /* Just set the latest error and return */
                str = g_markup_printf_escaped ("<b>%s</b>\n%s",
-                                              mc_account_get_display_name (account),
+                                              empathy_account_get_display_name (account),
                                               message);
                gtk_label_set_markup (GTK_LABEL (label), str);
                g_free (str);
@@ -429,7 +436,7 @@ main_window_error_display (EmpathyMainWindow *window,
        gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
 
        str = g_markup_printf_escaped ("<b>%s</b>\n%s",
-                                      mc_account_get_display_name (account),
+                                      empathy_account_get_display_name (account),
                                       message);
        gtk_label_set_markup (GTK_LABEL (label), str);
        g_free (str);
@@ -481,7 +488,7 @@ main_window_update_status (EmpathyMainWindow *window, EmpathyAccountManager *man
 
 static void
 main_window_connection_changed_cb (EmpathyAccountManager *manager,
-                                  McAccount *account,
+                                  EmpathyAccount *account,
                                   TpConnectionStatusReason reason,
                                   TpConnectionStatus current,
                                   TpConnectionStatus previous,
@@ -568,11 +575,11 @@ main_window_contact_presence_changed_cb (EmpathyContactMonitor *monitor,
                                         TpConnectionPresenceType previous,
                                         EmpathyMainWindow *window)
 {
-       McAccount *account;
+       EmpathyAccount *account;
        gboolean should_play;
 
        account = empathy_contact_get_account (contact);
-       should_play = !empathy_account_manager_is_account_just_connected (window->account_manager, account);
+       should_play = !empathy_account_is_just_connected (account);
 
        if (!should_play) {
                return;
@@ -716,6 +723,120 @@ main_window_view_show_offline_cb (GtkToggleAction   *action,
        //empathy_sound_set_enabled (TRUE);
 }
 
+static void
+main_window_notify_sort_contact_cb (EmpathyConf       *conf,
+                                   const gchar       *key,
+                                   EmpathyMainWindow *window)
+{
+       gchar *str = NULL;
+
+       if (empathy_conf_get_string (conf, key, &str) && str) {
+               GType       type;
+               GEnumClass *enum_class;
+               GEnumValue *enum_value;
+
+               type = empathy_contact_list_store_sort_get_type ();
+               enum_class = G_ENUM_CLASS (g_type_class_peek (type));
+               enum_value = g_enum_get_value_by_nick (enum_class, str);
+               if (enum_value) {
+                       /* By changing the value of the GtkRadioAction,
+                          it emits a signal that calls main_window_view_sort_contacts_cb
+                          which updates the contacts list */
+                       gtk_radio_action_set_current_value (window->sort_by_name,
+                                                           enum_value->value);
+               } else {
+                       g_warning ("Wrong value for sort_criterium configuration : %s", str);
+               }
+               g_free (str);
+       }
+}
+
+static void
+main_window_view_sort_contacts_cb (GtkRadioAction    *action,
+                                  GtkRadioAction    *current,
+                                  EmpathyMainWindow *window)
+{
+       EmpathyContactListStoreSort value;
+       GSList      *group;
+       GType        type;
+       GEnumClass  *enum_class;
+       GEnumValue  *enum_value;
+
+       value = gtk_radio_action_get_current_value (action);
+       group = gtk_radio_action_get_group (action);
+
+       /* Get string from index */
+       type = empathy_contact_list_store_sort_get_type ();
+       enum_class = G_ENUM_CLASS (g_type_class_peek (type));
+       enum_value = g_enum_get_value (enum_class, g_slist_index (group, current));
+
+       if (!enum_value) {
+               g_warning ("No GEnumValue for EmpathyContactListSort with GtkRadioAction index:%d",
+                          g_slist_index (group, action));
+       } else {
+               empathy_conf_set_string (empathy_conf_get (),
+                                        EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM,
+                                        enum_value->value_nick);
+       }
+       empathy_contact_list_store_set_sort_criterium (window->list_store, value);
+}
+
+/* Matches GtkRadioAction values set in empathy-main-window.ui */
+#define CONTACT_LIST_NORMAL_SIZE_WITH_AVATARS          0
+#define CONTACT_LIST_NORMAL_SIZE                       1
+#define CONTACT_LIST_COMPACT_SIZE                      2
+
+static void
+main_window_view_contacts_list_size_cb (GtkRadioAction    *action,
+                                       GtkRadioAction    *current,
+                                       EmpathyMainWindow *window)
+{
+       gint     value;
+
+       value = gtk_radio_action_get_current_value (action);
+
+       empathy_conf_set_bool (empathy_conf_get (),
+                              EMPATHY_PREFS_UI_SHOW_AVATARS,
+                              value == CONTACT_LIST_NORMAL_SIZE_WITH_AVATARS);
+       empathy_conf_set_bool (empathy_conf_get (),
+                              EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST,
+                              value == CONTACT_LIST_COMPACT_SIZE);
+
+       empathy_contact_list_store_set_show_avatars (window->list_store,
+                                                    value == CONTACT_LIST_NORMAL_SIZE_WITH_AVATARS);
+       empathy_contact_list_store_set_is_compact (window->list_store,
+                                                  value == CONTACT_LIST_COMPACT_SIZE);
+}
+
+static void
+main_window_notify_contact_list_size_cb (EmpathyConf       *conf,
+                                        const gchar       *key,
+                                        EmpathyMainWindow *window)
+{
+       gboolean show_avatars;
+       gboolean compact_contact_list;
+       gint value = CONTACT_LIST_NORMAL_SIZE_WITH_AVATARS;
+
+       if (empathy_conf_get_bool (conf,
+                                  EMPATHY_PREFS_UI_SHOW_AVATARS,
+                                  &show_avatars)
+           && empathy_conf_get_bool (conf,
+                                     EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST,
+                                     &compact_contact_list)) {
+               if (compact_contact_list) {
+                       value = CONTACT_LIST_COMPACT_SIZE;
+               } else if (show_avatars) {
+                       value = CONTACT_LIST_NORMAL_SIZE_WITH_AVATARS;
+               } else {
+                       value = CONTACT_LIST_NORMAL_SIZE;
+               }
+       }
+       /* By changing the value of the GtkRadioAction,
+          it emits a signal that calls main_window_view_contacts_list_size_cb
+          which updates the contacts list */
+       gtk_radio_action_set_current_value (window->normal_with_avatars, value);
+}
+
 static void
 main_window_view_show_map_cb (GtkCheckMenuItem  *item,
                              EmpathyMainWindow *window)
@@ -728,16 +849,13 @@ main_window_view_show_map_cb (GtkCheckMenuItem  *item,
 static void
 main_window_favorite_chatroom_join (EmpathyChatroom *chatroom)
 {
-       EmpathyAccountManager *manager;
-       McAccount      *account;
+       EmpathyAccount *account;
        TpConnection   *connection;
        const gchar    *room;
 
-       manager = empathy_account_manager_dup_singleton ();
        account = empathy_chatroom_get_account (chatroom);
-       connection = empathy_account_manager_get_connection (manager, account);
+       connection = empathy_account_get_connection (account);
        room = empathy_chatroom_get_room (chatroom);
-       g_object_unref (manager);
 
        if (connection != NULL) {
                DEBUG ("Requesting channel for '%s'", room);
@@ -1008,7 +1126,7 @@ main_window_configure_event_cb (GtkWidget         *widget,
 
 static void
 main_window_account_created_or_deleted_cb (EmpathyAccountManager  *manager,
-                                          McAccount              *account,
+                                          EmpathyAccount         *account,
                                           EmpathyMainWindow      *window)
 {
        gtk_action_set_sensitive (window->view_history,
@@ -1027,56 +1145,6 @@ main_window_notify_show_offline_cb (EmpathyConf *conf,
        }
 }
 
-static void
-main_window_notify_show_avatars_cb (EmpathyConf        *conf,
-                                   const gchar       *key,
-                                   EmpathyMainWindow *window)
-{
-       gboolean show_avatars;
-
-       if (empathy_conf_get_bool (conf, key, &show_avatars)) {
-               empathy_contact_list_store_set_show_avatars (window->list_store,
-                                                           show_avatars);
-       }
-}
-
-static void
-main_window_notify_compact_contact_list_cb (EmpathyConf        *conf,
-                                           const gchar       *key,
-                                           EmpathyMainWindow *window)
-{
-       gboolean compact_contact_list;
-
-       if (empathy_conf_get_bool (conf, key, &compact_contact_list)) {
-               empathy_contact_list_store_set_is_compact (window->list_store,
-                                                         compact_contact_list);
-       }
-}
-
-static void
-main_window_notify_sort_criterium_cb (EmpathyConf       *conf,
-                                     const gchar       *key,
-                                     EmpathyMainWindow *window)
-{
-       gchar *str = NULL;
-
-       if (empathy_conf_get_string (conf, key, &str) && str) {
-               GType       type;
-               GEnumClass *enum_class;
-               GEnumValue *enum_value;
-
-               type = empathy_contact_list_store_sort_get_type ();
-               enum_class = G_ENUM_CLASS (g_type_class_peek (type));
-               enum_value = g_enum_get_value_by_nick (enum_class, str);
-               g_free (str);
-
-               if (enum_value) {
-                       empathy_contact_list_store_set_sort_criterium (window->list_store,
-                                                                      enum_value->value);
-               }
-       }
-}
-
 static void
 main_window_connection_items_setup (EmpathyMainWindow *window,
                                    GtkBuilder        *gui)
@@ -1118,8 +1186,6 @@ empathy_main_window_show (void)
        GtkAction                *show_map_widget;
        GtkToolItem              *item;
        gboolean                  show_offline;
-       gboolean                  show_avatars;
-       gboolean                  compact_contact_list;
        gint                      x, y, w, h;
        gchar                    *filename;
        GSList                   *l;
@@ -1139,6 +1205,11 @@ empathy_main_window_show (void)
                                       "errors_vbox", &window->errors_vbox,
                                       "ui_manager", &window->ui_manager,
                                       "view_show_offline", &show_offline_widget,
+                                      "view_sort_by_name", &window->sort_by_name,
+                                      "view_sort_by_status", &window->sort_by_status,
+                                      "view_normal_size_with_avatars", &window->normal_with_avatars,
+                                      "view_normal_size", &window->normal_size,
+                                      "view_compact_size", &window->compact_size,
                                       "view_history", &window->view_history,
                                       "view_show_map", &show_map_widget,
                                       "room_join_favorites", &window->room_join_favorites,
@@ -1159,6 +1230,8 @@ empathy_main_window_show (void)
                              "chat_add_contact", "activate", main_window_chat_add_contact_cb,
                              "view_show_ft_manager", "activate", main_window_view_show_ft_manager,
                              "view_show_offline", "toggled", main_window_view_show_offline_cb,
+                             "view_sort_by_name", "changed", main_window_view_sort_contacts_cb,
+                             "view_normal_size_with_avatars", "changed", main_window_view_contacts_list_size_cb,
                              "view_show_map", "activate", main_window_view_show_map_cb,
                              "edit", "activate", main_window_edit_cb,
                              "edit_accounts", "activate", main_window_edit_accounts_cb,
@@ -1310,34 +1383,29 @@ empathy_main_window_show (void)
 
        gtk_toggle_action_set_active (show_offline_widget, show_offline);
 
-       /* Show avatars ? */
-       empathy_conf_get_bool (conf,
-                             EMPATHY_PREFS_UI_SHOW_AVATARS,
-                             &show_avatars);
+       /* Sort by name / by status ? */
        empathy_conf_notify_add (conf,
-                               EMPATHY_PREFS_UI_SHOW_AVATARS,
-                               (EmpathyConfNotifyFunc) main_window_notify_show_avatars_cb,
-                               window);
-       empathy_contact_list_store_set_show_avatars (window->list_store, show_avatars);
+                                EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM,
+                                (EmpathyConfNotifyFunc) main_window_notify_sort_contact_cb,
+                                window);
 
-       /* Is compact ? */
-       empathy_conf_get_bool (conf,
-                             EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST,
-                             &compact_contact_list);
-       empathy_conf_notify_add (conf,
-                               EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST,
-                               (EmpathyConfNotifyFunc) main_window_notify_compact_contact_list_cb,
-                               window);
-       empathy_contact_list_store_set_is_compact (window->list_store, compact_contact_list);
+       main_window_notify_sort_contact_cb (conf,
+                                           EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM,
+                                           window);
 
-       /* Sort criterium */
+       /* Contacts list size */
        empathy_conf_notify_add (conf,
-                               EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM,
-                               (EmpathyConfNotifyFunc) main_window_notify_sort_criterium_cb,
-                               window);
-       main_window_notify_sort_criterium_cb (conf,
-                                             EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM,
-                                             window);
+                                EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST,
+                                (EmpathyConfNotifyFunc) main_window_notify_contact_list_size_cb,
+                                window);
+       empathy_conf_notify_add (conf,
+                                EMPATHY_PREFS_UI_SHOW_AVATARS,
+                                (EmpathyConfNotifyFunc) main_window_notify_contact_list_size_cb,
+                                window);
+
+       main_window_notify_contact_list_size_cb (conf,
+                                                EMPATHY_PREFS_UI_SHOW_AVATARS,
+                                                window);
 
        main_window_update_status (window, window->account_manager);