summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2023-04-18 17:16:43 +0200
committerMilan Crha <mcrha@redhat.com>2023-04-18 17:16:43 +0200
commit21bc5f94ac0b60c22610c3746de3134daf387851 (patch)
treea0a976dc67e89bb1f2ff3e08f1ae9752774ef28e
parent0a488216b57d4426f450259b381bb5f065ad61e9 (diff)
downloadevolution-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.c32
-rw-r--r--src/mail/e-mail-label-list-store.h3
-rw-r--r--src/mail/e-mail-label-manager.c60
-rw-r--r--src/mail/e-mail-reader.c73
-rw-r--r--src/mail/em-folder-properties.c39
-rw-r--r--src/mail/mail.error.xml6
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>