aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-05-16 11:31:08 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-05-16 11:31:08 +0000
commit3cc2910a1aeb1dd0c4b048fb92a96407f802a5f4 (patch)
tree9f5aa2f22d4f1dcadc0af1193fe2b5580c852497 /src
parentbf0db4ac9142e93e2df42c82d558470df6c3005f (diff)
fixed selection problem after execution.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@258 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'src')
-rw-r--r--src/gtkutils.c21
-rw-r--r--src/summaryview.c116
2 files changed, 92 insertions, 45 deletions
diff --git a/src/gtkutils.c b/src/gtkutils.c
index 23e42bec..9751beb5 100644
--- a/src/gtkutils.c
+++ b/src/gtkutils.c
@@ -482,25 +482,22 @@ gboolean gtkut_tree_model_find_by_column_data(GtkTreeModel *model,
GtkTreeIter iter_;
gpointer store_data;
- if (start)
+ if (start) {
+ gtk_tree_model_get(model, start, col, &store_data, -1);
+ if (store_data == data) {
+ *iter = *start;
+ return TRUE;
+ }
valid = gtk_tree_model_iter_children(model, &iter_, start);
- else
+ } else
valid = gtk_tree_model_get_iter_first(model, &iter_);
while (valid) {
- gtk_tree_model_get(model, &iter_, col, &store_data, -1);
- if (store_data == data) {
- *iter = iter_;
+ if (gtkut_tree_model_find_by_column_data
+ (model, iter, &iter_, col, data)) {
return TRUE;
}
- if (gtk_tree_model_iter_has_child(model, &iter_)) {
- if (gtkut_tree_model_find_by_column_data
- (model, iter, &iter_, col, data)) {
- return TRUE;
- }
- }
-
valid = gtk_tree_model_iter_next(model, &iter_);
}
diff --git a/src/summaryview.c b/src/summaryview.c
index 8a8a0eca..12926aeb 100644
--- a/src/summaryview.c
+++ b/src/summaryview.c
@@ -2454,28 +2454,23 @@ void summary_delete(SummaryView *summaryview)
summary_delete_row(summaryview, &last_sel);
}
- valid = summary_find_next_msg(summaryview, &next, &last_sel);
- if (!valid)
- valid = summary_find_prev_msg(summaryview, &next, &last_sel);
+ if (prefs_common.immediate_exec || item->stype == F_TRASH) {
+ summary_execute(summaryview);
+ } else {
+ valid = summary_find_next_msg(summaryview, &next, &last_sel);
+ if (!valid)
+ valid = summary_find_prev_msg
+ (summaryview, &next, &last_sel);
- if (valid) {
-#if 0
- if (sel_last && node == gtkut_ctree_node_next(ctree, sel_last))
- summary_step(summaryview, GTK_SCROLL_STEP_FORWARD);
- else if (sel_last && node == GTK_CTREE_NODE_PREV(sel_last))
- summary_step(summaryview, GTK_SCROLL_STEP_BACKWARD);
- else
-#endif
+ if (valid) {
summary_select_row
(summaryview, &next,
- messageview_is_visible(summaryview->messageview),
+ messageview_is_visible
+ (summaryview->messageview),
FALSE);
- }
-
- if (prefs_common.immediate_exec || item->stype == F_TRASH)
- summary_execute(summaryview);
- else
+ }
summary_status_show(summaryview);
+ }
}
static gboolean summary_delete_duplicated_func(GtkTreeModel *model,
@@ -2634,12 +2629,12 @@ void summary_move_selected_to(SummaryView *summaryview, FolderItem *to_folder)
}
g_list_free(rows);
- summary_step(summaryview, GTK_SCROLL_STEP_FORWARD);
-
if (prefs_common.immediate_exec)
summary_execute(summaryview);
- else
+ else {
+ summary_step(summaryview, GTK_SCROLL_STEP_FORWARD);
summary_status_show(summaryview);
+ }
}
void summary_move_to(SummaryView *summaryview)
@@ -2707,12 +2702,12 @@ void summary_copy_selected_to(SummaryView *summaryview, FolderItem *to_folder)
}
g_list_free(rows);
- summary_step(summaryview, GTK_SCROLL_STEP_FORWARD);
-
if (prefs_common.immediate_exec)
summary_execute(summaryview);
- else
+ else {
+ summary_step(summaryview, GTK_SCROLL_STEP_FORWARD);
summary_status_show(summaryview);
+ }
}
void summary_copy_to(SummaryView *summaryview)
@@ -2903,6 +2898,17 @@ static void summary_remove_invalid_messages(SummaryView *summaryview)
if (summaryview->folder_item->threaded)
summary_modify_threads(summaryview);
+ valid = gtkut_tree_row_reference_get_iter(model, summaryview->selected,
+ &iter);
+ if (valid) {
+ valid = summary_find_next_msg(summaryview, &next, &iter);
+ if (!valid)
+ valid = summary_find_prev_msg(summaryview, &next,
+ &iter);
+ if (valid)
+ summary_select_row(summaryview, &next, FALSE, FALSE);
+ }
+
for (valid = gtk_tree_model_get_iter_first(model, &iter);
valid == TRUE; iter = next) {
next = iter;
@@ -3285,13 +3291,15 @@ static GNode *summary_get_modified_node(SummaryView *summaryview,
return node;
}
-static void summary_modify_node(SummaryView *summaryview, GtkTreeIter *iter)
+static void summary_modify_node(SummaryView *summaryview, GtkTreeIter *iter,
+ GtkTreeIter *selected)
{
GtkTreeModel *model = GTK_TREE_MODEL(summaryview->store);
- MsgInfo *msginfo;
+ MsgInfo *msginfo, *sel_msginfo = NULL;
GNode *root, *cur;
GtkTreeIter iter_, sibling;
- GtkTreePath *path;
+ GtkTreePath *path, *sel_path;
+ gboolean found = FALSE;
if (!gtk_tree_model_iter_has_child(model, iter))
return;
@@ -3300,6 +3308,17 @@ static void summary_modify_node(SummaryView *summaryview, GtkTreeIter *iter)
gtk_tree_model_get(model, iter, S_COL_MSG_INFO, &msginfo, -1);
+ if (selected) {
+ path = gtk_tree_model_get_path(model, iter);
+ sel_path = gtk_tree_model_get_path(model, selected);
+ if (gtk_tree_path_compare(path, sel_path) == 0 ||
+ gtk_tree_path_is_ancestor(path, sel_path))
+ gtk_tree_model_get(model, selected,
+ S_COL_MSG_INFO, &sel_msginfo, -1);
+ gtk_tree_path_free(sel_path);
+ gtk_tree_path_free(path);
+ }
+
root = g_node_new(NULL);
summary_get_modified_node(summaryview, iter, root, NULL);
@@ -3315,6 +3334,11 @@ static void summary_modify_node(SummaryView *summaryview, GtkTreeIter *iter)
path, TRUE);
gtk_tree_path_free(path);
}
+ if (sel_msginfo && !found) {
+ found = gtkut_tree_model_find_by_column_data
+ (model, selected, &iter_,
+ S_COL_MSG_INFO, sel_msginfo);
+ }
sibling = iter_;
}
@@ -3326,21 +3350,40 @@ static void summary_modify_node(SummaryView *summaryview, GtkTreeIter *iter)
static void summary_modify_threads(SummaryView *summaryview)
{
GtkTreeModel *model = GTK_TREE_MODEL(summaryview->store);
- GtkTreeIter iter, next;
- gboolean valid;
+ GtkTreeIter iter, next, selected;
+ GtkTreeIter *selected_p = NULL;
+ gboolean valid, has_selection;
summary_lock(summaryview);
debug_print("Modifying threads for execution...");
+ has_selection = gtkut_tree_row_reference_get_iter
+ (model, summaryview->selected, &selected);
+ if (has_selection) {
+ valid = summary_find_next_msg(summaryview, &next, &selected);
+ if (!valid)
+ valid = summary_find_prev_msg(summaryview, &next,
+ &selected);
+ if (valid) {
+ selected = next;
+ selected_p = &selected;
+ } else
+ has_selection = FALSE;
+ }
+
valid = gtk_tree_model_get_iter_first(model, &next);
while (valid) {
iter = next;
valid = gtk_tree_model_iter_next(model, &next);
- summary_modify_node(summaryview, &iter);
+ summary_modify_node(summaryview, &iter, selected_p);
}
+ if (has_selection &&
+ !gtk_tree_row_reference_valid(summaryview->selected))
+ summary_select_row(summaryview, &selected, FALSE, FALSE);
+
debug_print("done.\n");
summary_unlock(summaryview);
@@ -4039,8 +4082,7 @@ static gboolean summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
break;
}
- if (!summaryview->selected &&
- gtk_tree_selection_count_selected_rows(summaryview->selection) == 0)
+ if (!summaryview->selected)
return FALSE;
messageview = summaryview->messageview;
@@ -4121,6 +4163,9 @@ static void summary_row_expanded(GtkTreeView *treeview, GtkTreeIter *iter,
if (prefs_common.bold_unread)
summary_set_bold_recursive(summaryview, iter);
+
+ /* workaround for last row expand problem */
+ gtk_widget_queue_resize(GTK_WIDGET(treeview));
}
static void summary_row_collapsed(GtkTreeView *treeview, GtkTreeIter *iter,
@@ -4154,9 +4199,14 @@ static void summary_selection_changed(GtkTreeSelection *selection,
summary_status_show(summaryview);
if (gtk_tree_selection_count_selected_rows(selection) != 1) {
- if (summaryview->selected) {
+ list = gtk_tree_selection_get_selected_rows(selection, NULL);
+ if (list) {
+ path = (GtkTreePath *)list->data;
gtk_tree_row_reference_free(summaryview->selected);
- summaryview->selected = NULL;
+ summaryview->selected =
+ gtk_tree_row_reference_new(model, path);
+ g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL);
+ g_list_free(list);
}
summaryview->display_msg = FALSE;
if (summaryview->displayed && prefs_common.always_show_msg) {