From 03787e53dd70307774433281bb8e537c831abcdd Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 26 Jun 2008 08:39:27 +0000 Subject: ** Fix for bug #540160 2008-06-26 Milan Crha ** Fix for bug #540160 * message-list.h: (struct _MessageList): * message-list.c: (message_list_init), (on_cursor_activated_cmd), (on_selection_changed_cmd): Remember whether we come from none/multi select to single select and properly update the preview. (Reverting patch for bug #337160 and doing that with other approach.) svn path=/trunk/; revision=35684 --- mail/ChangeLog | 10 ++++++++++ mail/message-list.c | 37 +++++++++++++++++-------------------- mail/message-list.h | 3 +++ 3 files changed, 30 insertions(+), 20 deletions(-) (limited to 'mail') diff --git a/mail/ChangeLog b/mail/ChangeLog index 750355286a..e98d9dee60 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,13 @@ +2008-06-26 Milan Crha + + ** Fix for bug #540160 + + * message-list.h: (struct _MessageList): + * message-list.c: (message_list_init), (on_cursor_activated_cmd), + (on_selection_changed_cmd): Remember whether we come from none/multi + select to single select and properly update the preview. + (Reverting patch for bug #337160 and doing that with other approach.) + 2008-06-24 Milan Crha ** Fix for bug #537275 diff --git a/mail/message-list.c b/mail/message-list.c index ca370d8beb..ad524e373a 100644 --- a/mail/message-list.c +++ b/mail/message-list.c @@ -2166,6 +2166,9 @@ message_list_init (MessageList *message_list) message_list->uid_nodemap = g_hash_table_new (g_str_hash, g_str_equal); message_list->async_event = mail_async_event_new(); + message_list->cursor_uid = NULL; + message_list->last_sel_single = FALSE; + /* TODO: Should this only get the selection if we're realised? */ p = message_list->priv = g_malloc0(sizeof(*message_list->priv)); p->invisible = gtk_invisible_new(); @@ -3309,30 +3312,19 @@ on_cursor_activated_cmd (ETree *tree, int row, ETreePath path, gpointer user_dat { MessageList *message_list = MESSAGE_LIST (user_data); const char *new_uid; - ESelectionModel *etsm; - gint selected; - - etsm = e_tree_get_selection_model (message_list->tree); - - selected = e_selection_model_selected_count (etsm); - if (selected == 1) { - GPtrArray *uids; - - uids = message_list_get_selected (message_list); - - new_uid = g_strdup (uids->pdata [0]); - - message_list_free_uids (message_list, uids); - } else if (path == NULL - || !e_selection_model_is_row_selected (etsm, e_selection_model_cursor_row (etsm)) - || selected != 1) + if (path == NULL) new_uid = NULL; else new_uid = get_message_uid (message_list, path); + /* Do not check the cursor_uid and the new_uid values, because the selected item + (set in on_selection_changed_cmd) can be different from the one with a cursor + (when selecting with Ctrl, for example). This has a little side-effect, when + keeping list it that state, then changing folders forth and back will select + and move cursor to that selected item. Does anybody consider it as a bug? */ if ((message_list->cursor_uid == NULL && new_uid == NULL) - || (message_list->cursor_uid != NULL && new_uid != NULL && !strcmp (message_list->cursor_uid, new_uid))) + || (message_list->last_sel_single && message_list->cursor_uid != NULL && new_uid != NULL)) return; g_free (message_list->cursor_uid); @@ -3350,20 +3342,23 @@ on_selection_changed_cmd(ETree *tree, MessageList *ml) { GPtrArray *uids; char *newuid; + ETreePath cursor; /* not sure if we could just ignore this for the cursor, i think sometimes you only get a selection changed when you should also get a cursor activated? */ uids = message_list_get_selected(ml); if (uids->len == 1) newuid = uids->pdata[0]; + else if ((cursor = e_tree_get_cursor(tree))) + newuid = (char *)camel_message_info_uid(e_tree_memory_node_get_data((ETreeMemory *)tree, cursor)); else newuid = NULL; /* If the selection isn't empty, then we ignore the no-uid check, since this event is also used for other updating. If it is empty, it might just be a setup event from etree which we do need to ignore */ - if ((newuid == NULL && ml->cursor_uid == NULL && uids->len == 0) - || (uids->len == 1 && newuid != NULL && ml->cursor_uid != NULL && !strcmp(ml->cursor_uid, newuid))) { + if ((newuid == NULL && ml->cursor_uid == NULL && uids->len == 0) || + (ml->last_sel_single && uids->len == 1 && newuid != NULL && ml->cursor_uid != NULL && !strcmp (ml->cursor_uid, newuid))) { /* noop */ } else { g_free(ml->cursor_uid); @@ -3372,6 +3367,8 @@ on_selection_changed_cmd(ETree *tree, MessageList *ml) ml->idle_id = g_idle_add_full (G_PRIORITY_LOW, on_cursor_activated_idle, ml, NULL); } + ml->last_sel_single = uids->len == 1; + message_list_free_uids(ml, uids); } diff --git a/mail/message-list.h b/mail/message-list.h index ba1ef84b7d..fe9f42f19f 100644 --- a/mail/message-list.h +++ b/mail/message-list.h @@ -138,6 +138,9 @@ struct _MessageList { /* Where the ETree cursor is. */ char *cursor_uid; + /* whether the last selection was on a single row or none/multi */ + gboolean last_sel_single; + /* Row-selection and seen-marking timers */ guint idle_id, seen_id; -- cgit