From: José Dapena Paz Date: Thu, 14 Jan 2010 10:07:37 +0000 (+0100) Subject: In wizard, if country picker change, only refresh the plugins entries in X-Git-Tag: 3.2.10-1~25 X-Git-Url: http://git.maemo.org/git/?p=modest;a=commitdiff_plain;h=a15991f3d4513a344e98e94bbca8fde28f9ee3b7 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-easysetup-wizard-dialog.c b/src/hildon2/modest-easysetup-wizard-dialog.c index 9ecb29f..30e43e6 100644 --- a/src/hildon2/modest-easysetup-wizard-dialog.c +++ b/src/hildon2/modest-easysetup-wizard-dialog.c @@ -142,6 +142,7 @@ struct _ModestEasysetupWizardDialogPrivate GtkWidget *page_complete_customsetup; + gint last_mcc; ModestProtocolType last_plugin_protocol_selected; GSList *missing_data_signals; }; @@ -460,8 +461,13 @@ on_account_country_selector_changed (HildonTouchSelector *widget, gpointer user_ if (priv->presets != NULL) { gint mcc = modest_country_picker_get_active_country_mcc ( MODEST_COUNTRY_PICKER (priv->account_country_picker)); - modest_provider_picker_fill ( - MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker), priv->presets, mcc); + if (priv->last_mcc != mcc) { + modest_provider_picker_fill ( + MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker), priv->presets, mcc); + } else { + modest_provider_picker_refresh (MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker)); + } + priv->last_mcc = mcc; } } @@ -1308,9 +1314,15 @@ fill_providers (ModestEasysetupWizardDialog *self) MODEST_COUNTRY_PICKER (priv->account_country_picker)); mcc = modest_country_picker_get_active_country_mcc ( MODEST_COUNTRY_PICKER (priv->account_country_picker)); - modest_provider_picker_fill ( - MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker), - priv->presets, mcc); + if (priv->last_mcc != mcc) { + modest_provider_picker_fill ( + MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker), + priv->presets, mcc); + } else { + modest_provider_picker_refresh ( + MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker)); + } + priv->last_mcc = mcc; /* connect to providers picker's changed signal, so we can fill the email address: */ g_signal_connect (G_OBJECT (hildon_picker_button_get_selector (HILDON_PICKER_BUTTON (priv->account_serviceprovider_picker))), @@ -1487,6 +1499,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/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);