aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2012-02-17 00:22:28 +0800
committerMilan Crha <mcrha@redhat.com>2012-02-17 00:23:07 +0800
commit83d001baa23d3cce1d983dbc7946a7c5375c05f2 (patch)
tree5c19dd40d965b35d2ca26a926e964946dcd91178
parentaeb3238ad0fc239a26a9b3708679bb677030063b (diff)
downloadgsoc2013-evolution-83d001baa23d3cce1d983dbc7946a7c5375c05f2.tar
gsoc2013-evolution-83d001baa23d3cce1d983dbc7946a7c5375c05f2.tar.gz
gsoc2013-evolution-83d001baa23d3cce1d983dbc7946a7c5375c05f2.tar.bz2
gsoc2013-evolution-83d001baa23d3cce1d983dbc7946a7c5375c05f2.tar.lz
gsoc2013-evolution-83d001baa23d3cce1d983dbc7946a7c5375c05f2.tar.xz
gsoc2013-evolution-83d001baa23d3cce1d983dbc7946a7c5375c05f2.tar.zst
gsoc2013-evolution-83d001baa23d3cce1d983dbc7946a7c5375c05f2.zip
Bug #320976 - Remember last New button choice in Calendar view
-rw-r--r--calendar/gui/calendar-config.c19
-rw-r--r--calendar/gui/calendar-config.h2
-rw-r--r--calendar/gui/e-day-view.c6
-rw-r--r--calendar/gui/e-week-view.c3
-rw-r--r--data/org.gnome.evolution.calendar.gschema.xml.in5
-rw-r--r--modules/calendar/e-cal-shell-backend.c14
-rw-r--r--modules/calendar/e-cal-shell-settings.c5
-rw-r--r--shell/e-shell-backend.c93
-rw-r--r--shell/e-shell-backend.h5
-rw-r--r--shell/e-shell-window.c103
-rw-r--r--shell/e-shell-window.h5
-rw-r--r--widgets/misc/e-menu-tool-button.c139
-rw-r--r--widgets/misc/e-menu-tool-button.h9
13 files changed, 395 insertions, 13 deletions
diff --git a/calendar/gui/calendar-config.c b/calendar/gui/calendar-config.c
index 39431549dd..e293a6e41b 100644
--- a/calendar/gui/calendar-config.c
+++ b/calendar/gui/calendar-config.c
@@ -434,3 +434,22 @@ calendar_config_add_notification_day_second_zone (CalendarConfigChangedFunc func
g_signal_connect (G_OBJECT (config), "changed::day-second-zone",
G_CALLBACK (func), data);
}
+
+gboolean
+calendar_config_get_prefer_meeting (void)
+{
+ EShell *shell;
+ EShellSettings *shell_settings;
+ gchar *prefer_new_item;
+ gboolean prefer_meeting;
+
+ shell = e_shell_get_default ();
+ shell_settings = e_shell_get_shell_settings (shell);
+
+ prefer_new_item = e_shell_settings_get_string (shell_settings, "cal-prefer-new-item");
+ prefer_meeting = g_strcmp0 (prefer_new_item, "event-meeting-new") == 0;
+
+ g_free (prefer_new_item);
+
+ return prefer_meeting;
+}
diff --git a/calendar/gui/calendar-config.h b/calendar/gui/calendar-config.h
index 483fbbd667..81f8534364 100644
--- a/calendar/gui/calendar-config.h
+++ b/calendar/gui/calendar-config.h
@@ -90,4 +90,6 @@ void calendar_config_add_notification_day_second_zone (CalendarConfigChangedFu
gboolean calendar_config_get_month_scroll_by_week (void);
void calendar_config_add_notification_month_scroll_by_week (CalendarConfigChangedFunc func, gpointer data);
+gboolean calendar_config_get_prefer_meeting (void);
+
#endif /* _CALENDAR_CONFIG_H_ */
diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c
index 8af5ffb3fa..cb19db0fe0 100644
--- a/calendar/gui/e-day-view.c
+++ b/calendar/gui/e-day-view.c
@@ -50,6 +50,7 @@
#include "dialogs/recur-comp.h"
#include "dialogs/goto-dialog.h"
#include "print.h"
+#include "calendar-config.h"
#include "comp-util.h"
#include "itip-utils.h"
#include "e-cal-model-calendar.h"
@@ -3073,9 +3074,10 @@ e_day_view_on_top_canvas_button_press (GtkWidget *widget,
dtend = day_view->before_click_dtend;
e_day_view_set_selected_time_range ((ECalendarView *) day_view, dtstart, dtend);
}
+
e_calendar_view_new_appointment_for (E_CALENDAR_VIEW (day_view),
dtstart, dtend,
- TRUE, FALSE);
+ TRUE, calendar_config_get_prefer_meeting ());
return TRUE;
}
@@ -3214,7 +3216,7 @@ e_day_view_on_main_canvas_button_press (GtkWidget *widget,
}
e_calendar_view_new_appointment_for (E_CALENDAR_VIEW (day_view),
dtstart, dtend,
- FALSE, FALSE);
+ FALSE, calendar_config_get_prefer_meeting ());
return TRUE;
}
diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c
index 4b2eeb02bf..45917c170c 100644
--- a/calendar/gui/e-week-view.c
+++ b/calendar/gui/e-week-view.c
@@ -48,6 +48,7 @@
#include "dialogs/cancel-comp.h"
#include "dialogs/recur-comp.h"
#include "dialogs/goto-dialog.h"
+#include "calendar-config.h"
#include "comp-util.h"
#include "itip-utils.h"
#include <libecal/e-cal-time-util.h>
@@ -2417,7 +2418,7 @@ e_week_view_on_button_press (GtkWidget *widget,
if (dtstart < week_view->before_click_dtend && dtend > week_view->before_click_dtstart) {
e_week_view_set_selected_time_range ((ECalendarView *) week_view, week_view->before_click_dtstart, week_view->before_click_dtend);
}
- e_calendar_view_new_appointment_full (E_CALENDAR_VIEW (week_view), FALSE, FALSE, FALSE);
+ e_calendar_view_new_appointment_full (E_CALENDAR_VIEW (week_view), FALSE, FALSE, calendar_config_get_prefer_meeting ());
return TRUE;
}
diff --git a/data/org.gnome.evolution.calendar.gschema.xml.in b/data/org.gnome.evolution.calendar.gschema.xml.in
index f1c9385e2d..cc66fbba86 100644
--- a/data/org.gnome.evolution.calendar.gschema.xml.in
+++ b/data/org.gnome.evolution.calendar.gschema.xml.in
@@ -185,6 +185,11 @@
<_summary>Show display reminders in notification tray</_summary>
<_description>Whether or not to use the notification tray for display reminders</_description>
</key>
+ <key name="prefer-new-item" type="s">
+ <default>''</default>
+ <_summary>Preferred New button item</_summary>
+ <_description>Name of the preferred New toolbar button item</_description>
+ </key>
<key name="primary-calendar" type="s">
<default>''</default>
<_summary>Primary calendar</_summary>
diff --git a/modules/calendar/e-cal-shell-backend.c b/modules/calendar/e-cal-shell-backend.c
index f13cc2d715..f9400707a2 100644
--- a/modules/calendar/e-cal-shell-backend.c
+++ b/modules/calendar/e-cal-shell-backend.c
@@ -357,6 +357,8 @@ action_event_new_cb (GtkAction *action,
const gchar *action_name;
gchar *uid;
+ action_name = gtk_action_get_name (action);
+
/* With a 'calendar' active shell view pass the new appointment
* request to it, thus the event will inherit selected time from
* the view. */
@@ -367,6 +369,7 @@ action_event_new_cb (GtkAction *action,
GnomeCalendarViewType view_type;
ECalendarView *view;
+ shell_backend = e_shell_view_get_shell_backend (shell_view);
shell_content = e_shell_view_get_shell_content (shell_view);
gcal = e_cal_shell_content_get_calendar (
@@ -376,7 +379,7 @@ action_event_new_cb (GtkAction *action,
view = gnome_calendar_get_calendar_view (gcal, view_type);
if (view) {
- action_name = gtk_action_get_name (action);
+ g_object_set (G_OBJECT (shell_backend), "prefer-new-item", action_name, NULL);
e_calendar_view_new_appointment_full (
view,
@@ -412,9 +415,10 @@ action_event_new_cb (GtkAction *action,
g_return_if_fail (E_IS_SOURCE (source));
+ g_object_set (G_OBJECT (shell_backend), "prefer-new-item", action_name, NULL);
+
/* Use a callback function appropriate for the action.
* FIXME Need to obtain a better default time zone. */
- action_name = gtk_action_get_name (action);
if (strcmp (action_name, "event-all-day-new") == 0)
e_client_utils_open_new (source, source_type, FALSE, NULL,
e_client_utils_authenticate_handler, GTK_WINDOW (shell_window),
@@ -796,6 +800,12 @@ cal_shell_backend_constructed (GObject *object)
e_calendar_preferences_new,
600);
+ g_object_bind_property (
+ e_shell_get_shell_settings (shell), "cal-prefer-new-item",
+ shell_backend, "prefer-new-item",
+ G_BINDING_BIDIRECTIONAL |
+ G_BINDING_SYNC_CREATE);
+
/* Chain up to parent's constructed() method. */
G_OBJECT_CLASS (e_cal_shell_backend_parent_class)->constructed (object);
}
diff --git a/modules/calendar/e-cal-shell-settings.c b/modules/calendar/e-cal-shell-settings.c
index 9810d816e6..0c77063f46 100644
--- a/modules/calendar/e-cal-shell-settings.c
+++ b/modules/calendar/e-cal-shell-settings.c
@@ -714,6 +714,11 @@ e_cal_shell_backend_init_settings (EShell *shell)
CALENDAR_SCHEMA,
"working-days");
+ e_shell_settings_install_property_for_key (
+ "cal-prefer-new-item",
+ CALENDAR_SCHEMA,
+ "prefer-new-item");
+
/* These properties use transform functions to convert
* GConf values to forms more useful to Evolution. We
* have to use separate properties because GConfBridge
diff --git a/shell/e-shell-backend.c b/shell/e-shell-backend.c
index fed85cd6e2..f4baca770f 100644
--- a/shell/e-shell-backend.c
+++ b/shell/e-shell-backend.c
@@ -58,13 +58,15 @@ struct _EShellBackendPrivate {
gchar *config_dir;
gchar *data_dir;
+ gchar *prefer_new_item;
guint started : 1;
};
enum {
PROP_0,
- PROP_BUSY
+ PROP_BUSY,
+ PROP_PREFER_NEW_ITEM
};
enum {
@@ -164,6 +166,30 @@ shell_backend_get_property (GObject *object,
value, e_shell_backend_is_busy (
E_SHELL_BACKEND (object)));
return;
+
+ case PROP_PREFER_NEW_ITEM:
+ g_value_set_string (
+ value,
+ e_shell_backend_get_prefer_new_item (
+ E_SHELL_BACKEND (object)));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+shell_backend_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_PREFER_NEW_ITEM:
+ e_shell_backend_set_prefer_new_item (
+ E_SHELL_BACKEND (object),
+ g_value_get_string (value));
+ return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -181,6 +207,11 @@ shell_backend_dispose (GObject *object)
priv->shell_view_class = NULL;
}
+ if (priv->prefer_new_item) {
+ g_free (priv->prefer_new_item);
+ priv->prefer_new_item = NULL;
+ }
+
/* Chain up to parent's dispose() method. */
G_OBJECT_CLASS (e_shell_backend_parent_class)->dispose (object);
}
@@ -253,6 +284,7 @@ e_shell_backend_class_init (EShellBackendClass *class)
object_class = G_OBJECT_CLASS (class);
object_class->constructor = shell_backend_constructor;
object_class->get_property = shell_backend_get_property;
+ object_class->set_property = shell_backend_set_property;
object_class->dispose = shell_backend_dispose;
object_class->finalize = shell_backend_finalize;
@@ -278,6 +310,21 @@ e_shell_backend_class_init (EShellBackendClass *class)
G_PARAM_READABLE));
/**
+ * EShellBackend:prefer-new-item
+ *
+ * Name of an item to prefer in New toolbar button; can be NULL
+ **/
+ g_object_class_install_property (
+ object_class,
+ PROP_PREFER_NEW_ITEM,
+ g_param_spec_string (
+ "prefer-new-item",
+ "Prefer New Item",
+ "Name of an item to prefer in New toolbar button",
+ NULL,
+ G_PARAM_READWRITE));
+
+ /**
* EShellBackend::activity-added
* @shell_backend: the #EShellBackend that emitted the signal
* @activity: an #EActivity
@@ -455,6 +502,50 @@ e_shell_backend_is_busy (EShellBackend *shell_backend)
}
/**
+ * e_shell_backend_set_prefer_new_item:
+ * @shell_backend: an #EShellBackend
+ * @prefer_new_item: name of an item
+ *
+ * Sets name of a preferred item in New toolbar button. Use %NULL or
+ * an empty string for no preference.
+ *
+ * Since: 3.4
+ **/
+void
+e_shell_backend_set_prefer_new_item (EShellBackend *shell_backend,
+ const gchar *prefer_new_item)
+{
+ g_return_if_fail (shell_backend != NULL);
+ g_return_if_fail (E_IS_SHELL_BACKEND (shell_backend));
+
+ if (g_strcmp0 (shell_backend->priv->prefer_new_item, prefer_new_item) == 0)
+ return;
+
+ g_free (shell_backend->priv->prefer_new_item);
+ shell_backend->priv->prefer_new_item = g_strdup (prefer_new_item);
+
+ g_object_notify (G_OBJECT (shell_backend), "prefer-new-item");
+}
+
+/**
+ * e_shell_backend_get_prefer_new_item:
+ * @shell_backend: an #EShellBackend
+ *
+ * Returns: Name of a preferred item in New toolbar button, %NULL or
+ * an empty string for no preference.
+ *
+ * Since: 3.4
+ **/
+const gchar *
+e_shell_backend_get_prefer_new_item (EShellBackend *shell_backend)
+{
+ g_return_val_if_fail (shell_backend != NULL, NULL);
+ g_return_val_if_fail (E_IS_SHELL_BACKEND (shell_backend), NULL);
+
+ return shell_backend->priv->prefer_new_item;
+}
+
+/**
* e_shell_backend_cancel_all:
* @shell_backend: an #EShellBackend
*
diff --git a/shell/e-shell-backend.h b/shell/e-shell-backend.h
index ae600bac3d..759a3bdcb7 100644
--- a/shell/e-shell-backend.h
+++ b/shell/e-shell-backend.h
@@ -126,6 +126,11 @@ struct _EShell *e_shell_backend_get_shell (EShellBackend *shell_backend);
void e_shell_backend_add_activity (EShellBackend *shell_backend,
EActivity *activity);
gboolean e_shell_backend_is_busy (EShellBackend *shell_backend);
+void e_shell_backend_set_prefer_new_item
+ (EShellBackend *shell_backend,
+ const gchar *prefer_new_item);
+const gchar * e_shell_backend_get_prefer_new_item
+ (EShellBackend *shell_backend);
void e_shell_backend_cancel_all (EShellBackend *shell_backend);
void e_shell_backend_start (EShellBackend *shell_backend);
gboolean e_shell_backend_is_started (EShellBackend *shell_backend);
diff --git a/shell/e-shell-window.c b/shell/e-shell-window.c
index 19178f8292..a8b44e67db 100644
--- a/shell/e-shell-window.c
+++ b/shell/e-shell-window.c
@@ -81,6 +81,10 @@ shell_window_menubar_update_new_menu (EShellWindow *shell_window)
gtk_widget_show (widget);
}
+static void shell_window_backend_prefer_item_changed_cb (EShellBackend *backend,
+ GParamSpec *pspec,
+ EShellWindow *shell_window);
+
static void
shell_window_toolbar_update_new_menu (EShellWindow *shell_window,
GParamSpec *pspec,
@@ -91,6 +95,44 @@ shell_window_toolbar_update_new_menu (EShellWindow *shell_window,
/* Update the "New" menu tool button submenu. */
menu = e_shell_window_create_new_menu (shell_window);
gtk_menu_tool_button_set_menu (menu_tool_button, menu);
+
+ if (pspec && g_strcmp0 (pspec->name, "active-view") == 0) {
+ EShellView *shell_view;
+ EShellBackend *shell_backend;
+
+ shell_view = e_shell_window_peek_shell_view (shell_window,
+ e_shell_window_get_active_view (shell_window));
+ g_return_if_fail (shell_view != NULL);
+
+ shell_backend = e_shell_view_get_shell_backend (shell_view);
+
+ g_signal_handlers_disconnect_by_func (shell_backend,
+ shell_window_backend_prefer_item_changed_cb, shell_window);
+ g_signal_connect (shell_backend, "notify::prefer-new-item",
+ G_CALLBACK (shell_window_backend_prefer_item_changed_cb), shell_window);
+
+ shell_window_backend_prefer_item_changed_cb (shell_backend, NULL, shell_window);
+ }
+}
+
+static void
+shell_window_backend_prefer_item_changed_cb (EShellBackend *backend,
+ GParamSpec *pspec,
+ EShellWindow *shell_window)
+{
+ EShellView *shell_view;
+ EShellBackend *shell_backend;
+
+ shell_view = e_shell_window_peek_shell_view (shell_window,
+ e_shell_window_get_active_view (shell_window));
+ g_return_if_fail (shell_view != NULL);
+
+ shell_backend = e_shell_view_get_shell_backend (shell_view);
+ if (shell_backend != backend)
+ return;
+
+ e_shell_window_set_toolbar_new_prefer_item (shell_window,
+ e_shell_backend_get_prefer_new_item (shell_backend));
}
static void
@@ -456,6 +498,11 @@ shell_window_construct_toolbar (EShellWindow *shell_window)
G_CALLBACK (shell_window_toolbar_update_new_menu),
GTK_MENU_TOOL_BUTTON (item));
+ g_signal_connect_swapped (
+ item, "notify::prefer-item",
+ G_CALLBACK (shell_window_toolbar_update_new_menu),
+ shell_window);
+
gtk_box_pack_start (GTK_BOX (box), toolbar, TRUE, TRUE, 0);
toolbar = e_shell_window_get_managed_widget (
@@ -1503,6 +1550,62 @@ e_shell_window_set_toolbar_visible (EShellWindow *shell_window,
}
/**
+ * e_shell_window_set_toolbar_new_prefer_item:
+ * @shell_window: an #EShellWindow
+ * @prefer_item: prefer-item name to be set
+ *
+ * Sets prefer item on the New button for current view.
+ *
+ * Since: 3.4
+ **/
+void
+e_shell_window_set_toolbar_new_prefer_item (EShellWindow *shell_window,
+ const gchar *prefer_item)
+{
+ GtkWidget *toolbar;
+ GtkToolItem *item;
+
+ g_return_if_fail (shell_window != NULL);
+ g_return_if_fail (E_IS_SHELL_WINDOW (shell_window));
+
+ toolbar = e_shell_window_get_managed_widget (shell_window, "/main-toolbar");
+ g_return_if_fail (toolbar != NULL);
+
+ item = gtk_toolbar_get_nth_item (GTK_TOOLBAR (toolbar), 0);
+ g_return_if_fail (item != NULL);
+ g_return_if_fail (E_IS_MENU_TOOL_BUTTON (item));
+
+ e_menu_tool_button_set_prefer_item (E_MENU_TOOL_BUTTON (item), prefer_item);
+}
+
+/**
+ * e_shell_window_get_toolbar_new_prefer_item:
+ * @shell_window: an #EShellWindow
+ *
+ * Returns: name of preferred item on the New button for current view.
+ *
+ * Since: 3.4
+ **/
+const gchar *
+e_shell_window_get_toolbar_new_prefer_item (EShellWindow *shell_window)
+{
+ GtkWidget *toolbar;
+ GtkToolItem *item;
+
+ g_return_val_if_fail (shell_window != NULL, NULL);
+ g_return_val_if_fail (E_IS_SHELL_WINDOW (shell_window), NULL);
+
+ toolbar = e_shell_window_get_managed_widget (shell_window, "/main-toolbar");
+ g_return_val_if_fail (toolbar != NULL, NULL);
+
+ item = gtk_toolbar_get_nth_item (GTK_TOOLBAR (toolbar), 0);
+ g_return_val_if_fail (item != NULL, NULL);
+ g_return_val_if_fail (E_IS_MENU_TOOL_BUTTON (item), NULL);
+
+ return e_menu_tool_button_get_prefer_item (E_MENU_TOOL_BUTTON (item));
+}
+
+/**
* e_shell_window_register_new_item_actions:
* @shell_window: an #EShellWindow
* @backend_name: name of an #EShellBackend
diff --git a/shell/e-shell-window.h b/shell/e-shell-window.h
index 25e039a0ab..366a2186c1 100644
--- a/shell/e-shell-window.h
+++ b/shell/e-shell-window.h
@@ -135,6 +135,11 @@ gboolean e_shell_window_get_toolbar_visible
void e_shell_window_set_toolbar_visible
(EShellWindow *shell_window,
gboolean toolbar_visible);
+void e_shell_window_set_toolbar_new_prefer_item
+ (EShellWindow *shell_window,
+ const gchar *prefer_item);
+const gchar * e_shell_window_get_toolbar_new_prefer_item
+ (EShellWindow *shell_window);
/* These should be called from the shell backend's window_created() handler. */
diff --git a/widgets/misc/e-menu-tool-button.c b/widgets/misc/e-menu-tool-button.c
index 0c5ef95f33..5a052a1844 100644
--- a/widgets/misc/e-menu-tool-button.c
+++ b/widgets/misc/e-menu-tool-button.c
@@ -25,6 +25,16 @@
#include "e-menu-tool-button.h"
+enum {
+ PROP_0,
+ PROP_PREFER_ITEM
+};
+
+struct _EMenuToolButtonPrivate
+{
+ gchar *prefer_item;
+};
+
G_DEFINE_TYPE (
EMenuToolButton,
e_menu_tool_button,
@@ -48,11 +58,12 @@ menu_tool_button_clone_image (GtkWidget *source)
}
static GtkMenuItem *
-menu_tool_button_get_first_menu_item (GtkMenuToolButton *menu_tool_button)
+menu_tool_button_get_prefer_menu_item (GtkMenuToolButton *menu_tool_button)
{
GtkWidget *menu;
- GtkMenuItem *item;
+ GtkMenuItem *item = NULL;
GList *children;
+ const gchar *prefer_item;
menu = gtk_menu_tool_button_get_menu (menu_tool_button);
if (!GTK_IS_MENU (menu))
@@ -62,7 +73,29 @@ menu_tool_button_get_first_menu_item (GtkMenuToolButton *menu_tool_button)
if (children == NULL)
return NULL;
- item = GTK_MENU_ITEM (children->data);
+ prefer_item = e_menu_tool_button_get_prefer_item (E_MENU_TOOL_BUTTON (menu_tool_button));
+ if (prefer_item && *prefer_item) {
+ GtkAction *action;
+ GList *iter;
+
+ for (iter = children; iter != NULL; iter = iter->next) {
+ item = GTK_MENU_ITEM (iter->data);
+
+ if (!item)
+ continue;
+
+ action = gtk_activatable_get_related_action (GTK_ACTIVATABLE (item));
+ if (action && g_strcmp0 (gtk_action_get_name (action), prefer_item) == 0)
+ break;
+ else if (!action && g_strcmp0 (gtk_widget_get_name (GTK_WIDGET (item)), prefer_item) == 0)
+ break;
+
+ item = NULL;
+ }
+ }
+
+ if (!item)
+ item = GTK_MENU_ITEM (children->data);
g_list_free (children);
@@ -80,7 +113,7 @@ menu_tool_button_update_button (GtkToolButton *tool_button)
gchar *tooltip = NULL;
menu_tool_button = GTK_MENU_TOOL_BUTTON (tool_button);
- menu_item = menu_tool_button_get_first_menu_item (menu_tool_button);
+ menu_item = menu_tool_button_get_prefer_menu_item (menu_tool_button);
if (!GTK_IS_IMAGE_MENU_ITEM (menu_item))
return;
@@ -110,24 +143,95 @@ menu_tool_button_clicked (GtkToolButton *tool_button)
GtkMenuToolButton *menu_tool_button;
menu_tool_button = GTK_MENU_TOOL_BUTTON (tool_button);
- menu_item = menu_tool_button_get_first_menu_item (menu_tool_button);
+ menu_item = menu_tool_button_get_prefer_menu_item (menu_tool_button);
if (GTK_IS_MENU_ITEM (menu_item))
gtk_menu_item_activate (menu_item);
}
static void
+menu_tool_button_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_PREFER_ITEM:
+ e_menu_tool_button_set_prefer_item (
+ E_MENU_TOOL_BUTTON (object),
+ g_value_get_string (value));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+menu_tool_button_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_PREFER_ITEM:
+ g_value_set_string (
+ value, e_menu_tool_button_get_prefer_item (
+ E_MENU_TOOL_BUTTON (object)));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+menu_tool_button_dispose (GObject *object)
+{
+ EMenuToolButtonPrivate *priv = E_MENU_TOOL_BUTTON (object)->priv;
+
+ if (priv->prefer_item) {
+ g_free (priv->prefer_item);
+ priv->prefer_item = NULL;
+ }
+
+ /* Chain up to parent's dispose() method. */
+ G_OBJECT_CLASS (e_menu_tool_button_parent_class)->dispose (object);
+}
+
+static void
e_menu_tool_button_class_init (EMenuToolButtonClass *class)
{
+ GObjectClass *object_class;
GtkToolButtonClass *tool_button_class;
+ g_type_class_add_private (class, sizeof (EMenuToolButtonPrivate));
+
+ object_class = G_OBJECT_CLASS (class);
+ object_class->set_property = menu_tool_button_set_property;
+ object_class->get_property = menu_tool_button_get_property;
+ object_class->dispose = menu_tool_button_dispose;
+
tool_button_class = GTK_TOOL_BUTTON_CLASS (class);
tool_button_class->clicked = menu_tool_button_clicked;
+
+ g_object_class_install_property (
+ object_class,
+ PROP_PREFER_ITEM,
+ g_param_spec_string (
+ "prefer-item",
+ "Prefer Item",
+ "Name of an item to show instead of the first",
+ NULL,
+ G_PARAM_READWRITE));
}
static void
e_menu_tool_button_init (EMenuToolButton *button)
{
+ button->priv = G_TYPE_INSTANCE_GET_PRIVATE (
+ button, E_TYPE_MENU_TOOL_BUTTON, EMenuToolButtonPrivate);
+
+ button->priv->prefer_item = NULL;
+
g_signal_connect (
button, "notify::menu",
G_CALLBACK (menu_tool_button_update_button), NULL);
@@ -138,3 +242,28 @@ e_menu_tool_button_new (const gchar *label)
{
return g_object_new (E_TYPE_MENU_TOOL_BUTTON, "label", label, NULL);
}
+
+void
+e_menu_tool_button_set_prefer_item (EMenuToolButton *button,
+ const gchar *prefer_item)
+{
+ g_return_if_fail (button != NULL);
+ g_return_if_fail (E_IS_MENU_TOOL_BUTTON (button));
+
+ if (g_strcmp0 (button->priv->prefer_item, prefer_item) == 0)
+ return;
+
+ g_free (button->priv->prefer_item);
+ button->priv->prefer_item = g_strdup (prefer_item);
+
+ g_object_notify (G_OBJECT (button), "prefer-item");
+}
+
+const gchar *
+e_menu_tool_button_get_prefer_item (EMenuToolButton *button)
+{
+ g_return_val_if_fail (button != NULL, NULL);
+ g_return_val_if_fail (E_IS_MENU_TOOL_BUTTON (button), NULL);
+
+ return button->priv->prefer_item;
+}
diff --git a/widgets/misc/e-menu-tool-button.h b/widgets/misc/e-menu-tool-button.h
index 214f5ab217..803ec8ff58 100644
--- a/widgets/misc/e-menu-tool-button.h
+++ b/widgets/misc/e-menu-tool-button.h
@@ -50,18 +50,23 @@
G_BEGIN_DECLS
typedef struct _EMenuToolButton EMenuToolButton;
+typedef struct _EMenuToolButtonPrivate EMenuToolButtonPrivate;
typedef struct _EMenuToolButtonClass EMenuToolButtonClass;
struct _EMenuToolButton {
GtkMenuToolButton parent;
+ EMenuToolButtonPrivate *priv;
};
struct _EMenuToolButtonClass {
GtkMenuToolButtonClass parent_class;
};
-GType e_menu_tool_button_get_type (void);
-GtkToolItem * e_menu_tool_button_new (const gchar *label);
+GType e_menu_tool_button_get_type (void);
+GtkToolItem * e_menu_tool_button_new (const gchar *label);
+void e_menu_tool_button_set_prefer_item (EMenuToolButton *button,
+ const gchar *prefer_item);
+const gchar * e_menu_tool_button_get_prefer_item (EMenuToolButton *button);
G_END_DECLS