Changeset 3825

Show
Ignore:
Timestamp:
11/24/08 15:30:24
Author:
jdapena
Message:

* libtinymailui-gtk/tny-gtk-folder-store-tree-model.[ch]:

Added support for settings construction flags. Also added a flag
"show path" for the tree model, that makes it store the full path
name.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ChangeLog

    r3824 r3825  
     12008-11-24  Jose Dapena Paz  <jdapena@igalia.com> 
     2 
     3        * libtinymailui-gtk/tny-gtk-folder-store-tree-model.[ch]: 
     4        Added support for settings construction flags. Also added a flag 
     5        "show path" for the tree model, that makes it store the full path  
     6        name. 
     7 
    182008-11-21  Sergio Villar Senin  <svillar@iglaia.com> 
    29 
  • trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.c

    r3787 r3825  
    6666#include "tny-gtk-folder-store-tree-model-iterator-priv.h" 
    6767 
     68#define PATH_SEPARATOR " " 
     69 
    6870static GObjectClass *parent_class = NULL; 
    6971 
     
    110112 
    111113static void 
    112 recurse_folders_sync (TnyGtkFolderStoreTreeModel *self, TnyFolderStore *store, GtkTreeIter *parent_tree_iter) 
     114recurse_folders_sync (TnyGtkFolderStoreTreeModel *self,  
     115                      TnyFolderStore *store,  
     116                      const gchar *parent_name, 
     117                      GtkTreeIter *parent_tree_iter) 
    113118{ 
    114119        TnyIterator *iter; 
     
    118123        tny_folder_store_get_folders (store, folders, self->query, TRUE, NULL); 
    119124        iter = tny_list_create_iterator (folders); 
     125 
     126        if (parent_name == NULL) 
     127                parent_name = ""; 
    120128 
    121129        while (!tny_iterator_is_done (iter)) 
     
    187195                if (!found) 
    188196                { 
     197                        gchar *name; 
    189198                        gtk_tree_store_append (model, &tree_iter, parent_tree_iter); 
    190199 
     
    202211                                add_folder_observer_weak (self, folder); 
    203212 
     213                                if (self->flags & TNY_GTK_FOLDER_STORE_TREE_MODEL_FLAG_SHOW_PATH) { 
     214                                        if ((parent_name == NULL) || *parent_name == '\0') { 
     215                                                name = g_strdup (tny_folder_get_name (folder)); 
     216                                        } else { 
     217                                                name = g_strconcat (parent_name, 
     218                                                                    PATH_SEPARATOR, 
     219                                                                    tny_folder_get_name (folder),  
     220                                                                    NULL); 
     221                                        } 
     222                                } else { 
     223                                        name = g_strdup (tny_folder_get_name (folder)); 
     224                                } 
     225 
    204226                                gtk_tree_store_set  (model, &tree_iter, 
    205227                                        TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN,  
    206                                         tny_folder_get_name (TNY_FOLDER (folder))
     228                                        name
    207229                                        TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN,  
    208230                                        tny_folder_get_unread_count (TNY_FOLDER (folder)), 
     
    214236                                        folder, -1); 
    215237 
     238                        } else { 
     239                                name = g_strdup (tny_folder_get_name (folder)); 
    216240                        } 
    217241 
     
    219243                        if (folder_store) { 
    220244                                add_folder_store_observer_weak (self, folder_store); 
    221                                 recurse_folders_sync (self, folder_store, &tree_iter); 
     245                                recurse_folders_sync (self, folder_store, name, &tree_iter); 
    222246                        } 
     247 
     248                        g_free (name); 
    223249 
    224250                        /* We're a folder, we'll request a status, since we've 
     
    319345 
    320346        if (found) 
    321                 recurse_folders_sync (self, fstore, &name_iter); 
     347                recurse_folders_sync (self, fstore, NULL, &name_iter); 
    322348 
    323349        g_object_unref (self); 
     
    543569 * @query: the #TnyFolderStoreQuery that will be used to retrieve the child folders of each #TnyFolderStore 
    544570 * 
     571 * Create a new #GtkTreeModel for showing #TnyFolderStore instances, with default flags 
     572 *  
     573 * returns: (caller-owns): a new #GtkTreeModel for #TnyFolderStore instances 
     574 * since: 1.0 
     575 * audience: application-developer 
     576 **/ 
     577GtkTreeModel* 
     578tny_gtk_folder_store_tree_model_new (TnyFolderStoreQuery *query) 
     579{ 
     580        return tny_gtk_folder_store_tree_model_new_with_flags (query, 0); 
     581} 
     582 
     583/** 
     584 * tny_gtk_folder_store_tree_model_new: 
     585 * @query: the #TnyFolderStoreQuery that will be used to retrieve the child folders of each #TnyFolderStore 
     586 * @flags: #TnyGtkFolderStoreTreeModelFlags for setting the store 
     587 * 
    545588 * Create a new #GtkTreeModel for showing #TnyFolderStore instances 
    546589 *  
     
    550593 **/ 
    551594GtkTreeModel* 
    552 tny_gtk_folder_store_tree_model_new (TnyFolderStoreQuery *query) 
     595tny_gtk_folder_store_tree_model_new_with_flags (TnyFolderStoreQuery *query, 
     596                                                TnyGtkFolderStoreTreeModelFlags flags) 
    553597{ 
    554598        TnyGtkFolderStoreTreeModel *self = g_object_new (TNY_TYPE_GTK_FOLDER_STORE_TREE_MODEL, NULL); 
     
    556600        if (query)  
    557601                self->query = g_object_ref (query); 
     602 
     603        self->flags = flags; 
    558604 
    559605        return GTK_TREE_MODEL (self); 
     
    647693        me->iterator_lock = g_mutex_new (); 
    648694        me->first_needs_unref = FALSE; 
     695 
     696        me->flags = 0; 
    649697 
    650698        gtk_tree_store_set_column_types (store,  
     
    850898} 
    851899 
     900typedef struct _FindParentHelperInfo { 
     901        GtkTreeIter *iter; 
     902        TnyFolder *folder; 
     903        TnyAccount *account; 
     904        gboolean found; 
     905} FindParentHelperInfo; 
     906 
     907static gboolean 
     908find_parent_helper (GtkTreeModel *model, 
     909                    GtkTreePath *path, 
     910                    GtkTreeIter *iter, 
     911                    gpointer userdata) 
     912{ 
     913        TnyFolderStore *folder_store; 
     914        FindParentHelperInfo *helper_info = (FindParentHelperInfo *) userdata; 
     915        TnyList *children; 
     916        TnyIterator *iterator; 
     917 
     918        gtk_tree_model_get (model, iter,  
     919                            TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN,  
     920                            &folder_store, -1); 
     921 
     922        /* Only search on same account */ 
     923        if (TNY_IS_ACCOUNT (folder_store) && ((TnyAccount *)folder_store == helper_info->account)) 
     924                return FALSE; 
     925 
     926        if (TNY_IS_FOLDER (folder_store)) { 
     927                TnyAccount *account = NULL; 
     928                account = tny_folder_get_account (TNY_FOLDER (folder_store)); 
     929                g_object_unref (account); 
     930                if (account == helper_info->account) 
     931                        return FALSE; 
     932        } 
     933 
     934        children = TNY_LIST (tny_simple_list_new ()); 
     935        tny_folder_store_get_folders (folder_store, children, NULL, FALSE, NULL); 
     936        iterator = tny_list_create_iterator (children); 
     937 
     938        while (!tny_iterator_is_done (iterator)) { 
     939                TnyFolderStore *child; 
     940 
     941                child = (TnyFolderStore *) tny_iterator_get_current (iterator); 
     942                g_object_unref (child); 
     943                if (child == (TnyFolderStore *) helper_info->folder) { 
     944                        helper_info->found = TRUE; 
     945                        *helper_info->iter = *iter; 
     946                        break; 
     947                } 
     948                tny_iterator_next (iterator); 
     949        } 
     950        g_object_unref (iterator); 
     951        g_object_unref (children); 
     952 
     953        return helper_info->found; 
     954         
     955} 
     956 
     957static gboolean 
     958find_parent (GtkTreeModel *model, TnyFolder *folder, GtkTreeIter *iter) 
     959{ 
     960        FindParentHelperInfo *helper_info; 
     961        gboolean result; 
     962 
     963        helper_info = g_slice_new0 (FindParentHelperInfo); 
     964 
     965        helper_info->folder = folder; 
     966        helper_info->iter = iter; 
     967        helper_info->account = tny_folder_get_account (folder); 
     968 
     969        gtk_tree_model_foreach (model, find_parent_helper, helper_info); 
     970 
     971        g_object_unref (helper_info->account); 
     972        result = helper_info->found; 
     973        g_slice_free (FindParentHelperInfo, helper_info); 
     974 
     975        return result; 
     976} 
     977 
     978typedef struct _FindHelperInfo { 
     979        GtkTreeIter *iter; 
     980        TnyFolder *folder; 
     981        gboolean found; 
     982} FindHelperInfo; 
     983 
     984static gboolean 
     985find_node_helper (GtkTreeModel *model, 
     986                  GtkTreePath *path, 
     987                  GtkTreeIter *iter, 
     988                  gpointer userdata) 
     989{ 
     990        TnyFolderStore *folder_store; 
     991        FindHelperInfo *helper_info = (FindHelperInfo *) userdata; 
     992 
     993        gtk_tree_model_get (model, iter,  
     994                            TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN,  
     995                            &folder_store, -1); 
     996 
     997        if ((TnyFolderStore *) helper_info->folder == folder_store) { 
     998                helper_info->found = TRUE; 
     999                *helper_info->iter = *iter; 
     1000        } 
     1001 
     1002        return helper_info->found; 
     1003         
     1004} 
     1005 
     1006static gboolean 
     1007find_node (GtkTreeModel *model, TnyFolder *folder, GtkTreeIter *iter) 
     1008{ 
     1009        FindHelperInfo *helper_info; 
     1010        gboolean result; 
     1011 
     1012        helper_info = g_slice_new0 (FindHelperInfo); 
     1013 
     1014        helper_info->folder = folder; 
     1015        helper_info->iter = iter; 
     1016 
     1017        gtk_tree_model_foreach (model, find_node_helper, helper_info); 
     1018 
     1019        result = helper_info->found; 
     1020        g_slice_free (FindHelperInfo, helper_info); 
     1021 
     1022        return result; 
     1023} 
     1024 
     1025static void 
     1026update_children_names (GtkTreeModel *model, TnyFolder *folder, const gchar *name) 
     1027{ 
     1028        TnyList *children; 
     1029        TnyIterator *iterator; 
     1030 
     1031        children = TNY_LIST (tny_simple_list_new ()); 
     1032        iterator = tny_list_create_iterator (children); 
     1033 
     1034        while (!tny_iterator_is_done (iterator)) { 
     1035                GtkTreeIter iter; 
     1036                TnyFolder *child; 
     1037 
     1038                child = TNY_FOLDER (tny_iterator_get_current (iterator)); 
     1039                if (find_node (model, child, &iter)) { 
     1040                        gchar *new_name; 
     1041                        new_name = g_strconcat (name, PATH_SEPARATOR, 
     1042                                                tny_folder_get_name (TNY_FOLDER (child)), 
     1043                                                NULL); 
     1044                        gtk_tree_store_set (GTK_TREE_STORE (model), &iter, 
     1045                                            TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN,  
     1046                                            new_name, 
     1047                                            -1); 
     1048                        update_children_names (model, child, new_name); 
     1049                        g_free (new_name); 
     1050                } 
     1051 
     1052                g_object_unref (folder); 
     1053                tny_iterator_next (iterator); 
     1054        } 
     1055 
     1056        g_object_unref (iterator); 
     1057        g_object_unref (children); 
     1058} 
     1059 
    8521060 
    8531061static gboolean  
     
    9071115                if (folder == changed_folder) 
    9081116                { 
    909  
    9101117                        /* TNY TODO: This is not enough: Subfolders will be incorrect because the 
    9111118                           the full_name of the subfolders will still be the old full_name!*/ 
    9121119 
    9131120                        gtk_tree_store_set (GTK_TREE_STORE (model), iter, 
    914                                 TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN,  
    915                                 tny_folder_get_name (TNY_FOLDER (folder)), 
    9161121                                TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN,  
    9171122                                unread, 
    9181123                                TNY_GTK_FOLDER_STORE_TREE_MODEL_ALL_COLUMN,  
    9191124                                total, -1); 
     1125 
     1126                        if (changed & TNY_FOLDER_CHANGE_CHANGED_FOLDER_RENAME) { 
     1127                                GtkTreeIter parent_iter; 
     1128                                gchar *name = NULL; 
     1129 
     1130                                if (TNY_GTK_FOLDER_STORE_TREE_MODEL (model)->flags & 
     1131                                    TNY_GTK_FOLDER_STORE_TREE_MODEL_FLAG_SHOW_PATH) { 
     1132                                        if (find_parent (model, folder, &parent_iter)) { 
     1133                                                gchar *parent_name; 
     1134                                                gtk_tree_model_get (model, &parent_iter,  
     1135                                                                    TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN,  
     1136                                                                    &parent_name, -1); 
     1137                                                if (parent_name && parent_name[0] == '\0') 
     1138                                                        name = g_strconcat (parent_name, PATH_SEPARATOR, 
     1139                                                                            tny_folder_get_name (TNY_FOLDER (folder)), 
     1140                                                                            NULL); 
     1141                                                g_free (parent_name); 
     1142 
     1143 
     1144                                        } 
     1145                                } 
     1146 
     1147                                 
     1148                                if (name == NULL) 
     1149                                        name = g_strdup (tny_folder_get_name (TNY_FOLDER (folder))); 
     1150 
     1151                                gtk_tree_store_set (GTK_TREE_STORE (model), iter, 
     1152                                                    TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN,  
     1153                                                    name, 
     1154                                                    -1); 
     1155                                if (TNY_GTK_FOLDER_STORE_TREE_MODEL (model)->flags & 
     1156                                    TNY_GTK_FOLDER_STORE_TREE_MODEL_FLAG_SHOW_PATH) { 
     1157                                        update_children_names (model, folder, name); 
     1158                                } 
     1159                                g_free (name); 
     1160                        } 
    9201161                } 
    9211162 
     
    10321273                TnyList *created = tny_simple_list_new (); 
    10331274                TnyIterator *miter; 
     1275                gchar *parent_name; 
    10341276 
    10351277                tny_folder_store_change_get_created_folders (change, created); 
    10361278                miter = tny_list_create_iterator (created); 
     1279 
     1280                /* We assume parent name is already the expected one in full path style */ 
     1281                gtk_tree_model_get (model, in_iter, 
     1282                                    TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, &parent_name,  
     1283                                    -1); 
    10371284 
    10381285                while (!tny_iterator_is_done (miter)) 
     
    10401287                        GtkTreeIter newiter; 
    10411288                        TnyFolder *folder = TNY_FOLDER (tny_iterator_get_current (miter)); 
     1289                        gchar *finalname; 
    10421290 
    10431291                        add_folder_observer_weak (self, folder); 
     
    10481296                           the gtktreestore infrastructure. */ 
    10491297 
     1298                        if (TNY_GTK_FOLDER_STORE_TREE_MODEL (self)->flags & 
     1299                            TNY_GTK_FOLDER_STORE_TREE_MODEL_FLAG_SHOW_PATH) { 
     1300                                if (parent_name && *parent_name != '\0') 
     1301                                        finalname = g_strconcat (parent_name, PATH_SEPARATOR, 
     1302                                                                 tny_folder_get_name (TNY_FOLDER (folder)), NULL); 
     1303                                else 
     1304                                        finalname = g_strdup (tny_folder_get_name (TNY_FOLDER (folder))); 
     1305                        } else { 
     1306                                finalname = g_strdup (tny_folder_get_name (TNY_FOLDER (folder))); 
     1307                        } 
    10501308 
    10511309                        gtk_tree_store_prepend (GTK_TREE_STORE (model), &newiter, in_iter); 
     
    10531311                        gtk_tree_store_set (GTK_TREE_STORE (model), &newiter, 
    10541312                                TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN,  
    1055                                 tny_folder_get_name (TNY_FOLDER (folder))
     1313                                finalname
    10561314                                TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN,  
    10571315                                tny_folder_get_unread_count (TNY_FOLDER (folder)), 
     
    10621320                                TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, 
    10631321                                folder, -1); 
     1322                        g_free (finalname); 
    10641323 
    10651324                        g_object_unref (folder); 
    10661325                        tny_iterator_next (miter); 
    10671326                } 
     1327                g_free (parent_name); 
    10681328                g_object_unref (miter); 
    10691329                g_object_unref (created); 
  • trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.h

    r3349 r3825  
    5555typedef enum _TnyGtkFolderStoreTreeModelColumn TnyGtkFolderStoreTreeModelColumn; 
    5656 
     57enum _TnyGtkFolderStoreTreeModelFlags 
     58{ 
     59        TNY_GTK_FOLDER_STORE_TREE_MODEL_FLAG_SHOW_PATH = 1<<0, 
     60}; 
     61 
     62typedef enum _TnyGtkFolderStoreTreeModelFlags TnyGtkFolderStoreTreeModelFlags; 
     63 
    5764struct _TnyGtkFolderStoreTreeModel 
    5865{ 
     
    6370        gboolean first_needs_unref; 
    6471        GPtrArray *signals; 
     72 
     73        TnyGtkFolderStoreTreeModelFlags flags; 
    6574}; 
    6675 
     
    7382GType tny_gtk_folder_store_tree_model_column_get_type (void); 
    7483GtkTreeModel* tny_gtk_folder_store_tree_model_new (TnyFolderStoreQuery *query); 
    75  
     84GtkTreeModel* tny_gtk_folder_store_tree_model_new_with_flags (TnyFolderStoreQuery *query,  
     85                                                              TnyGtkFolderStoreTreeModelFlags flags); 
    7686void tny_gtk_folder_store_tree_model_prepend (TnyGtkFolderStoreTreeModel *self, TnyFolderStore* item, const gchar *root_name); 
    7787void tny_gtk_folder_store_tree_model_append (TnyGtkFolderStoreTreeModel *self, TnyFolderStore* item, const gchar *root_name);