X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-folder-view.c;h=9bdb0df49483a4cf838de69deb9aa47d06dd317c;hp=923f4a348c577edf557716f445307e1e2bd513ef;hb=b94b783d9801be57422fdf478ae5bdafbc7200a7;hpb=ac8e3df0d8b5f056941a6ca1a679bfda63002a72 diff --git a/src/widgets/modest-folder-view.c b/src/widgets/modest-folder-view.c index 923f4a3..9bdb0df 100644 --- a/src/widgets/modest-folder-view.c +++ b/src/widgets/modest-folder-view.c @@ -40,10 +40,9 @@ #include #include #include -#include #include #include - +#include #include "modest-folder-view.h" /* 'private'/'protected' functions */ @@ -56,10 +55,8 @@ static gboolean update_model (ModestFolderView *self, static gboolean update_model_empty (ModestFolderView *self); static void on_selection_changed (GtkTreeSelection *sel, gpointer data); -static void on_subscription_changed (TnyStoreAccount *store_account, TnyFolder *folder, - ModestFolderView *self); - -static void modest_folder_view_disconnect_store_account_handlers (GtkTreeView *self); +/* static void on_subscription_changed (TnyStoreAccount *store_account, TnyFolder *folder, */ +/* ModestFolderView *self); */ static gint cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2, gpointer user_data); @@ -76,7 +73,6 @@ struct _ModestFolderViewPrivate { TnyFolder *cur_folder; gulong sig1, sig2; - gulong *store_accounts_handlers; GMutex *lock; GtkTreeSelection *cur_selection; TnyFolderStoreQuery *query; @@ -194,6 +190,35 @@ text_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, } +static GdkPixbuf* +get_cached_icon (const gchar *name) +{ + GError *err = NULL; + gpointer pixbuf; + gpointer orig_key; + static GHashTable *icon_cache = NULL; + + g_return_val_if_fail (name, NULL); + + if (G_UNLIKELY(!icon_cache)) + icon_cache = modest_cache_mgr_get_cache (modest_runtime_get_cache_mgr(), + MODEST_CACHE_MGR_CACHE_TYPE_PIXBUF); + + if (!icon_cache || !g_hash_table_lookup_extended (icon_cache, name, &orig_key, &pixbuf)) { + pixbuf = (gpointer)gdk_pixbuf_new_from_file (name, &err); + if (!pixbuf) { + g_printerr ("modest: error in icon factory while loading '%s': %s\n", + name, err->message); + g_error_free (err); + } + /* if we cannot find it, we still insert (if we have a cache), so we get the error + * only once */ + if (icon_cache) + g_hash_table_insert (icon_cache, g_strdup(name),(gpointer)pixbuf); + } + return GDK_PIXBUF(pixbuf); +} + static void icon_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, @@ -212,51 +237,48 @@ icon_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN, &unread, -1); rendobj = G_OBJECT(renderer); - if (type == TNY_FOLDER_TYPE_NORMAL || type == TNY_FOLDER_TYPE_UNKNOWN) + if (type == TNY_FOLDER_TYPE_NORMAL || type == TNY_FOLDER_TYPE_UNKNOWN) { type = modest_tny_folder_guess_folder_type_from_name (fname); + } g_free (fname); switch (type) { case TNY_FOLDER_TYPE_ROOT: - pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_ACCOUNT); + pixbuf = get_cached_icon (MODEST_FOLDER_ICON_ACCOUNT); break; case TNY_FOLDER_TYPE_INBOX: - pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_INBOX); + pixbuf = get_cached_icon (MODEST_FOLDER_ICON_INBOX); break; case TNY_FOLDER_TYPE_OUTBOX: - pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_OUTBOX); + pixbuf = get_cached_icon (MODEST_FOLDER_ICON_OUTBOX); break; case TNY_FOLDER_TYPE_JUNK: - pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_JUNK); + pixbuf = get_cached_icon (MODEST_FOLDER_ICON_JUNK); break; case TNY_FOLDER_TYPE_SENT: - pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_SENT); + pixbuf = get_cached_icon (MODEST_FOLDER_ICON_SENT); + break; + case TNY_FOLDER_TYPE_TRASH: + pixbuf = get_cached_icon (MODEST_FOLDER_ICON_TRASH); break; case TNY_FOLDER_TYPE_DRAFTS: - pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_DRAFTS); + pixbuf = get_cached_icon (MODEST_FOLDER_ICON_DRAFTS); break; case TNY_FOLDER_TYPE_NOTES: - pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_NOTES); + pixbuf = get_cached_icon (MODEST_FOLDER_ICON_NOTES); break; case TNY_FOLDER_TYPE_CALENDAR: - pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_CALENDAR); + pixbuf = get_cached_icon (MODEST_FOLDER_ICON_CALENDAR); break; case TNY_FOLDER_TYPE_CONTACTS: - pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_CONTACTS); + pixbuf = get_cached_icon (MODEST_FOLDER_ICON_CONTACTS); break; case TNY_FOLDER_TYPE_NORMAL: default: - pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_NORMAL); - break; + pixbuf = get_cached_icon (MODEST_FOLDER_ICON_NORMAL); + break; } - - g_object_set (rendobj, - "pixbuf-expander-open", - modest_icon_factory_get_icon (MODEST_FOLDER_ICON_OPEN), - "pixbuf-expander-closed", - modest_icon_factory_get_icon (MODEST_FOLDER_ICON_CLOSED), - "pixbuf", pixbuf, - NULL); + g_object_set (rendobj, "pixbuf", pixbuf, NULL); } static void @@ -299,34 +321,6 @@ modest_folder_view_init (ModestFolderView *obj) } static void -modest_folder_view_disconnect_store_account_handlers (GtkTreeView *self) -{ - TnyIterator *iter; - ModestFolderViewPrivate *priv; - GtkTreeModel *model; - GtkTreeModelSort *sortable; - gint i = 0; - - sortable = GTK_TREE_MODEL_SORT (gtk_tree_view_get_model (self)); - if (!sortable) - return; - - model = gtk_tree_model_sort_get_model (sortable); - if (!model) - return; - - priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self); - iter = tny_list_create_iterator (TNY_LIST (model)); - while (!tny_iterator_is_done (iter)) { - g_signal_handler_disconnect (G_OBJECT (tny_iterator_get_current (iter)), - priv->store_accounts_handlers [i++]); - tny_iterator_next (iter); - } - g_object_unref (G_OBJECT (iter)); -} - - -static void modest_folder_view_finalize (GObject *obj) { ModestFolderViewPrivate *priv; @@ -347,12 +341,6 @@ modest_folder_view_finalize (GObject *obj) priv->lock = NULL; } - if (priv->store_accounts_handlers) { - modest_folder_view_disconnect_store_account_handlers (GTK_TREE_VIEW (obj)); - g_free (priv->store_accounts_handlers); - priv->store_accounts_handlers = NULL; - } - if (priv->query) { g_object_unref (G_OBJECT (priv->query)); priv->query = NULL; @@ -433,53 +421,12 @@ update_model_empty (ModestFolderView *self) g_return_val_if_fail (self, FALSE); priv = MODEST_FOLDER_VIEW_GET_PRIVATE(self); - /* Disconnect old handlers */ - if (priv->store_accounts_handlers) { - modest_folder_view_disconnect_store_account_handlers (GTK_TREE_VIEW (self)); - g_free (priv->store_accounts_handlers); - priv->store_accounts_handlers = NULL; - } - g_signal_emit (G_OBJECT(self), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0, NULL, TRUE); return TRUE; } -static void -update_store_account_handlers (ModestFolderView *self, TnyList *account_list) -{ - ModestFolderViewPrivate *priv; - TnyIterator *iter; - guint len; - - priv = MODEST_FOLDER_VIEW_GET_PRIVATE(self); - - /* Listen to subscription changes */ - len = tny_list_get_length (TNY_LIST (account_list)); - - g_assert (priv->store_accounts_handlers == NULL); /* don't leak */ - priv->store_accounts_handlers = g_malloc0 (sizeof (guint) * len); - iter = tny_list_create_iterator (account_list); - - if (!tny_iterator_is_done (iter)) { - gint i = 0; - - do { - - priv->store_accounts_handlers [i++] = - g_signal_connect (G_OBJECT (tny_iterator_get_current (iter)), - "subscription_changed", - G_CALLBACK (on_subscription_changed), - self); - tny_iterator_next (iter); - } while (!tny_iterator_is_done (iter)); - } - g_object_unref (G_OBJECT (iter)); -} - - - /* this feels dirty; any other way to expand all the root items? */ static void expand_root_items (ModestFolderView *self) @@ -506,11 +453,12 @@ update_model (ModestFolderView *self, ModestTnyAccountStore *account_store) g_return_val_if_fail (account_store, FALSE); - update_model_empty (self); - priv = MODEST_FOLDER_VIEW_GET_PRIVATE(self); - model = tny_gtk_folder_store_tree_model_new (FALSE, NULL); + /* Notify that there is no folder selected */ + update_model_empty (self); + + model = tny_gtk_folder_store_tree_model_new (TRUE, NULL); account_list = TNY_LIST(model); tny_account_store_get_accounts (TNY_ACCOUNT_STORE(account_store), @@ -524,10 +472,11 @@ update_model (ModestFolderView *self, ModestTnyAccountStore *account_store) gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (sortable), TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, cmp_rows, NULL, NULL); + + /* Set new model */ gtk_tree_view_set_model (GTK_TREE_VIEW(self), sortable); expand_root_items (self); /* expand all account folders */ - update_store_account_handlers (self, account_list); } g_object_unref (model); @@ -578,19 +527,19 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data) } -static void -on_subscription_changed (TnyStoreAccount *store_account, - TnyFolder *folder, - ModestFolderView *self) -{ - /* TODO: probably we won't need a full reload, just the store - account or even the parent of the folder */ +/* static void */ +/* on_subscription_changed (TnyStoreAccount *store_account, */ +/* TnyFolder *folder, */ +/* ModestFolderView *self) */ +/* { */ +/* /\* TODO: probably we won't need a full reload, just the store */ +/* account or even the parent of the folder *\/ */ - ModestFolderViewPrivate *priv; +/* ModestFolderViewPrivate *priv; */ - priv = MODEST_FOLDER_VIEW_GET_PRIVATE(self); - update_model (self, MODEST_TNY_ACCOUNT_STORE (priv->account_store)); -} +/* priv = MODEST_FOLDER_VIEW_GET_PRIVATE(self); */ +/* update_model (self, MODEST_TNY_ACCOUNT_STORE (priv->account_store)); */ +/* } */ gboolean @@ -647,9 +596,9 @@ cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2, cmp = -1; else cmp = modest_text_utils_utf8_strcmp (name1, name2, TRUE); - } else { + } else cmp = modest_text_utils_utf8_strcmp (name1, name2, TRUE); - } + g_free (name1); g_free (name2);