diff options
author | Milan Crha <mcrha@redhat.com> | 2012-02-17 00:22:28 +0800 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2012-02-17 00:23:07 +0800 |
commit | 83d001baa23d3cce1d983dbc7946a7c5375c05f2 (patch) | |
tree | 5c19dd40d965b35d2ca26a926e964946dcd91178 | |
parent | aeb3238ad0fc239a26a9b3708679bb677030063b (diff) | |
download | gsoc2013-evolution-83d001baa23d3cce1d983dbc7946a7c5375c05f2.tar.gz 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.c | 19 | ||||
-rw-r--r-- | calendar/gui/calendar-config.h | 2 | ||||
-rw-r--r-- | calendar/gui/e-day-view.c | 6 | ||||
-rw-r--r-- | calendar/gui/e-week-view.c | 3 | ||||
-rw-r--r-- | data/org.gnome.evolution.calendar.gschema.xml.in | 5 | ||||
-rw-r--r-- | modules/calendar/e-cal-shell-backend.c | 14 | ||||
-rw-r--r-- | modules/calendar/e-cal-shell-settings.c | 5 | ||||
-rw-r--r-- | shell/e-shell-backend.c | 93 | ||||
-rw-r--r-- | shell/e-shell-backend.h | 5 | ||||
-rw-r--r-- | shell/e-shell-window.c | 103 | ||||
-rw-r--r-- | shell/e-shell-window.h | 5 | ||||
-rw-r--r-- | widgets/misc/e-menu-tool-button.c | 139 | ||||
-rw-r--r-- | widgets/misc/e-menu-tool-button.h | 9 |
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 |