From 76229dcb001dc7a72f35e89fbad4835d6529d728 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Thu, 27 Aug 2009 17:32:53 -0400 Subject: Add vertical view to Contacts. --- .../apps_evolution_addressbook.schemas.in | 38 +++++++- modules/addressbook/e-book-shell-content.c | 105 +++++++++++++++------ modules/addressbook/e-book-shell-view-actions.c | 70 +++++++++++++- modules/addressbook/e-book-shell-view-actions.h | 4 + ui/evolution-contacts.ui | 11 ++- 5 files changed, 195 insertions(+), 33 deletions(-) diff --git a/modules/addressbook/apps_evolution_addressbook.schemas.in b/modules/addressbook/apps_evolution_addressbook.schemas.in index 4a336409df..7ce3902c82 100644 --- a/modules/addressbook/apps_evolution_addressbook.schemas.in +++ b/modules/addressbook/apps_evolution_addressbook.schemas.in @@ -55,14 +55,48 @@ + + /schemas/apps/evolution/addressbook/display/layout + /apps/evolution/addressbook/display/layout + evolution-addressbook + int + 0 + + Contact layout style + + The layout style determines where to place the preview pane + in relation to the contact list. "0" (Classic View) places + the preview pane below the contact list. "1" (Vertical View) + places the preview pane next to the contact list. + + + + + + /schemas/apps/evolution/addressbook/display/hpane_position + /apps/evolution/addressbook/display/hpane_position + evolution-addressbook + int + 200 + + Contact preview pane position (horizontal) + + Position of the contact preview pane when oriented horizontally. + + + + /schemas/apps/evolution/addressbook/display/vpane_position /apps/evolution/addressbook/display/vpane_position evolution-addressbook int + 400 - Vertical pane position - Position of the vertical pane, between the card and list views and the preview pane, in pixels. + Contact preview pane position (vertical) + + Position of the contact preview pane when oriented vertically. + diff --git a/modules/addressbook/e-book-shell-content.c b/modules/addressbook/e-book-shell-content.c index cce03b1575..f138da3d00 100644 --- a/modules/addressbook/e-book-shell-content.c +++ b/modules/addressbook/e-book-shell-content.c @@ -23,7 +23,9 @@ #include +#include "e-util/e-binding.h" #include "e-util/gconf-bridge.h" +#include "widgets/misc/e-paned.h" #define E_BOOK_SHELL_CONTENT_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE \ @@ -33,17 +35,22 @@ struct _EBookShellContentPrivate { GtkWidget *paned; GtkWidget *notebook; GtkWidget *preview; + + GtkOrientation orientation; + + guint preview_visible : 1; }; enum { PROP_0, PROP_CURRENT_VIEW, + PROP_ORIENTATION, PROP_PREVIEW_CONTACT, PROP_PREVIEW_VISIBLE }; static gpointer parent_class; -static GType book_shell_view_type; +static GType book_shell_content_type; static void book_shell_content_send_message_cb (EBookShellContent *book_shell_content, @@ -55,6 +62,21 @@ book_shell_content_send_message_cb (EBookShellContent *book_shell_content, eab_send_as_to (&node); } +static GtkOrientation +book_shell_content_get_orientation (EBookShellContent *book_shell_content) +{ + return book_shell_content->priv->orientation; +} + +static void +book_shell_content_set_orientation (EBookShellContent *book_shell_content, + GtkOrientation orientation) +{ + book_shell_content->priv->orientation = orientation; + + g_object_notify (G_OBJECT (book_shell_content), "orientation"); +} + static void book_shell_content_set_property (GObject *object, guint property_id, @@ -68,6 +90,12 @@ book_shell_content_set_property (GObject *object, g_value_get_object (value)); return; + case PROP_ORIENTATION: + book_shell_content_set_orientation ( + E_BOOK_SHELL_CONTENT (object), + g_value_get_enum (value)); + return; + case PROP_PREVIEW_CONTACT: e_book_shell_content_set_preview_contact ( E_BOOK_SHELL_CONTENT (object), @@ -93,19 +121,29 @@ book_shell_content_get_property (GObject *object, switch (property_id) { case PROP_CURRENT_VIEW: g_value_set_object ( - value, e_book_shell_content_get_current_view ( + value, + e_book_shell_content_get_current_view ( + E_BOOK_SHELL_CONTENT (object))); + return; + + case PROP_ORIENTATION: + g_value_set_enum ( + value, + book_shell_content_get_orientation ( E_BOOK_SHELL_CONTENT (object))); return; case PROP_PREVIEW_CONTACT: g_value_set_object ( - value, e_book_shell_content_get_preview_contact ( + value, + e_book_shell_content_get_preview_contact ( E_BOOK_SHELL_CONTENT (object))); return; case PROP_PREVIEW_VISIBLE: g_value_set_boolean ( - value, e_book_shell_content_get_preview_visible ( + value, + e_book_shell_content_get_preview_visible ( E_BOOK_SHELL_CONTENT (object))); return; } @@ -155,17 +193,21 @@ book_shell_content_constructed (GObject *object) container = GTK_WIDGET (object); - widget = gtk_vpaned_new (); + widget = e_paned_new (GTK_ORIENTATION_VERTICAL); gtk_container_add (GTK_CONTAINER (container), widget); priv->paned = g_object_ref (widget); gtk_widget_show (widget); + e_binding_new ( + G_OBJECT (object), "orientation", + G_OBJECT (widget), "orientation"); + container = widget; widget = gtk_notebook_new (); gtk_notebook_set_show_tabs (GTK_NOTEBOOK (widget), FALSE); gtk_notebook_set_show_border (GTK_NOTEBOOK (widget), FALSE); - gtk_paned_add1 (GTK_PANED (container), widget); + gtk_paned_pack1 (GTK_PANED (container), widget, TRUE, FALSE); priv->notebook = g_object_ref (widget); gtk_widget_show (widget); @@ -175,9 +217,13 @@ book_shell_content_constructed (GObject *object) GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type ( GTK_SCROLLED_WINDOW (widget), GTK_SHADOW_IN); - gtk_paned_add2 (GTK_PANED (container), widget); + gtk_paned_pack2 (GTK_PANED (container), widget, FALSE, FALSE); gtk_widget_show (widget); + e_binding_new ( + G_OBJECT (object), "preview-visible", + G_OBJECT (widget), "visible"); + container = widget; widget = eab_contact_display_new (); @@ -196,9 +242,13 @@ book_shell_content_constructed (GObject *object) bridge = gconf_bridge_get (); + object = G_OBJECT (priv->paned); + key = "/apps/evolution/addressbook/display/hpane_position"; + gconf_bridge_bind_property_delayed (bridge, key, object, "hposition"); + object = G_OBJECT (priv->paned); key = "/apps/evolution/addressbook/display/vpane_position"; - gconf_bridge_bind_property_delayed (bridge, key, object, "position"); + gconf_bridge_bind_property_delayed (bridge, key, object, "vposition"); } static guint32 @@ -283,7 +333,11 @@ book_shell_content_class_init (EBookShellContentClass *class) _("Preview is Visible"), _("Whether the preview pane is visible"), TRUE, - G_PARAM_READWRITE)); + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); + + g_object_class_override_property ( + object_class, PROP_ORIENTATION, "orientation"); } static void @@ -298,7 +352,7 @@ book_shell_content_init (EBookShellContent *book_shell_content) GType e_book_shell_content_get_type (void) { - return book_shell_view_type; + return book_shell_content_type; } void @@ -317,9 +371,19 @@ e_book_shell_content_register_type (GTypeModule *type_module) NULL /* value_table */ }; - book_shell_view_type = g_type_module_register_type ( + static const GInterfaceInfo orientable_info = { + (GInterfaceInitFunc) NULL, + (GInterfaceFinalizeFunc) NULL, + NULL /* interface_data */ + }; + + book_shell_content_type = g_type_module_register_type ( type_module, E_TYPE_SHELL_CONTENT, "EBookShellContent", &type_info, 0); + + g_type_module_add_interface ( + type_module, book_shell_content_type, + GTK_TYPE_ORIENTABLE, &orientable_info); } GtkWidget * @@ -434,34 +498,19 @@ e_book_shell_content_set_preview_contact (EBookShellContent *book_shell_content, gboolean e_book_shell_content_get_preview_visible (EBookShellContent *book_shell_content) { - GtkPaned *paned; - GtkWidget *child; - g_return_val_if_fail ( E_IS_BOOK_SHELL_CONTENT (book_shell_content), FALSE); - paned = GTK_PANED (book_shell_content->priv->paned); - child = gtk_paned_get_child2 (paned); - - return GTK_WIDGET_VISIBLE (child); + return book_shell_content->priv->preview_visible; } void e_book_shell_content_set_preview_visible (EBookShellContent *book_shell_content, gboolean preview_visible) { - GtkPaned *paned; - GtkWidget *child; - g_return_if_fail (E_IS_BOOK_SHELL_CONTENT (book_shell_content)); - paned = GTK_PANED (book_shell_content->priv->paned); - child = gtk_paned_get_child2 (paned); - - if (preview_visible) - gtk_widget_show (child); - else - gtk_widget_hide (child); + book_shell_content->priv->preview_visible = preview_visible; g_object_notify (G_OBJECT (book_shell_content), "preview-visible"); } diff --git a/modules/addressbook/e-book-shell-view-actions.c b/modules/addressbook/e-book-shell-view-actions.c index 4515207ed4..c2195e52de 100644 --- a/modules/addressbook/e-book-shell-view-actions.c +++ b/modules/addressbook/e-book-shell-view-actions.c @@ -533,6 +533,32 @@ action_contact_send_message_cb (GtkAction *action, g_list_free (list); } +static void +action_contact_view_cb (GtkRadioAction *action, + GtkRadioAction *current, + EBookShellView *book_shell_view) +{ + EBookShellContent *book_shell_content; + GtkOrientable *orientable; + GtkOrientation orientation; + + book_shell_content = book_shell_view->priv->book_shell_content; + orientable = GTK_ORIENTABLE (book_shell_content); + + switch (gtk_radio_action_get_current_value (action)) { + case 0: + orientation = GTK_ORIENTATION_VERTICAL; + break; + case 1: + orientation = GTK_ORIENTATION_HORIZONTAL; + break; + default: + g_return_if_reached (); + } + + gtk_orientable_set_orientation (orientable, orientation); +} + static void action_gal_save_custom_view_cb (GtkAction *action, EBookShellView *book_shell_view) @@ -736,11 +762,18 @@ static GtkActionEntry contact_entries[] = { /*** Menus ***/ - { "actions-menu", + { "contact-actions-menu", NULL, N_("_Actions"), NULL, NULL, + NULL }, + + { "contact-preview-menu", + NULL, + N_("_Preview"), + NULL, + NULL, NULL } }; @@ -814,6 +847,33 @@ static GtkToggleActionEntry contact_toggle_entries[] = { TRUE } }; +static GtkRadioActionEntry contact_view_entries[] = { + + /* This action represents the initial active contact view. + * It should not be visible in the UI, nor should it be + * possible to switch to it from another shell view. */ + { "contact-view-initial", + NULL, + NULL, + NULL, + NULL, + -1 }, + + { "contact-view-classic", + NULL, + N_("_Classic View"), + NULL, + N_("Show contact preview below the contact list"), + 0 }, + + { "contact-view-vertical", + NULL, + N_("_Vertical View"), + NULL, + N_("Show contact preview alongside the contact list"), + 1 } +}; + static GtkRadioActionEntry contact_filter_entries[] = { { "contact-filter-any-category", @@ -904,6 +964,10 @@ e_book_shell_view_actions_init (EBookShellView *book_shell_view) gtk_action_group_add_toggle_actions ( action_group, contact_toggle_entries, G_N_ELEMENTS (contact_toggle_entries), book_shell_view); + gtk_action_group_add_radio_actions ( + action_group, contact_view_entries, + G_N_ELEMENTS (contact_view_entries), -1, + G_CALLBACK (action_contact_view_cb), book_shell_view); gtk_action_group_add_radio_actions ( action_group, contact_search_entries, G_N_ELEMENTS (contact_search_entries), @@ -927,6 +991,10 @@ e_book_shell_view_actions_init (EBookShellView *book_shell_view) key = "/apps/evolution/addressbook/display/show_preview"; gconf_bridge_bind_property (bridge, key, object, "active"); + object = G_OBJECT (ACTION (CONTACT_VIEW_VERTICAL)); + key = "/apps/evolution/addressbook/display/layout"; + gconf_bridge_bind_property (bridge, key, object, "current-value"); + /* Fine tuning. */ action = ACTION (CONTACT_DELETE); diff --git a/modules/addressbook/e-book-shell-view-actions.h b/modules/addressbook/e-book-shell-view-actions.h index 8e3d31f7bf..4c3a18bddf 100644 --- a/modules/addressbook/e-book-shell-view-actions.h +++ b/modules/addressbook/e-book-shell-view-actions.h @@ -73,6 +73,10 @@ E_SHELL_WINDOW_ACTION ((window), "contact-select-all") #define E_SHELL_WINDOW_ACTION_CONTACT_SEND_MESSAGE(window) \ E_SHELL_WINDOW_ACTION ((window), "contact-send-message") +#define E_SHELL_WINDOW_ACTION_CONTACT_VIEW_CLASSIC(window) \ + E_SHELL_WINDOW_ACTION ((window), "contact-view-classic") +#define E_SHELL_WINDOW_ACTION_CONTACT_VIEW_VERTICAL(window) \ + E_SHELL_WINDOW_ACTION ((window), "contact-view-vertical") /* Search Actions */ #define E_SHELL_WINDOW_ACTION_CONTACT_SEARCH_ANY_FIELD_CONTAINS(window) \ diff --git a/ui/evolution-contacts.ui b/ui/evolution-contacts.ui index 6d42ee0ae2..cf95acd4a0 100644 --- a/ui/evolution-contacts.ui +++ b/ui/evolution-contacts.ui @@ -24,10 +24,17 @@ - + + + + + + + + - + -- cgit v1.2.3