aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-11-16 06:38:06 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-11-16 06:38:06 +0000
commitcd17b1aeb12d55754344a57720b089e6b28ca271 (patch)
tree37d943a4d453416ed1c59a51128613f228846857 /src
parent690f9a59dcfb68ec4901f942ae3e3e596df24b29 (diff)
fixed a bug that the selection was broken (and sometimes crashed) when mark, unread, and colorlabel flags were changed while the summary was sorted by the flags.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@751 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'src')
-rw-r--r--src/summaryview.c91
1 files changed, 77 insertions, 14 deletions
diff --git a/src/summaryview.c b/src/summaryview.c
index 96dbaa88..2023ae6c 100644
--- a/src/summaryview.c
+++ b/src/summaryview.c
@@ -97,6 +97,17 @@
S_COL_MSG_INFO, &msginfo, -1); \
}
+#define SORT_BLOCK(key) \
+ if (summaryview->folder_item->sort_key == key) { \
+ sort_key = key; \
+ sort_type = summaryview->folder_item->sort_type; \
+ summary_sort(summaryview, SORT_BY_NONE, SORT_ASCENDING); \
+ }
+
+#define SORT_UNBLOCK(key) \
+ if (sort_key == key) \
+ summary_sort(summaryview, sort_key, sort_type);
+
#define SUMMARY_COL_MARK_WIDTH 21
#define SUMMARY_COL_UNREAD_WIDTH 24
#define SUMMARY_COL_MIME_WIDTH 17
@@ -2205,6 +2216,7 @@ static void summary_display_msg_full(SummaryView *summaryview,
gboolean new_window, gboolean all_headers,
gboolean redisplay)
{
+ GtkTreePath *path;
MsgInfo *msginfo = NULL;
gint val;
@@ -2228,17 +2240,8 @@ static void summary_display_msg_full(SummaryView *summaryview,
msgview = messageview_create_with_new_window();
val = messageview_show(msgview, msginfo, all_headers);
} else {
- MessageView *msgview;
- GtkTreePath *path;
-
- msgview = summaryview->messageview;
+ MessageView *msgview = summaryview->messageview;
- gtk_tree_row_reference_free(summaryview->displayed);
- path = gtk_tree_model_get_path
- (GTK_TREE_MODEL(summaryview->store), iter);
- summaryview->displayed =
- gtk_tree_row_reference_new
- (GTK_TREE_MODEL(summaryview->store), path);
if (!messageview_is_visible(msgview)) {
main_window_toggle_message_view(summaryview->mainwin);
GTK_EVENTS_FLUSH();
@@ -2250,10 +2253,6 @@ static void summary_display_msg_full(SummaryView *summaryview,
gtk_notebook_get_current_page
(GTK_NOTEBOOK(msgview->notebook)) == 0)))
gtk_widget_grab_focus(summaryview->treeview);
- gtkut_tree_view_scroll_to_cell
- (GTK_TREE_VIEW(summaryview->treeview), path,
- !summaryview->on_button_press);
- gtk_tree_path_free(path);
}
if (val == 0 &&
@@ -2275,6 +2274,22 @@ static void summary_display_msg_full(SummaryView *summaryview,
}
}
+ path = gtk_tree_model_get_path
+ (GTK_TREE_MODEL(summaryview->store), iter);
+ if (!new_window) {
+ gtk_tree_row_reference_free(summaryview->displayed);
+ summaryview->displayed =
+ gtk_tree_row_reference_new
+ (GTK_TREE_MODEL(summaryview->store), path);
+ }
+ gtkut_tree_view_scroll_to_cell
+ (GTK_TREE_VIEW(summaryview->treeview), path,
+ !summaryview->on_button_press);
+ gtk_tree_path_free(path);
+
+ if (summaryview->folder_item->sort_key == SORT_BY_UNREAD)
+ summary_selection_list_free(summaryview);
+
summary_set_menu_sensitive(summaryview);
main_window_set_toolbar_sensitive(summaryview->mainwin);
@@ -2449,6 +2464,10 @@ void summary_mark(SummaryView *summaryview)
GList *rows, *cur;
GtkTreeModel *model = GTK_TREE_MODEL(summaryview->store);
GtkTreeIter iter;
+ FolderSortKey sort_key = SORT_BY_NONE;
+ FolderSortType sort_type = SORT_ASCENDING;
+
+ SORT_BLOCK(SORT_BY_MARK);
rows = summary_get_selected_rows(summaryview);
for (cur = rows; cur != NULL; cur = cur->next) {
@@ -2465,6 +2484,8 @@ void summary_mark(SummaryView *summaryview)
g_slist_free(msglist);
}
+ SORT_UNBLOCK(SORT_BY_MARK);
+
summary_status_show(summaryview);
}
@@ -2493,6 +2514,10 @@ void summary_mark_as_read(SummaryView *summaryview)
GList *rows, *cur;
GtkTreeModel *model = GTK_TREE_MODEL(summaryview->store);
GtkTreeIter iter;
+ FolderSortKey sort_key = SORT_BY_NONE;
+ FolderSortType sort_type = SORT_ASCENDING;
+
+ SORT_BLOCK(SORT_BY_UNREAD);
rows = summary_get_selected_rows(summaryview);
@@ -2511,6 +2536,8 @@ void summary_mark_as_read(SummaryView *summaryview)
g_slist_free(msglist);
}
+ SORT_UNBLOCK(SORT_BY_UNREAD);
+
summary_status_show(summaryview);
}
@@ -2519,6 +2546,10 @@ void summary_mark_all_read(SummaryView *summaryview)
GtkTreeModel *model = GTK_TREE_MODEL(summaryview->store);
GtkTreeIter iter;
gboolean valid;
+ FolderSortKey sort_key = SORT_BY_NONE;
+ FolderSortType sort_type = SORT_ASCENDING;
+
+ SORT_BLOCK(SORT_BY_UNREAD);
valid = gtk_tree_model_get_iter_first(model, &iter);
@@ -2534,6 +2565,8 @@ void summary_mark_all_read(SummaryView *summaryview)
g_slist_free(msglist);
}
+ SORT_UNBLOCK(SORT_BY_UNREAD);
+
summary_status_show(summaryview);
}
@@ -2566,6 +2599,10 @@ void summary_mark_as_unread(SummaryView *summaryview)
GList *rows, *cur;
GtkTreeModel *model = GTK_TREE_MODEL(summaryview->store);
GtkTreeIter iter;
+ FolderSortKey sort_key = SORT_BY_NONE;
+ FolderSortType sort_type = SORT_ASCENDING;
+
+ SORT_BLOCK(SORT_BY_UNREAD);
rows = summary_get_selected_rows(summaryview);
for (cur = rows; cur != NULL; cur = cur->next) {
@@ -2583,6 +2620,8 @@ void summary_mark_as_unread(SummaryView *summaryview)
g_slist_free(msglist);
}
+ SORT_UNBLOCK(SORT_BY_UNREAD);
+
summary_status_show(summaryview);
}
@@ -2738,6 +2777,10 @@ void summary_unmark(SummaryView *summaryview)
GList *rows, *cur;
GtkTreeModel *model = GTK_TREE_MODEL(summaryview->store);
GtkTreeIter iter;
+ FolderSortKey sort_key = SORT_BY_NONE;
+ FolderSortType sort_type = SORT_ASCENDING;
+
+ SORT_BLOCK(SORT_BY_MARK);
rows = summary_get_selected_rows(summaryview);
for (cur = rows; cur != NULL; cur = cur->next) {
@@ -2754,6 +2797,8 @@ void summary_unmark(SummaryView *summaryview)
g_slist_free(msglist);
}
+ SORT_UNBLOCK(SORT_BY_MARK);
+
summary_status_show(summaryview);
}
@@ -4162,6 +4207,10 @@ void summary_set_colorlabel(SummaryView *summaryview, guint labelcolor,
GList *rows, *cur;
GtkTreeIter iter;
MsgInfo *msginfo;
+ FolderSortKey sort_key = SORT_BY_NONE;
+ FolderSortType sort_type = SORT_ASCENDING;
+
+ SORT_BLOCK(SORT_BY_LABEL);
rows = summary_get_selected_rows(summaryview);
for (cur = rows; cur != NULL; cur = cur->next) {
@@ -4175,6 +4224,8 @@ void summary_set_colorlabel(SummaryView *summaryview, guint labelcolor,
if (rows)
summaryview->folder_item->mark_dirty = TRUE;
+
+ SORT_UNBLOCK(SORT_BY_LABEL);
}
static void summary_colorlabel_menu_item_activate_item_cb(GtkMenuItem *menuitem,
@@ -4555,10 +4606,14 @@ static gboolean summary_button_pressed(GtkWidget *treeview,
if ((event->button == 1 || event->button == 2)) {
MsgInfo *msginfo;
+ FolderSortKey sort_key = SORT_BY_NONE;
+ FolderSortType sort_type = SORT_ASCENDING;
GET_MSG_INFO(msginfo, &iter);
if (column == summaryview->columns[S_COL_MARK]) {
+ SORT_BLOCK(SORT_BY_MARK);
+
if (!MSG_IS_DELETED(msginfo->flags) &&
!MSG_IS_MOVE(msginfo->flags) &&
!MSG_IS_COPY(msginfo->flags)) {
@@ -4575,8 +4630,13 @@ static gboolean summary_button_pressed(GtkWidget *treeview,
}
}
gtk_tree_path_free(path);
+
+ SORT_UNBLOCK(SORT_BY_MARK);
+
return TRUE;
} else if (column == summaryview->columns[S_COL_UNREAD]) {
+ SORT_BLOCK(SORT_BY_UNREAD);
+
if (MSG_IS_UNREAD(msginfo->flags)) {
summary_mark_row_as_read(summaryview, &iter);
if (MSG_IS_IMAP(msginfo->flags))
@@ -4592,6 +4652,9 @@ static gboolean summary_button_pressed(GtkWidget *treeview,
summary_status_show(summaryview);
}
gtk_tree_path_free(path);
+
+ SORT_UNBLOCK(SORT_BY_UNREAD);
+
return TRUE;
}
}