[evolution] Bug 269852 - Label should be on "Message" menu when mail is selected ][
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] Bug 269852 - Label should be on "Message" menu when mail is selected ][
- Date: Thu, 26 Jul 2018 16:05:30 +0000 (UTC)
commit 46896a39e5c004c26fc5e3f46c965c3d6975c853
Author: Milan Crha <mcrha redhat com>
Date: Thu Jul 26 18:02:27 2018 +0200
Bug 269852 - Label should be on "Message" menu when mail is selected ][
The Message->Mark As->Label had been failing in EMailBrowser with
a runtime warning.
src/mail/e-mail-browser.c | 24 ++
src/mail/e-mail-paned-view.c | 3 +
src/mail/e-mail-reader.c | 347 ++++++++++++++++++++++++
src/mail/e-mail-reader.h | 1 +
src/modules/mail/e-mail-shell-content.c | 22 ++
src/modules/mail/e-mail-shell-view-actions.c | 378 ---------------------------
src/modules/mail/e-mail-shell-view-actions.h | 6 -
src/modules/mail/e-mail-shell-view-private.c | 40 +--
src/modules/mail/e-mail-shell-view-private.h | 10 +-
src/modules/mail/e-mail-shell-view.c | 20 +-
10 files changed, 419 insertions(+), 432 deletions(-)
---
diff --git a/src/mail/e-mail-browser.c b/src/mail/e-mail-browser.c
index 48b9ac0f93..b8dc5cc8ef 100644
--- a/src/mail/e-mail-browser.c
+++ b/src/mail/e-mail-browser.c
@@ -41,6 +41,7 @@
#define ACTION_GROUP_STANDARD "action-group-standard"
#define ACTION_GROUP_SEARCH_FOLDERS "action-group-search-folders"
+#define ACTION_GROUP_LABELS "action-group-labels"
struct _EMailBrowserPrivate {
EMailBackend *backend;
@@ -721,6 +722,20 @@ mail_browser_constructed (GObject *object)
object, ACTION_GROUP_SEARCH_FOLDERS,
action_group, (GDestroyNotify) g_object_unref);
+ action_group = gtk_action_group_new (ACTION_GROUP_LABELS);
+ gtk_action_group_set_translation_domain (action_group, domain);
+ gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
+
+ /* For easy access. Takes ownership of the reference. */
+ g_object_set_data_full (
+ object, ACTION_GROUP_LABELS,
+ action_group, (GDestroyNotify) g_object_unref);
+
+ e_binding_bind_property (
+ display, "need-input",
+ action_group, "sensitive",
+ G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN);
+
e_mail_reader_init (reader, TRUE, TRUE);
e_load_ui_manager_definition (ui_manager, E_MAIL_READER_UI_DEFINITION);
@@ -799,6 +814,12 @@ mail_browser_constructed (GObject *object)
e_plugin_ui_register_manager (ui_manager, id, object);
e_plugin_ui_enable_manager (ui_manager, id);
+ action = e_mail_reader_get_action (reader, "mail-label-none");
+ e_binding_bind_property (
+ display, "need-input",
+ action, "sensitive",
+ G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN);
+
e_extensible_load_extensions (E_EXTENSIBLE (object));
}
@@ -829,6 +850,9 @@ mail_browser_get_action_group (EMailReader *reader,
case E_MAIL_READER_ACTION_GROUP_SEARCH_FOLDERS:
group_name = ACTION_GROUP_SEARCH_FOLDERS;
break;
+ case E_MAIL_READER_ACTION_GROUP_LABELS:
+ group_name = ACTION_GROUP_LABELS;
+ break;
default:
g_return_val_if_reached (NULL);
}
diff --git a/src/mail/e-mail-paned-view.c b/src/mail/e-mail-paned-view.c
index 228be05daa..17f0c7c7f3 100644
--- a/src/mail/e-mail-paned-view.c
+++ b/src/mail/e-mail-paned-view.c
@@ -486,6 +486,9 @@ mail_paned_view_get_action_group (EMailReader *reader,
case E_MAIL_READER_ACTION_GROUP_SEARCH_FOLDERS:
group_name = "search-folders";
break;
+ case E_MAIL_READER_ACTION_GROUP_LABELS:
+ group_name = "mail-labels";
+ break;
default:
g_return_val_if_reached (NULL);
}
diff --git a/src/mail/e-mail-reader.c b/src/mail/e-mail-reader.c
index 98dde18a82..95773c9c68 100644
--- a/src/mail/e-mail-reader.c
+++ b/src/mail/e-mail-reader.c
@@ -40,6 +40,9 @@
#include "e-mail-backend.h"
#include "e-mail-browser.h"
#include "e-mail-enumtypes.h"
+#include "e-mail-label-action.h"
+#include "e-mail-label-dialog.h"
+#include "e-mail-label-list-store.h"
#include "e-mail-notes.h"
#include "e-mail-reader-utils.h"
#include "e-mail-ui-session.h"
@@ -101,6 +104,9 @@ struct _EMailReaderPrivate {
gpointer followup_alert; /* weak pointer to an EAlert */
GSList *ongoing_operations; /* GCancellable * */
+
+ guint main_menu_label_merge_id;
+ guint popup_menu_label_merge_id;
};
enum {
@@ -876,6 +882,116 @@ action_mail_forward_quoted_cb (GtkAction *action,
g_ptr_array_unref (uids);
}
+static void
+action_mail_label_new_cb (GtkAction *action,
+ EMailReader *reader)
+{
+ EMailLabelDialog *label_dialog;
+ EMailLabelListStore *label_store;
+ EMailBackend *backend;
+ EMailSession *session;
+ CamelFolder *folder;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ GtkWidget *dialog;
+ GPtrArray *uids;
+ GdkColor label_color;
+ const gchar *label_name;
+ gchar *label_tag;
+ gint n_children;
+ guint ii;
+
+ 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_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);
+
+ /* 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);
+
+ folder = e_mail_reader_ref_folder (reader);
+ uids = e_mail_reader_get_selected_uids (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_free (label_tag);
+
+ exit:
+ gtk_widget_destroy (dialog);
+}
+
+static void
+action_mail_label_none_cb (GtkAction *action,
+ EMailReader *reader)
+{
+ EMailBackend *backend;
+ EMailSession *session;
+ EMailLabelListStore *label_store;
+ CamelFolder *folder;
+ GtkTreeIter iter;
+ GPtrArray *uids;
+ gboolean valid;
+ guint ii;
+
+ 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));
+
+ folder = e_mail_reader_ref_folder (reader);
+ uids = e_mail_reader_get_selected_uids (reader);
+
+ valid = gtk_tree_model_get_iter_first (
+ GTK_TREE_MODEL (label_store), &iter);
+
+ while (valid) {
+ gchar *tag;
+
+ tag = e_mail_label_list_store_get_tag (label_store, &iter);
+
+ for (ii = 0; ii < uids->len; ii++) {
+ camel_folder_set_message_user_flag (
+ folder, uids->pdata[ii], tag, FALSE);
+ camel_folder_set_message_user_tag (
+ folder, uids->pdata[ii], "label", NULL);
+ }
+
+ g_free (tag);
+
+ valid = gtk_tree_model_iter_next (
+ GTK_TREE_MODEL (label_store), &iter);
+ }
+
+ g_clear_object (&folder);
+ g_ptr_array_unref (uids);
+}
+
static void
action_mail_load_images_cb (GtkAction *action,
EMailReader *reader)
@@ -2406,6 +2522,22 @@ static GtkActionEntry mail_reader_entries[] = {
N_("Forward the selected message quoted like a reply"),
G_CALLBACK (action_mail_forward_quoted_cb) },
+ { "mail-label-new",
+ NULL,
+ N_("_New Label"),
+ NULL,
+ NULL, /* XXX Add a tooltip! */
+ G_CALLBACK (action_mail_label_new_cb) },
+
+ { "mail-label-none",
+ NULL,
+ /* Translators: "None" is used in the message label context menu.
+ * It removes all labels from the selected messages. */
+ N_("N_one"),
+ "0",
+ NULL, /* XXX Add a tooltip! */
+ G_CALLBACK (action_mail_label_none_cb) },
+
{ "mail-load-images",
"image-x-generic",
N_("_Load Images"),
@@ -2702,6 +2834,13 @@ static GtkActionEntry mail_reader_entries[] = {
NULL,
NULL },
+ { "mail-label-menu",
+ NULL,
+ N_("_Label"),
+ NULL,
+ NULL,
+ NULL },
+
{ "mail-reply-group-menu",
NULL,
N_("_Group Reply"),
@@ -3890,6 +4029,212 @@ mail_reader_show_search_bar (EMailReader *reader)
e_preview_pane_show_search_bar (preview_pane);
}
+static void
+action_mail_label_cb (GtkToggleAction *action,
+ EMailReader *reader)
+{
+ CamelFolder *folder;
+ GPtrArray *uids;
+ const gchar *tag;
+ gint ii;
+
+ tag = g_object_get_data (G_OBJECT (action), "tag");
+ g_return_if_fail (tag != NULL);
+
+ folder = e_mail_reader_ref_folder (reader);
+ uids = e_mail_reader_get_selected_uids (reader);
+
+ camel_folder_freeze (folder);
+ for (ii = 0; ii < uids->len; ii++) {
+ if (gtk_toggle_action_get_active (action))
+ camel_folder_set_message_user_flag (
+ folder, uids->pdata[ii], tag, TRUE);
+ else {
+ camel_folder_set_message_user_flag (
+ folder, uids->pdata[ii], tag, FALSE);
+ camel_folder_set_message_user_tag (
+ folder, uids->pdata[ii], "label", NULL);
+ }
+ }
+ camel_folder_thaw (folder);
+
+ g_clear_object (&folder);
+ g_ptr_array_unref (uids);
+}
+
+static void
+mail_reader_update_label_action (GtkToggleAction *action,
+ EMailReader *reader,
+ GPtrArray *uids,
+ const gchar *label_tag)
+{
+ CamelFolder *folder;
+ gboolean exists = FALSE;
+ gboolean not_exists = FALSE;
+ gboolean sensitive;
+ guint ii;
+
+ folder = e_mail_reader_ref_folder (reader);
+
+ /* Figure out the proper label action state for the selected
+ * messages. If all the selected messages have the given label,
+ * make the toggle action active. If all the selected message
+ * DO NOT have the given label, make the toggle action inactive.
+ * If some do and some don't, make the action insensitive. */
+
+ for (ii = 0; ii < uids->len && (!exists || !not_exists); ii++) {
+ const gchar *old_label;
+ gchar *new_label;
+
+ /* Check for new-style labels. */
+ if (camel_folder_get_message_user_flag (
+ folder, uids->pdata[ii], label_tag)) {
+ exists = TRUE;
+ continue;
+ }
+
+ /* Check for old-style labels. */
+ old_label = camel_folder_get_message_user_tag (
+ folder, uids->pdata[ii], "label");
+ if (old_label == NULL) {
+ not_exists = TRUE;
+ continue;
+ }
+
+ /* Convert old-style labels ("<name>") to "$Label<name>". */
+ new_label = g_alloca (strlen (old_label) + 10);
+ g_stpcpy (g_stpcpy (new_label, "$Label"), old_label);
+
+ if (strcmp (new_label, label_tag) == 0)
+ exists = TRUE;
+ else
+ not_exists = TRUE;
+ }
+
+ sensitive = !(exists && not_exists);
+ gtk_toggle_action_set_active (action, exists);
+ gtk_action_set_sensitive (GTK_ACTION (action), sensitive);
+
+ g_clear_object (&folder);
+}
+
+static void
+mail_reader_update_labels_menu (EMailReader *reader)
+{
+ EMailReaderPrivate *priv;
+ EMailLabelListStore *label_store;
+ EMailBackend *backend;
+ EMailSession *session;
+ GtkWindow *window;
+ GtkUIManager *ui_manager = NULL;
+ GtkActionGroup *action_group;
+ GtkTreeIter iter;
+ GPtrArray *uids;
+ const gchar *main_menu_path, *popup_menu_path;
+ gboolean valid;
+ gint ii = 0;
+
+ priv = E_MAIL_READER_GET_PRIVATE (reader);
+
+ window = e_mail_reader_get_window (reader);
+ g_return_if_fail (window != NULL);
+
+ if (E_IS_SHELL_WINDOW (window))
+ ui_manager = e_shell_window_get_ui_manager (E_SHELL_WINDOW (window));
+ else if (E_IS_MAIL_BROWSER (window))
+ ui_manager = e_mail_browser_get_ui_manager (E_MAIL_BROWSER (window));
+
+ g_return_if_fail (ui_manager != NULL);
+ g_return_if_fail (GTK_IS_UI_MANAGER (ui_manager));
+
+ 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));
+
+ action_group = e_mail_reader_get_action_group (reader, E_MAIL_READER_ACTION_GROUP_LABELS);
+ main_menu_path =
"/main-menu/custom-menus/mail-message-menu/mail-mark-as-menu/mail-label-menu/mail-label-actions";
+ popup_menu_path = "/mail-message-popup/mail-label-menu/mail-label-actions";
+
+ /* Unmerge the previous menu items. */
+ if (priv->main_menu_label_merge_id)
+ gtk_ui_manager_remove_ui (ui_manager, priv->main_menu_label_merge_id);
+ else
+ priv->main_menu_label_merge_id = gtk_ui_manager_new_merge_id (ui_manager);
+
+ if (priv->popup_menu_label_merge_id)
+ gtk_ui_manager_remove_ui (ui_manager, priv->popup_menu_label_merge_id);
+ else
+ priv->popup_menu_label_merge_id = gtk_ui_manager_new_merge_id (ui_manager);
+
+ e_action_group_remove_all_actions (action_group);
+ gtk_ui_manager_ensure_update (ui_manager);
+
+ uids = e_mail_reader_get_selected_uids (reader);
+
+ valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (label_store), &iter);
+
+ while (valid) {
+ EMailLabelAction *label_action;
+ GtkAction *action;
+ gchar *action_name;
+ gchar *stock_id;
+ gchar *label;
+ gchar *tag;
+
+ label = e_mail_label_list_store_get_name (label_store, &iter);
+ stock_id = e_mail_label_list_store_get_stock_id (label_store, &iter);
+ tag = e_mail_label_list_store_get_tag (label_store, &iter);
+ action_name = g_strdup_printf ("mail-label-%d", ii);
+
+ /* XXX Add a tooltip! */
+ label_action = e_mail_label_action_new (action_name, label, NULL, stock_id);
+
+ g_object_set_data_full (
+ G_OBJECT (label_action), "tag",
+ tag, (GDestroyNotify) g_free);
+
+ /* Configure the action before we connect to signals. */
+ mail_reader_update_label_action (GTK_TOGGLE_ACTION (label_action), reader, uids, tag);
+
+ g_signal_connect (
+ label_action, "toggled",
+ G_CALLBACK (action_mail_label_cb), reader);
+
+ /* The action group takes ownership of the action. */
+ action = GTK_ACTION (label_action);
+
+ if (ii + 1 < 10) {
+ gchar accel[5];
+
+ accel[0] = '1' + ii;
+ accel[1] = '\0';
+
+ gtk_action_group_add_action_with_accel (action_group, action, accel);
+ } else {
+ gtk_action_group_add_action (action_group, action);
+ }
+ g_object_unref (label_action);
+
+ gtk_ui_manager_add_ui (
+ ui_manager, priv->main_menu_label_merge_id, main_menu_path,
+ action_name, action_name, GTK_UI_MANAGER_AUTO, FALSE);
+
+ gtk_ui_manager_add_ui (
+ ui_manager, priv->popup_menu_label_merge_id, popup_menu_path,
+ action_name, action_name, GTK_UI_MANAGER_AUTO, FALSE);
+
+ g_free (label);
+ g_free (stock_id);
+ g_free (action_name);
+
+ valid = gtk_tree_model_iter_next (
+ GTK_TREE_MODEL (label_store), &iter);
+ ii++;
+ }
+
+ g_ptr_array_unref (uids);
+}
+
static void
mail_reader_update_actions (EMailReader *reader,
guint32 state)
@@ -4336,6 +4681,8 @@ mail_reader_update_actions (EMailReader *reader,
sensitive = single_message_selected;
action = e_mail_reader_get_action (reader, action_name);
gtk_action_set_sensitive (action, sensitive);
+
+ mail_reader_update_labels_menu (reader);
}
static gboolean
diff --git a/src/mail/e-mail-reader.h b/src/mail/e-mail-reader.h
index 7cf77432bc..3510163c25 100644
--- a/src/mail/e-mail-reader.h
+++ b/src/mail/e-mail-reader.h
@@ -65,6 +65,7 @@ typedef struct _EMailReaderInterface EMailReaderInterface;
typedef enum {
E_MAIL_READER_ACTION_GROUP_STANDARD,
E_MAIL_READER_ACTION_GROUP_SEARCH_FOLDERS,
+ E_MAIL_READER_ACTION_GROUP_LABELS,
E_MAIL_READER_NUM_ACTION_GROUPS
} EMailReaderActionGroup;
diff --git a/src/modules/mail/e-mail-shell-content.c b/src/modules/mail/e-mail-shell-content.c
index 03f4394c16..2ca0e53429 100644
--- a/src/modules/mail/e-mail-shell-content.c
+++ b/src/modules/mail/e-mail-shell-content.c
@@ -434,6 +434,9 @@ mail_shell_content_get_action_group (EMailReader *reader,
case E_MAIL_READER_ACTION_GROUP_SEARCH_FOLDERS:
group_name = "search-folders";
break;
+ case E_MAIL_READER_ACTION_GROUP_LABELS:
+ group_name = "mail-labels";
+ break;
default:
g_return_val_if_reached (NULL);
}
@@ -578,6 +581,24 @@ mail_shell_content_set_folder (EMailReader *reader,
e_mail_reader_set_folder (reader, folder);
}
+static void
+mail_shell_content_update_actions (EMailReader *reader,
+ guint32 state)
+{
+ EMailShellContent *mail_shell_content;
+
+ mail_shell_content = E_MAIL_SHELL_CONTENT (reader);
+
+ if (!mail_shell_content->priv->mail_view)
+ return;
+
+ /* Forward this to our internal EMailView, which
+ * also implements the EMailReader interface. */
+ reader = E_MAIL_READER (mail_shell_content->priv->mail_view);
+
+ e_mail_reader_update_actions (reader, state);
+}
+
static void
mail_shell_content_reload (EMailReader *reader)
{
@@ -683,6 +704,7 @@ e_mail_shell_content_reader_init (EMailReaderInterface *iface)
iface->get_window = mail_shell_content_get_window;
iface->set_folder = mail_shell_content_set_folder;
iface->open_selected_mail = mail_shell_content_open_selected_mail;
+ iface->update_actions = mail_shell_content_update_actions;
iface->reload = mail_shell_content_reload;
}
diff --git a/src/modules/mail/e-mail-shell-view-actions.c b/src/modules/mail/e-mail-shell-view-actions.c
index 8924a84aeb..b9c43d6f87 100644
--- a/src/modules/mail/e-mail-shell-view-actions.c
+++ b/src/modules/mail/e-mail-shell-view-actions.c
@@ -1170,182 +1170,6 @@ action_mail_goto_folder_cb (GtkAction *action,
g_clear_object (&folder);
}
-static void
-action_mail_label_cb (GtkToggleAction *action,
- EMailShellView *mail_shell_view)
-{
- EMailShellContent *mail_shell_content;
- EMailReader *reader;
- EMailView *mail_view;
- CamelFolder *folder;
- GPtrArray *uids;
- const gchar *tag;
- gint ii;
-
- tag = g_object_get_data (G_OBJECT (action), "tag");
- g_return_if_fail (tag != NULL);
-
- mail_shell_content = mail_shell_view->priv->mail_shell_content;
- mail_view = e_mail_shell_content_get_mail_view (mail_shell_content);
-
- reader = E_MAIL_READER (mail_view);
- folder = e_mail_reader_ref_folder (reader);
- uids = e_mail_reader_get_selected_uids (reader);
-
- camel_folder_freeze (folder);
- for (ii = 0; ii < uids->len; ii++) {
- if (gtk_toggle_action_get_active (action))
- camel_folder_set_message_user_flag (
- folder, uids->pdata[ii], tag, TRUE);
- else {
- camel_folder_set_message_user_flag (
- folder, uids->pdata[ii], tag, FALSE);
- camel_folder_set_message_user_tag (
- folder, uids->pdata[ii], "label", NULL);
- }
- }
- camel_folder_thaw (folder);
-
- g_clear_object (&folder);
- g_ptr_array_unref (uids);
-}
-
-static void
-action_mail_label_new_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EShellView *shell_view;
- EShellWindow *shell_window;
- EShellBackend *shell_backend;
- EMailShellContent *mail_shell_content;
- EMailLabelDialog *label_dialog;
- EMailLabelListStore *label_store;
- EMailBackend *backend;
- EMailSession *session;
- EMailReader *reader;
- EMailView *mail_view;
- CamelFolder *folder;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkWidget *dialog;
- GPtrArray *uids;
- GdkColor label_color;
- const gchar *label_name;
- gchar *label_tag;
- gint n_children;
- guint ii;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
- shell_backend = e_shell_view_get_shell_backend (shell_view);
-
- dialog = e_mail_label_dialog_new (GTK_WINDOW (shell_window));
-
- gtk_window_set_title (GTK_WINDOW (dialog), _("Add Label"));
-
- if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK)
- goto exit;
-
- backend = E_MAIL_BACKEND (shell_backend);
- session = e_mail_backend_get_session (backend);
- 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);
-
- /* 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);
-
- mail_shell_content = mail_shell_view->priv->mail_shell_content;
- mail_view = e_mail_shell_content_get_mail_view (mail_shell_content);
-
- reader = E_MAIL_READER (mail_view);
- folder = e_mail_reader_ref_folder (reader);
- uids = e_mail_reader_get_selected_uids (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_free (label_tag);
-
-exit:
- gtk_widget_destroy (dialog);
-}
-
-static void
-action_mail_label_none_cb (GtkAction *action,
- EMailShellView *mail_shell_view)
-{
- EShellView *shell_view;
- EShellBackend *shell_backend;
- EMailBackend *backend;
- EMailSession *session;
- EMailShellContent *mail_shell_content;
- EMailLabelListStore *label_store;
- EMailReader *reader;
- EMailView *mail_view;
- CamelFolder *folder;
- GtkTreeIter iter;
- GPtrArray *uids;
- gboolean valid;
- guint ii;
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_backend = e_shell_view_get_shell_backend (shell_view);
-
- backend = E_MAIL_BACKEND (shell_backend);
- session = e_mail_backend_get_session (backend);
- label_store = e_mail_ui_session_get_label_store (
- E_MAIL_UI_SESSION (session));
-
- mail_shell_content = mail_shell_view->priv->mail_shell_content;
- mail_view = e_mail_shell_content_get_mail_view (mail_shell_content);
-
- reader = E_MAIL_READER (mail_view);
- folder = e_mail_reader_ref_folder (reader);
- uids = e_mail_reader_get_selected_uids (reader);
-
- valid = gtk_tree_model_get_iter_first (
- GTK_TREE_MODEL (label_store), &iter);
-
- while (valid) {
- gchar *tag;
-
- tag = e_mail_label_list_store_get_tag (label_store, &iter);
-
- for (ii = 0; ii < uids->len; ii++) {
- camel_folder_set_message_user_flag (
- folder, uids->pdata[ii], tag, FALSE);
- camel_folder_set_message_user_tag (
- folder, uids->pdata[ii], "label", NULL);
- }
-
- g_free (tag);
-
- valid = gtk_tree_model_iter_next (
- GTK_TREE_MODEL (label_store), &iter);
- }
-
- g_clear_object (&folder);
- g_ptr_array_unref (uids);
-}
-
static void
action_mail_send_receive_cb (GtkAction *action,
EMailShellView *mail_shell_view)
@@ -1766,22 +1590,6 @@ static GtkActionEntry mail_entries[] = {
N_("Opens a dialog to select a folder to go to"),
G_CALLBACK (action_mail_goto_folder_cb) },
- { "mail-label-new",
- NULL,
- N_("_New Label"),
- NULL,
- NULL, /* XXX Add a tooltip! */
- G_CALLBACK (action_mail_label_new_cb) },
-
- { "mail-label-none",
- NULL,
- /* Translators: "None" is used in the message label context menu.
- * It removes all labels from the selected messages. */
- N_("N_one"),
- "0",
- NULL, /* XXX Add a tooltip! */
- G_CALLBACK (action_mail_label_none_cb) },
-
/* This is the same as "mail-tools-subscriptions" but only
* appears in the sidebar context menu when right-clicking
* on a store that supports folder subscriptions. No need
@@ -1889,13 +1697,6 @@ static GtkActionEntry mail_entries[] = {
NULL,
NULL },
- { "mail-label-menu",
- NULL,
- N_("_Label"),
- NULL,
- NULL,
- NULL },
-
{ "mail-preview-menu",
NULL,
N_("_Preview"),
@@ -2420,185 +2221,6 @@ e_mail_shell_view_actions_init (EMailShellView *mail_shell_view)
G_BINDING_SYNC_CREATE);
}
-/* Helper for e_mail_shell_view_update_popup_labels() */
-static void
-mail_shell_view_update_label_action (GtkToggleAction *action,
- EMailReader *reader,
- GPtrArray *uids,
- const gchar *label_tag)
-{
- CamelFolder *folder;
- gboolean exists = FALSE;
- gboolean not_exists = FALSE;
- gboolean sensitive;
- guint ii;
-
- folder = e_mail_reader_ref_folder (reader);
-
- /* Figure out the proper label action state for the selected
- * messages. If all the selected messages have the given label,
- * make the toggle action active. If all the selected message
- * DO NOT have the given label, make the toggle action inactive.
- * If some do and some don't, make the action insensitive. */
-
- for (ii = 0; ii < uids->len && (!exists || !not_exists); ii++) {
- const gchar *old_label;
- gchar *new_label;
-
- /* Check for new-style labels. */
- if (camel_folder_get_message_user_flag (
- folder, uids->pdata[ii], label_tag)) {
- exists = TRUE;
- continue;
- }
-
- /* Check for old-style labels. */
- old_label = camel_folder_get_message_user_tag (
- folder, uids->pdata[ii], "label");
- if (old_label == NULL) {
- not_exists = TRUE;
- continue;
- }
-
- /* Convert old-style labels ("<name>") to "$Label<name>". */
- new_label = g_alloca (strlen (old_label) + 10);
- g_stpcpy (g_stpcpy (new_label, "$Label"), old_label);
-
- if (strcmp (new_label, label_tag) == 0)
- exists = TRUE;
- else
- not_exists = TRUE;
- }
-
- sensitive = !(exists && not_exists);
- gtk_toggle_action_set_active (action, exists);
- gtk_action_set_sensitive (GTK_ACTION (action), sensitive);
-
- g_clear_object (&folder);
-}
-
-void
-e_mail_shell_view_update_popup_labels (EMailShellView *mail_shell_view)
-{
- EShellView *shell_view;
- EShellWindow *shell_window;
- EShellBackend *shell_backend;
- EMailShellContent *mail_shell_content;
- EMailLabelListStore *label_store;
- EMailBackend *backend;
- EMailSession *session;
- EMailReader *reader;
- EMailView *mail_view;
- GtkUIManager *ui_manager;
- GtkActionGroup *action_group;
- GtkTreeIter iter;
- GPtrArray *uids;
- const gchar *main_menu_path, *popup_menu_path;
- gboolean valid;
- gint ii = 0;
-
- g_return_if_fail (E_IS_MAIL_SHELL_VIEW (mail_shell_view));
-
- shell_view = E_SHELL_VIEW (mail_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
- shell_backend = e_shell_view_get_shell_backend (shell_view);
- ui_manager = e_shell_window_get_ui_manager (shell_window);
-
- g_return_if_fail (ui_manager != NULL);
- g_return_if_fail (GTK_IS_UI_MANAGER (ui_manager));
-
- backend = E_MAIL_BACKEND (shell_backend);
- session = e_mail_backend_get_session (backend);
- label_store = e_mail_ui_session_get_label_store (
- E_MAIL_UI_SESSION (session));
-
- action_group = ACTION_GROUP (MAIL_LABEL);
- main_menu_path =
"/main-menu/custom-menus/mail-message-menu/mail-mark-as-menu/mail-label-menu/mail-label-actions";
- popup_menu_path = "/mail-message-popup/mail-label-menu/mail-label-actions";
-
- /* Unmerge the previous menu items. */
- gtk_ui_manager_remove_ui (ui_manager, mail_shell_view->priv->main_menu_label_merge_id);
- gtk_ui_manager_remove_ui (ui_manager, mail_shell_view->priv->popup_menu_label_merge_id);
- e_action_group_remove_all_actions (action_group);
- gtk_ui_manager_ensure_update (ui_manager);
-
- mail_shell_content = mail_shell_view->priv->mail_shell_content;
- mail_view = e_mail_shell_content_get_mail_view (mail_shell_content);
-
- reader = E_MAIL_READER (mail_view);
- uids = e_mail_reader_get_selected_uids (reader);
-
- valid = gtk_tree_model_get_iter_first (
- GTK_TREE_MODEL (label_store), &iter);
-
- while (valid) {
- EMailLabelAction *label_action;
- GtkAction *action;
- gchar *action_name;
- gchar *stock_id;
- gchar *label;
- gchar *tag;
-
- label = e_mail_label_list_store_get_name (
- label_store, &iter);
- stock_id = e_mail_label_list_store_get_stock_id (
- label_store, &iter);
- tag = e_mail_label_list_store_get_tag (
- label_store, &iter);
- action_name = g_strdup_printf ("mail-label-%d", ii);
-
- /* XXX Add a tooltip! */
- label_action = e_mail_label_action_new (
- action_name, label, NULL, stock_id);
-
- g_object_set_data_full (
- G_OBJECT (label_action), "tag",
- tag, (GDestroyNotify) g_free);
-
- /* Configure the action before we connect to signals. */
- mail_shell_view_update_label_action (
- GTK_TOGGLE_ACTION (label_action),
- reader, uids, tag);
-
- g_signal_connect (
- label_action, "toggled",
- G_CALLBACK (action_mail_label_cb), mail_shell_view);
-
- /* The action group takes ownership of the action. */
- action = GTK_ACTION (label_action);
-
- if (ii + 1 < 10) {
- gchar accel[5];
-
- accel[0] = '1' + ii;
- accel[1] = '\0';
-
- gtk_action_group_add_action_with_accel (action_group, action, accel);
- } else {
- gtk_action_group_add_action (action_group, action);
- }
- g_object_unref (label_action);
-
- gtk_ui_manager_add_ui (
- ui_manager, mail_shell_view->priv->main_menu_label_merge_id, main_menu_path,
- action_name, action_name, GTK_UI_MANAGER_AUTO, FALSE);
-
- gtk_ui_manager_add_ui (
- ui_manager, mail_shell_view->priv->popup_menu_label_merge_id, popup_menu_path,
- action_name, action_name, GTK_UI_MANAGER_AUTO, FALSE);
-
- g_free (label);
- g_free (stock_id);
- g_free (action_name);
-
- valid = gtk_tree_model_iter_next (
- GTK_TREE_MODEL (label_store), &iter);
- ii++;
- }
-
- g_ptr_array_unref (uids);
-}
-
void
e_mail_shell_view_update_search_filter (EMailShellView *mail_shell_view)
{
diff --git a/src/modules/mail/e-mail-shell-view-actions.h b/src/modules/mail/e-mail-shell-view-actions.h
index 0c13472e3f..3a46a492cd 100644
--- a/src/modules/mail/e-mail-shell-view-actions.h
+++ b/src/modules/mail/e-mail-shell-view-actions.h
@@ -106,10 +106,6 @@
E_SHELL_WINDOW_ACTION ((window), "mail-forward-inline")
#define E_SHELL_WINDOW_ACTION_MAIL_FORWARD_QUOTED(window) \
E_SHELL_WINDOW_ACTION ((window), "mail-forward-quoted")
-#define E_SHELL_WINDOW_ACTION_MAIL_LABEL_NEW(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-label-new")
-#define E_SHELL_WINDOW_ACTION_MAIL_LABEL_NONE(window) \
- E_SHELL_WINDOW_ACTION ((window), "mail-label-none")
#define E_SHELL_WINDOW_ACTION_MAIL_LOAD_IMAGES(window) \
E_SHELL_WINDOW_ACTION ((window), "mail-load-images")
#define E_SHELL_WINDOW_ACTION_MAIL_MANAGE_SUBSCRIPTIONS(window) \
@@ -278,8 +274,6 @@
E_SHELL_WINDOW_ACTION_GROUP ((window), "mail")
#define E_SHELL_WINDOW_ACTION_GROUP_MAIL_FILTER(window) \
E_SHELL_WINDOW_ACTION_GROUP ((window), "mail-filter")
-#define E_SHELL_WINDOW_ACTION_GROUP_MAIL_LABEL(window) \
- E_SHELL_WINDOW_ACTION_GROUP ((window), "mail-label")
#define E_SHELL_WINDOW_ACTION_GROUP_SEARCH_FOLDERS(window) \
E_SHELL_WINDOW_ACTION_GROUP ((window), "search-folders")
diff --git a/src/modules/mail/e-mail-shell-view-private.c b/src/modules/mail/e-mail-shell-view-private.c
index 03e3bb977d..d3dd552c4b 100644
--- a/src/modules/mail/e-mail-shell-view-private.c
+++ b/src/modules/mail/e-mail-shell-view-private.c
@@ -417,20 +417,6 @@ mail_shell_view_reader_changed_cb (EMailShellView *mail_shell_view,
shell_taskbar, G_CONNECT_SWAPPED);
}
-static void
-mail_shell_view_reader_update_actions_cb (EMailReader *reader,
- guint32 state,
- EMailShellView *mail_shell_view)
-{
- EMailShellContent *mail_shell_content;
-
- g_return_if_fail (mail_shell_view != NULL);
- g_return_if_fail (mail_shell_view->priv != NULL);
-
- mail_shell_content = mail_shell_view->priv->mail_shell_content;
- e_mail_reader_update_actions (E_MAIL_READER (mail_shell_content), state);
-}
-
static void
mail_shell_view_prepare_for_quit_cb (EMailShellView *mail_shell_view,
EActivity *activity)
@@ -525,7 +511,6 @@ e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view)
ERuleContext *context;
EFilterRule *rule = NULL;
GtkTreeSelection *selection;
- GtkUIManager *ui_manager;
GtkWidget *message_list;
GSettings *settings;
EMailLabelListStore *label_store;
@@ -544,8 +529,6 @@ e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view)
shell_taskbar = e_shell_view_get_shell_taskbar (shell_view);
shell_window = e_shell_view_get_shell_window (shell_view);
- ui_manager = e_shell_window_get_ui_manager (shell_window);
-
shell = e_shell_window_get_shell (shell_window);
backend = E_MAIL_BACKEND (shell_backend);
@@ -555,16 +538,13 @@ e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view)
e_shell_window_add_action_group (shell_window, "mail");
e_shell_window_add_action_group (shell_window, "mail-filter");
- e_shell_window_add_action_group (shell_window, "mail-label");
+ e_shell_window_add_action_group (shell_window, "mail-labels");
e_shell_window_add_action_group (shell_window, "search-folders");
g_signal_connect (
shell_window, "set-focus",
G_CALLBACK (e_mail_shell_view_update_labels_sensitivity), shell_view);
- priv->main_menu_label_merge_id = gtk_ui_manager_new_merge_id (ui_manager);
- priv->popup_menu_label_merge_id = gtk_ui_manager_new_merge_id (ui_manager);
-
/* Cache these to avoid lots of awkward casting. */
priv->mail_shell_backend = g_object_ref (shell_backend);
priv->mail_shell_content = g_object_ref (shell_content);
@@ -634,11 +614,6 @@ e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view)
G_CALLBACK (mail_shell_view_reader_changed_cb),
mail_shell_view, G_CONNECT_SWAPPED);
- g_signal_connect_object (
- mail_view, "update-actions",
- G_CALLBACK (mail_shell_view_reader_update_actions_cb),
- mail_shell_view, 0);
-
g_signal_connect_object (
reader, "folder-loaded",
G_CALLBACK (e_mail_view_update_view_instance),
@@ -1545,20 +1520,25 @@ e_mail_shell_view_update_send_receive_menus (EMailShellView *mail_shell_view)
void
e_mail_shell_view_update_labels_sensitivity (EShellWindow *shell_window,
- GtkWidget *focused_widget)
+ GtkWidget *focused_widget,
+ EMailShellView *mail_shell_view)
{
GtkActionGroup *action_group;
GtkAction *action;
GtkWidget *widget;
+ EMailReader *reader;
gboolean sensitive = FALSE;
g_return_if_fail (E_IS_SHELL_WINDOW (shell_window));
+ g_return_if_fail (E_IS_MAIL_SHELL_VIEW (mail_shell_view));
/* It can be called also during the dispose of the GtkWindow,
when the UI manager is already freed */
if (!e_shell_window_get_ui_manager (shell_window))
return;
+ reader = E_MAIL_READER (e_mail_shell_content_get_mail_view
(mail_shell_view->priv->mail_shell_content));
+
widget = focused_widget ? focused_widget : gtk_window_get_focus (GTK_WINDOW (shell_window));
while (widget) {
@@ -1570,11 +1550,13 @@ e_mail_shell_view_update_labels_sensitivity (EShellWindow *shell_window,
widget = gtk_widget_get_parent (widget);
}
- action_group = ACTION_GROUP (MAIL_LABEL);
+ reader = E_MAIL_READER (e_mail_shell_content_get_mail_view
(mail_shell_view->priv->mail_shell_content));
+
+ action_group = e_mail_reader_get_action_group (reader, E_MAIL_READER_ACTION_GROUP_LABELS);
if (action_group)
gtk_action_group_set_sensitive (action_group, sensitive);
- action = ACTION (MAIL_LABEL_NONE);
+ action = e_mail_reader_get_action (reader, "mail-label-none");
if (action)
gtk_action_set_sensitive (action, sensitive);
}
diff --git a/src/modules/mail/e-mail-shell-view-private.h b/src/modules/mail/e-mail-shell-view-private.h
index 2c60f0c3f8..ecb7bbdf09 100644
--- a/src/modules/mail/e-mail-shell-view-private.h
+++ b/src/modules/mail/e-mail-shell-view-private.h
@@ -27,9 +27,6 @@
#include <camel/camel-search-private.h> /* for camel_search_word */
#include <mail/e-mail-folder-create-dialog.h>
-#include <mail/e-mail-label-action.h>
-#include <mail/e-mail-label-dialog.h>
-#include <mail/e-mail-label-list-store.h>
#include <mail/e-mail-reader.h>
#include <mail/e-mail-reader-utils.h>
#include <mail/e-mail-sidebar.h>
@@ -120,8 +117,6 @@ struct _EMailShellViewPrivate {
/* For UI merging and unmerging. */
guint merge_id;
- guint main_menu_label_merge_id;
- guint popup_menu_label_merge_id;
/* Filter rules correspond to the search entry menu. */
EFilterRule *search_rules[MAIL_NUM_SEARCH_RULES];
@@ -162,8 +157,6 @@ void e_mail_shell_view_actions_init
(EMailShellView *mail_shell_view);
void e_mail_shell_view_restore_state
(EMailShellView *mail_shell_view);
-void e_mail_shell_view_update_popup_labels
- (EMailShellView *mail_shell_view);
void e_mail_shell_view_update_search_filter
(EMailShellView *mail_shell_view);
void e_mail_shell_view_update_sidebar
@@ -174,7 +167,8 @@ GDBusProxy * e_mail_shell_view_get_web_extension_proxy
(EMailShellView *mail_shell_view);
void e_mail_shell_view_update_labels_sensitivity
(EShellWindow *shell_window,
- GtkWidget *focused_widget);
+ GtkWidget *focused_widget,
+ EMailShellView *mail_shell_view);
G_END_DECLS
diff --git a/src/modules/mail/e-mail-shell-view.c b/src/modules/mail/e-mail-shell-view.c
index 7e31592e7e..1f4758f43b 100644
--- a/src/modules/mail/e-mail-shell-view.c
+++ b/src/modules/mail/e-mail-shell-view.c
@@ -438,15 +438,15 @@ mail_shell_view_toggled (EShellView *shell_view)
basename = E_MAIL_READER_UI_DEFINITION;
if (view_is_active && priv->merge_id == 0) {
- EMailView *mail_view;
+ EMailReader *reader;
+
+ priv->merge_id = e_load_ui_manager_definition (ui_manager, basename);
- priv->merge_id = e_load_ui_manager_definition (
- ui_manager, basename);
- mail_view = e_mail_shell_content_get_mail_view (
- priv->mail_shell_content);
- e_mail_reader_create_charset_menu (
- E_MAIL_READER (mail_view),
- ui_manager, priv->merge_id);
+ reader = E_MAIL_READER (e_mail_shell_content_get_mail_view (priv->mail_shell_content));
+ e_mail_reader_create_charset_menu (reader, ui_manager, priv->merge_id);
+
+ /* This also fills the Label menu */
+ e_mail_reader_update_actions (reader, e_mail_reader_check_state (reader));
} else if (!view_is_active && priv->merge_id != 0) {
gtk_ui_manager_remove_ui (ui_manager, priv->merge_id);
gtk_ui_manager_ensure_update (ui_manager);
@@ -1461,9 +1461,7 @@ mail_shell_view_update_actions (EShellView *shell_view)
action = ACTION (MAIL_VFOLDER_UNMATCHED_ENABLE);
gtk_action_set_visible (action, folder_is_store && folder_is_virtual);
- e_mail_shell_view_update_labels_sensitivity (shell_window, NULL);
-
- e_mail_shell_view_update_popup_labels (mail_shell_view);
+ e_mail_shell_view_update_labels_sensitivity (shell_window, NULL, mail_shell_view);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]