diff options
author | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2005-09-13 06:00:29 +0000 |
---|---|---|
committer | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2005-09-13 06:00:29 +0000 |
commit | 2d99fe5ebda8a9ec92f94cc22b1c16739f19f3da (patch) | |
tree | 0752b703dc18efc4309cc0d17d1fd65694341833 /src | |
parent | 818d22882b42a3cd7c73f6bbceb39cb4066f3d74 (diff) |
added 'View/Sort/by thread date'.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@574 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'src')
-rw-r--r-- | src/mainwindow.c | 3 | ||||
-rw-r--r-- | src/summaryview.c | 104 |
2 files changed, 99 insertions, 8 deletions
diff --git a/src/mainwindow.c b/src/mainwindow.c index 5bd94bfe..745740ee 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -529,6 +529,7 @@ static GtkItemFactoryEntry mainwin_entries[] = {N_("/_View/_Sort/by _number"), NULL, sort_summary_cb, SORT_BY_NUMBER, "<RadioItem>"}, {N_("/_View/_Sort/by s_ize"), NULL, sort_summary_cb, SORT_BY_SIZE, "/View/Sort/by number"}, {N_("/_View/_Sort/by _date"), NULL, sort_summary_cb, SORT_BY_DATE, "/View/Sort/by number"}, + {N_("/_View/_Sort/by t_hread date"), NULL, sort_summary_cb, SORT_BY_TDATE, "/View/Sort/by number"}, {N_("/_View/_Sort/by _from"), NULL, sort_summary_cb, SORT_BY_FROM, "/View/Sort/by number"}, {N_("/_View/_Sort/by _recipient"), NULL, sort_summary_cb, SORT_BY_TO, "/View/Sort/by number"}, {N_("/_View/_Sort/by _subject"), NULL, sort_summary_cb, SORT_BY_SUBJECT, "/View/Sort/by number"}, @@ -1902,6 +1903,8 @@ void main_window_set_menu_sensitive(MainWindow *mainwin) menu_path = "/View/Sort/by size"; break; case SORT_BY_DATE: menu_path = "/View/Sort/by date"; break; + case SORT_BY_TDATE: + menu_path = "/View/Sort/by thread date"; break; case SORT_BY_FROM: menu_path = "/View/Sort/by from"; break; case SORT_BY_TO: diff --git a/src/summaryview.c b/src/summaryview.c index da018bb9..b0e7d2a1 100644 --- a/src/summaryview.c +++ b/src/summaryview.c @@ -303,6 +303,10 @@ static gint summary_cmp_by_date (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data); +static gint summary_cmp_by_thread_date (GtkTreeModel *model, + GtkTreeIter *a, + GtkTreeIter *b, + gpointer data); static gint summary_cmp_by_from (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, @@ -327,6 +331,7 @@ static SummaryColumnType sort_key_to_col[] = { S_COL_NUMBER, S_COL_SIZE, S_COL_DATE, + S_COL_TDATE, S_COL_FROM, S_COL_SUBJECT, -1, @@ -1898,6 +1903,7 @@ static void summary_set_row(SummaryView *summaryview, GtkTreeIter *iter, S_COL_MSG_INFO, msginfo, S_COL_LABEL, color_val, + S_COL_TDATE, 0, S_COL_TO, NULL, S_COL_FOREGROUND, foreground, @@ -1918,6 +1924,13 @@ static void summary_insert_gnode(SummaryView *summaryview, GtkTreeStore *store, summary_set_row(summaryview, iter, msginfo); + if (!parent) { + guint tdate; + + tdate = procmsg_get_thread_date(gnode); + gtk_tree_store_set(store, iter, S_COL_TDATE, tdate, -1); + } + for (gnode = gnode->children; gnode != NULL; gnode = gnode->next) { GtkTreeIter child; @@ -1937,6 +1950,13 @@ static void summary_insert_gnode_before(SummaryView *summaryview, summary_set_row(summaryview, iter, msginfo); + if (!parent) { + guint tdate; + + tdate = procmsg_get_thread_date(gnode); + gtk_tree_store_set(store, iter, S_COL_TDATE, tdate, -1); + } + for (gnode = gnode->children; gnode != NULL; gnode = gnode->next) { GtkTreeIter child; @@ -3295,6 +3315,11 @@ void summary_thread_build(SummaryView *summaryview) GHashTable *node_table; MsgInfo *msginfo; gboolean valid; + FolderSortKey sort_key = SORT_BY_NONE; + FolderSortType sort_type = SORT_ASCENDING; + + if (!summaryview->folder_item) + return; summary_lock(summaryview); @@ -3302,8 +3327,7 @@ void summary_thread_build(SummaryView *summaryview) STATUSBAR_PUSH(summaryview->mainwin, _("Building threads...")); main_window_cursor_wait(summaryview->mainwin); - if (summaryview->folder_item) - summaryview->folder_item->threaded = TRUE; + summaryview->folder_item->threaded = TRUE; mlist = summary_get_msg_list(summaryview); root = procmsg_get_thread_tree(mlist); @@ -3312,6 +3336,12 @@ void summary_thread_build(SummaryView *summaryview) g_hash_table_insert(node_table, node->data, node); } + if (summaryview->folder_item->sort_key != SORT_BY_NONE) { + sort_key = summaryview->folder_item->sort_key; + sort_type = summaryview->folder_item->sort_type; + summary_sort(summaryview, SORT_BY_NONE, SORT_ASCENDING); + } + valid = gtk_tree_model_get_iter_first(model, &next); while (valid) { iter = next; @@ -3320,17 +3350,36 @@ void summary_thread_build(SummaryView *summaryview) gtk_tree_model_get(model, &iter, S_COL_MSG_INFO, &msginfo, -1); node = g_hash_table_lookup(node_table, msginfo); if (node) { + GNode *cur; GtkTreeIter child; - for (node = node->children; node != NULL; - node = node->next) { + for (cur = node->children; cur != NULL; + cur = cur->next) { summary_insert_gnode(summaryview, store, &child, - &iter, NULL, node); + &iter, NULL, cur); } } else gtk_tree_store_remove(store, &iter); } + valid = gtk_tree_model_get_iter_first(model, &next); + while (valid) { + guint tdate; + + iter = next; + valid = gtk_tree_model_iter_next(model, &next); + + gtk_tree_model_get(model, &iter, S_COL_MSG_INFO, &msginfo, -1); + node = g_hash_table_lookup(node_table, msginfo); + if (node) { + tdate = procmsg_get_thread_date(node); + gtk_tree_store_set(store, &iter, S_COL_TDATE, tdate, -1); + } + } + + if (sort_key != SORT_BY_NONE) + summary_sort(summaryview, sort_key, sort_type); + g_hash_table_destroy(node_table); g_node_destroy(root); g_slist_free(mlist); @@ -3363,7 +3412,6 @@ static void summary_unthread_node_recursive(SummaryView *summaryview, *sibling = iter_; valid = gtk_tree_model_iter_children(model, &child, iter); - while (valid) { summary_unthread_node_recursive(summaryview, &child, sibling); valid = gtk_tree_model_iter_next(model, &child); @@ -3379,7 +3427,6 @@ static void summary_unthread_node(SummaryView *summaryview, GtkTreeIter *iter) sibling = *iter; valid = gtk_tree_model_iter_children(model, &next, iter); - while (valid) { child = next; valid = gtk_tree_model_iter_next(model, &next); @@ -3393,6 +3440,8 @@ void summary_unthread(SummaryView *summaryview) GtkTreeModel *model = GTK_TREE_MODEL(summaryview->store); GtkTreeIter iter, next; gboolean valid; + FolderSortKey sort_key = SORT_BY_NONE; + FolderSortType sort_type = SORT_ASCENDING; summary_lock(summaryview); @@ -3403,14 +3452,30 @@ void summary_unthread(SummaryView *summaryview) if (summaryview->folder_item) summaryview->folder_item->threaded = FALSE; + if (summaryview->folder_item->sort_key != SORT_BY_NONE) { + sort_key = summaryview->folder_item->sort_key; + sort_type = summaryview->folder_item->sort_type; + summary_sort(summaryview, SORT_BY_NONE, SORT_ASCENDING); + } + valid = gtk_tree_model_get_iter_first(model, &next); + while (valid) { + iter = next; + valid = gtk_tree_model_iter_next(model, &next); + gtk_tree_store_set(GTK_TREE_STORE(model), &iter, + S_COL_TDATE, 0, -1); + } + valid = gtk_tree_model_get_iter_first(model, &next); while (valid) { iter = next; valid = gtk_tree_model_iter_next(model, &next); summary_unthread_node(summaryview, &iter); } + if (sort_key != SORT_BY_NONE) + summary_sort(summaryview, sort_key, sort_type); + summary_scroll_to_selected(summaryview, TRUE); debug_print(_("done.\n")); @@ -3431,7 +3496,6 @@ static gboolean summary_has_invalid_node(GtkTreeModel *model, GtkTreeIter *iter) return TRUE; valid = gtk_tree_model_iter_children(model, &child, iter); - while (valid) { if (summary_has_invalid_node(model, &child)) return TRUE; @@ -4122,6 +4186,7 @@ static GtkWidget *summary_tree_view_create(SummaryView *summaryview) G_TYPE_UINT, G_TYPE_POINTER, G_TYPE_INT, + G_TYPE_UINT, G_TYPE_POINTER, GDK_TYPE_COLOR, G_TYPE_BOOLEAN); @@ -4139,6 +4204,7 @@ static GtkWidget *summary_tree_view_create(SummaryView *summaryview) SET_SORT(S_COL_SIZE, summary_cmp_by_size); SET_SORT(S_COL_NUMBER, summary_cmp_by_num); SET_SORT(S_COL_LABEL, summary_cmp_by_label); + SET_SORT(S_COL_TDATE, summary_cmp_by_thread_date); SET_SORT(S_COL_TO, summary_cmp_by_to); #undef SET_SORT @@ -4890,6 +4956,28 @@ CMP_FUNC_DEF(summary_cmp_by_num, msginfo_a->msgnum - msginfo_b->msgnum) CMP_FUNC_DEF(summary_cmp_by_date, msginfo_a->date_t - msginfo_b->date_t) #undef CMP_FUNC_DEF + +static gint summary_cmp_by_thread_date(GtkTreeModel *model, + GtkTreeIter *a, GtkTreeIter *b, + gpointer data) +{ + MsgInfo *msginfo_a = NULL, *msginfo_b = NULL; + guint tdate_a, tdate_b; + + gtk_tree_model_get(model, a, S_COL_MSG_INFO, &msginfo_a, S_COL_TDATE, + &tdate_a, -1); + gtk_tree_model_get(model, b, S_COL_MSG_INFO, &msginfo_b, S_COL_TDATE, + &tdate_b, -1); + + if (!msginfo_a || !msginfo_b) + return 0; + + if (tdate_a == 0 && tdate_b == 0) + return msginfo_a->date_t - msginfo_b->date_t; + else + return tdate_a - tdate_b; +} + #define CMP_FUNC_DEF(func_name, var_name) \ static gint func_name(GtkTreeModel *model, \ GtkTreeIter *a, GtkTreeIter *b, gpointer data) \ |