diff options
author | Milan Crha <mcrha@redhat.com> | 2023-04-18 17:16:43 +0200 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2023-04-18 17:16:43 +0200 |
commit | 21bc5f94ac0b60c22610c3746de3134daf387851 (patch) | |
tree | a0a976dc67e89bb1f2ff3e08f1ae9752774ef28e | |
parent | 0a488216b57d4426f450259b381bb5f065ad61e9 (diff) | |
download | evolution-21bc5f94ac0b60c22610c3746de3134daf387851.tar.gz |
I#1437 - Mail: Warn when adding an existing label
Closes https://gitlab.gnome.org/GNOME/evolution/-/issues/1437
-rw-r--r-- | src/mail/e-mail-label-list-store.c | 32 | ||||
-rw-r--r-- | src/mail/e-mail-label-list-store.h | 3 | ||||
-rw-r--r-- | src/mail/e-mail-label-manager.c | 60 | ||||
-rw-r--r-- | src/mail/e-mail-reader.c | 73 | ||||
-rw-r--r-- | src/mail/em-folder-properties.c | 39 | ||||
-rw-r--r-- | src/mail/mail.error.xml | 6 |
6 files changed, 159 insertions, 54 deletions
diff --git a/src/mail/e-mail-label-list-store.c b/src/mail/e-mail-label-list-store.c index b650844e7e..3cf2ae60b5 100644 --- a/src/mail/e-mail-label-list-store.c +++ b/src/mail/e-mail-label-list-store.c @@ -685,6 +685,38 @@ e_mail_label_list_store_lookup (EMailLabelListStore *store, } gboolean +e_mail_label_list_store_lookup_by_name (EMailLabelListStore *store, + const gchar *name, + GtkTreeIter *out_iter) +{ + GHashTableIter hash_iter; + GtkTreeIter *stored_iter; + gpointer value; + + g_return_val_if_fail (E_IS_MAIL_LABEL_LIST_STORE (store), FALSE); + g_return_val_if_fail (name != NULL, FALSE); + + g_hash_table_iter_init (&hash_iter, store->priv->tag_index); + while (g_hash_table_iter_next (&hash_iter, NULL, &value)) { + gchar *stored_name; + + stored_iter = value; + stored_name = e_mail_label_list_store_get_name (store, stored_iter); + + if (g_strcmp0 (stored_name, name) == 0) { + g_free (stored_name); + if (out_iter) + *out_iter = *stored_iter; + return TRUE; + } + + g_free (stored_name); + } + + return FALSE; +} + +gboolean e_mail_label_tag_is_default (const gchar *tag) { g_return_val_if_fail (tag != NULL, FALSE); diff --git a/src/mail/e-mail-label-list-store.h b/src/mail/e-mail-label-list-store.h index d56256c000..81fc1bef2c 100644 --- a/src/mail/e-mail-label-list-store.h +++ b/src/mail/e-mail-label-list-store.h @@ -82,6 +82,9 @@ void e_mail_label_list_store_set_with_tag (EMailLabelListStore *store, gboolean e_mail_label_list_store_lookup (EMailLabelListStore *store, const gchar *tag, GtkTreeIter *iter); +gboolean e_mail_label_list_store_lookup_by_name (EMailLabelListStore *store, + const gchar *name, + GtkTreeIter *out_iter); gboolean e_mail_label_tag_is_default (const gchar *tag); G_END_DECLS diff --git a/src/mail/e-mail-label-manager.c b/src/mail/e-mail-label-manager.c index 71aee1c6f8..b32b840bda 100644 --- a/src/mail/e-mail-label-manager.c +++ b/src/mail/e-mail-label-manager.c @@ -145,28 +145,39 @@ mail_label_manager_add_label (EMailLabelManager *manager) gpointer parent; GdkColor label_color; const gchar *label_name; + gboolean repeat = TRUE; parent = gtk_widget_get_toplevel (GTK_WIDGET (manager)); parent = gtk_widget_is_toplevel (parent) ? parent : NULL; dialog = e_mail_label_dialog_new (parent); + label_dialog = E_MAIL_LABEL_DIALOG (dialog); + tree_view = GTK_TREE_VIEW (manager->priv->tree_view); + model = gtk_tree_view_get_model (tree_view); gtk_window_set_title (GTK_WINDOW (dialog), _("Add Label")); - if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK) - goto exit; + while (repeat) { + repeat = FALSE; - label_dialog = E_MAIL_LABEL_DIALOG (dialog); - label_name = e_mail_label_dialog_get_label_name (label_dialog); - e_mail_label_dialog_get_label_color (label_dialog, &label_color); + if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK) + break; - tree_view = GTK_TREE_VIEW (manager->priv->tree_view); - model = gtk_tree_view_get_model (tree_view); + label_name = e_mail_label_dialog_get_label_name (label_dialog); + e_mail_label_dialog_get_label_color (label_dialog, &label_color); - e_mail_label_list_store_set ( - E_MAIL_LABEL_LIST_STORE (model), - NULL, label_name, &label_color); + if (e_mail_label_list_store_lookup_by_name (E_MAIL_LABEL_LIST_STORE (model), label_name, NULL)) { + repeat = TRUE; + e_alert_run_dialog_for_args ( + GTK_WINDOW (dialog), + "mail:error-label-exists", label_name, NULL); + continue; + } + + e_mail_label_list_store_set ( + E_MAIL_LABEL_LIST_STORE (model), + NULL, label_name, &label_color); + } -exit: gtk_widget_destroy (dialog); } @@ -184,6 +195,7 @@ mail_label_manager_edit_label (EMailLabelManager *manager) GdkColor label_color; const gchar *new_name; gchar *label_name; + gboolean repeat = TRUE; tree_view = GTK_TREE_VIEW (manager->priv->tree_view); selection = gtk_tree_view_get_selection (tree_view); @@ -203,16 +215,28 @@ mail_label_manager_edit_label (EMailLabelManager *manager) e_mail_label_dialog_set_label_color (label_dialog, &label_color); gtk_window_set_title (GTK_WINDOW (dialog), _("Edit Label")); - if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK) - goto exit; + while (repeat) { + repeat = FALSE; + + if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK) + break; - new_name = e_mail_label_dialog_get_label_name (label_dialog); - e_mail_label_dialog_get_label_color (label_dialog, &label_color); + new_name = e_mail_label_dialog_get_label_name (label_dialog); + e_mail_label_dialog_get_label_color (label_dialog, &label_color); - e_mail_label_list_store_set ( - label_store, &iter, new_name, &label_color); + if (g_strcmp0 (new_name, label_name) != 0 && + e_mail_label_list_store_lookup_by_name (label_store, new_name, NULL)) { + repeat = TRUE; + e_alert_run_dialog_for_args ( + GTK_WINDOW (dialog), + "mail:error-label-exists", new_name, NULL); + continue; + } + + e_mail_label_list_store_set ( + label_store, &iter, new_name, &label_color); + } -exit: gtk_widget_destroy (dialog); g_free (label_name); diff --git a/src/mail/e-mail-reader.c b/src/mail/e-mail-reader.c index d435c4dc34..fe7871160d 100644 --- a/src/mail/e-mail-reader.c +++ b/src/mail/e-mail-reader.c @@ -908,54 +908,65 @@ action_mail_label_new_cb (GtkAction *action, gchar *label_tag; gint n_children; guint ii; + gboolean repeat = TRUE; dialog = e_mail_label_dialog_new (e_mail_reader_get_window (reader)); gtk_window_set_title (GTK_WINDOW (dialog), _("Add Label")); - if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK) - goto exit; - backend = e_mail_reader_get_backend (reader); session = e_mail_backend_get_session (backend); - label_store = e_mail_ui_session_get_label_store ( - E_MAIL_UI_SESSION (session)); - + label_store = e_mail_ui_session_get_label_store (E_MAIL_UI_SESSION (session)); label_dialog = E_MAIL_LABEL_DIALOG (dialog); - label_name = e_mail_label_dialog_get_label_name (label_dialog); - e_mail_label_dialog_get_label_color (label_dialog, &label_color); - e_mail_label_list_store_set ( - label_store, NULL, label_name, &label_color); + while (repeat) { + repeat = FALSE; - /* XXX This is awkward. We've added a new label to the list store - * but we don't have the new label's tag nor an iterator to use - * to fetch it. We know the label was appended to the store, - * so we have to dig it out manually. EMailLabelListStore API - * probably needs some rethinking. */ - model = GTK_TREE_MODEL (label_store); - n_children = gtk_tree_model_iter_n_children (model, NULL); - g_warn_if_fail (gtk_tree_model_iter_nth_child (model, &iter, NULL, n_children - 1)); - label_tag = e_mail_label_list_store_get_tag (label_store, &iter); + if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK) + break; - uids = e_mail_reader_get_selected_uids (reader); - if (uids) { - CamelFolder *folder; + label_name = e_mail_label_dialog_get_label_name (label_dialog); + e_mail_label_dialog_get_label_color (label_dialog, &label_color); - folder = e_mail_reader_ref_folder (reader); + if (e_mail_label_list_store_lookup_by_name (label_store, label_name, NULL)) { + repeat = TRUE; + e_alert_run_dialog_for_args ( + GTK_WINDOW (dialog), + "mail:error-label-exists", label_name, NULL); + continue; + } - for (ii = 0; ii < uids->len; ii++) { - camel_folder_set_message_user_flag ( - folder, uids->pdata[ii], label_tag, TRUE); + e_mail_label_list_store_set ( + label_store, NULL, label_name, &label_color); + + /* XXX This is awkward. We've added a new label to the list store + * but we don't have the new label's tag nor an iterator to use + * to fetch it. We know the label was appended to the store, + * so we have to dig it out manually. EMailLabelListStore API + * probably needs some rethinking. */ + model = GTK_TREE_MODEL (label_store); + n_children = gtk_tree_model_iter_n_children (model, NULL); + g_warn_if_fail (gtk_tree_model_iter_nth_child (model, &iter, NULL, n_children - 1)); + label_tag = e_mail_label_list_store_get_tag (label_store, &iter); + + uids = e_mail_reader_get_selected_uids (reader); + if (uids) { + CamelFolder *folder; + + folder = e_mail_reader_ref_folder (reader); + + for (ii = 0; ii < uids->len; ii++) { + camel_folder_set_message_user_flag ( + folder, uids->pdata[ii], label_tag, TRUE); + } + + g_clear_object (&folder); + g_ptr_array_unref (uids); } - g_clear_object (&folder); - g_ptr_array_unref (uids); + g_free (label_tag); } - g_free (label_tag); - - exit: gtk_widget_destroy (dialog); } diff --git a/src/mail/em-folder-properties.c b/src/mail/em-folder-properties.c index 0bff9e05c1..d82aaf9475 100644 --- a/src/mail/em-folder-properties.c +++ b/src/mail/em-folder-properties.c @@ -1167,20 +1167,34 @@ emfp_labels_action (GtkWidget *parent, if (action == EMFP_ADD_LABEL) { if (!tag_exists) { + EMailLabelDialog *label_dialog; GtkWidget *dialog; + gboolean repeat = TRUE; dialog = e_mail_label_dialog_new (parent ? GTK_WINDOW (parent) : NULL); + label_dialog = E_MAIL_LABEL_DIALOG (dialog); gtk_window_set_title (GTK_WINDOW (dialog), _("Add Label")); - if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { - EMailLabelDialog *label_dialog; + while (repeat) { GdkColor label_color; const gchar *label_name; - label_dialog = E_MAIL_LABEL_DIALOG (dialog); + repeat = FALSE; + + if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK) + break; + label_name = e_mail_label_dialog_get_label_name (label_dialog); e_mail_label_dialog_get_label_color (label_dialog, &label_color); + if (e_mail_label_list_store_lookup_by_name (label_store, label_name, NULL)) { + repeat = TRUE; + e_alert_run_dialog_for_args ( + GTK_WINDOW (dialog), + "mail:error-label-exists", label_name, NULL); + continue; + } + e_mail_label_list_store_set_with_tag (label_store, NULL, tag, label_name, &label_color); emfp_update_label_row (model, &my_iter, label_name, &label_color); @@ -1195,6 +1209,7 @@ emfp_labels_action (GtkWidget *parent, const gchar *new_name; GdkColor label_color; gchar *label_name; + gboolean repeat = TRUE; dialog = e_mail_label_dialog_new (parent ? GTK_WINDOW (parent) : NULL); gtk_window_set_title (GTK_WINDOW (dialog), _("Edit Label")); @@ -1203,20 +1218,34 @@ emfp_labels_action (GtkWidget *parent, label_name = e_mail_label_list_store_get_name (label_store, &labels_iter); e_mail_label_dialog_set_label_name (label_dialog, label_name); - g_free (label_name); if (e_mail_label_list_store_get_color (label_store, &labels_iter, &label_color)) e_mail_label_dialog_set_label_color (label_dialog, &label_color); - if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { + while (repeat) { + repeat = FALSE; + + if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK) + break; + new_name = e_mail_label_dialog_get_label_name (label_dialog); e_mail_label_dialog_get_label_color (label_dialog, &label_color); + if (g_strcmp0 (label_name, new_name) != 0 && + e_mail_label_list_store_lookup_by_name (label_store, new_name, NULL)) { + repeat = TRUE; + e_alert_run_dialog_for_args ( + GTK_WINDOW (dialog), + "mail:error-label-exists", new_name, NULL); + continue; + } + e_mail_label_list_store_set (label_store, &labels_iter, new_name, &label_color); emfp_update_label_row (model, &my_iter, new_name, &label_color); } + g_free (label_name); gtk_widget_destroy (dialog); } } else if (action == EMFP_REMOVE_LABEL) { diff --git a/src/mail/mail.error.xml b/src/mail/mail.error.xml index 931bf186c9..e58559ebb5 100644 --- a/src/mail/mail.error.xml +++ b/src/mail/mail.error.xml @@ -673,4 +673,10 @@ in the folder will be available in offline mode.</_secondary> <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/> <button _label="_Mark as Junk" response="GTK_RESPONSE_YES"/> </error> + + <error id="error-label-exists" type="error"> + <!-- Translators: {0} is the name of the folder where the delete of the message note failed. --> + <_primary>Label named “{0}” already exists</_primary> + <_secondary>Choose a different name, please.</_secondary> + </error> </error-list> |