Changeset 3825
- Timestamp:
- 11/24/08 15:30:24
- Files:
-
- trunk/ChangeLog (modified) (1 diff)
- trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.c (modified) (19 diffs)
- trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/ChangeLog
r3824 r3825 1 2008-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 1 8 2008-11-21 Sergio Villar Senin <svillar@iglaia.com> 2 9 trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.c
r3787 r3825 66 66 #include "tny-gtk-folder-store-tree-model-iterator-priv.h" 67 67 68 #define PATH_SEPARATOR " " 69 68 70 static GObjectClass *parent_class = NULL; 69 71 … … 110 112 111 113 static void 112 recurse_folders_sync (TnyGtkFolderStoreTreeModel *self, TnyFolderStore *store, GtkTreeIter *parent_tree_iter) 114 recurse_folders_sync (TnyGtkFolderStoreTreeModel *self, 115 TnyFolderStore *store, 116 const gchar *parent_name, 117 GtkTreeIter *parent_tree_iter) 113 118 { 114 119 TnyIterator *iter; … … 118 123 tny_folder_store_get_folders (store, folders, self->query, TRUE, NULL); 119 124 iter = tny_list_create_iterator (folders); 125 126 if (parent_name == NULL) 127 parent_name = ""; 120 128 121 129 while (!tny_iterator_is_done (iter)) … … 187 195 if (!found) 188 196 { 197 gchar *name; 189 198 gtk_tree_store_append (model, &tree_iter, parent_tree_iter); 190 199 … … 202 211 add_folder_observer_weak (self, folder); 203 212 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 204 226 gtk_tree_store_set (model, &tree_iter, 205 227 TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, 206 tny_folder_get_name (TNY_FOLDER (folder)),228 name, 207 229 TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN, 208 230 tny_folder_get_unread_count (TNY_FOLDER (folder)), … … 214 236 folder, -1); 215 237 238 } else { 239 name = g_strdup (tny_folder_get_name (folder)); 216 240 } 217 241 … … 219 243 if (folder_store) { 220 244 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); 222 246 } 247 248 g_free (name); 223 249 224 250 /* We're a folder, we'll request a status, since we've … … 319 345 320 346 if (found) 321 recurse_folders_sync (self, fstore, &name_iter);347 recurse_folders_sync (self, fstore, NULL, &name_iter); 322 348 323 349 g_object_unref (self); … … 543 569 * @query: the #TnyFolderStoreQuery that will be used to retrieve the child folders of each #TnyFolderStore 544 570 * 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 **/ 577 GtkTreeModel* 578 tny_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 * 545 588 * Create a new #GtkTreeModel for showing #TnyFolderStore instances 546 589 * … … 550 593 **/ 551 594 GtkTreeModel* 552 tny_gtk_folder_store_tree_model_new (TnyFolderStoreQuery *query) 595 tny_gtk_folder_store_tree_model_new_with_flags (TnyFolderStoreQuery *query, 596 TnyGtkFolderStoreTreeModelFlags flags) 553 597 { 554 598 TnyGtkFolderStoreTreeModel *self = g_object_new (TNY_TYPE_GTK_FOLDER_STORE_TREE_MODEL, NULL); … … 556 600 if (query) 557 601 self->query = g_object_ref (query); 602 603 self->flags = flags; 558 604 559 605 return GTK_TREE_MODEL (self); … … 647 693 me->iterator_lock = g_mutex_new (); 648 694 me->first_needs_unref = FALSE; 695 696 me->flags = 0; 649 697 650 698 gtk_tree_store_set_column_types (store, … … 850 898 } 851 899 900 typedef struct _FindParentHelperInfo { 901 GtkTreeIter *iter; 902 TnyFolder *folder; 903 TnyAccount *account; 904 gboolean found; 905 } FindParentHelperInfo; 906 907 static gboolean 908 find_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 957 static gboolean 958 find_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 978 typedef struct _FindHelperInfo { 979 GtkTreeIter *iter; 980 TnyFolder *folder; 981 gboolean found; 982 } FindHelperInfo; 983 984 static gboolean 985 find_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 1006 static gboolean 1007 find_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 1025 static void 1026 update_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 852 1060 853 1061 static gboolean … … 907 1115 if (folder == changed_folder) 908 1116 { 909 910 1117 /* TNY TODO: This is not enough: Subfolders will be incorrect because the 911 1118 the full_name of the subfolders will still be the old full_name!*/ 912 1119 913 1120 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)),916 1121 TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN, 917 1122 unread, 918 1123 TNY_GTK_FOLDER_STORE_TREE_MODEL_ALL_COLUMN, 919 1124 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 } 920 1161 } 921 1162 … … 1032 1273 TnyList *created = tny_simple_list_new (); 1033 1274 TnyIterator *miter; 1275 gchar *parent_name; 1034 1276 1035 1277 tny_folder_store_change_get_created_folders (change, created); 1036 1278 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); 1037 1284 1038 1285 while (!tny_iterator_is_done (miter)) … … 1040 1287 GtkTreeIter newiter; 1041 1288 TnyFolder *folder = TNY_FOLDER (tny_iterator_get_current (miter)); 1289 gchar *finalname; 1042 1290 1043 1291 add_folder_observer_weak (self, folder); … … 1048 1296 the gtktreestore infrastructure. */ 1049 1297 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 } 1050 1308 1051 1309 gtk_tree_store_prepend (GTK_TREE_STORE (model), &newiter, in_iter); … … 1053 1311 gtk_tree_store_set (GTK_TREE_STORE (model), &newiter, 1054 1312 TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, 1055 tny_folder_get_name (TNY_FOLDER (folder)),1313 finalname, 1056 1314 TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN, 1057 1315 tny_folder_get_unread_count (TNY_FOLDER (folder)), … … 1062 1320 TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, 1063 1321 folder, -1); 1322 g_free (finalname); 1064 1323 1065 1324 g_object_unref (folder); 1066 1325 tny_iterator_next (miter); 1067 1326 } 1327 g_free (parent_name); 1068 1328 g_object_unref (miter); 1069 1329 g_object_unref (created); trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.h
r3349 r3825 55 55 typedef enum _TnyGtkFolderStoreTreeModelColumn TnyGtkFolderStoreTreeModelColumn; 56 56 57 enum _TnyGtkFolderStoreTreeModelFlags 58 { 59 TNY_GTK_FOLDER_STORE_TREE_MODEL_FLAG_SHOW_PATH = 1<<0, 60 }; 61 62 typedef enum _TnyGtkFolderStoreTreeModelFlags TnyGtkFolderStoreTreeModelFlags; 63 57 64 struct _TnyGtkFolderStoreTreeModel 58 65 { … … 63 70 gboolean first_needs_unref; 64 71 GPtrArray *signals; 72 73 TnyGtkFolderStoreTreeModelFlags flags; 65 74 }; 66 75 … … 73 82 GType tny_gtk_folder_store_tree_model_column_get_type (void); 74 83 GtkTreeModel* tny_gtk_folder_store_tree_model_new (TnyFolderStoreQuery *query); 75 84 GtkTreeModel* tny_gtk_folder_store_tree_model_new_with_flags (TnyFolderStoreQuery *query, 85 TnyGtkFolderStoreTreeModelFlags flags); 76 86 void tny_gtk_folder_store_tree_model_prepend (TnyGtkFolderStoreTreeModel *self, TnyFolderStore* item, const gchar *root_name); 77 87 void tny_gtk_folder_store_tree_model_append (TnyGtkFolderStoreTreeModel *self, TnyFolderStore* item, const gchar *root_name);
