From 9ef44b686dd73deb01dcfddcca0926d1d1943b6e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Dapena=20Paz?= Date: Thu, 14 Jan 2010 13:15:35 +0100 Subject: [PATCH] In wizard, if country picker change, only refresh the plugins entries in provider picker if the MCC hasn't changed. This should decrease the lag after cancelling the plugin protocols check (fixes NB#152716). --- src/hildon2/modest-provider-picker.c | 92 +++++++++++++++++++++++++ src/hildon2/modest-provider-picker.h | 2 + src/widgets/modest-easysetup-wizard-dialog.c | 19 ++++-- src/widgets/modest-provider-combo-box.c | 94 +++++++++++++++++++++++++- src/widgets/modest-provider-combo-box.h | 2 + src/widgets/modest-toolkit-factory.c | 10 +++ src/widgets/modest-toolkit-factory.h | 3 + 7 files changed, 216 insertions(+), 6 deletions(-) diff --git a/src/hildon2/modest-provider-picker.c b/src/hildon2/modest-provider-picker.c index 51dc417..f14d470 100644 --- a/src/hildon2/modest-provider-picker.c +++ b/src/hildon2/modest-provider-picker.c @@ -56,12 +56,15 @@ typedef struct _ModestProviderPickerPrivate ModestProviderPickerPrivate; struct _ModestProviderPickerPrivate { GtkTreeModel *model; + GHashTable *enabled_plugin_ids; }; static void modest_provider_picker_finalize (GObject *object) { ModestProviderPickerPrivate *priv = MODEST_PROVIDER_PICKER_GET_PRIVATE (object); + g_hash_table_destroy (priv->enabled_plugin_ids); + g_object_unref (G_OBJECT (priv->model)); G_OBJECT_CLASS (modest_provider_picker_parent_class)->finalize (object); @@ -161,6 +164,8 @@ modest_provider_picker_init (ModestProviderPicker *self) priv = MODEST_PROVIDER_PICKER_GET_PRIVATE (self); priv->model = NULL; + priv->enabled_plugin_ids = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, NULL); } ModestProviderPicker* @@ -246,6 +251,8 @@ modest_provider_picker_fill (ModestProviderPicker *self, iter_provider_names = provider_names; iter_provider_ids = provider_ids; + g_hash_table_remove_all (priv->enabled_plugin_ids); + while(iter_provider_names && *iter_provider_names && iter_provider_ids && *iter_provider_ids) { const gchar* provider_name = *iter_provider_names; const gchar* provider_id = *iter_provider_ids; @@ -315,6 +322,7 @@ modest_provider_picker_fill (ModestProviderPicker *self, MODEL_COL_NAME, name, MODEL_COL_ID_TYPE, MODEST_PROVIDER_PICKER_ID_PLUGIN_PROTOCOL, -1); + g_hash_table_insert (priv->enabled_plugin_ids, g_strdup (modest_protocol_get_name (proto)), NULL); } g_slist_free (provider_protos); @@ -338,6 +346,90 @@ modest_provider_picker_fill (ModestProviderPicker *self, } +void +modest_provider_picker_refresh (ModestProviderPicker *self) +{ + ModestProviderPickerPrivate *priv; + GtkListStore *liststore; + GSList *provider_ids_used_already = NULL, *provider_protos, *tmp; + ModestProtocolRegistry *registry; + + g_return_if_fail (MODEST_IS_PROVIDER_PICKER(self)); + + priv = MODEST_PROVIDER_PICKER_GET_PRIVATE (self); + liststore = GTK_LIST_STORE (priv->model); + /* Add the provider protocols */ + registry = modest_runtime_get_protocol_registry (); + provider_protos = modest_protocol_registry_get_by_tag (registry, + MODEST_PROTOCOL_REGISTRY_PROVIDER_PROTOCOLS); + for (tmp = provider_protos; tmp != NULL; tmp = g_slist_next (tmp)) { + + GtkTreeIter iter; + ModestProtocol *proto = MODEST_PROTOCOL (tmp->data); + const gchar *name = modest_protocol_get_display_name (proto); + gboolean provider_exists; + + /* only add store protocols, no need to duplicate them */ + if (!modest_protocol_registry_protocol_type_has_tag (registry, + modest_protocol_get_type_id (proto), + MODEST_PROTOCOL_REGISTRY_STORE_PROTOCOLS)) + continue; + + if (modest_protocol_registry_protocol_type_has_tag + (registry, + modest_protocol_get_type_id (proto), + MODEST_PROTOCOL_REGISTRY_SINGLETON_PROVIDER_PROTOCOLS)) { + /* Check if there's already an account configured with this account type */ + if (modest_account_mgr_singleton_protocol_exists (modest_runtime_get_account_mgr (), + modest_protocol_get_type_id (proto))) + continue; + } + + provider_exists = g_hash_table_lookup_extended (priv->enabled_plugin_ids, modest_protocol_get_name (proto), + NULL, NULL); + + if (MODEST_ACCOUNT_PROTOCOL (proto) && + !modest_account_protocol_is_supported (MODEST_ACCOUNT_PROTOCOL (proto))) { + + if (provider_exists) { + GtkTreeIter iter; + + if (!gtk_tree_model_get_iter_first (priv->model, &iter)) + continue; + + do { + const gchar *id; + gtk_tree_model_get (priv->model, &iter, + MODEL_COL_ID, id, + -1); + + if (g_strcmp0 (id, modest_protocol_get_name (proto)) == 0) { + gtk_list_store_remove (GTK_LIST_STORE (priv->model), &iter); + break; + } + + } while (gtk_tree_model_iter_next (priv->model, &iter)); + } + + continue; + } + + if (!provider_exists) { + gtk_list_store_append (liststore, &iter); + gtk_list_store_set (liststore, &iter, + MODEL_COL_ID, modest_protocol_get_name (proto), + MODEL_COL_NAME, name, + MODEL_COL_ID_TYPE, MODEST_PROVIDER_PICKER_ID_PLUGIN_PROTOCOL, + -1); + } + } + g_slist_free (provider_protos); + + g_slist_foreach (provider_ids_used_already, (GFunc)g_free, NULL); + g_slist_free (provider_ids_used_already); + +} + /** * Returns the MCC number of the selected provider, * or NULL if no provider was selected, or "Other" was selected. diff --git a/src/hildon2/modest-provider-picker.h b/src/hildon2/modest-provider-picker.h index 426d95e..1258b4c 100644 --- a/src/hildon2/modest-provider-picker.h +++ b/src/hildon2/modest-provider-picker.h @@ -88,6 +88,8 @@ ModestProviderPicker* modest_provider_picker_new (HildonSizeType size, void modest_provider_picker_fill (ModestProviderPicker *combobox, ModestPresets *presets, gint mcc); +void modest_provider_picker_refresh (ModestProviderPicker *combobox); + gchar* modest_provider_picker_get_active_provider_id (ModestProviderPicker *combobox); ModestProviderPickerIdType modest_provider_picker_get_active_id_type (ModestProviderPicker *combobox); diff --git a/src/widgets/modest-easysetup-wizard-dialog.c b/src/widgets/modest-easysetup-wizard-dialog.c index e4a68de..5821f1d 100644 --- a/src/widgets/modest-easysetup-wizard-dialog.c +++ b/src/widgets/modest-easysetup-wizard-dialog.c @@ -141,6 +141,7 @@ struct _ModestEasysetupWizardDialogPrivate GtkWidget *page_complete_customsetup; + gint last_mcc; ModestProtocolType last_plugin_protocol_selected; GSList *missing_data_signals; }; @@ -460,7 +461,12 @@ on_account_country_selector_changed (GtkWidget *widget, gpointer user_data) /* Fill the providers selector, based on the selected country: */ if (priv->presets != NULL) { gint mcc = modest_country_selector_get_active_country_mcc (priv->account_country_selector); - modest_provider_selector_fill (priv->account_serviceprovider_selector, priv->presets, mcc); + if (priv->last_mcc != mcc) { + modest_provider_selector_fill (priv->account_serviceprovider_selector, priv->presets, mcc); + } else { + modest_provider_selector_refresh (priv->account_serviceprovider_selector); + } + priv->last_mcc = mcc; } } @@ -1398,9 +1404,13 @@ fill_providers (ModestEasysetupWizardDialog *self) modest_country_selector_set_active_country_locale (priv->account_country_selector); mcc = modest_country_selector_get_active_country_mcc (priv->account_country_selector); - modest_provider_selector_fill ( - priv->account_serviceprovider_selector, - priv->presets, mcc); + if (priv->last_mcc != mcc) { + modest_provider_selector_fill (priv->account_serviceprovider_selector, + priv->presets, mcc); + } else { + modest_provider_selector_refresh (priv->account_serviceprovider_selector); + } + priv->last_mcc = mcc; /* connect to providers picker's changed signal, so we can fill the email address: */ if (GTK_IS_COMBO_BOX (priv->account_serviceprovider_selector)) { g_signal_connect (priv->account_serviceprovider_selector, @@ -1584,6 +1594,7 @@ modest_easysetup_wizard_dialog_init (ModestEasysetupWizardDialog *self) priv->page_complete_easysetup = NULL; priv->page_complete_customsetup = NULL; priv->last_plugin_protocol_selected = MODEST_PROTOCOL_REGISTRY_TYPE_INVALID; + priv->last_mcc = -1; priv->missing_data_signals = NULL; /* Add the common pages */ diff --git a/src/widgets/modest-provider-combo-box.c b/src/widgets/modest-provider-combo-box.c index 8bf3b15..9273229 100644 --- a/src/widgets/modest-provider-combo-box.c +++ b/src/widgets/modest-provider-combo-box.c @@ -55,6 +55,7 @@ typedef struct _ModestProviderComboBoxPrivate ModestProviderComboBoxPrivate; struct _ModestProviderComboBoxPrivate { GtkTreeModel *model; + GHashTable *enabled_plugin_ids; }; static void @@ -91,6 +92,8 @@ modest_provider_combo_box_finalize (GObject *object) g_object_unref (G_OBJECT (priv->model)); + g_hash_table_destroy (priv->enabled_plugin_ids); + G_OBJECT_CLASS (modest_provider_combo_box_parent_class)->finalize (object); } @@ -152,6 +155,8 @@ modest_provider_combo_box_init (ModestProviderComboBox *self) * This must match our MODEL_COLS enum constants. */ priv->model = GTK_TREE_MODEL (gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT)); + priv->enabled_plugin_ids = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, NULL); /* Setup the combo box: */ GtkComboBox *combobox = GTK_COMBO_BOX (self); @@ -207,7 +212,9 @@ modest_provider_combo_box_fill (ModestProviderComboBox *combobox, iter_provider_names = provider_names; iter_provider_ids = provider_ids; - while(iter_provider_names && *iter_provider_names && iter_provider_ids && *iter_provider_ids) { + g_hash_table_remove_all (priv->enabled_plugin_ids); + + while(iter_provider_names && *iter_provider_names && iter_provider_ids && *iter_provider_ids) { const gchar* provider_name = *iter_provider_names; const gchar* provider_id = *iter_provider_ids; @@ -225,7 +232,7 @@ modest_provider_combo_box_fill (ModestProviderComboBox *combobox, MODEL_COL_NAME, provider_name, MODEL_COL_ID_TYPE, MODEST_PROVIDER_COMBO_BOX_ID_PROVIDER, -1); - + provider_ids_used_already = g_slist_prepend ( provider_ids_used_already, (gpointer)g_strdup (provider_id)); } @@ -265,6 +272,7 @@ modest_provider_combo_box_fill (ModestProviderComboBox *combobox, MODEL_COL_NAME, name, MODEL_COL_ID_TYPE, MODEST_PROVIDER_COMBO_BOX_ID_PLUGIN_PROTOCOL, -1); + g_hash_table_insert (priv->enabled_plugin_ids, g_strdup (modest_protocol_get_name (proto)), NULL); } } tmp = g_slist_next (tmp); @@ -287,6 +295,88 @@ modest_provider_combo_box_fill (ModestProviderComboBox *combobox, g_slist_free (provider_ids_used_already); } +void +modest_provider_combo_box_refresh (ModestProviderComboBox *self) +{ + ModestProviderComboBoxPrivate *priv; + GtkListStore *liststore; + GSList *provider_protos, *tmp; + ModestProtocolRegistry *registry; + + g_return_if_fail (MODEST_IS_PROVIDER_COMBO_BOX(self)); + + priv = MODEST_PROVIDER_COMBO_BOX_GET_PRIVATE (self); + liststore = GTK_LIST_STORE (priv->model); + /* Add the provider protocols */ + registry = modest_runtime_get_protocol_registry (); + provider_protos = modest_protocol_registry_get_by_tag (registry, + MODEST_PROTOCOL_REGISTRY_PROVIDER_PROTOCOLS); + for (tmp = provider_protos; tmp != NULL; tmp = g_slist_next (tmp)) { + + GtkTreeIter iter; + ModestProtocol *proto = MODEST_PROTOCOL (tmp->data); + const gchar *name = modest_protocol_get_display_name (proto); + gboolean provider_exists; + + /* only add store protocols, no need to duplicate them */ + if (!modest_protocol_registry_protocol_type_has_tag (registry, + modest_protocol_get_type_id (proto), + MODEST_PROTOCOL_REGISTRY_STORE_PROTOCOLS)) + continue; + + if (modest_protocol_registry_protocol_type_has_tag + (registry, + modest_protocol_get_type_id (proto), + MODEST_PROTOCOL_REGISTRY_SINGLETON_PROVIDER_PROTOCOLS)) { + /* Check if there's already an account configured with this account type */ + if (modest_account_mgr_singleton_protocol_exists (modest_runtime_get_account_mgr (), + modest_protocol_get_type_id (proto))) + continue; + } + + provider_exists = g_hash_table_lookup_extended (priv->enabled_plugin_ids, modest_protocol_get_name (proto), + NULL, NULL); + + if (MODEST_ACCOUNT_PROTOCOL (proto) && + !modest_account_protocol_is_supported (MODEST_ACCOUNT_PROTOCOL (proto))) { + + if (provider_exists) { + GtkTreeIter iter; + + if (!gtk_tree_model_get_iter_first (priv->model, &iter)) + continue; + + do { + const gchar *id; + gtk_tree_model_get (priv->model, &iter, + MODEL_COL_ID, id, + -1); + + if (g_strcmp0 (id, modest_protocol_get_name (proto)) == 0) { + gtk_list_store_remove (GTK_LIST_STORE (priv->model), &iter); + break; + } + + } while (gtk_tree_model_iter_next (priv->model, &iter)); + } + + continue; + } + + if (!provider_exists) { + gtk_list_store_append (liststore, &iter); + gtk_list_store_set (liststore, &iter, + MODEL_COL_ID, modest_protocol_get_name (proto), + MODEL_COL_NAME, name, + MODEL_COL_ID_TYPE, MODEST_PROVIDER_COMBO_BOX_ID_PLUGIN_PROTOCOL, + -1); + g_hash_table_insert (priv->enabled_plugin_ids, g_strdup (modest_protocol_get_name (proto)), NULL); + } + } + g_slist_free (provider_protos); + +} + /** * Returns the MCC number of the selected provider, * or NULL if no provider was selected, or "Other" was selected. diff --git a/src/widgets/modest-provider-combo-box.h b/src/widgets/modest-provider-combo-box.h index aca9a00..b887e2d 100644 --- a/src/widgets/modest-provider-combo-box.h +++ b/src/widgets/modest-provider-combo-box.h @@ -87,6 +87,8 @@ ModestProviderComboBox* modest_provider_combo_box_new (void); void modest_provider_combo_box_fill (ModestProviderComboBox *combobox, ModestPresets *presets, gint mcc); +void modest_provider_combo_box_refresh (ModestProviderComboBox *combobox); + gchar* modest_provider_combo_box_get_active_provider_id (ModestProviderComboBox *combobox); gchar* modest_provider_combo_box_get_active_provider_label (ModestProviderComboBox *combobox); diff --git a/src/widgets/modest-toolkit-factory.c b/src/widgets/modest-toolkit-factory.c index 8e338cc..42de49b 100644 --- a/src/widgets/modest-toolkit-factory.c +++ b/src/widgets/modest-toolkit-factory.c @@ -537,6 +537,16 @@ modest_provider_selector_fill (GtkWidget *widget, #endif } +void +modest_provider_selector_refresh (GtkWidget *widget) +{ +#ifdef USE_PROVIDER_COMBOBOX + modest_provider_combo_box_refresh (MODEST_PROVIDER_COMBO_BOX (widget)); +#else + modest_provider_picker_refresh (MODEST_PROVIDER_PICKER (widget)); +#endif +} + gchar * modest_provider_selector_get_active_provider_id (GtkWidget *widget) { diff --git a/src/widgets/modest-toolkit-factory.h b/src/widgets/modest-toolkit-factory.h index 8c00a5c..0eecfaf 100644 --- a/src/widgets/modest-toolkit-factory.h +++ b/src/widgets/modest-toolkit-factory.h @@ -184,6 +184,9 @@ typedef enum { void modest_provider_selector_fill (GtkWidget *widget, ModestPresets *presets, gint mcc); +void +modest_provider_selector_refresh (GtkWidget *widget); + gchar * modest_provider_selector_get_active_provider_id (GtkWidget *widget); -- 1.7.9.5