talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 4e838df8becc76c71418014572b7ce9b62e55a64
parent a7491a56de719d04e034feb2caa73c35da076c0e
Author: wwp <wwp@free.fr>
Date:   Sun,  6 May 2018 16:02:43 +0200

Make Claws Mail conservative about color labels: ask for confirmation
when user clears or override existing color labels to messages.
Confirmation dialog is discardable.

Diffstat:
Msrc/prefs_common.c | 2++
Msrc/prefs_common.h | 1+
Msrc/prefs_summaries.c | 12+++++++++++-
Msrc/summaryview.c | 60++++++++++++++++++++++++++++++++++++++++++++++++++++--------
4 files changed, 66 insertions(+), 9 deletions(-)

diff --git a/src/prefs_common.c b/src/prefs_common.c @@ -876,6 +876,8 @@ static PrefParam param[] = { {"ask_mark_all_read", "TRUE", &prefs_common.ask_mark_all_read, P_BOOL, NULL, NULL, NULL}, + {"ask_override_colorlabel", "TRUE", &prefs_common.ask_override_colorlabel, P_BOOL, + NULL, NULL, NULL}, {"ask_apply_per_account_filtering_rules", "TRUE", &prefs_common.ask_apply_per_account_filtering_rules, P_BOOL, NULL, NULL, NULL}, diff --git a/src/prefs_common.h b/src/prefs_common.h @@ -413,6 +413,7 @@ struct _PrefsCommon #endif int hover_timeout; /* msecs mouse hover timeout */ gboolean ask_mark_all_read; + gboolean ask_override_colorlabel; gboolean ask_apply_per_account_filtering_rules; gint apply_per_account_filtering_rules; diff --git a/src/prefs_summaries.c b/src/prefs_summaries.c @@ -74,6 +74,7 @@ typedef struct _SummariesPage GtkWidget *spinbtn_mark_as_read_delay; GtkWidget *checkbtn_immedexec; GtkWidget *checkbtn_ask_mark_all_read; + GtkWidget *checkbtn_ask_override_colorlabel; GtkWidget *optmenu_sort_key; GtkWidget *optmenu_sort_type; GtkWidget *optmenu_nextunreadmsgdialog; @@ -344,6 +345,7 @@ static void prefs_summaries_create_widget(PrefsPage *_page, GtkWindow *window, GtkAdjustment *spinbtn_mark_as_read_delay_adj; GtkWidget *checkbtn_immedexec; GtkWidget *checkbtn_ask_mark_all_read; + GtkWidget *checkbtn_ask_override_colorlabel; GtkWidget *label, *label_fill; GtkListStore *menu; GtkTreeIter iter; @@ -599,6 +601,9 @@ static void prefs_summaries_create_widget(PrefsPage *_page, GtkWindow *window, (vbox1, checkbtn_ask_mark_all_read, _("Confirm before marking all messages in a folder as read or unread")); PACK_CHECK_BUTTON + (vbox1, checkbtn_ask_override_colorlabel, + _("Confirm before overriding color label of messages")); + PACK_CHECK_BUTTON (vbox1, checkbtn_transhdr, _("Translate header names")); CLAWS_SET_TIP(checkbtn_transhdr, @@ -625,10 +630,11 @@ static void prefs_summaries_create_widget(PrefsPage *_page, GtkWindow *window, prefs_summaries->checkbtn_show_on_deletemove = checkbtn_show_on_deletemove; prefs_summaries->checkbtn_show_on_directional = checkbtn_show_on_directional; - prefs_summaries->checkbtn_mark_as_read_on_newwin = radio_mark_as_read_on_new_win; + prefs_summaries->checkbtn_mark_as_read_on_newwin = radio_mark_as_read_on_new_win; prefs_summaries->spinbtn_mark_as_read_delay = spinbtn_mark_as_read_delay; prefs_summaries->checkbtn_immedexec = checkbtn_immedexec; prefs_summaries->checkbtn_ask_mark_all_read = checkbtn_ask_mark_all_read; + prefs_summaries->checkbtn_ask_override_colorlabel = checkbtn_ask_override_colorlabel; prefs_summaries->optmenu_sort_key = optmenu_sort_key; prefs_summaries->optmenu_sort_type = optmenu_sort_type; prefs_summaries->optmenu_nextunreadmsgdialog = optmenu_nextunreadmsgdialog; @@ -681,6 +687,8 @@ static void prefs_summaries_create_widget(PrefsPage *_page, GtkWindow *window, prefs_common.immediate_exec); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_ask_mark_all_read), prefs_common.ask_mark_all_read); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_ask_override_colorlabel), + prefs_common.ask_override_colorlabel); combobox_select_by_data(GTK_COMBO_BOX(optmenu_sort_key), prefs_common.default_sort_key); @@ -737,6 +745,8 @@ static void prefs_summaries_save(PrefsPage *_page) GTK_TOGGLE_BUTTON(page->checkbtn_immedexec)); prefs_common.ask_mark_all_read = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(page->checkbtn_ask_mark_all_read)); + prefs_common.ask_override_colorlabel = gtk_toggle_button_get_active( + GTK_TOGGLE_BUTTON(page->checkbtn_ask_override_colorlabel)); prefs_common.mark_as_read_delay = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(page->spinbtn_mark_as_read_delay)); diff --git a/src/summaryview.c b/src/summaryview.c @@ -4220,12 +4220,10 @@ void summary_msgs_unlock(SummaryView *summaryview) static gboolean summary_mark_all_read_confirm(gboolean ask_if_needed) { - AlertValue val; - /* ask_if_needed is FALSE when user-asking is performed by caller, commonly when the caller is a mark-as-read-recursive func */ if (ask_if_needed && prefs_common.ask_mark_all_read) { - val = alertpanel_full(_("Mark all as read"), + AlertValue val = alertpanel_full(_("Mark all as read"), _("Do you really want to mark all mails in this folder as read?"), GTK_STOCK_NO, GTK_STOCK_YES, NULL, ALERTFOCUS_FIRST, TRUE, NULL, ALERT_QUESTION); @@ -4268,12 +4266,10 @@ void summary_mark_all_read(SummaryView *summaryview, gboolean ask_if_needed) static gboolean summary_mark_all_unread_confirm(gboolean ask_if_needed) { - AlertValue val; - /* ask_if_needed is FALSE when user-asking is performed by caller, commonly when the caller is a mark-as-unread-recursive func */ if (ask_if_needed && prefs_common.ask_mark_all_read) { - val = alertpanel_full(_("Mark all as unread"), + AlertValue val = alertpanel_full(_("Mark all as unread"), _("Do you really want to mark all mails in this folder as unread?"), GTK_STOCK_NO, GTK_STOCK_YES, NULL, ALERTFOCUS_FIRST, TRUE, NULL, ALERT_QUESTION); @@ -4420,7 +4416,7 @@ static gboolean check_permission(SummaryView *summaryview, MsgInfo * msginfo) } if (!found) { - alertpanel_error(_("You're not the author of the article.\n")); + alertpanel_error(_("You're not the author of the article.")); } return found; @@ -5916,7 +5912,7 @@ static void summary_colorlabel_menu_item_activate_cb(GtkWidget *widget, } /* summary_set_colorlabel_color() - labelcolor parameter is the color *flag* - * for the messsage; not the color index */ + * for the message; not the color index */ void summary_set_colorlabel_color(GtkCMCTree *ctree, GtkCMCTreeNode *node, guint labelcolor) { @@ -5977,6 +5973,54 @@ void summary_set_colorlabel(SummaryView *summaryview, guint labelcolor, GList *cur; gboolean froze = FALSE; + if (prefs_common.ask_override_colorlabel) { + GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree); + gboolean ask = FALSE; + AlertValue val; + guint color; + gboolean already_this_color_everywhere = TRUE; + + /* if clearing color labels (applying 'none', 0): + - ask if at least one message has a non-0 color label set + if applying a non-0 color label: + - ask if at least one of the selected messages has a non-0 color label different + from the one we want to apply. + - don't ask if all messages have the same color label as the one we're applying + */ + for (cur = GTK_CMCLIST(ctree)->selection; + !ask && cur != NULL && cur->data != NULL; + cur = cur->next) { + MsgInfo *msginfo = gtk_cmctree_node_get_row_data(ctree, GTK_CMCTREE_NODE(cur->data)); + if (msginfo) { + color = MSG_GET_COLORLABEL_VALUE(msginfo->flags); + if (labelcolor == 0) { + /* clearing color labels */ + ask = (color != 0); + } else { + already_this_color_everywhere &= (color == labelcolor); + ask = ((color != 0) && (color != labelcolor)) && !already_this_color_everywhere; + } + } + } + + if (ask) { + gchar *msg; + + if (labelcolor == 0) + msg = _("Do you really want to reset the color label of all selected messages?"); + else + msg = _("Do you really want to apply this color label to all selected messages?"); + val = alertpanel_full(_("Set color label"), msg, + GTK_STOCK_NO, GTK_STOCK_YES, NULL, ALERTFOCUS_FIRST, + TRUE, NULL, ALERT_QUESTION); + + if ((val & ~G_ALERTDISABLE) != G_ALERTALTERNATE) + return; + else if (val & G_ALERTDISABLE) + prefs_common.ask_override_colorlabel = FALSE; + } + } + START_LONG_OPERATION(summaryview, FALSE); for (cur = GTK_CMCLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next) summary_set_row_colorlabel(summaryview,