]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-irc-network-chooser-dialog.c
Merge branch 'sasl'
[empathy.git] / libempathy-gtk / empathy-irc-network-chooser-dialog.c
index b4483df1ef7a6647b920b7bb5c3aee3d09666858..f81ba80bbdee503355d7502265c41f12194e6f89 100644 (file)
@@ -61,6 +61,7 @@ typedef struct {
     GtkWidget *select_button;
 
     gulong search_sig;
+    gulong activate_sig;
 } EmpathyIrcNetworkChooserDialogPriv;
 
 enum {
@@ -284,6 +285,8 @@ irc_network_dialog_destroy_cb (GtkWidget *widget,
   filter_iter = iter_to_filter_iter (self, &iter);
   scroll_to_iter (self, &filter_iter);
 
+  gtk_widget_grab_focus (priv->treeview);
+
   g_object_unref (network);
 }
 
@@ -354,16 +357,34 @@ remove_network (EmpathyIrcNetworkChooserDialog *self)
 
   DEBUG ("Remove network %s", empathy_irc_network_get_name (network));
 
-  gtk_list_store_remove (priv->store, &iter);
-  empathy_irc_network_manager_remove (priv->network_manager, network);
-
-  /* Select next network */
-  if (gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->store), &iter))
+  /* Delete network and select next network */
+  if (gtk_list_store_remove (priv->store, &iter))
     {
       GtkTreeIter filter_iter = iter_to_filter_iter (self, &iter);
 
       select_iter (self, &filter_iter, TRUE);
     }
+  else
+    {
+      /* this should only happen if the last network was deleted */
+      GtkTreeIter last, filter_iter;
+      gint n_elements;
+
+      n_elements = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (priv->store),
+          NULL);
+
+      if (n_elements > 0)
+        {
+          gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (priv->store), &last,
+              NULL, (n_elements-1));
+          filter_iter = iter_to_filter_iter (self, &last);
+
+          select_iter (self, &filter_iter, TRUE);
+        }
+    }
+
+  empathy_irc_network_manager_remove (priv->network_manager, network);
+  gtk_widget_grab_focus (priv->treeview);
 
   g_object_unref (network);
 }
@@ -399,6 +420,13 @@ filter_visible_func (GtkTreeModel *model,
   return visible;
 }
 
+static void
+search_activate_cb (GtkWidget *search,
+  EmpathyIrcNetworkChooserDialog *self)
+{
+  gtk_widget_hide (search);
+  gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_CLOSE);
+}
 
 static void
 search_text_notify_cb (EmpathyLiveSearch *search,
@@ -448,6 +476,7 @@ dialog_destroy_cb (GtkWidget *widget,
   EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self);
 
   g_signal_handler_disconnect (priv->search, priv->search_sig);
+  g_signal_handler_disconnect (priv->search, priv->activate_sig);
 }
 
 static void
@@ -512,6 +541,9 @@ empathy_irc_network_chooser_dialog_constructed (GObject *object)
   priv->search_sig = g_signal_connect (priv->search, "notify::text",
       G_CALLBACK (search_text_notify_cb), self);
 
+  priv->activate_sig = g_signal_connect (priv->search, "activate",
+      G_CALLBACK (search_activate_cb), self);
+
   /* Add buttons */
   gtk_dialog_add_buttons (dialog,
       GTK_STOCK_ADD, GTK_RESPONSE_OK,
@@ -519,7 +551,8 @@ empathy_irc_network_chooser_dialog_constructed (GObject *object)
       GTK_STOCK_REMOVE, GTK_RESPONSE_REJECT,
       NULL);
 
-  priv->select_button = gtk_dialog_add_button (dialog, _("Select"),
+  priv->select_button = gtk_dialog_add_button (dialog,
+      C_("verb displayed on a button to select an IRC network", "Select"),
       GTK_RESPONSE_CLOSE);
 
   fill_store (self);
@@ -534,6 +567,8 @@ empathy_irc_network_chooser_dialog_constructed (GObject *object)
 
   /* Request a side ensuring to display at least some networks */
   gtk_widget_set_size_request (GTK_WIDGET (self), -1, 300);
+
+  gtk_window_set_modal (GTK_WINDOW (self), TRUE);
 }
 
 static void
@@ -594,11 +629,13 @@ empathy_irc_network_chooser_dialog_init (EmpathyIrcNetworkChooserDialog *self)
 
 GtkWidget *
 empathy_irc_network_chooser_dialog_new (EmpathyAccountSettings *settings,
-    EmpathyIrcNetwork *network)
+    EmpathyIrcNetwork *network,
+    GtkWindow *parent)
 {
   return g_object_new (EMPATHY_TYPE_IRC_NETWORK_CHOOSER_DIALOG,
       "settings", settings,
       "network", network,
+      "transient-for", parent,
       NULL);
 }