X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-folder-view.c;h=e16aba76b668661a42408650050679fbca3bad38;hb=f9f5747145762afa8ed378ba49aa0b84ecddb7f1;hp=b0395386a96b45bbea36a452006bdd8e52d3003c;hpb=98a191fd5ff86c60a4af3902f9432448843ae2a2;p=modest diff --git a/src/widgets/modest-folder-view.c b/src/widgets/modest-folder-view.c index b039538..e16aba7 100644 --- a/src/widgets/modest-folder-view.c +++ b/src/widgets/modest-folder-view.c @@ -30,17 +30,20 @@ #include #include -#include +#include +#include +#include #include #include #include +#include +#include #include #include #include #include "modest-folder-view.h" - /* 'private'/'protected' functions */ static void modest_folder_view_class_init (ModestFolderViewClass *klass); static void modest_folder_view_init (ModestFolderView *obj); @@ -56,12 +59,11 @@ static void on_subscription_changed (TnyStoreAccount *store_account, Tn static gboolean modest_folder_view_update_model (ModestFolderView *self, TnyAccountStore *account_store); -static const gchar *get_account_name_from_folder (GtkTreeModel *model, GtkTreeIter iter); static void modest_folder_view_disconnect_store_account_handlers (GtkTreeView *self); enum { - FOLDER_SELECTED_SIGNAL, + FOLDER_SELECTION_CHANGED_SIGNAL, LAST_SIGNAL }; @@ -127,19 +129,18 @@ modest_folder_view_class_init (ModestFolderViewClass *klass) g_type_class_add_private (gobject_class, sizeof(ModestFolderViewPrivate)); - signals[FOLDER_SELECTED_SIGNAL] = - g_signal_new ("folder_selected", + signals[FOLDER_SELECTION_CHANGED_SIGNAL] = + g_signal_new ("folder_selection_changed", G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (ModestFolderViewClass, - folder_selected), + folder_selection_changed), NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, G_TYPE_POINTER); + modest_marshal_VOID__POINTER_BOOLEAN, + G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_BOOLEAN); } - static void text_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data) @@ -150,9 +151,9 @@ text_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, TnyFolderType type; gtk_tree_model_get (tree_model, iter, - TNY_GTK_ACCOUNT_TREE_MODEL_NAME_COLUMN, &fname, - TNY_GTK_ACCOUNT_TREE_MODEL_TYPE_COLUMN, &type, - TNY_GTK_ACCOUNT_TREE_MODEL_UNREAD_COLUMN, &unread, -1); + TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, &fname, + TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, &type, + TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN, &unread, -1); rendobj = G_OBJECT(renderer); if (unread > 0) { @@ -165,59 +166,6 @@ text_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, g_free (fname); } -/* FIXME: move these to TnyMail */ -enum { - - TNY_FOLDER_TYPE_NOTES = TNY_FOLDER_TYPE_ROOT + 1, /* urgh */ - TNY_FOLDER_TYPE_DRAFTS, - TNY_FOLDER_TYPE_CONTACTS, - TNY_FOLDER_TYPE_CALENDAR -}; - -static TnyFolderType -guess_folder_type (const gchar* name) -{ - TnyFolderType type; - gchar *folder; - - g_return_val_if_fail (name, TNY_FOLDER_TYPE_NORMAL); - - type = TNY_FOLDER_TYPE_NORMAL; - folder = g_utf8_strdown (name, strlen(name)); - - if (strcmp (folder, "inbox") == 0 || - strcmp (folder, _("inbox")) == 0) - type = TNY_FOLDER_TYPE_INBOX; - else if (strcmp (folder, "outbox") == 0 || - strcmp (folder, _("outbox")) == 0) - type = TNY_FOLDER_TYPE_OUTBOX; - else if (g_str_has_prefix(folder, "junk") || - g_str_has_prefix(folder, _("junk"))) - type = TNY_FOLDER_TYPE_JUNK; - else if (g_str_has_prefix(folder, "trash") || - g_str_has_prefix(folder, _("trash"))) - type = TNY_FOLDER_TYPE_JUNK; - else if (g_str_has_prefix(folder, "sent") || - g_str_has_prefix(folder, _("sent"))) - type = TNY_FOLDER_TYPE_SENT; - - /* these are not *really* TNY_ types */ - else if (g_str_has_prefix(folder, "draft") || - g_str_has_prefix(folder, _("draft"))) - type = TNY_FOLDER_TYPE_DRAFTS; - else if (g_str_has_prefix(folder, "notes") || - g_str_has_prefix(folder, _("notes"))) - type = TNY_FOLDER_TYPE_NOTES; - else if (g_str_has_prefix(folder, "contacts") || - g_str_has_prefix(folder, _("contacts"))) - type = TNY_FOLDER_TYPE_CONTACTS; - else if (g_str_has_prefix(folder, "calendar") || - g_str_has_prefix(folder, _("calendar"))) - type = TNY_FOLDER_TYPE_CALENDAR; - - g_free (folder); - return type; -} static void @@ -232,16 +180,14 @@ icon_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, rendobj = G_OBJECT(renderer); gtk_tree_model_get (tree_model, iter, - TNY_GTK_ACCOUNT_TREE_MODEL_TYPE_COLUMN, &type, - TNY_GTK_ACCOUNT_TREE_MODEL_NAME_COLUMN, &fname, - TNY_GTK_ACCOUNT_TREE_MODEL_UNREAD_COLUMN, &unread, -1); + TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, &type, + TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, &fname, + TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN, &unread, -1); rendobj = G_OBJECT(renderer); - if (type == TNY_FOLDER_TYPE_NORMAL) - type = guess_folder_type (fname); - - if (fname) - g_free (fname); + 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: @@ -303,8 +249,7 @@ modest_folder_view_init (ModestFolderView *obj) priv->lock = g_mutex_new (); column = gtk_tree_view_column_new (); - gtk_tree_view_append_column (GTK_TREE_VIEW(obj), - column); + gtk_tree_view_append_column (GTK_TREE_VIEW(obj),column); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start (column, renderer, FALSE); @@ -346,11 +291,12 @@ modest_folder_view_disconnect_store_account_handlers (GtkTreeView *self) priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self); iter = tny_list_create_iterator (TNY_LIST (model)); - do { + 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); - } while (!tny_iterator_is_done (iter)); + } + g_object_unref (G_OBJECT (iter)); } @@ -451,26 +397,11 @@ modest_folder_view_new (ModestTnyAccountStore *account_store, sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(self)); priv->sig2 = g_signal_connect (sel, "changed", G_CALLBACK(on_selection_changed), self); - + return GTK_WIDGET(self); } -const gchar * -modest_folder_view_get_selected_account (ModestFolderView *self) -{ - GtkTreeModel *model; - GtkTreeIter iter; - ModestFolderViewPrivate *priv; - - g_return_val_if_fail (self, NULL); - priv = MODEST_FOLDER_VIEW_GET_PRIVATE(self); - - gtk_tree_selection_get_selected (priv->cur_selection, &model, &iter); - - return get_account_name_from_folder (model, iter); -} - static gboolean update_model_empty (ModestFolderView *self) { @@ -492,8 +423,7 @@ update_model_empty (ModestFolderView *self) store = gtk_tree_store_new (1, G_TYPE_STRING); gtk_tree_store_append (store, &iter, NULL); - gtk_tree_store_set (store, &iter, 0, - _("(empty)"), -1); + gtk_tree_store_set (store, &iter, 0, _("(empty)"), -1); gtk_tree_view_set_model (GTK_TREE_VIEW(self), GTK_TREE_MODEL(store)); @@ -501,8 +431,8 @@ update_model_empty (ModestFolderView *self) priv->view_is_empty = TRUE; - g_signal_emit (G_OBJECT(self), signals[FOLDER_SELECTED_SIGNAL], 0, - NULL); + g_signal_emit (G_OBJECT(self), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0, + NULL, TRUE); return TRUE; } @@ -510,24 +440,24 @@ update_model_empty (ModestFolderView *self) static void update_store_account_handlers (ModestFolderView *self, TnyList *account_list) { - gint size; ModestFolderViewPrivate *priv; TnyIterator *iter; + guint len; priv = MODEST_FOLDER_VIEW_GET_PRIVATE(self); /* Listen to subscription changes */ - size = tny_list_get_length (TNY_LIST (account_list)) * sizeof (gulong); + 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 (size); + priv->store_accounts_handlers = g_malloc0 (sizeof (guint) * len); iter = tny_list_create_iterator (account_list); - if (!tny_iterator_is_done (iter)) - priv->view_is_empty = FALSE; - else { + if (!tny_iterator_is_done (iter)) { gint i = 0; - while (!tny_iterator_is_done (iter)) { + + priv->view_is_empty = FALSE; + do { priv->store_accounts_handlers [i++] = g_signal_connect (G_OBJECT (tny_iterator_get_current (iter)), @@ -535,11 +465,13 @@ update_store_account_handlers (ModestFolderView *self, TnyList *account_list) G_CALLBACK (on_subscription_changed), self); tny_iterator_next (iter); - } - } - g_object_unref (iter); + } while (!tny_iterator_is_done (iter)); + } + g_object_unref (G_OBJECT (iter)); } + + static gboolean update_model (ModestFolderView *self, ModestTnyAccountStore *account_store) { @@ -550,12 +482,8 @@ update_model (ModestFolderView *self, ModestTnyAccountStore *account_store) g_return_val_if_fail (account_store, FALSE); priv = MODEST_FOLDER_VIEW_GET_PRIVATE(self); - - update_model_empty (self); /* cleanup */ - //model = GTK_TREE_MODEL(tny_gtk_account_tree_model_new (TRUE, priv->query)); /* async */ - model = GTK_TREE_MODEL(tny_gtk_account_tree_model_new (TRUE, NULL)); /* async */ - + 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), @@ -565,7 +493,7 @@ update_model (ModestFolderView *self, ModestTnyAccountStore *account_store) if (account_list) { sortable = gtk_tree_model_sort_new_with_model (model); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sortable), - TNY_GTK_ACCOUNT_TREE_MODEL_NAME_COLUMN, + TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, GTK_SORT_ASCENDING); gtk_tree_view_set_model (GTK_TREE_VIEW(self), sortable); @@ -585,46 +513,43 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data) GtkTreeIter iter; ModestFolderView *tree_view; ModestFolderViewPrivate *priv; - gint type; - const gchar *account_name; + gint type; g_return_if_fail (sel); g_return_if_fail (user_data); priv = MODEST_FOLDER_VIEW_GET_PRIVATE(user_data); priv->cur_selection = sel; - /* is_empty means that there is only the 'empty' item */ if (priv->view_is_empty) return; - + /* folder was _un_selected if true */ if (!gtk_tree_selection_get_selected (sel, &model, &iter)) { priv->cur_folder = NULL; /* FIXME: need this? */ - return; - } - + return; + } + tree_view = MODEST_FOLDER_VIEW (user_data); - - gtk_tree_model_get (model, &iter, - TNY_GTK_ACCOUNT_TREE_MODEL_TYPE_COLUMN, &type, - TNY_GTK_ACCOUNT_TREE_MODEL_INSTANCE_COLUMN, &folder, + gtk_tree_model_get (model, &iter, + TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, &type, + TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, &folder, -1); - if (type == TNY_FOLDER_TYPE_ROOT) { - account_name = tny_account_get_name (TNY_ACCOUNT (folder)); - } else { - if (priv->cur_folder) - tny_folder_expunge (priv->cur_folder, NULL); /* FIXME */ - priv->cur_folder = folder; + if (type == TNY_FOLDER_TYPE_ROOT) + return; - /* FIXME: this is ugly */ - account_name = get_account_name_from_folder (model, iter); - - g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTED_SIGNAL], 0, - folder); - } + /* emit 2 signals: one for the unselection of the old one, + * and one for the selection of the new on */ + g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0, + priv->cur_folder, FALSE); + g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0, + folder, TRUE); + + if (priv->cur_folder) + tny_folder_expunge (priv->cur_folder, NULL); /* FIXME */ + priv->cur_folder = folder; } @@ -647,33 +572,12 @@ static gboolean modest_folder_view_update_model (ModestFolderView *self, TnyAccountStore *account_store) { gboolean retval; - + g_return_val_if_fail (MODEST_IS_FOLDER_VIEW (self), FALSE); retval = update_model (self, MODEST_TNY_ACCOUNT_STORE(account_store)); /* ugly */ - g_signal_emit (G_OBJECT(self), signals[FOLDER_SELECTED_SIGNAL], - 0, NULL); + g_signal_emit (G_OBJECT(self), signals[FOLDER_SELECTION_CHANGED_SIGNAL], + 0, NULL, TRUE); return retval; } - -static const gchar * -get_account_name_from_folder (GtkTreeModel *model, GtkTreeIter iter) -{ - GtkTreePath *path; - GtkTreeIter new_iter; - TnyFolder *account_folder; - gint depth, i; - - path = gtk_tree_model_get_path (model, &iter); - depth = gtk_tree_path_get_depth (path); - - for (i = 1; i < depth; ++i) - gtk_tree_path_up (path); - - gtk_tree_model_get_iter (model, &new_iter, path); - gtk_tree_model_get (model, &new_iter, - TNY_GTK_ACCOUNT_TREE_MODEL_INSTANCE_COLUMN, &account_folder, - -1); - return tny_account_get_name (TNY_ACCOUNT (account_folder)); -}