]> git.0d.be Git - empathy.git/blobdiff - src/empathy-accounts-dialog.c
Merge remote-tracking branch 'jonny/ft'
[empathy.git] / src / empathy-accounts-dialog.c
index 83179a8b9f1f8afd9d217e2ef90dd5fab14a42f0..9e2fea781614e546c73271ae9d9477a1fcf3a837 100644 (file)
@@ -85,6 +85,7 @@ typedef struct {
   GtkWidget *label_status;
   GtkWidget *image_status;
   GtkWidget *throbber;
+  GtkWidget *enabled_switch;
   GtkWidget *frame_no_protocol;
 
   GtkWidget *treeview;
@@ -215,6 +216,49 @@ accounts_dialog_status_infobar_set_message (EmpathyAccountsDialog *dialog,
   g_free (message_markup);
 }
 
+static void
+accounts_dialog_enable_account_cb (GObject *account,
+    GAsyncResult *result,
+    gpointer user_data)
+{
+  GError *error = NULL;
+
+  tp_account_set_enabled_finish (TP_ACCOUNT (account), result, &error);
+
+  if (error != NULL)
+    {
+      DEBUG ("Could not enable the account: %s", error->message);
+      g_error_free (error);
+    }
+  else
+    {
+      TpAccountManager *am = tp_account_manager_dup ();
+
+      empathy_connect_new_account (TP_ACCOUNT (account), am);
+      g_object_unref (am);
+    }
+}
+
+static void
+accounts_dialog_enable_switch_active_cb (GtkSwitch *sw,
+    GParamSpec *spec,
+    EmpathyAccountsDialog *dialog)
+{
+  EmpathyAccountSettings *settings;
+  TpAccount *account;
+
+  settings = accounts_dialog_model_get_selected_settings (dialog);
+  if (settings == NULL)
+    return;
+
+  account = empathy_account_settings_get_account (settings);
+  if (account == NULL)
+    return;
+
+  tp_account_set_enabled_async (account, gtk_switch_get_active (sw),
+      accounts_dialog_enable_account_cb, NULL);
+}
+
 static void
 accounts_dialog_update_status_infobar (EmpathyAccountsDialog *dialog,
     TpAccount *account)
@@ -231,6 +275,7 @@ accounts_dialog_update_status_infobar (EmpathyAccountsDialog *dialog,
   TpAccount                 *selected_account;
   gboolean                  account_enabled;
   gboolean                  creating_account;
+  TpStorageRestrictionFlags storage_restrictions = 0;
 
   view = GTK_TREE_VIEW (priv->treeview);
   selection = gtk_tree_view_get_selection (view);
@@ -265,6 +310,8 @@ accounts_dialog_update_status_infobar (EmpathyAccountsDialog *dialog,
        * (else no icon is shown in infobar)*/
       if (!account_enabled)
         presence = TP_CONNECTION_PRESENCE_TYPE_OFFLINE;
+
+      storage_restrictions = tp_account_get_storage_restrictions (account);
     }
   else
     {
@@ -277,6 +324,18 @@ accounts_dialog_update_status_infobar (EmpathyAccountsDialog *dialog,
   gtk_image_set_from_icon_name (GTK_IMAGE (priv->image_status),
       empathy_icon_name_for_presence (presence), GTK_ICON_SIZE_SMALL_TOOLBAR);
 
+  /* update the enabled switch */
+  g_signal_handlers_block_by_func (priv->enabled_switch,
+      accounts_dialog_enable_switch_active_cb, dialog);
+  gtk_switch_set_active (GTK_SWITCH (priv->enabled_switch),
+      account_enabled);
+  g_signal_handlers_unblock_by_func (priv->enabled_switch,
+      accounts_dialog_enable_switch_active_cb, dialog);
+
+  /* Display the Enable switch if account supports it */
+  gtk_widget_set_visible (priv->enabled_switch,
+      !(storage_restrictions & TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_ENABLED));
+
   if (account_enabled)
     {
       switch (status)
@@ -1150,12 +1209,10 @@ accounts_dialog_button_remove_clicked_cb (GtkWidget *button,
 {
   EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
   GtkTreeView  *view;
-  GtkTreeModel *model;
   GtkTreeSelection *selection;
   GtkTreeIter iter;
 
   view = GTK_TREE_VIEW (priv->treeview);
-  model = gtk_tree_view_get_model (view);
   selection = gtk_tree_view_get_selection (view);
   if (!gtk_tree_selection_get_selected (selection, NULL, &iter))
       return;
@@ -1432,14 +1489,12 @@ accounts_dialog_get_settings_iter (EmpathyAccountsDialog *dialog,
     GtkTreeIter *iter)
 {
   GtkTreeView      *view;
-  GtkTreeSelection *selection;
   GtkTreeModel     *model;
   gboolean          ok;
   EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
 
   /* Update the status in the model */
   view = GTK_TREE_VIEW (priv->treeview);
-  selection = gtk_tree_view_get_selection (view);
   model = gtk_tree_view_get_model (view);
 
   for (ok = gtk_tree_model_get_iter_first (model, iter);
@@ -1469,14 +1524,12 @@ accounts_dialog_get_account_iter (EmpathyAccountsDialog *dialog,
     GtkTreeIter *iter)
 {
   GtkTreeView      *view;
-  GtkTreeSelection *selection;
   GtkTreeModel     *model;
   gboolean          ok;
   EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
 
   /* Update the status in the model */
   view = GTK_TREE_VIEW (priv->treeview);
-  selection = gtk_tree_view_get_selection (view);
   model = gtk_tree_view_get_model (view);
 
   for (ok = gtk_tree_model_get_iter_first (model, iter);
@@ -1526,11 +1579,8 @@ static void
 accounts_dialog_model_set_selected (EmpathyAccountsDialog *dialog,
     EmpathyAccountSettings *settings)
 {
-  GtkTreeSelection *selection;
   GtkTreeIter       iter;
-  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
 
-  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
   if (accounts_dialog_get_settings_iter (dialog, settings, &iter))
     select_and_scroll_to_iter (dialog, &iter);
 }
@@ -1772,14 +1822,12 @@ accounts_dialog_add_account (EmpathyAccountsDialog *dialog,
   GtkTreeIter         iter;
   TpConnectionStatus  status;
   const gchar        *name;
-  gboolean            enabled;
   EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
   gboolean selected = FALSE;
 
   model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->treeview));
   status = tp_account_get_connection_status (account, NULL);
   name = tp_account_get_display_name (account);
-  enabled = tp_account_is_enabled (account);
 
   settings = empathy_account_settings_new_for_account (account);
 
@@ -1839,7 +1887,7 @@ account_prepare_cb (GObject *source_object,
   TpAccount *account = TP_ACCOUNT (source_object);
   GError *error = NULL;
 
-  if (!tp_account_prepare_finish (account, result, &error))
+  if (!tp_proxy_prepare_finish (account, result, &error))
     {
       DEBUG ("Failed to prepare account: %s", error->message);
       g_error_free (error);
@@ -1855,7 +1903,7 @@ accounts_dialog_account_validity_changed_cb (TpAccountManager *manager,
     gboolean valid,
     EmpathyAccountsDialog *dialog)
 {
-  tp_account_prepare_async (account, NULL, account_prepare_cb, dialog);
+  tp_proxy_prepare_async (account, NULL, account_prepare_cb, dialog);
 }
 
 static void
@@ -1909,12 +1957,6 @@ enable_or_disable_account (EmpathyAccountsDialog *dialog,
     TpAccount *account,
     gboolean enabled)
 {
-  GtkTreeModel *model;
-  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
-
-  /* Update the status in the model */
-  model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->treeview));
-
   /* Update the status-infobar in the details view */
   accounts_dialog_update_status_infobar (dialog, account);
 
@@ -1977,11 +2019,8 @@ static void
 accounts_dialog_set_selected_account (EmpathyAccountsDialog *dialog,
     TpAccount *account)
 {
-  GtkTreeSelection *selection;
   GtkTreeIter       iter;
-  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
 
-  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
   if (accounts_dialog_get_account_iter (dialog, account, &iter))
     select_and_scroll_to_iter (dialog, &iter);
 }
@@ -2021,7 +2060,9 @@ accounts_dialog_cms_prepare_cb (GObject *source,
   if (!empathy_connection_managers_prepare_finish (cms, result, NULL))
     goto out;
 
-  accounts_dialog_update_settings (dialog, NULL);
+  /* No need to update the settings if we are already preparing one */
+  if (priv->settings_ready == NULL)
+    accounts_dialog_update_settings (dialog, NULL);
 
   if (priv->initial_selection != NULL)
     {
@@ -2077,7 +2118,7 @@ accounts_dialog_manager_ready_cb (GObject *source_object,
   TpAccountManager *manager = TP_ACCOUNT_MANAGER (source_object);
   GError *error = NULL;
 
-  if (!tp_account_manager_prepare_finish (manager, result, &error))
+  if (!tp_proxy_prepare_finish (manager, result, &error))
     {
       DEBUG ("Failed to prepare account manager: %s", error->message);
       g_error_free (error);
@@ -2136,9 +2177,11 @@ accounts_dialog_build_ui (EmpathyAccountsDialog *dialog)
   GtkBuilder                   *gui;
   gchar                        *filename;
   EmpathyAccountsDialogPriv    *priv = GET_PRIV (dialog);
-  GtkWidget                    *content_area;
-  GtkWidget *action_area, *vbox, *hbox, *align;
+  GtkWidget *content_area, *action_area;
+  GtkWidget *grid, *hbox;
   GtkWidget *alig;
+  GtkWidget *sw, *toolbar;
+  GtkStyleContext *context;
 
   filename = empathy_file_lookup ("empathy-accounts-dialog.ui", "src");
 
@@ -2155,6 +2198,8 @@ accounts_dialog_build_ui (EmpathyAccountsDialog *dialog)
       "hbox_protocol", &priv->hbox_protocol,
       "notebook_account", &priv->notebook_account,
       "alignment_loading", &alig,
+      "accounts_sw", &sw,
+      "add_remove_toolbar", &toolbar,
       NULL);
   g_free (filename);
 
@@ -2219,36 +2264,26 @@ accounts_dialog_build_ui (EmpathyAccountsDialog *dialog)
       priv->infobar);
   gtk_widget_show (priv->infobar);
 
-  content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (priv->infobar));
+  grid = gtk_grid_new ();
+  gtk_container_add (
+      GTK_CONTAINER (gtk_info_bar_get_content_area (
+          GTK_INFO_BAR (priv->infobar))),
+      grid);
 
   priv->image_type = gtk_image_new_from_stock (GTK_STOCK_CUT,
       GTK_ICON_SIZE_DIALOG);
   gtk_misc_set_alignment (GTK_MISC (priv->image_type), 0.0, 0.5);
-  gtk_box_pack_start (GTK_BOX (content_area), priv->image_type, FALSE, FALSE, 0);
-  gtk_widget_show (priv->image_type);
-
-  vbox = gtk_vbox_new (FALSE, 6);
-  gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
-  gtk_widget_show (vbox);
+  gtk_grid_attach (GTK_GRID (grid), priv->image_type, 0, 0, 1, 2);
 
   /* first row */
-  align = gtk_alignment_new (0.5, 0.0, 0.0, 0.0);
-  gtk_widget_show (align);
-
   priv->label_name = gtk_label_new (NULL);
-  gtk_container_add (GTK_CONTAINER (align), priv->label_name);
-  gtk_widget_show (priv->label_name);
-
-  gtk_box_pack_start (GTK_BOX (vbox), align, TRUE, TRUE, 0);
+  gtk_grid_attach (GTK_GRID (grid), priv->label_name, 1, 0, 1, 1);
 
   /* second row */
-  align = gtk_alignment_new (0.5, 0.0, 0.0, 0.0);
-  gtk_widget_show (align);
-  hbox = gtk_hbox_new (FALSE, 6);
-  gtk_widget_show (hbox);
-  gtk_container_add (GTK_CONTAINER (align), hbox);
-
-  gtk_box_pack_start (GTK_BOX (vbox), align, TRUE, TRUE, 0);
+  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
+  gtk_widget_set_hexpand (hbox, TRUE);
+  gtk_widget_set_halign (hbox, GTK_ALIGN_CENTER);
+  gtk_grid_attach (GTK_GRID (grid), hbox, 1, 1, 1, 1);
 
   /* set up spinner */
   priv->throbber = gtk_spinner_new ();
@@ -2259,11 +2294,19 @@ accounts_dialog_build_ui (EmpathyAccountsDialog *dialog)
 
   priv->label_status = gtk_label_new (NULL);
   gtk_label_set_line_wrap (GTK_LABEL (priv->label_status), TRUE);
-  gtk_widget_show (priv->label_status);
 
   gtk_box_pack_start (GTK_BOX (hbox), priv->throbber, FALSE, FALSE, 0);
-  gtk_box_pack_start (GTK_BOX (hbox), priv->image_status, FALSE, FALSE, 3);
-  gtk_box_pack_start (GTK_BOX (hbox), priv->label_status, TRUE, TRUE, 0);
+  gtk_box_pack_start (GTK_BOX (hbox), priv->image_status, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (hbox), priv->label_status, FALSE, FALSE, 0);
+
+  /* enabled switch */
+  priv->enabled_switch = gtk_switch_new ();
+  gtk_widget_set_valign (priv->enabled_switch, GTK_ALIGN_CENTER);
+  g_signal_connect (priv->enabled_switch, "notify::active",
+      G_CALLBACK (accounts_dialog_enable_switch_active_cb), dialog);
+  gtk_grid_attach (GTK_GRID (grid), priv->enabled_switch, 2, 0, 1, 2);
+
+  gtk_widget_show_all (grid);
 
   /* Tweak the dialog */
   gtk_window_set_title (GTK_WINDOW (dialog), _("Messaging and VoIP Accounts"));
@@ -2273,6 +2316,13 @@ accounts_dialog_build_ui (EmpathyAccountsDialog *dialog)
 
   gtk_window_set_type_hint (GTK_WINDOW (dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
 
+  /* join the add/remove toolbar to the treeview */
+  context = gtk_widget_get_style_context (sw);
+  gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
+
+  context = gtk_widget_get_style_context (toolbar);
+  gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
+
   /* add dialog buttons */
   gtk_button_box_set_layout (GTK_BUTTON_BOX (action_area), GTK_BUTTONBOX_END);
 
@@ -2382,7 +2432,7 @@ do_constructed (GObject *object)
   /* Set up signalling */
   priv->account_manager = tp_account_manager_dup ();
 
-  tp_account_manager_prepare_async (priv->account_manager, NULL,
+  tp_proxy_prepare_async (priv->account_manager, NULL,
       accounts_dialog_manager_ready_cb, dialog);
 
   priv->connectivity = empathy_connectivity_dup_singleton ();
@@ -2455,68 +2505,30 @@ empathy_accounts_dialog_show_application (GdkScreen *screen,
     gboolean if_needed,
     gboolean hidden)
 {
-  GError *error = NULL;
-  GdkDisplay *display;
-  GString *cmd;
-  gchar *path;
-  GAppInfo *app_info;
-  GdkAppLaunchContext *context = NULL;
+  GString *args;
 
-  g_return_if_fail (GDK_IS_SCREEN (screen));
   g_return_if_fail (!selected_account || TP_IS_ACCOUNT (selected_account));
 
-  /* Try to run from source directory if possible */
-  path = g_build_filename (g_getenv ("EMPATHY_SRCDIR"), "src",
-      "empathy-accounts", NULL);
-
-  if (!g_file_test (path, G_FILE_TEST_EXISTS))
-    {
-      g_free (path);
-      path = g_build_filename (BIN_DIR, "empathy-accounts", NULL);
-    }
-
-  cmd = g_string_new (path);
-  g_free (path);
+  args = g_string_new (NULL);
 
   if (selected_account != NULL)
-    {
-      g_string_append_printf (cmd, " --select-account=%s",
-          tp_account_get_path_suffix (selected_account));
-    }
+    g_string_append_printf (args, " --select-account=%s",
+        tp_account_get_path_suffix (selected_account));
 
   if (if_needed)
-    g_string_append_printf (cmd, " --if-needed");
+    g_string_append_printf (args, " --if-needed");
 
   if (hidden)
-    g_string_append_printf (cmd, " --hidden");
+    g_string_append_printf (args, " --hidden");
 
   DEBUG ("Launching empathy-accounts (if_needed: %d, hidden: %d, account: %s)",
     if_needed, hidden,
     selected_account == NULL ? "<none selected>" :
       tp_proxy_get_object_path (TP_PROXY (selected_account)));
 
-  app_info = g_app_info_create_from_commandline (cmd->str, NULL, 0, &error);
-  if (app_info == NULL)
-    {
-      DEBUG ("Failed to create app info: %s", error->message);
-      g_error_free (error);
-      goto out;
-    }
-
-  display = gdk_screen_get_display (screen);
-  context = gdk_display_get_app_launch_context (display);
+  empathy_launch_program (BIN_DIR, "empathy-accounts", args->str);
 
-  if (!g_app_info_launch (app_info, NULL, (GAppLaunchContext *) context,
-        &error))
-    {
-      g_warning ("Failed to open accounts dialog: %s", error->message);
-      g_error_free (error);
-    }
-
-out:
-  tp_clear_object (&app_info);
-  tp_clear_object (&context);
-  g_string_free (cmd, TRUE);
+  g_string_free (args, TRUE);
 }
 
 gboolean