From 860c26554e90126287adcba3ae9dc536bdfbb622 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Tue, 24 Aug 2010 14:20:23 +0200 Subject: add empathy_irc_network_manager_dup_default() --- libempathy/empathy-irc-network-manager.c | 34 ++++++++++++++++++++++++++++++++ libempathy/empathy-irc-network-manager.h | 2 ++ 2 files changed, 36 insertions(+) diff --git a/libempathy/empathy-irc-network-manager.c b/libempathy/empathy-irc-network-manager.c index 97d19a0eb..5e0530938 100644 --- a/libempathy/empathy-irc-network-manager.c +++ b/libempathy/empathy-irc-network-manager.c @@ -32,6 +32,7 @@ #include "empathy-debug.h" #define IRC_NETWORKS_DTD_FILENAME "empathy-irc-networks.dtd" +#define IRC_NETWORKS_FILENAME "irc-networks.xml" #define SAVE_TIMER 4 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyIrcNetworkManager) @@ -781,3 +782,36 @@ empathy_irc_network_manager_find_network_by_address ( return network; } + +EmpathyIrcNetworkManager * +empathy_irc_network_manager_dup_default (void) +{ + static EmpathyIrcNetworkManager *default_mgr = NULL; + gchar *dir, *user_file_with_path, *global_file_with_path; + + if (default_mgr != NULL) + return g_object_ref (default_mgr); + + dir = g_build_filename (g_get_user_config_dir (), PACKAGE_NAME, NULL); + g_mkdir_with_parents (dir, S_IRUSR | S_IWUSR | S_IXUSR); + user_file_with_path = g_build_filename (dir, IRC_NETWORKS_FILENAME, NULL); + g_free (dir); + + global_file_with_path = g_build_filename (g_getenv ("EMPATHY_SRCDIR"), + "libempathy", IRC_NETWORKS_FILENAME, NULL); + if (!g_file_test (global_file_with_path, G_FILE_TEST_EXISTS)) + { + g_free (global_file_with_path); + global_file_with_path = g_build_filename (DATADIR, "empathy", + IRC_NETWORKS_FILENAME, NULL); + } + + default_mgr = empathy_irc_network_manager_new ( + global_file_with_path, user_file_with_path); + + g_object_add_weak_pointer (G_OBJECT (default_mgr), (gpointer *) &default_mgr); + + g_free (global_file_with_path); + g_free (user_file_with_path); + return default_mgr; +} diff --git a/libempathy/empathy-irc-network-manager.h b/libempathy/empathy-irc-network-manager.h index a050f4723..11c84836f 100644 --- a/libempathy/empathy-irc-network-manager.h +++ b/libempathy/empathy-irc-network-manager.h @@ -63,6 +63,8 @@ GType empathy_irc_network_manager_get_type (void); EmpathyIrcNetworkManager * empathy_irc_network_manager_new ( const gchar *global_file, const gchar *user_file); +EmpathyIrcNetworkManager * empathy_irc_network_manager_dup_default (void); + void empathy_irc_network_manager_add (EmpathyIrcNetworkManager *manager, EmpathyIrcNetwork *network); -- cgit v1.2.3 From 4b08cbd1605f1671a9d90ffa7f3a3a1776e5a61a Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Mon, 23 Aug 2010 17:24:59 +0200 Subject: add empathy-irc-network-chooser --- libempathy-gtk/Makefile.am | 2 + libempathy-gtk/empathy-irc-network-chooser.c | 299 +++++++++++++++++++++++++++ libempathy-gtk/empathy-irc-network-chooser.h | 61 ++++++ 3 files changed, 362 insertions(+) create mode 100644 libempathy-gtk/empathy-irc-network-chooser.c create mode 100644 libempathy-gtk/empathy-irc-network-chooser.h diff --git a/libempathy-gtk/Makefile.am b/libempathy-gtk/Makefile.am index de6cba2f1..15e187c07 100644 --- a/libempathy-gtk/Makefile.am +++ b/libempathy-gtk/Makefile.am @@ -63,6 +63,7 @@ libempathy_gtk_handwritten_source = \ empathy-individual-store.c \ empathy-individual-view.c \ empathy-individual-widget.c \ + empathy-irc-network-chooser.c \ empathy-irc-network-dialog.c \ empathy-kludge-label.c \ empathy-log-window.c \ @@ -123,6 +124,7 @@ libempathy_gtk_headers = \ empathy-individual-store.h \ empathy-individual-view.h \ empathy-individual-widget.h \ + empathy-irc-network-chooser.h \ empathy-irc-network-dialog.h \ empathy-kludge-label.h \ empathy-log-window.h \ diff --git a/libempathy-gtk/empathy-irc-network-chooser.c b/libempathy-gtk/empathy-irc-network-chooser.c new file mode 100644 index 000000000..768abe2d6 --- /dev/null +++ b/libempathy-gtk/empathy-irc-network-chooser.c @@ -0,0 +1,299 @@ +/* + * Copyright (C) 2007-2008 Guillaume Desmottes + * Copyright (C) 2010 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Authors: Guillaume Desmottes + */ + +#include "config.h" + +#include +#include +#include + +#include +#include + +#include +#include + +#include "empathy-irc-network-dialog.h" +#include "empathy-ui-utils.h" + +#define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT | EMPATHY_DEBUG_IRC +#include + +#include "empathy-irc-network-chooser.h" + +#define DEFAULT_IRC_NETWORK "irc.gimp.org" + +#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyIrcNetworkChooser) + +enum { + PROP_SETTINGS = 1 +}; + +typedef struct { + EmpathyAccountSettings *settings; + + EmpathyIrcNetworkManager *network_manager; + /* Displayed network */ + EmpathyIrcNetwork *network; +} EmpathyIrcNetworkChooserPriv; + +G_DEFINE_TYPE (EmpathyIrcNetworkChooser, empathy_irc_network_chooser, + GTK_TYPE_BUTTON); + +static void +empathy_irc_network_chooser_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (object); + + switch (prop_id) + { + case PROP_SETTINGS: + priv->settings = g_value_dup_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +empathy_irc_network_chooser_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (object); + + switch (prop_id) + { + case PROP_SETTINGS: + g_value_set_object (value, priv->settings); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +unset_server_params (EmpathyIrcNetworkChooser *self) +{ + EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self); + + DEBUG ("Unset server, port and use-ssl"); + empathy_account_settings_unset (priv->settings, "server"); + empathy_account_settings_unset (priv->settings, "port"); + empathy_account_settings_unset (priv->settings, "use-ssl"); +} + +static void +update_server_params (EmpathyIrcNetworkChooser *self) +{ + EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self); + GSList *servers; + gchar *charset; + + g_assert (priv->network != NULL); + + g_object_get (priv->network, "charset", &charset, NULL); + DEBUG ("Setting charset to %s", charset); + empathy_account_settings_set_string (priv->settings, "charset", charset); + g_free (charset); + + servers = empathy_irc_network_get_servers (priv->network); + if (g_slist_length (servers) > 0) + { + /* set the first server as CM server */ + EmpathyIrcServer *server = servers->data; + gchar *address; + guint port; + gboolean ssl; + + g_object_get (server, + "address", &address, + "port", &port, + "ssl", &ssl, + NULL); + + DEBUG ("Setting server to %s", address); + empathy_account_settings_set_string (priv->settings, "server", address); + DEBUG ("Setting port to %u", port); + empathy_account_settings_set_uint32 (priv->settings, "port", port); + DEBUG ("Setting use-ssl to %s", ssl ? "TRUE": "FALSE" ); + empathy_account_settings_set_boolean (priv->settings, "use-ssl", ssl); + + g_free (address); + } + else + { + /* No server. Unset values */ + unset_server_params (self); + } + + g_slist_foreach (servers, (GFunc) g_object_unref, NULL); + g_slist_free (servers); +} + +static void +set_label (EmpathyIrcNetworkChooser *self) +{ + EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self); + gchar *name; + + g_assert (priv->network != NULL); + g_object_get (priv->network, "name", &name, NULL); + + gtk_button_set_label (GTK_BUTTON (self), name); + g_free (name); +} + +static void +set_label_from_settings (EmpathyIrcNetworkChooser *self) +{ + EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self); + const gchar *server; + + tp_clear_object (&priv->network); + + server = empathy_account_settings_get_string (priv->settings, "server"); + + if (server != NULL) + { + EmpathyIrcServer *srv; + gint port; + gboolean ssl; + + priv->network = empathy_irc_network_manager_find_network_by_address ( + priv->network_manager, server); + + if (priv->network != NULL) + { + /* The network is known */ + g_object_ref (priv->network); + set_label (self); + return; + } + + /* We don't have this network. Let's create it */ + port = empathy_account_settings_get_uint32 (priv->settings, "port"); + ssl = empathy_account_settings_get_boolean (priv->settings, + "use-ssl"); + + DEBUG ("Create a network %s", server); + priv->network = empathy_irc_network_new (server); + srv = empathy_irc_server_new (server, port, ssl); + + empathy_irc_network_append_server (priv->network, srv); + empathy_irc_network_manager_add (priv->network_manager, priv->network); + + set_label (self); + + g_object_unref (srv); + return; + } + + /* Set default network */ + priv->network = empathy_irc_network_manager_find_network_by_address ( + priv->network_manager, DEFAULT_IRC_NETWORK); + g_assert (priv->network != NULL); + + set_label (self); + update_server_params (self); + g_object_ref (priv->network); +} + +static void +clicked_cb (GtkButton *button, + gpointer user_data) +{ + /* TODO: open edit dialog */ +} + +static void +empathy_irc_network_chooser_constructed (GObject *object) +{ + EmpathyIrcNetworkChooser *self = (EmpathyIrcNetworkChooser *) object; + EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self); + + g_assert (priv->settings != NULL); + + set_label_from_settings (self); + + g_signal_connect (self, "clicked", G_CALLBACK (clicked_cb), self); +} + +static void +empathy_irc_network_chooser_dispose (GObject *object) +{ + EmpathyIrcNetworkManager *self = (EmpathyIrcNetworkManager *) object; + EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self); + + tp_clear_object (&priv->settings); + tp_clear_object (&priv->network_manager); + tp_clear_object (&priv->network); + + if (G_OBJECT_CLASS (empathy_irc_network_chooser_parent_class)->dispose) + G_OBJECT_CLASS (empathy_irc_network_chooser_parent_class)->dispose (object); +} + +static void +empathy_irc_network_chooser_class_init (EmpathyIrcNetworkChooserClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = empathy_irc_network_chooser_get_property; + object_class->set_property = empathy_irc_network_chooser_set_property; + object_class->constructed = empathy_irc_network_chooser_constructed; + object_class->dispose = empathy_irc_network_chooser_dispose; + + g_object_class_install_property (object_class, PROP_SETTINGS, + g_param_spec_object ("settings", + "Settings", + "The EmpathyAccountSettings to show and edit", + EMPATHY_TYPE_ACCOUNT_SETTINGS, + G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_type_class_add_private (object_class, + sizeof (EmpathyIrcNetworkChooserPriv)); +} + +static void +empathy_irc_network_chooser_init (EmpathyIrcNetworkChooser *self) +{ + EmpathyIrcNetworkChooserPriv *priv; + + priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + EMPATHY_TYPE_IRC_NETWORK_CHOOSER, EmpathyIrcNetworkChooserPriv); + self->priv = priv; + + priv->network_manager = empathy_irc_network_manager_dup_default (); +} + +GtkWidget * +empathy_irc_network_chooser_new (EmpathyAccountSettings *settings) +{ + return g_object_new (EMPATHY_TYPE_IRC_NETWORK_CHOOSER, + "settings", settings, + NULL); +} diff --git a/libempathy-gtk/empathy-irc-network-chooser.h b/libempathy-gtk/empathy-irc-network-chooser.h new file mode 100644 index 000000000..442ac2d53 --- /dev/null +++ b/libempathy-gtk/empathy-irc-network-chooser.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2007-2008 Guillaume Desmottes + * Copyright (C) 2010 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Authors: Guillaume Desmottes + */ + +#ifndef __EMPATHY_IRC_NETWORK_CHOOSER_H__ +#define __EMPATHY_IRC_NETWORK_CHOOSER_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define EMPATHY_TYPE_IRC_NETWORK_CHOOSER (empathy_irc_network_chooser_get_type ()) +#define EMPATHY_IRC_NETWORK_CHOOSER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), \ + EMPATHY_TYPE_IRC_NETWORK_CHOOSER, EmpathyIrcNetworkChooser)) +#define EMPATHY_IRC_NETWORK_CHOOSER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), \ + EMPATHY_TYPE_IRC_NETWORK_CHOOSER, EmpathyIrcNetworkChooserClass)) +#define EMPATHY_IS_IRC_NETWORK_CHOOSER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), \ + EMPATHY_TYPE_IRC_NETWORK_CHOOSER)) +#define EMPATHY_IS_IRC_NETWORK_CHOOSER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), \ + EMPATHY_TYPE_IRC_NETWORK_CHOOSER)) +#define EMPATHY_IRC_NETWORK_CHOOSER_GET_CLASS(o) ( \ + G_TYPE_INSTANCE_GET_CLASS ((o), EMPATHY_TYPE_IRC_NETWORK_CHOOSER, \ + EmpathyIrcNetworkChooserClass)) + +typedef struct { + GtkButton parent; + + /**/ + gpointer priv; +} EmpathyIrcNetworkChooser; + +typedef struct { + GtkButtonClass parent_class; +} EmpathyIrcNetworkChooserClass; + +GType empathy_irc_network_chooser_get_type (void) G_GNUC_CONST; + +GtkWidget * empathy_irc_network_chooser_new (EmpathyAccountSettings *settings); + +G_END_DECLS + +#endif /* __EMPATHY_IRC_NETWORK_CHOOSER_H__ */ -- cgit v1.2.3 From 8f678a31a63eccb4fc086a8caddb37b1a0e7de91 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Tue, 24 Aug 2010 16:09:24 +0200 Subject: add empathy-irc-network-chooser-dialog Some of the code has been copied from empathy-account-widget-irc.c. --- libempathy-gtk/Makefile.am | 2 + .../empathy-irc-network-chooser-dialog.c | 487 +++++++++++++++++++++ .../empathy-irc-network-chooser-dialog.h | 70 +++ 3 files changed, 559 insertions(+) create mode 100644 libempathy-gtk/empathy-irc-network-chooser-dialog.c create mode 100644 libempathy-gtk/empathy-irc-network-chooser-dialog.h diff --git a/libempathy-gtk/Makefile.am b/libempathy-gtk/Makefile.am index 15e187c07..d81b97253 100644 --- a/libempathy-gtk/Makefile.am +++ b/libempathy-gtk/Makefile.am @@ -64,6 +64,7 @@ libempathy_gtk_handwritten_source = \ empathy-individual-view.c \ empathy-individual-widget.c \ empathy-irc-network-chooser.c \ + empathy-irc-network-chooser-dialog.c \ empathy-irc-network-dialog.c \ empathy-kludge-label.c \ empathy-log-window.c \ @@ -125,6 +126,7 @@ libempathy_gtk_headers = \ empathy-individual-view.h \ empathy-individual-widget.h \ empathy-irc-network-chooser.h \ + empathy-irc-network-chooser-dialog.h \ empathy-irc-network-dialog.h \ empathy-kludge-label.h \ empathy-log-window.h \ diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c new file mode 100644 index 000000000..e4f6146bc --- /dev/null +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -0,0 +1,487 @@ +/* + * Copyright (C) 2007-2008 Guillaume Desmottes + * Copyright (C) 2010 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Authors: Guillaume Desmottes + */ + +#include "config.h" + +#include +#include +#include + +#include +#include + +#include +#include + +#include "empathy-irc-network-dialog.h" +#include "empathy-ui-utils.h" + +#define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT | EMPATHY_DEBUG_IRC +#include + +#include "empathy-irc-network-chooser-dialog.h" + +#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyIrcNetworkChooserDialog) + +enum { + PROP_SETTINGS = 1, + PROP_NETWORK +}; + +typedef struct { + EmpathyAccountSettings *settings; + EmpathyIrcNetwork *network; + + EmpathyIrcNetworkManager *network_manager; + gboolean changed; + + GtkWidget *treeview; + GtkListStore *store; +} EmpathyIrcNetworkChooserDialogPriv; + +enum { + COL_NETWORK_OBJ, + COL_NETWORK_NAME, +}; + +G_DEFINE_TYPE (EmpathyIrcNetworkChooserDialog, empathy_irc_network_chooser_dialog, + GTK_TYPE_DIALOG); + +static void +empathy_irc_network_chooser_dialog_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (object); + + switch (prop_id) + { + case PROP_SETTINGS: + priv->settings = g_value_dup_object (value); + break; + case PROP_NETWORK: + priv->network = g_value_dup_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +empathy_irc_network_chooser_dialog_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (object); + + switch (prop_id) + { + case PROP_SETTINGS: + g_value_set_object (value, priv->settings); + break; + case PROP_NETWORK: + g_value_set_object (value, priv->network); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static EmpathyIrcNetwork * +dup_selected_network (EmpathyIrcNetworkChooserDialog *self, + GtkTreeIter *it) +{ + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); + EmpathyIrcNetwork *network; + GtkTreeSelection *selection; + GtkTreeIter iter; + GtkTreeModel *model; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview)); + gtk_tree_selection_get_selected (selection, &model, &iter); + + gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1); + g_assert (network != NULL); + + if (it != NULL) + *it = iter; + + return network; +} + +static void +treeview_changed_cb (GtkTreeView *treeview, + EmpathyIrcNetworkChooserDialog *self) +{ + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); + EmpathyIrcNetwork *network; + + network = dup_selected_network (self, NULL); + if (network == priv->network) + { + g_object_unref (network); + return; + } + + tp_clear_object (&priv->network); + /* Transfer the reference */ + priv->network = network; + + priv->changed = TRUE; +} + +static void +scroll_to_iter (EmpathyIrcNetworkChooserDialog *self, + GtkTreeIter *iter) +{ + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); + GtkTreePath *path; + + path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->store), iter); + + if (path != NULL) + { + gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (priv->treeview), + path, NULL, FALSE, 0, 0); + + gtk_tree_path_free (path); + } +} + +static void +select_iter (EmpathyIrcNetworkChooserDialog *self, + GtkTreeIter *iter, + gboolean emulate_changed) +{ + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); + GtkTreeSelection *selection; + + /* Select the network */ + selection = gtk_tree_view_get_selection ( + GTK_TREE_VIEW (priv->treeview)); + + gtk_tree_selection_select_iter (selection, iter); + + /* Scroll to the selected network */ + scroll_to_iter (self, iter); + + if (emulate_changed) + { + /* gtk_tree_selection_select_iter doesn't fire the 'cursor-changed' signal + * so we call the callback manually. */ + treeview_changed_cb (GTK_TREE_VIEW (priv->treeview), self); + } +} + +static void +fill_store (EmpathyIrcNetworkChooserDialog *self) +{ + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); + GSList *networks, *l; + + networks = empathy_irc_network_manager_get_networks ( + priv->network_manager); + + for (l = networks; l != NULL; l = g_slist_next (l)) + { + gchar *name; + EmpathyIrcNetwork *network = l->data; + GtkTreeIter iter; + + g_object_get (network, "name", &name, NULL); + + gtk_list_store_insert_with_values (priv->store, &iter, -1, + COL_NETWORK_OBJ, network, + COL_NETWORK_NAME, name, + -1); + + if (network == priv->network) + select_iter (self, &iter, FALSE); + + g_free (name); + g_object_unref (network); + } + + g_slist_free (networks); +} + +static void +irc_network_dialog_destroy_cb (GtkWidget *widget, + EmpathyIrcNetworkChooserDialog *self) +{ + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); + EmpathyIrcNetwork *network; + gchar *name; + GtkTreeIter iter; + + network = dup_selected_network (self, &iter); + + /* name could be changed */ + g_object_get (network, "name", &name, NULL); + gtk_list_store_set (GTK_LIST_STORE (priv->store), &iter, + COL_NETWORK_NAME, name, -1); + + scroll_to_iter (self, &iter); + + priv->changed = TRUE; + + g_object_unref (network); + g_free (name); +} + +static void +display_irc_network_dialog (EmpathyIrcNetworkChooserDialog *self, + EmpathyIrcNetwork *network) +{ + GtkWidget *dialog; + + dialog = empathy_irc_network_dialog_show (network, NULL); + + g_signal_connect (dialog, "destroy", + G_CALLBACK (irc_network_dialog_destroy_cb), self); +} + +static void +edit_network (EmpathyIrcNetworkChooserDialog *self) +{ + EmpathyIrcNetwork *network; + + network = dup_selected_network (self, NULL); + display_irc_network_dialog (self, network); + + g_object_unref (network); +} + +static void +add_network (EmpathyIrcNetworkChooserDialog *self) +{ + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); + EmpathyIrcNetwork *network; + gchar *name; + GtkTreeIter iter; + + network = empathy_irc_network_new (_("New Network")); + empathy_irc_network_manager_add (priv->network_manager, network); + + g_object_get (network, "name", &name, NULL); + + gtk_list_store_insert_with_values (priv->store, &iter, -1, + COL_NETWORK_OBJ, network, + COL_NETWORK_NAME, name, + -1); + + select_iter (self, &iter, TRUE); + + display_irc_network_dialog (self, network); + + g_free (name); + g_object_unref (network); +} + +static void +remove_network (EmpathyIrcNetworkChooserDialog *self) +{ + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); + EmpathyIrcNetwork *network; + GtkTreeIter iter; + gchar *name; + + network = dup_selected_network (self, &iter); + + g_object_get (network, "name", &name, NULL); + DEBUG ("Remove network %s", name); + + 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)) + select_iter (self, &iter, TRUE); + + g_free (name); + g_object_unref (network); +} + +static void +dialog_response_cb (GtkDialog *dialog, + gint response, + EmpathyIrcNetworkChooserDialog *self) +{ + if (response == GTK_RESPONSE_OK) + add_network (self); + else if (response == GTK_RESPONSE_APPLY) + edit_network (self); + else if (response == GTK_RESPONSE_REJECT) + remove_network (self); +} + +static void +empathy_irc_network_chooser_dialog_constructed (GObject *object) +{ + EmpathyIrcNetworkChooserDialog *self = (EmpathyIrcNetworkChooserDialog *) object; + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); + GtkDialog *dialog = GTK_DIALOG (self); + GtkCellRenderer *renderer; + GtkWidget *vbox; + GtkTreeViewColumn *column; + GtkWidget *scroll; + + g_assert (priv->settings != NULL); + + gtk_window_set_title (GTK_WINDOW (self), _("IRC Networks")); + + /* Create store and treeview */ + priv->store = gtk_list_store_new (2, G_TYPE_OBJECT, G_TYPE_STRING); + + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (priv->store), + COL_NETWORK_NAME, + GTK_SORT_ASCENDING); + + priv->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (priv->store)); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (priv->treeview), FALSE); + gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->treeview), FALSE); + + column = gtk_tree_view_column_new (); + gtk_tree_view_append_column (GTK_TREE_VIEW (priv->treeview), column); + + renderer = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (column), renderer, TRUE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (column), + renderer, + "text", COL_NETWORK_NAME, + NULL); + + /* add the treeview in a GtkScrolledWindow */ + vbox = gtk_dialog_get_content_area (dialog); + + scroll = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + + gtk_container_add (GTK_CONTAINER (scroll), priv->treeview); + gtk_box_pack_start (GTK_BOX (vbox), scroll, TRUE, TRUE, 6); + + /* Add buttons */ + gtk_dialog_add_buttons (dialog, + GTK_STOCK_ADD, GTK_RESPONSE_OK, + GTK_STOCK_EDIT, GTK_RESPONSE_APPLY, + GTK_STOCK_REMOVE, GTK_RESPONSE_REJECT, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + NULL); + + fill_store (self); + + g_signal_connect (priv->treeview, "cursor-changed", + G_CALLBACK (treeview_changed_cb), self); + + g_signal_connect (self, "response", + G_CALLBACK (dialog_response_cb), self); + + /* Request a side ensuring to display at least some networks */ + gtk_widget_set_size_request (GTK_WIDGET (self), -1, 300); +} + +static void +empathy_irc_network_chooser_dialog_dispose (GObject *object) +{ + EmpathyIrcNetworkManager *self = (EmpathyIrcNetworkManager *) object; + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); + + tp_clear_object (&priv->settings); + tp_clear_object (&priv->network); + tp_clear_object (&priv->network_manager); + tp_clear_object (&priv->store); + + if (G_OBJECT_CLASS (empathy_irc_network_chooser_dialog_parent_class)->dispose) + G_OBJECT_CLASS (empathy_irc_network_chooser_dialog_parent_class)->dispose (object); +} + +static void +empathy_irc_network_chooser_dialog_class_init (EmpathyIrcNetworkChooserDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = empathy_irc_network_chooser_dialog_get_property; + object_class->set_property = empathy_irc_network_chooser_dialog_set_property; + object_class->constructed = empathy_irc_network_chooser_dialog_constructed; + object_class->dispose = empathy_irc_network_chooser_dialog_dispose; + + g_object_class_install_property (object_class, PROP_SETTINGS, + g_param_spec_object ("settings", + "Settings", + "The EmpathyAccountSettings to show and edit", + EMPATHY_TYPE_ACCOUNT_SETTINGS, + G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_install_property (object_class, PROP_NETWORK, + g_param_spec_object ("network", + "Network", + "The EmpathyIrcNetwork selected in the treeview", + EMPATHY_TYPE_IRC_NETWORK, + G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_type_class_add_private (object_class, + sizeof (EmpathyIrcNetworkChooserDialogPriv)); +} + +static void +empathy_irc_network_chooser_dialog_init (EmpathyIrcNetworkChooserDialog *self) +{ + EmpathyIrcNetworkChooserDialogPriv *priv; + + priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + EMPATHY_TYPE_IRC_NETWORK_CHOOSER_DIALOG, EmpathyIrcNetworkChooserDialogPriv); + self->priv = priv; + + priv->network_manager = empathy_irc_network_manager_dup_default (); +} + +GtkWidget * +empathy_irc_network_chooser_dialog_new (EmpathyAccountSettings *settings, + EmpathyIrcNetwork *network) +{ + return g_object_new (EMPATHY_TYPE_IRC_NETWORK_CHOOSER_DIALOG, + "settings", settings, + "network", network, + NULL); +} + +EmpathyIrcNetwork * +empathy_irc_network_chooser_dialog_get_network ( + EmpathyIrcNetworkChooserDialog *self) +{ + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); + + return priv->network; +} + +gboolean +empathy_irc_network_chooser_dialog_get_changed ( + EmpathyIrcNetworkChooserDialog *self) +{ + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); + + return priv->changed; +} diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.h b/libempathy-gtk/empathy-irc-network-chooser-dialog.h new file mode 100644 index 000000000..1c9d3fabd --- /dev/null +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.h @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2007-2008 Guillaume Desmottes + * Copyright (C) 2010 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Authors: Guillaume Desmottes + */ + +#ifndef __EMPATHY_IRC_NETWORK_CHOOSER_DIALOG_H__ +#define __EMPATHY_IRC_NETWORK_CHOOSER_DIALOG_H__ + +#include + +#include +#include + +G_BEGIN_DECLS + +#define EMPATHY_TYPE_IRC_NETWORK_CHOOSER_DIALOG (empathy_irc_network_chooser_dialog_get_type ()) +#define EMPATHY_IRC_NETWORK_CHOOSER_DIALOG(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), \ + EMPATHY_TYPE_IRC_NETWORK_CHOOSER_DIALOG, EmpathyIrcNetworkChooserDialog)) +#define EMPATHY_IRC_NETWORK_CHOOSER_DIALOG_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), \ + EMPATHY_TYPE_IRC_NETWORK_CHOOSER_DIALOG, EmpathyIrcNetworkChooserDialogClass)) +#define EMPATHY_IS_IRC_NETWORK_CHOOSER_DIALOG(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), \ + EMPATHY_TYPE_IRC_NETWORK_CHOOSER_DIALOG)) +#define EMPATHY_IS_IRC_NETWORK_CHOOSER_DIALOG_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), \ + EMPATHY_TYPE_IRC_NETWORK_CHOOSER_DIALOG)) +#define EMPATHY_IRC_NETWORK_CHOOSER_DIALOG_GET_CLASS(o) ( \ + G_TYPE_INSTANCE_GET_CLASS ((o), EMPATHY_TYPE_IRC_NETWORK_CHOOSER_DIALOG, \ + EmpathyIrcNetworkChooserDialogClass)) + +typedef struct { + GtkDialog parent; + + /**/ + gpointer priv; +} EmpathyIrcNetworkChooserDialog; + +typedef struct { + GtkDialogClass parent_class; +} EmpathyIrcNetworkChooserDialogClass; + +GType empathy_irc_network_chooser_dialog_get_type (void) G_GNUC_CONST; + +GtkWidget * empathy_irc_network_chooser_dialog_new ( + EmpathyAccountSettings *settings, + EmpathyIrcNetwork *network); + +EmpathyIrcNetwork * empathy_irc_network_chooser_dialog_get_network ( + EmpathyIrcNetworkChooserDialog *self); + +gboolean empathy_irc_network_chooser_dialog_get_changed ( + EmpathyIrcNetworkChooserDialog *self); + +G_END_DECLS + +#endif /* __EMPATHY_IRC_NETWORK_CHOOSER_DIALOG_H__ */ -- cgit v1.2.3 From f867ae2b8bbe9b885419f9748465d96ce70755d9 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Tue, 24 Aug 2010 16:10:28 +0200 Subject: irc-network-chooser: popup network chooser dialog when clicked --- libempathy-gtk/empathy-irc-network-chooser.c | 63 +++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/libempathy-gtk/empathy-irc-network-chooser.c b/libempathy-gtk/empathy-irc-network-chooser.c index 768abe2d6..ce71465c7 100644 --- a/libempathy-gtk/empathy-irc-network-chooser.c +++ b/libempathy-gtk/empathy-irc-network-chooser.c @@ -33,6 +33,7 @@ #include "empathy-irc-network-dialog.h" #include "empathy-ui-utils.h" +#include "empathy-irc-network-chooser-dialog.h" #define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT | EMPATHY_DEBUG_IRC #include @@ -47,10 +48,18 @@ enum { PROP_SETTINGS = 1 }; +enum { + SIG_CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + typedef struct { EmpathyAccountSettings *settings; EmpathyIrcNetworkManager *network_manager; + GtkWidget *dialog; /* Displayed network */ EmpathyIrcNetwork *network; } EmpathyIrcNetworkChooserPriv; @@ -223,11 +232,54 @@ set_label_from_settings (EmpathyIrcNetworkChooser *self) g_object_ref (priv->network); } +static void +dialog_response_cb (GtkDialog *dialog, + gint response, + EmpathyIrcNetworkChooser *self) +{ + EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self); + EmpathyIrcNetworkChooserDialog *chooser = + EMPATHY_IRC_NETWORK_CHOOSER_DIALOG (priv->dialog); + + if (response != GTK_RESPONSE_CLOSE && + response != GTK_RESPONSE_DELETE_EVENT) + return; + + if (empathy_irc_network_chooser_dialog_get_changed (chooser)) + { + tp_clear_object (&priv->network); + + priv->network = g_object_ref ( + empathy_irc_network_chooser_dialog_get_network (chooser)); + + update_server_params (self); + set_label (self); + + g_signal_emit (self, signals[SIG_CHANGED], 0); + } + + gtk_widget_destroy (priv->dialog); + priv->dialog = NULL; +} + static void clicked_cb (GtkButton *button, gpointer user_data) { - /* TODO: open edit dialog */ + EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (button); + + if (priv->dialog != NULL) + goto out; + + priv->dialog = empathy_irc_network_chooser_dialog_new (priv->settings, + priv->network); + gtk_widget_show_all (priv->dialog); + + tp_g_signal_connect_object (priv->dialog, "response", + G_CALLBACK (dialog_response_cb), button, 0); + +out: + empathy_window_present (GTK_WINDOW (priv->dialog)); } static void @@ -274,6 +326,15 @@ empathy_irc_network_chooser_class_init (EmpathyIrcNetworkChooserClass *klass) EMPATHY_TYPE_ACCOUNT_SETTINGS, G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + signals[SIG_CHANGED] = g_signal_new ("changed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + g_type_class_add_private (object_class, sizeof (EmpathyIrcNetworkChooserPriv)); } -- cgit v1.2.3 From ba36ddff81ce9f228f150246069ceb76425cfee5 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Tue, 24 Aug 2010 16:11:42 +0200 Subject: account-widget-irc: use EmpathyIrcNetworkChooser This avoid having a huge list in a combo box (#588243) --- libempathy-gtk/empathy-account-widget-irc.c | 405 ++------------------------- libempathy-gtk/empathy-account-widget-irc.ui | 78 +----- 2 files changed, 24 insertions(+), 459 deletions(-) diff --git a/libempathy-gtk/empathy-account-widget-irc.c b/libempathy-gtk/empathy-account-widget-irc.c index f98d54bbd..4b41c6e47 100644 --- a/libempathy-gtk/empathy-account-widget-irc.c +++ b/libempathy-gtk/empathy-account-widget-irc.c @@ -28,9 +28,9 @@ #include #include -#include #include "empathy-irc-network-dialog.h" +#include "empathy-irc-network-chooser.h" #include "empathy-account-widget.h" #include "empathy-account-widget-private.h" #include "empathy-account-widget-irc.h" @@ -39,304 +39,29 @@ #define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT | EMPATHY_DEBUG_IRC #include -#define IRC_NETWORKS_FILENAME "irc-networks.xml" -#define DEFAULT_IRC_NETWORK "irc.gimp.org" - typedef struct { EmpathyAccountWidget *self; - EmpathyIrcNetworkManager *network_manager; GtkWidget *vbox_settings; - GtkWidget *combobox_network; + GtkWidget *network_chooser; } EmpathyAccountWidgetIrc; -enum { - COL_NETWORK_OBJ, - COL_NETWORK_NAME, -}; - static void account_widget_irc_destroy_cb (GtkWidget *widget, EmpathyAccountWidgetIrc *settings) { - g_object_unref (settings->network_manager); g_slice_free (EmpathyAccountWidgetIrc, settings); } -static void -unset_server_params (EmpathyAccountWidgetIrc *settings) -{ - EmpathyAccountSettings *ac_settings; - - g_object_get (settings->self, "settings", &ac_settings, NULL); - DEBUG ("Unset server, port and use-ssl"); - empathy_account_settings_unset (ac_settings, "server"); - empathy_account_settings_unset (ac_settings, "port"); - empathy_account_settings_unset (ac_settings, "use-ssl"); -} - -static void -update_server_params (EmpathyAccountWidgetIrc *settings) -{ - GtkTreeIter iter; - GtkTreeModel *model; - EmpathyIrcNetwork *network; - GSList *servers; - gchar *charset; - EmpathyAccountSettings *ac_settings; - - g_object_get (settings->self, "settings", &ac_settings, NULL); - - if (!gtk_combo_box_get_active_iter ( - GTK_COMBO_BOX (settings->combobox_network), &iter)) - { - unset_server_params (settings); - return; - } - - model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network)); - gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1); - - g_assert (network != NULL); - - g_object_get (network, "charset", &charset, NULL); - DEBUG ("Setting charset to %s", charset); - empathy_account_settings_set_string (ac_settings, "charset", charset); - g_free (charset); - - servers = empathy_irc_network_get_servers (network); - if (g_slist_length (servers) > 0) - { - /* set the first server as CM server */ - EmpathyIrcServer *server = servers->data; - gchar *address; - guint port; - gboolean ssl; - - g_object_get (server, - "address", &address, - "port", &port, - "ssl", &ssl, - NULL); - - DEBUG ("Setting server to %s", address); - empathy_account_settings_set_string (ac_settings, "server", address); - DEBUG ("Setting port to %u", port); - empathy_account_settings_set_uint32 (ac_settings, "port", port); - DEBUG ("Setting use-ssl to %s", ssl ? "TRUE": "FALSE" ); - empathy_account_settings_set_boolean (ac_settings, "use-ssl", ssl); - - g_free (address); - } - else - { - /* No server. Unset values */ - unset_server_params (settings); - } - - g_slist_foreach (servers, (GFunc) g_object_unref, NULL); - g_slist_free (servers); - g_object_unref (network); -} - -static void -irc_network_dialog_destroy_cb (GtkWidget *widget, - EmpathyAccountWidgetIrc *settings) -{ - GtkTreeIter iter; - GtkTreeModel *model; - EmpathyIrcNetwork *network; - gchar *name; - - /* name could be changed */ - gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network), - &iter); - model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network)); - gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1); - - g_object_get (network, "name", &name, NULL); - gtk_list_store_set (GTK_LIST_STORE (model), &iter, - COL_NETWORK_NAME, name, -1); - - update_server_params (settings); - empathy_account_widget_changed (settings->self); - - g_object_unref (network); - g_free (name); -} - -static void -display_irc_network_dialog (EmpathyAccountWidgetIrc *settings, - EmpathyIrcNetwork *network) -{ - GtkWindow *window; - GtkWidget *dialog; - - window = empathy_get_toplevel_window (settings->vbox_settings); - dialog = empathy_irc_network_dialog_show (network, GTK_WIDGET (window)); - g_signal_connect (dialog, "destroy", - G_CALLBACK (irc_network_dialog_destroy_cb), settings); -} - -static void -account_widget_irc_button_edit_network_clicked_cb ( - GtkWidget *button, - EmpathyAccountWidgetIrc *settings) -{ - GtkTreeIter iter; - GtkTreeModel *model; - EmpathyIrcNetwork *network; - - gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network), - &iter); - model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network)); - gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1); - - g_assert (network != NULL); - - display_irc_network_dialog (settings, network); - - g_object_unref (network); -} - -static void -account_widget_irc_button_remove_clicked_cb (GtkWidget *button, - EmpathyAccountWidgetIrc *settings) -{ - EmpathyIrcNetwork *network; - GtkTreeIter iter; - GtkTreeModel *model; - gchar *name; - - gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network), - &iter); - model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network)); - gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1); - - g_assert (network != NULL); - - g_object_get (network, "name", &name, NULL); - DEBUG ("Remove network %s", name); - - gtk_list_store_remove (GTK_LIST_STORE (model), &iter); - empathy_irc_network_manager_remove (settings->network_manager, network); - - /* Select the first network */ - if (gtk_tree_model_get_iter_first (model, &iter)) - { - gtk_combo_box_set_active_iter ( - GTK_COMBO_BOX (settings->combobox_network), &iter); - } - - g_free (name); - g_object_unref (network); -} - -static void -account_widget_irc_button_add_network_clicked_cb (GtkWidget *button, - EmpathyAccountWidgetIrc *settings) -{ - EmpathyIrcNetwork *network; - GtkTreeModel *model; - GtkListStore *store; - gchar *name; - GtkTreeIter iter; - - network = empathy_irc_network_new (_("New Network")); - empathy_irc_network_manager_add (settings->network_manager, network); - - model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network)); - store = GTK_LIST_STORE (model); - - g_object_get (network, "name", &name, NULL); - - gtk_list_store_insert_with_values (store, &iter, -1, - COL_NETWORK_OBJ, network, - COL_NETWORK_NAME, name, - -1); - - gtk_combo_box_set_active_iter (GTK_COMBO_BOX (settings->combobox_network), - &iter); - - display_irc_network_dialog (settings, network); - - g_free (name); - g_object_unref (network); -} - -static void -account_widget_irc_combobox_network_changed_cb (GtkWidget *combobox, - EmpathyAccountWidgetIrc *settings) -{ - update_server_params (settings); - empathy_account_widget_changed (settings->self); -} - -static void -fill_networks_model (EmpathyAccountWidgetIrc *settings, - EmpathyIrcNetwork *network_to_select) -{ - GSList *networks, *l; - GtkTreeModel *model; - GtkListStore *store; - - networks = empathy_irc_network_manager_get_networks ( - settings->network_manager); - - model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network)); - store = GTK_LIST_STORE (model); - - for (l = networks; l != NULL; l = g_slist_next (l)) - { - gchar *name; - EmpathyIrcNetwork *network = l->data; - GtkTreeIter iter; - - g_object_get (network, "name", &name, NULL); - - gtk_list_store_insert_with_values (store, &iter, -1, - COL_NETWORK_OBJ, network, - COL_NETWORK_NAME, name, - -1); - - if (network == network_to_select) - { - gtk_combo_box_set_active_iter ( - GTK_COMBO_BOX (settings->combobox_network), &iter); - } - - g_free (name); - g_object_unref (network); - } - - if (network_to_select == NULL) - { - /* Select the first network */ - GtkTreeIter iter; - - if (gtk_tree_model_get_iter_first (model, &iter)) - { - gtk_combo_box_set_active_iter ( - GTK_COMBO_BOX (settings->combobox_network), &iter); - - update_server_params (settings); - } - } - - g_slist_free (networks); -} - static void account_widget_irc_setup (EmpathyAccountWidgetIrc *settings) { const gchar *nick = NULL; const gchar *fullname = NULL; - const gchar *server = NULL; gint port = 6667; const gchar *charset; gboolean ssl = FALSE; - EmpathyIrcNetwork *network = NULL; EmpathyAccountSettings *ac_settings; g_object_get (settings->self, "settings", &ac_settings, NULL); @@ -344,7 +69,6 @@ account_widget_irc_setup (EmpathyAccountWidgetIrc *settings) nick = empathy_account_settings_get_string (ac_settings, "account"); fullname = empathy_account_settings_get_string (ac_settings, "fullname"); - server = empathy_account_settings_get_string (ac_settings, "server"); charset = empathy_account_settings_get_string (ac_settings, "charset"); port = empathy_account_settings_get_uint32 (ac_settings, "port"); ssl = empathy_account_settings_get_boolean (ac_settings, "use-ssl"); @@ -366,63 +90,13 @@ account_widget_irc_setup (EmpathyAccountWidgetIrc *settings) empathy_account_settings_set_string (ac_settings, "fullname", fullname); } +} - if (server != NULL) - { - GtkListStore *store; - - network = empathy_irc_network_manager_find_network_by_address ( - settings->network_manager, server); - - - store = GTK_LIST_STORE (gtk_combo_box_get_model ( - GTK_COMBO_BOX (settings->combobox_network))); - - if (network != NULL) - { - gchar *name; - - g_object_set (network, "charset", charset, NULL); - - g_object_get (network, "name", &name, NULL); - DEBUG ("Account use network %s", name); - - g_free (name); - } - else - { - /* We don't have this network. Let's create it */ - EmpathyIrcServer *srv; - GtkTreeIter iter; - - DEBUG ("Create a network %s", server); - network = empathy_irc_network_new (server); - srv = empathy_irc_server_new (server, port, ssl); - - empathy_irc_network_append_server (network, srv); - empathy_irc_network_manager_add (settings->network_manager, network); - - gtk_list_store_insert_with_values (store, &iter, -1, - COL_NETWORK_OBJ, network, - COL_NETWORK_NAME, server, - -1); - - gtk_combo_box_set_active_iter ( - GTK_COMBO_BOX (settings->combobox_network), &iter); - - g_object_unref (srv); - g_object_unref (network); - } - } - - if (network == NULL) - { - network = empathy_irc_network_manager_find_network_by_address ( - settings->network_manager, DEFAULT_IRC_NETWORK); - } - - fill_networks_model (settings, network); - update_server_params (settings); +static void +network_changed_cb (EmpathyIrcNetworkChooser *chooser, + EmpathyAccountWidgetIrc *settings) +{ + empathy_account_widget_changed (settings->self); } void @@ -431,60 +105,29 @@ empathy_account_widget_irc_build (EmpathyAccountWidget *self, GtkWidget **table_common_settings) { EmpathyAccountWidgetIrc *settings; - gchar *dir, *user_file_with_path, *global_file_with_path; - GtkListStore *store; - GtkCellRenderer *renderer; + EmpathyAccountSettings *ac_settings; settings = g_slice_new0 (EmpathyAccountWidgetIrc); settings->self = self; - dir = g_build_filename (g_get_user_config_dir (), PACKAGE_NAME, NULL); - g_mkdir_with_parents (dir, S_IRUSR | S_IWUSR | S_IXUSR); - user_file_with_path = g_build_filename (dir, IRC_NETWORKS_FILENAME, NULL); - g_free (dir); - - global_file_with_path = g_build_filename (g_getenv ("EMPATHY_SRCDIR"), - "libempathy", IRC_NETWORKS_FILENAME, NULL); - if (!g_file_test (global_file_with_path, G_FILE_TEST_EXISTS)) - { - g_free (global_file_with_path); - global_file_with_path = g_build_filename (DATADIR, "empathy", - IRC_NETWORKS_FILENAME, NULL); - } - - settings->network_manager = empathy_irc_network_manager_new ( - global_file_with_path, - user_file_with_path); - - g_free (global_file_with_path); - g_free (user_file_with_path); - self->ui_details->gui = empathy_builder_get_file (filename, - "table_irc_settings", table_common_settings, + "table_irc_settings", &table_common_settings, "vbox_irc", &self->ui_details->widget, "table_irc_settings", &settings->vbox_settings, - "combobox_network", &settings->combobox_network, NULL); - /* Fill the networks combobox */ - store = gtk_list_store_new (2, G_TYPE_OBJECT, G_TYPE_STRING); + /* Add network chooser button */ + g_object_get (settings->self, "settings", &ac_settings, NULL); - gtk_cell_layout_clear (GTK_CELL_LAYOUT (settings->combobox_network)); - renderer = gtk_cell_renderer_text_new (); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (settings->combobox_network), - renderer, TRUE); - gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (settings->combobox_network), - renderer, - "text", COL_NETWORK_NAME, - NULL); + settings->network_chooser = empathy_irc_network_chooser_new (ac_settings); - gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store), - COL_NETWORK_NAME, - GTK_SORT_ASCENDING); + g_signal_connect (settings->network_chooser, "changed", + G_CALLBACK (network_changed_cb), settings); - gtk_combo_box_set_model (GTK_COMBO_BOX (settings->combobox_network), - GTK_TREE_MODEL (store)); - g_object_unref (store); + gtk_table_attach (GTK_TABLE (table_common_settings), + settings->network_chooser, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); + + gtk_widget_show (settings->network_chooser); account_widget_irc_setup (settings); @@ -497,15 +140,9 @@ empathy_account_widget_irc_build (EmpathyAccountWidget *self, empathy_builder_connect (self->ui_details->gui, settings, "table_irc_settings", "destroy", account_widget_irc_destroy_cb, - "button_network", "clicked", - account_widget_irc_button_edit_network_clicked_cb, - "button_add_network", "clicked", - account_widget_irc_button_add_network_clicked_cb, - "button_remove_network", "clicked", - account_widget_irc_button_remove_clicked_cb, - "combobox_network", "changed", - account_widget_irc_combobox_network_changed_cb, NULL); self->ui_details->default_focus = g_strdup ("entry_nick"); + + g_object_unref (ac_settings); } diff --git a/libempathy-gtk/empathy-account-widget-irc.ui b/libempathy-gtk/empathy-account-widget-irc.ui index af733fb95..de0aa00cd 100644 --- a/libempathy-gtk/empathy-account-widget-irc.ui +++ b/libempathy-gtk/empathy-account-widget-irc.ui @@ -257,7 +257,6 @@ True - vertical True @@ -372,80 +371,6 @@ - - - True - 2 - - - True - - - 0 - - - - - True - True - True - - - True - gtk-add - - - - - False - False - 1 - - - - - True - True - True - - - True - gtk-edit - - - - - False - False - 2 - - - - - True - True - True - - - True - gtk-remove - - - - - False - False - 3 - - - - - 1 - 2 - GTK_FILL - GTK_FILL - - True @@ -458,6 +383,9 @@ + + + 0 -- cgit v1.2.3 From e1513fcc6cebe513e0b3b0778b5cfe18097fe576 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 25 Aug 2010 10:55:46 +0200 Subject: irc-network: add accessors for name and charset --- libempathy/empathy-irc-network.c | 16 ++++++++++++++++ libempathy/empathy-irc-network.h | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/libempathy/empathy-irc-network.c b/libempathy/empathy-irc-network.c index 9b75f0e82..d5b0bdcb9 100644 --- a/libempathy/empathy-irc-network.c +++ b/libempathy/empathy-irc-network.c @@ -359,3 +359,19 @@ empathy_irc_network_set_server_position (EmpathyIrcNetwork *self, g_signal_emit (self, signals[MODIFIED], 0); } + +const gchar * +empathy_irc_network_get_name (EmpathyIrcNetwork *self) +{ + EmpathyIrcNetworkPriv *priv = GET_PRIV (self); + + return priv->name; +} + +const gchar * +empathy_irc_network_get_charset (EmpathyIrcNetwork *self) +{ + EmpathyIrcNetworkPriv *priv = GET_PRIV (self); + + return priv->charset; +} diff --git a/libempathy/empathy-irc-network.h b/libempathy/empathy-irc-network.h index b10b2769e..9d78f3c3f 100644 --- a/libempathy/empathy-irc-network.h +++ b/libempathy/empathy-irc-network.h @@ -75,6 +75,10 @@ void empathy_irc_network_remove_server (EmpathyIrcNetwork *network, void empathy_irc_network_set_server_position (EmpathyIrcNetwork *network, EmpathyIrcServer *server, gint pos); +const gchar * empathy_irc_network_get_name (EmpathyIrcNetwork *network); + +const gchar * empathy_irc_network_get_charset (EmpathyIrcNetwork *network); + G_END_DECLS #endif /* __EMPATHY_IRC_NETWORK_H__ */ -- cgit v1.2.3 From c7c68087a5a17cb270ac120e631cf4dbe7339fa4 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 25 Aug 2010 11:12:47 +0200 Subject: irc-network-chooser-dialog: add live search support --- .../empathy-irc-network-chooser-dialog.c | 98 ++++++++++++++++++++-- 1 file changed, 91 insertions(+), 7 deletions(-) diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c index e4f6146bc..55da49884 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.c +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -33,6 +33,7 @@ #include "empathy-irc-network-dialog.h" #include "empathy-ui-utils.h" +#include "empathy-live-search.h" #define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT | EMPATHY_DEBUG_IRC #include @@ -55,6 +56,10 @@ typedef struct { GtkWidget *treeview; GtkListStore *store; + GtkTreeModelFilter *filter; + GtkWidget *search; + + gulong search_sig; } EmpathyIrcNetworkChooserDialogPriv; enum { @@ -109,6 +114,7 @@ empathy_irc_network_chooser_dialog_get_property (GObject *object, } } +/* The iter returned by *it is a priv->store iter (not a filter one) */ static EmpathyIrcNetwork * dup_selected_network (EmpathyIrcNetworkChooserDialog *self, GtkTreeIter *it) @@ -120,13 +126,17 @@ dup_selected_network (EmpathyIrcNetworkChooserDialog *self, GtkTreeModel *model; selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview)); - gtk_tree_selection_get_selected (selection, &model, &iter); + if (!gtk_tree_selection_get_selected (selection, &model, &iter)) + return NULL; gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1); g_assert (network != NULL); if (it != NULL) - *it = iter; + { + gtk_tree_model_filter_convert_iter_to_child_iter (priv->filter, it, + &iter); + } return network; } @@ -158,8 +168,13 @@ scroll_to_iter (EmpathyIrcNetworkChooserDialog *self, { EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); GtkTreePath *path; + GtkTreeIter filter_iter; - path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->store), iter); + /* Convert to a filter iter */ + gtk_tree_model_filter_convert_child_iter_to_iter (priv->filter, &filter_iter, + iter); + + path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->filter), &filter_iter); if (path != NULL) { @@ -177,12 +192,17 @@ select_iter (EmpathyIrcNetworkChooserDialog *self, { EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); GtkTreeSelection *selection; + GtkTreeIter filter_iter; /* Select the network */ selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW (priv->treeview)); - gtk_tree_selection_select_iter (selection, iter); + /* Convert to a filter iter */ + gtk_tree_model_filter_convert_child_iter_to_iter (priv->filter, &filter_iter, + iter); + + gtk_tree_selection_select_iter (selection, &filter_iter); /* Scroll to the selected network */ scroll_to_iter (self, iter); @@ -236,7 +256,11 @@ irc_network_dialog_destroy_cb (GtkWidget *widget, gchar *name; GtkTreeIter iter; + priv->changed = TRUE; + network = dup_selected_network (self, &iter); + if (network == NULL) + return; /* name could be changed */ g_object_get (network, "name", &name, NULL); @@ -245,8 +269,6 @@ irc_network_dialog_destroy_cb (GtkWidget *widget, scroll_to_iter (self, &iter); - priv->changed = TRUE; - g_object_unref (network); g_free (name); } @@ -269,6 +291,9 @@ edit_network (EmpathyIrcNetworkChooserDialog *self) EmpathyIrcNetwork *network; network = dup_selected_network (self, NULL); + if (network == NULL) + return; + display_irc_network_dialog (self, network); g_object_unref (network); @@ -309,6 +334,8 @@ remove_network (EmpathyIrcNetworkChooserDialog *self) gchar *name; network = dup_selected_network (self, &iter); + if (network == NULL) + return; g_object_get (network, "name", &name, NULL); DEBUG ("Remove network %s", name); @@ -337,6 +364,44 @@ dialog_response_cb (GtkDialog *dialog, remove_network (self); } +static gboolean +filter_visible_func (GtkTreeModel *model, + GtkTreeIter *iter, + gpointer user_data) +{ + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (user_data); + EmpathyIrcNetwork *network; + gboolean visible; + + gtk_tree_model_get (model, iter, COL_NETWORK_OBJ, &network, -1); + + visible = empathy_live_search_match (EMPATHY_LIVE_SEARCH (priv->search), + empathy_irc_network_get_name (network)); + + g_object_unref (network); + return visible; +} + + +static void +search_text_notify_cb (EmpathyLiveSearch *search, + GParamSpec *pspec, + EmpathyIrcNetworkChooserDialog *self) +{ + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); + + gtk_tree_model_filter_refilter (priv->filter); +} + +static void +dialog_destroy_cb (GtkWidget *widget, + EmpathyIrcNetworkChooserDialog *self) +{ + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); + + g_signal_handler_disconnect (priv->search, priv->search_sig); +} + static void empathy_irc_network_chooser_dialog_constructed (GObject *object) { @@ -359,7 +424,7 @@ empathy_irc_network_chooser_dialog_constructed (GObject *object) COL_NETWORK_NAME, GTK_SORT_ASCENDING); - priv->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (priv->store)); + priv->treeview = gtk_tree_view_new (); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (priv->treeview), FALSE); gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->treeview), FALSE); @@ -383,6 +448,22 @@ empathy_irc_network_chooser_dialog_constructed (GObject *object) gtk_container_add (GTK_CONTAINER (scroll), priv->treeview); gtk_box_pack_start (GTK_BOX (vbox), scroll, TRUE, TRUE, 6); + /* Live search */ + priv->search = empathy_live_search_new (priv->treeview); + + gtk_box_pack_start (GTK_BOX (vbox), priv->search, FALSE, TRUE, 0); + + priv->filter = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new ( + GTK_TREE_MODEL (priv->store), NULL)); + gtk_tree_model_filter_set_visible_func (priv->filter, + filter_visible_func, self, NULL); + + gtk_tree_view_set_model (GTK_TREE_VIEW (priv->treeview), + GTK_TREE_MODEL (priv->filter)); + + priv->search_sig = g_signal_connect (priv->search, "notify::text", + G_CALLBACK (search_text_notify_cb), self); + /* Add buttons */ gtk_dialog_add_buttons (dialog, GTK_STOCK_ADD, GTK_RESPONSE_OK, @@ -398,6 +479,8 @@ empathy_irc_network_chooser_dialog_constructed (GObject *object) g_signal_connect (self, "response", G_CALLBACK (dialog_response_cb), self); + g_signal_connect (self, "destroy", + G_CALLBACK (dialog_destroy_cb), self); /* Request a side ensuring to display at least some networks */ gtk_widget_set_size_request (GTK_WIDGET (self), -1, 300); @@ -413,6 +496,7 @@ empathy_irc_network_chooser_dialog_dispose (GObject *object) tp_clear_object (&priv->network); tp_clear_object (&priv->network_manager); tp_clear_object (&priv->store); + tp_clear_object (&priv->filter); if (G_OBJECT_CLASS (empathy_irc_network_chooser_dialog_parent_class)->dispose) G_OBJECT_CLASS (empathy_irc_network_chooser_dialog_parent_class)->dispose (object); -- cgit v1.2.3 From a687feb900220a231b63bce08f43743488dc6bbe Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 25 Aug 2010 11:14:59 +0200 Subject: irc-network-chooser-dialog: use network accessors --- .../empathy-irc-network-chooser-dialog.c | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c index 55da49884..757cdc7a6 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.c +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -226,21 +226,17 @@ fill_store (EmpathyIrcNetworkChooserDialog *self) for (l = networks; l != NULL; l = g_slist_next (l)) { - gchar *name; EmpathyIrcNetwork *network = l->data; GtkTreeIter iter; - g_object_get (network, "name", &name, NULL); - gtk_list_store_insert_with_values (priv->store, &iter, -1, COL_NETWORK_OBJ, network, - COL_NETWORK_NAME, name, + COL_NETWORK_NAME, empathy_irc_network_get_name (network), -1); if (network == priv->network) select_iter (self, &iter, FALSE); - g_free (name); g_object_unref (network); } @@ -253,7 +249,6 @@ irc_network_dialog_destroy_cb (GtkWidget *widget, { EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); EmpathyIrcNetwork *network; - gchar *name; GtkTreeIter iter; priv->changed = TRUE; @@ -263,14 +258,12 @@ irc_network_dialog_destroy_cb (GtkWidget *widget, return; /* name could be changed */ - g_object_get (network, "name", &name, NULL); gtk_list_store_set (GTK_LIST_STORE (priv->store), &iter, - COL_NETWORK_NAME, name, -1); + COL_NETWORK_NAME, empathy_irc_network_get_name (network), -1); scroll_to_iter (self, &iter); g_object_unref (network); - g_free (name); } static void @@ -304,24 +297,20 @@ add_network (EmpathyIrcNetworkChooserDialog *self) { EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); EmpathyIrcNetwork *network; - gchar *name; GtkTreeIter iter; network = empathy_irc_network_new (_("New Network")); empathy_irc_network_manager_add (priv->network_manager, network); - g_object_get (network, "name", &name, NULL); - gtk_list_store_insert_with_values (priv->store, &iter, -1, COL_NETWORK_OBJ, network, - COL_NETWORK_NAME, name, + COL_NETWORK_NAME, empathy_irc_network_get_name (network), -1); select_iter (self, &iter, TRUE); display_irc_network_dialog (self, network); - g_free (name); g_object_unref (network); } @@ -331,14 +320,12 @@ remove_network (EmpathyIrcNetworkChooserDialog *self) EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); EmpathyIrcNetwork *network; GtkTreeIter iter; - gchar *name; network = dup_selected_network (self, &iter); if (network == NULL) return; - g_object_get (network, "name", &name, NULL); - DEBUG ("Remove network %s", name); + 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); @@ -347,7 +334,6 @@ remove_network (EmpathyIrcNetworkChooserDialog *self) if (gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->store), &iter)) select_iter (self, &iter, TRUE); - g_free (name); g_object_unref (network); } -- cgit v1.2.3 From 1d030ae9e63bbaac4fcd805dae61e22e3b1f5592 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 25 Aug 2010 11:17:11 +0200 Subject: irc-network-chooser: use network accessors --- libempathy-gtk/empathy-irc-network-chooser.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/libempathy-gtk/empathy-irc-network-chooser.c b/libempathy-gtk/empathy-irc-network-chooser.c index ce71465c7..6d41ae224 100644 --- a/libempathy-gtk/empathy-irc-network-chooser.c +++ b/libempathy-gtk/empathy-irc-network-chooser.c @@ -121,14 +121,13 @@ update_server_params (EmpathyIrcNetworkChooser *self) { EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self); GSList *servers; - gchar *charset; + const gchar *charset; g_assert (priv->network != NULL); - g_object_get (priv->network, "charset", &charset, NULL); + charset = empathy_irc_network_get_charset (priv->network); DEBUG ("Setting charset to %s", charset); empathy_account_settings_set_string (priv->settings, "charset", charset); - g_free (charset); servers = empathy_irc_network_get_servers (priv->network); if (g_slist_length (servers) > 0) @@ -168,13 +167,11 @@ static void set_label (EmpathyIrcNetworkChooser *self) { EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self); - gchar *name; g_assert (priv->network != NULL); - g_object_get (priv->network, "name", &name, NULL); - gtk_button_set_label (GTK_BUTTON (self), name); - g_free (name); + gtk_button_set_label (GTK_BUTTON (self), + empathy_irc_network_get_name (priv->network)); } static void -- cgit v1.2.3 From fd86b3c72bcc01a3592cc5beec052526c098e1bd Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 25 Aug 2010 14:10:10 +0200 Subject: pass filter iter to select_iter() and scroll_to_iter() --- .../empathy-irc-network-chooser-dialog.c | 46 +++++++++++++--------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c index 757cdc7a6..4f0b618b5 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.c +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -162,19 +162,15 @@ treeview_changed_cb (GtkTreeView *treeview, priv->changed = TRUE; } +/* Take a filter iterator as argument */ static void scroll_to_iter (EmpathyIrcNetworkChooserDialog *self, - GtkTreeIter *iter) + GtkTreeIter *filter_iter) { EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); GtkTreePath *path; - GtkTreeIter filter_iter; - /* Convert to a filter iter */ - gtk_tree_model_filter_convert_child_iter_to_iter (priv->filter, &filter_iter, - iter); - - path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->filter), &filter_iter); + path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->filter), filter_iter); if (path != NULL) { @@ -185,27 +181,23 @@ scroll_to_iter (EmpathyIrcNetworkChooserDialog *self, } } +/* Take a filter iterator as argument */ static void select_iter (EmpathyIrcNetworkChooserDialog *self, - GtkTreeIter *iter, + GtkTreeIter *filter_iter, gboolean emulate_changed) { EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); GtkTreeSelection *selection; - GtkTreeIter filter_iter; /* Select the network */ selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW (priv->treeview)); - /* Convert to a filter iter */ - gtk_tree_model_filter_convert_child_iter_to_iter (priv->filter, &filter_iter, - iter); - - gtk_tree_selection_select_iter (selection, &filter_iter); + gtk_tree_selection_select_iter (selection, filter_iter); /* Scroll to the selected network */ - scroll_to_iter (self, iter); + scroll_to_iter (self, filter_iter); if (emulate_changed) { @@ -235,7 +227,15 @@ fill_store (EmpathyIrcNetworkChooserDialog *self) -1); if (network == priv->network) - select_iter (self, &iter, FALSE); + { + GtkTreeIter filter_iter; + + /* Convert to a filter iter */ + gtk_tree_model_filter_convert_child_iter_to_iter (priv->filter, + &filter_iter, &iter); + + select_iter (self, &filter_iter, FALSE); + } g_object_unref (network); } @@ -249,7 +249,7 @@ irc_network_dialog_destroy_cb (GtkWidget *widget, { EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); EmpathyIrcNetwork *network; - GtkTreeIter iter; + GtkTreeIter iter, filter_iter; priv->changed = TRUE; @@ -261,6 +261,10 @@ irc_network_dialog_destroy_cb (GtkWidget *widget, gtk_list_store_set (GTK_LIST_STORE (priv->store), &iter, COL_NETWORK_NAME, empathy_irc_network_get_name (network), -1); + /* Convert to a filter iter */ + gtk_tree_model_filter_convert_child_iter_to_iter (priv->filter, &filter_iter, + &iter); + scroll_to_iter (self, &iter); g_object_unref (network); @@ -297,7 +301,7 @@ add_network (EmpathyIrcNetworkChooserDialog *self) { EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); EmpathyIrcNetwork *network; - GtkTreeIter iter; + GtkTreeIter iter, filter_iter; network = empathy_irc_network_new (_("New Network")); empathy_irc_network_manager_add (priv->network_manager, network); @@ -307,7 +311,11 @@ add_network (EmpathyIrcNetworkChooserDialog *self) COL_NETWORK_NAME, empathy_irc_network_get_name (network), -1); - select_iter (self, &iter, TRUE); + /* Convert to a filter iter */ + gtk_tree_model_filter_convert_child_iter_to_iter (priv->filter, &filter_iter, + &iter); + + select_iter (self, &filter_iter, TRUE); display_irc_network_dialog (self, network); -- cgit v1.2.3 From cc260a6fe68be18a935dbc81caf25107325b5563 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 25 Aug 2010 14:12:22 +0200 Subject: select the first matching network when searching --- libempathy-gtk/empathy-irc-network-chooser-dialog.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c index 4f0b618b5..8fadaf3d6 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.c +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -383,8 +383,14 @@ search_text_notify_cb (EmpathyLiveSearch *search, EmpathyIrcNetworkChooserDialog *self) { EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); + GtkTreeIter iter; gtk_tree_model_filter_refilter (priv->filter); + + /* Select first matching network */ + if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->filter), &iter)) + select_iter (self, &iter, TRUE); + /* TODO: else unsensitive the close button */ } static void -- cgit v1.2.3 From 75f7bc8ce00e28a84d19bf036382e2566b60f9e8 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 25 Aug 2010 14:17:50 +0200 Subject: replace the close button by 'Select' --- libempathy-gtk/empathy-irc-network-chooser-dialog.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c index 8fadaf3d6..c7bf3c078 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.c +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -58,6 +58,7 @@ typedef struct { GtkListStore *store; GtkTreeModelFilter *filter; GtkWidget *search; + GtkWidget *select_button; gulong search_sig; } EmpathyIrcNetworkChooserDialogPriv; @@ -469,9 +470,11 @@ empathy_irc_network_chooser_dialog_constructed (GObject *object) GTK_STOCK_ADD, GTK_RESPONSE_OK, GTK_STOCK_EDIT, GTK_RESPONSE_APPLY, GTK_STOCK_REMOVE, GTK_RESPONSE_REJECT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); + priv->select_button = gtk_dialog_add_button (dialog, _("Select"), + GTK_RESPONSE_CLOSE); + fill_store (self); g_signal_connect (priv->treeview, "cursor-changed", -- cgit v1.2.3 From c196520a0117248010140b0612e7d2726d135afc Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 25 Aug 2010 14:18:06 +0200 Subject: don't allow to select a network if none is actually selected --- libempathy-gtk/empathy-irc-network-chooser-dialog.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c index c7bf3c078..eab8f5b09 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.c +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -385,13 +385,18 @@ search_text_notify_cb (EmpathyLiveSearch *search, { EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); GtkTreeIter iter; + gboolean sensitive = FALSE; gtk_tree_model_filter_refilter (priv->filter); /* Select first matching network */ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->filter), &iter)) - select_iter (self, &iter, TRUE); - /* TODO: else unsensitive the close button */ + { + select_iter (self, &iter, TRUE); + sensitive = TRUE; + } + + gtk_widget_set_sensitive (priv->select_button, sensitive); } static void -- cgit v1.2.3 From 102c526be04a1356d1935844f293431fd864d9fe Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 25 Aug 2010 14:23:07 +0200 Subject: make title clearer --- libempathy-gtk/empathy-irc-network-chooser-dialog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c index eab8f5b09..47f5b3183 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.c +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -421,7 +421,7 @@ empathy_irc_network_chooser_dialog_constructed (GObject *object) g_assert (priv->settings != NULL); - gtk_window_set_title (GTK_WINDOW (self), _("IRC Networks")); + gtk_window_set_title (GTK_WINDOW (self), _("Choose an IRC network")); /* Create store and treeview */ priv->store = gtk_list_store_new (2, G_TYPE_OBJECT, G_TYPE_STRING); -- cgit v1.2.3 From 88cdfb884de9b2e288d07924624083a8fabe643f Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 25 Aug 2010 15:00:12 +0200 Subject: select_iter: set the cursor as well --- libempathy-gtk/empathy-irc-network-chooser-dialog.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c index 47f5b3183..8276a17d2 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.c +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -190,6 +190,7 @@ select_iter (EmpathyIrcNetworkChooserDialog *self, { EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); GtkTreeSelection *selection; + GtkTreePath *path; /* Select the network */ selection = gtk_tree_view_get_selection ( @@ -197,6 +198,15 @@ select_iter (EmpathyIrcNetworkChooserDialog *self, gtk_tree_selection_select_iter (selection, filter_iter); + path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->filter), filter_iter); + if (path != NULL) + { + gtk_tree_view_set_cursor (GTK_TREE_VIEW (priv->treeview), path, + NULL, FALSE); + + gtk_tree_path_free (path); + } + /* Scroll to the selected network */ scroll_to_iter (self, filter_iter); -- cgit v1.2.3 From d4e129c0d66340a755a9cb14f91e92539426e76d Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 25 Aug 2010 16:14:30 +0200 Subject: assert that iter convert don't fail If they do we did something wrong. --- libempathy-gtk/empathy-irc-network-chooser-dialog.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c index 8276a17d2..001f1dfbd 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.c +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -242,8 +242,8 @@ fill_store (EmpathyIrcNetworkChooserDialog *self) GtkTreeIter filter_iter; /* Convert to a filter iter */ - gtk_tree_model_filter_convert_child_iter_to_iter (priv->filter, - &filter_iter, &iter); + g_assert (gtk_tree_model_filter_convert_child_iter_to_iter ( + priv->filter, &filter_iter, &iter)); select_iter (self, &filter_iter, FALSE); } @@ -273,8 +273,8 @@ irc_network_dialog_destroy_cb (GtkWidget *widget, COL_NETWORK_NAME, empathy_irc_network_get_name (network), -1); /* Convert to a filter iter */ - gtk_tree_model_filter_convert_child_iter_to_iter (priv->filter, &filter_iter, - &iter); + g_assert (gtk_tree_model_filter_convert_child_iter_to_iter (priv->filter, + &filter_iter, &iter)); scroll_to_iter (self, &iter); @@ -323,8 +323,8 @@ add_network (EmpathyIrcNetworkChooserDialog *self) -1); /* Convert to a filter iter */ - gtk_tree_model_filter_convert_child_iter_to_iter (priv->filter, &filter_iter, - &iter); + g_assert (gtk_tree_model_filter_convert_child_iter_to_iter (priv->filter, + &filter_iter, &iter)); select_iter (self, &filter_iter, TRUE); -- cgit v1.2.3 From 98318894ea8217020e29be42b2cae209831b179c Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 25 Aug 2010 16:16:31 +0200 Subject: scroll_to_iter: need a filter iter --- libempathy-gtk/empathy-irc-network-chooser-dialog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c index 001f1dfbd..655c6776b 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.c +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -276,7 +276,7 @@ irc_network_dialog_destroy_cb (GtkWidget *widget, g_assert (gtk_tree_model_filter_convert_child_iter_to_iter (priv->filter, &filter_iter, &iter)); - scroll_to_iter (self, &iter); + scroll_to_iter (self, &filter_iter); g_object_unref (network); } -- cgit v1.2.3 From 0ead72dafcd03ac8db7b854cf883bea7a8394616 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 25 Aug 2010 16:25:19 +0200 Subject: factor out iter_to_filter_iter() --- .../empathy-irc-network-chooser-dialog.c | 35 +++++++++++++--------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c index 655c6776b..b51a32e9d 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.c +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -218,6 +218,19 @@ select_iter (EmpathyIrcNetworkChooserDialog *self, } } +static GtkTreeIter +iter_to_filter_iter (EmpathyIrcNetworkChooserDialog *self, + GtkTreeIter *iter) +{ + EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); + GtkTreeIter filter_iter; + + g_assert (gtk_tree_model_filter_convert_child_iter_to_iter (priv->filter, + &filter_iter, iter)); + + return filter_iter; +} + static void fill_store (EmpathyIrcNetworkChooserDialog *self) { @@ -239,11 +252,7 @@ fill_store (EmpathyIrcNetworkChooserDialog *self) if (network == priv->network) { - GtkTreeIter filter_iter; - - /* Convert to a filter iter */ - g_assert (gtk_tree_model_filter_convert_child_iter_to_iter ( - priv->filter, &filter_iter, &iter)); + GtkTreeIter filter_iter = iter_to_filter_iter (self, &iter); select_iter (self, &filter_iter, FALSE); } @@ -272,10 +281,7 @@ irc_network_dialog_destroy_cb (GtkWidget *widget, gtk_list_store_set (GTK_LIST_STORE (priv->store), &iter, COL_NETWORK_NAME, empathy_irc_network_get_name (network), -1); - /* Convert to a filter iter */ - g_assert (gtk_tree_model_filter_convert_child_iter_to_iter (priv->filter, - &filter_iter, &iter)); - + filter_iter = iter_to_filter_iter (self, &iter); scroll_to_iter (self, &filter_iter); g_object_unref (network); @@ -322,10 +328,7 @@ add_network (EmpathyIrcNetworkChooserDialog *self) COL_NETWORK_NAME, empathy_irc_network_get_name (network), -1); - /* Convert to a filter iter */ - g_assert (gtk_tree_model_filter_convert_child_iter_to_iter (priv->filter, - &filter_iter, &iter)); - + filter_iter = iter_to_filter_iter (self, &iter); select_iter (self, &filter_iter, TRUE); display_irc_network_dialog (self, network); @@ -351,7 +354,11 @@ remove_network (EmpathyIrcNetworkChooserDialog *self) /* Select next network */ if (gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->store), &iter)) - select_iter (self, &iter, TRUE); + { + GtkTreeIter filter_iter = iter_to_filter_iter (self, &iter); + + select_iter (self, &filter_iter, TRUE); + } g_object_unref (network); } -- cgit v1.2.3 From 469e9ea6d1e007265f7a5ec518e27052be9305a3 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 25 Aug 2010 16:28:09 +0200 Subject: search_text_notify_cb: rename iter to filter_iter to avoid confusion --- libempathy-gtk/empathy-irc-network-chooser-dialog.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c index b51a32e9d..6f123fb44 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.c +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -401,15 +401,16 @@ search_text_notify_cb (EmpathyLiveSearch *search, EmpathyIrcNetworkChooserDialog *self) { EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self); - GtkTreeIter iter; + GtkTreeIter filter_iter; gboolean sensitive = FALSE; gtk_tree_model_filter_refilter (priv->filter); /* Select first matching network */ - if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->filter), &iter)) + if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->filter), + &filter_iter)) { - select_iter (self, &iter, TRUE); + select_iter (self, &filter_iter, TRUE); sensitive = TRUE; } -- cgit v1.2.3 From f8c7011a571c35d976e00526491d499ec623acb9 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 25 Aug 2010 16:30:15 +0200 Subject: cance live search when adding/removing a network --- libempathy-gtk/empathy-irc-network-chooser-dialog.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c index 6f123fb44..dc7445fd5 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.c +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -320,6 +320,8 @@ add_network (EmpathyIrcNetworkChooserDialog *self) EmpathyIrcNetwork *network; GtkTreeIter iter, filter_iter; + gtk_widget_hide (priv->search); + network = empathy_irc_network_new (_("New Network")); empathy_irc_network_manager_add (priv->network_manager, network); @@ -343,6 +345,8 @@ remove_network (EmpathyIrcNetworkChooserDialog *self) EmpathyIrcNetwork *network; GtkTreeIter iter; + gtk_widget_hide (priv->search); + network = dup_selected_network (self, &iter); if (network == NULL) return; -- cgit v1.2.3 From deddbb95eba55352658572a9a3c9293fed4842c2 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 25 Aug 2010 16:41:35 +0200 Subject: properly set table_common_settings account-widget needs it to add the "Enabled" checkbox. --- libempathy-gtk/empathy-account-widget-irc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libempathy-gtk/empathy-account-widget-irc.c b/libempathy-gtk/empathy-account-widget-irc.c index 4b41c6e47..d60af5ea8 100644 --- a/libempathy-gtk/empathy-account-widget-irc.c +++ b/libempathy-gtk/empathy-account-widget-irc.c @@ -111,7 +111,7 @@ empathy_account_widget_irc_build (EmpathyAccountWidget *self, settings->self = self; self->ui_details->gui = empathy_builder_get_file (filename, - "table_irc_settings", &table_common_settings, + "table_irc_settings", table_common_settings, "vbox_irc", &self->ui_details->widget, "table_irc_settings", &settings->vbox_settings, NULL); @@ -124,7 +124,7 @@ empathy_account_widget_irc_build (EmpathyAccountWidget *self, g_signal_connect (settings->network_chooser, "changed", G_CALLBACK (network_changed_cb), settings); - gtk_table_attach (GTK_TABLE (table_common_settings), + gtk_table_attach (GTK_TABLE (*table_common_settings), settings->network_chooser, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); gtk_widget_show (settings->network_chooser); -- cgit v1.2.3 From acc900cd828e7883436fe41ca68d5de3b27cf1df Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Thu, 26 Aug 2010 11:50:11 +0200 Subject: Hide the search after picking the network to get the right one --- libempathy-gtk/empathy-irc-network-chooser-dialog.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c index dc7445fd5..8dce07389 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.c +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -345,12 +345,13 @@ remove_network (EmpathyIrcNetworkChooserDialog *self) EmpathyIrcNetwork *network; GtkTreeIter iter; - gtk_widget_hide (priv->search); - network = dup_selected_network (self, &iter); if (network == NULL) return; + /* Hide the search after picking the network to get the right one */ + gtk_widget_hide (priv->search); + DEBUG ("Remove network %s", empathy_irc_network_get_name (network)); gtk_list_store_remove (priv->store, &iter); -- cgit v1.2.3 From c48ad853488aed4cd28eeb20d6c4614f01b4b2f0 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Thu, 26 Aug 2010 12:20:18 +0200 Subject: search_text_notify_cb: select first matching only if we are still searching Also scroll to the selected network when cancelling the search. --- .../empathy-irc-network-chooser-dialog.c | 23 ++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c index 8dce07389..b4483df1e 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.c +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -411,11 +411,30 @@ search_text_notify_cb (EmpathyLiveSearch *search, gtk_tree_model_filter_refilter (priv->filter); - /* Select first matching network */ + /* Is there at least one network in the view ? */ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->filter), &filter_iter)) { - select_iter (self, &filter_iter, TRUE); + const gchar *text; + + text = empathy_live_search_get_text (EMPATHY_LIVE_SEARCH (priv->search)); + if (!EMP_STR_EMPTY (text)) + { + /* We are doing a search, select the first matching network */ + select_iter (self, &filter_iter, TRUE); + } + else + { + /* Search has been cancelled. Scroll to the selected network */ + GtkTreeSelection *selection; + + selection = gtk_tree_view_get_selection ( + GTK_TREE_VIEW (priv->treeview)); + + if (gtk_tree_selection_get_selected (selection, NULL, &filter_iter)) + scroll_to_iter (self, &filter_iter); + } + sensitive = TRUE; } -- cgit v1.2.3 From 3ba9a682ce49528af7db7a6d7e5b5baddd475618 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Thu, 26 Aug 2010 13:54:01 +0200 Subject: irc-network-chooser-dialog: make it transient and modal --- libempathy-gtk/empathy-irc-network-chooser-dialog.c | 6 +++++- libempathy-gtk/empathy-irc-network-chooser-dialog.h | 3 ++- libempathy-gtk/empathy-irc-network-chooser.c | 5 ++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c index b4483df1e..06d9e59a4 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.c +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -534,6 +534,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 +596,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); } diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.h b/libempathy-gtk/empathy-irc-network-chooser-dialog.h index 1c9d3fabd..0d4f24e7f 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.h +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.h @@ -57,7 +57,8 @@ GType empathy_irc_network_chooser_dialog_get_type (void) G_GNUC_CONST; GtkWidget * empathy_irc_network_chooser_dialog_new ( EmpathyAccountSettings *settings, - EmpathyIrcNetwork *network); + EmpathyIrcNetwork *network, + GtkWindow *parent); EmpathyIrcNetwork * empathy_irc_network_chooser_dialog_get_network ( EmpathyIrcNetworkChooserDialog *self); diff --git a/libempathy-gtk/empathy-irc-network-chooser.c b/libempathy-gtk/empathy-irc-network-chooser.c index 6d41ae224..55a90fd0c 100644 --- a/libempathy-gtk/empathy-irc-network-chooser.c +++ b/libempathy-gtk/empathy-irc-network-chooser.c @@ -264,12 +264,15 @@ clicked_cb (GtkButton *button, gpointer user_data) { EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (button); + GtkWindow *window; if (priv->dialog != NULL) goto out; + window = empathy_get_toplevel_window (GTK_WIDGET (button)); + priv->dialog = empathy_irc_network_chooser_dialog_new (priv->settings, - priv->network); + priv->network, window); gtk_widget_show_all (priv->dialog); tp_g_signal_connect_object (priv->dialog, "response", -- cgit v1.2.3 From e62460125c8a90e0f77f18326d597868ca01a42c Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Thu, 26 Aug 2010 13:59:36 +0200 Subject: grab focus on the treeview after adding, editing or removing network --- libempathy-gtk/empathy-irc-network-chooser-dialog.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libempathy-gtk/empathy-irc-network-chooser-dialog.c b/libempathy-gtk/empathy-irc-network-chooser-dialog.c index 06d9e59a4..c1335e539 100644 --- a/libempathy-gtk/empathy-irc-network-chooser-dialog.c +++ b/libempathy-gtk/empathy-irc-network-chooser-dialog.c @@ -284,6 +284,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); } @@ -365,6 +367,8 @@ remove_network (EmpathyIrcNetworkChooserDialog *self) select_iter (self, &filter_iter, TRUE); } + gtk_widget_grab_focus (priv->treeview); + g_object_unref (network); } -- cgit v1.2.3