From: José Dapena Paz Date: Thu, 14 Jan 2010 12:15:35 +0000 (+0100) Subject: In wizard, if country picker change, only refresh the plugins entries in X-Git-Tag: 3.90.4~38 X-Git-Url: http://git.maemo.org/git/?p=modest;a=commitdiff_plain;h=9ef44b686dd73deb01dcfddcca0926d1d1943b6e 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). --- 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);