[evolution] Bug 600714 - No label colors in popup menu



commit 51fe60cd69cd77fd63dbdd20b3e5fcc6bb650c8a
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sat Nov 14 00:20:35 2009 -0500

    Bug 600714 - No label colors in popup menu

 mail/Makefile.am                         |    2 +
 mail/e-mail-label-action.c               |  155 ++++++++++++++++++++++++++++++
 mail/e-mail-label-action.h               |   73 ++++++++++++++
 modules/mail/e-mail-shell-view-actions.c |   15 ++--
 modules/mail/e-mail-shell-view-private.h |    1 +
 5 files changed, 239 insertions(+), 7 deletions(-)
---
diff --git a/mail/Makefile.am b/mail/Makefile.am
index 01d41aa..286d27d 100644
--- a/mail/Makefile.am
+++ b/mail/Makefile.am
@@ -40,6 +40,7 @@ mailinclude_HEADERS =					\
 	e-mail-attachment-bar.h				\
 	e-mail-browser.h				\
 	e-mail-display.h				\
+	e-mail-label-action.h				\
 	e-mail-label-dialog.h				\
 	e-mail-label-list-store.h			\
 	e-mail-label-manager.h				\
@@ -96,6 +97,7 @@ libevolution_mail_la_SOURCES =				\
 	e-mail-attachment-bar.c				\
 	e-mail-browser.c				\
 	e-mail-display.c				\
+	e-mail-label-action.c				\
 	e-mail-label-dialog.c				\
 	e-mail-label-list-store.c			\
 	e-mail-label-manager.c				\
diff --git a/mail/e-mail-label-action.c b/mail/e-mail-label-action.c
new file mode 100644
index 0000000..2647564
--- /dev/null
+++ b/mail/e-mail-label-action.c
@@ -0,0 +1,155 @@
+/*
+ * e-mail-label-action.c
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ */
+
+#include "e-mail-label-action.h"
+
+#include "e-util/e-binding.h"
+
+#define E_MAIL_LABEL_ACTION_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), E_TYPE_MAIL_LABEL_ACTION, EMailLabelActionPrivate))
+
+struct _EMailLabelActionPrivate {
+	gint placeholder;
+};
+
+static gpointer parent_class;
+
+static void
+mail_label_action_menu_item_realize_cb (GtkWidget *menu_item)
+{
+	GtkAction *action;
+	GtkActivatable *activatable;
+	GtkWidget *container;
+	GtkWidget *widget;
+	const gchar *stock_id;
+
+	activatable = GTK_ACTIVATABLE (menu_item);
+	action = gtk_activatable_get_related_action (activatable);
+	g_return_if_fail (E_IS_MAIL_LABEL_ACTION (action));
+
+	/* Prevent GtkMenuItem's sync_action_properties() method from
+	 * destroying our hack.  Instead we use EBindings to keep the
+	 * label and image in sync with the action. */
+	gtk_activatable_set_use_action_appearance (activatable, FALSE);
+
+	/* Remove the menu item's child widget. */
+	widget = gtk_bin_get_child (GTK_BIN (menu_item));
+	gtk_widget_destroy (widget);
+
+	/* Now add our own child widget. */
+
+	widget = gtk_hbox_new (FALSE, 3);
+	gtk_container_add (GTK_CONTAINER (menu_item), widget);
+	gtk_widget_show (widget);
+
+	container = widget;
+
+	/*stock_id = gtk_action_get_stock_id (action);
+	widget = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU);*/
+	widget = gtk_action_create_icon (action, GTK_ICON_SIZE_MENU);
+	gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+	gtk_widget_show (widget);
+
+	/* XXX GtkImage calls it "stock", not "stock-id". */
+	/*e_mutual_binding_new (action, "stock-id", widget, "stock");*/
+
+	widget = gtk_label_new (NULL);
+	gtk_label_set_use_underline (GTK_LABEL (widget), TRUE);
+	gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
+	gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0);
+	gtk_widget_show (widget);
+
+	e_mutual_binding_new (action, "label", widget, "label");
+}
+
+static GtkWidget *
+mail_label_action_create_menu_item (GtkAction *action)
+{
+	GtkWidget *menu_item;
+
+	menu_item = gtk_check_menu_item_new ();
+
+	g_signal_connect (
+		menu_item, "realize",
+		G_CALLBACK (mail_label_action_menu_item_realize_cb), NULL);
+
+	return menu_item;
+}
+
+static void
+mail_label_action_class_init (EMailLabelActionClass *class)
+{
+	GtkActionClass *action_class;
+
+	parent_class = g_type_class_peek_parent (class);
+	g_type_class_add_private (class, sizeof (EMailLabelActionPrivate));
+
+	action_class = GTK_ACTION_CLASS (class);
+	action_class->create_menu_item = mail_label_action_create_menu_item;
+}
+
+static void
+mail_label_action_init (EMailLabelAction *action)
+{
+	action->priv = E_MAIL_LABEL_ACTION_GET_PRIVATE (action);
+}
+
+GType
+e_mail_label_action_get_type (void)
+{
+	static GType type = 0;
+
+	if (G_UNLIKELY (type == 0)) {
+		static const GTypeInfo type_info = {
+			sizeof (EMailLabelActionClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) mail_label_action_class_init,
+			(GClassFinalizeFunc) NULL,
+			NULL,  /* class_data */
+			sizeof (EMailLabelAction),
+			0,     /* n_preallocs */
+			(GInstanceInitFunc) mail_label_action_init,
+			NULL   /* value_table */
+		};
+
+		type = g_type_register_static (
+			GTK_TYPE_TOGGLE_ACTION,
+			"EMailLabelAction", &type_info, 0);
+	}
+
+	return type;
+}
+
+EMailLabelAction *
+e_mail_label_action_new (const gchar *name,
+                         const gchar *label,
+                         const gchar *tooltip,
+                         const gchar *stock_id)
+{
+	g_return_val_if_fail (name != NULL, NULL);
+
+	return g_object_new (
+		E_TYPE_MAIL_LABEL_ACTION,
+		"name", name, "label", label,
+		"tooltip", tooltip, "stock-id", stock_id, NULL);
+}
diff --git a/mail/e-mail-label-action.h b/mail/e-mail-label-action.h
new file mode 100644
index 0000000..1b681f1
--- /dev/null
+++ b/mail/e-mail-label-action.h
@@ -0,0 +1,73 @@
+/*
+ * e-mail-label-action.h
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ */
+
+/* This is a toggle action whose menu item shows a checkbox, icon and
+ * label.  Use of this thing for anything besides the label submenu in
+ * the message list popup menu is discouraged, which is why this class
+ * was not given a more generic name. */
+
+#ifndef E_MAIL_LABEL_ACTION_H
+#define E_MAIL_LABEL_ACTION_H
+
+#include <gtk/gtk.h>
+
+/* Standard GObject macros */
+#define E_TYPE_MAIL_LABEL_ACTION \
+	(e_mail_label_action_get_type ())
+#define E_MAIL_LABEL_ACTION(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), E_TYPE_MAIL_LABEL_ACTION, EMailLabelAction))
+#define E_MAIL_LABEL_ACTION_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), E_TYPE_MAIL_LABEL_ACTION, EMailLabelActionClass))
+#define E_IS_MAIL_LABEL_ACTION(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), E_TYPE_MAIL_LABEL_ACTION))
+#define E_IS_MAIL_LABEL_ACTION_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), E_TYPE_MAIL_LABEL_ACTION))
+#define E_MAIL_LABEL_ACTION_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), E_TYPE_MAIL_LABEL_ACTION, EMailLabelActionClass))
+
+G_BEGIN_DECLS
+
+typedef struct _EMailLabelAction EMailLabelAction;
+typedef struct _EMailLabelActionClass EMailLabelActionClass;
+typedef struct _EMailLabelActionPrivate EMailLabelActionPrivate;
+
+struct _EMailLabelAction {
+	GtkToggleAction parent;
+	EMailLabelActionPrivate *priv;
+};
+
+struct _EMailLabelActionClass {
+	GtkToggleActionClass parent_class;
+};
+
+GType		e_mail_label_action_get_type	(void);
+EMailLabelAction *
+		e_mail_label_action_new		(const gchar *name,
+						 const gchar *label,
+						 const gchar *tooltip,
+						 const gchar *stock_id);
+
+#endif /* E_MAIL_LABEL_ACTION_H */
diff --git a/modules/mail/e-mail-shell-view-actions.c b/modules/mail/e-mail-shell-view-actions.c
index 07fdf8f..3473d2a 100644
--- a/modules/mail/e-mail-shell-view-actions.c
+++ b/modules/mail/e-mail-shell-view-actions.c
@@ -1729,7 +1729,7 @@ e_mail_shell_view_update_popup_labels (EMailShellView *mail_shell_view)
 	valid = gtk_tree_model_get_iter_first (tree_model, &iter);
 
 	while (valid) {
-		GtkToggleAction *toggle_action;
+		EMailLabelAction *label_action;
 		GtkAction *action;
 		gchar *action_name;
 		gchar *stock_id;
@@ -1745,25 +1745,26 @@ e_mail_shell_view_update_popup_labels (EMailShellView *mail_shell_view)
 		action_name = g_strdup_printf ("mail-label-%d", ii);
 
 		/* XXX Add a tooltip! */
-		toggle_action = gtk_toggle_action_new (
+		label_action = e_mail_label_action_new (
 			action_name, label, NULL, stock_id);
 
 		g_object_set_data_full (
-			G_OBJECT (toggle_action), "tag",
+			G_OBJECT (label_action), "tag",
 			tag, (GDestroyNotify) g_free);
 
 		/* Configure the action before we connect to signals. */
 		mail_shell_view_update_label_action (
-			toggle_action, message_list, uids, tag);
+			GTK_TOGGLE_ACTION (label_action),
+			message_list, uids, tag);
 
 		g_signal_connect (
-			toggle_action, "toggled",
+			label_action, "toggled",
 			G_CALLBACK (action_mail_label_cb), mail_shell_view);
 
 		/* The action group takes ownership of the action. */
-		action = GTK_ACTION (toggle_action);
+		action = GTK_ACTION (label_action);
 		gtk_action_group_add_action (action_group, action);
-		g_object_unref (toggle_action);
+		g_object_unref (label_action);
 
 		gtk_ui_manager_add_ui (
 			ui_manager, merge_id, path, action_name,
diff --git a/modules/mail/e-mail-shell-view-private.h b/modules/mail/e-mail-shell-view-private.h
index bf86f33..6142b6e 100644
--- a/modules/mail/e-mail-shell-view-private.h
+++ b/modules/mail/e-mail-shell-view-private.h
@@ -40,6 +40,7 @@
 #include "widgets/misc/e-popup-action.h"
 #include "widgets/menus/gal-view-instance.h"
 
+#include "e-mail-label-action.h"
 #include "e-mail-label-dialog.h"
 #include "e-mail-label-list-store.h"
 #include "e-mail-local.h"



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]