From e1efca844727d9dc06b9d721be8434c1ffaf3fa7 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Wed, 26 Aug 2009 18:51:47 -0400 Subject: Fix preview pane size persistance. The new packing style broke preview pane size restoration at startup. The fix is to store the size of the bottom GtkPaned child instead of the top child. Unfortunately GtkPaned does not make this easy. Will have to repeat this procedure for the other preview panes. --- modules/mail/e-mail-shell-content.c | 144 ++++++++++++++++++++++++++++++------ modules/mail/e-mail-shell-content.h | 5 ++ 2 files changed, 127 insertions(+), 22 deletions(-) (limited to 'modules/mail') diff --git a/modules/mail/e-mail-shell-content.c b/modules/mail/e-mail-shell-content.c index 436eaa4dfe..faa74473ac 100644 --- a/modules/mail/e-mail-shell-content.c +++ b/modules/mail/e-mail-shell-content.c @@ -72,6 +72,7 @@ struct _EMailShellContentPrivate { enum { PROP_0, + PROP_PREVIEW_SIZE, PROP_PREVIEW_VISIBLE, PROP_SHOW_DELETED, PROP_VERTICAL_VIEW @@ -80,6 +81,12 @@ enum { static gpointer parent_class; static GType mail_shell_content_type; +static void +mail_shell_content_notify_preview_size (EMailShellContent *mail_shell_content) +{ + g_object_notify (G_OBJECT (mail_shell_content), "preview-size"); +} + static void mail_shell_content_etree_unfreeze (MessageList *message_list, GdkEvent *event) @@ -316,6 +323,12 @@ mail_shell_content_set_property (GObject *object, GParamSpec *pspec) { switch (property_id) { + case PROP_PREVIEW_SIZE: + e_mail_shell_content_set_preview_size ( + E_MAIL_SHELL_CONTENT (object), + g_value_get_int (value)); + return; + case PROP_PREVIEW_VISIBLE: e_mail_shell_content_set_preview_visible ( E_MAIL_SHELL_CONTENT (object), @@ -345,6 +358,13 @@ mail_shell_content_get_property (GObject *object, GParamSpec *pspec) { switch (property_id) { + case PROP_PREVIEW_SIZE: + g_value_set_int ( + value, + e_mail_shell_content_get_preview_size ( + E_MAIL_SHELL_CONTENT (object))); + return; + case PROP_PREVIEW_VISIBLE: g_value_set_boolean ( value, @@ -445,6 +465,11 @@ mail_shell_content_constructed (GObject *object) priv->paned = g_object_ref (widget); gtk_widget_show (widget); + g_signal_connect_swapped ( + widget, "notify::position", + G_CALLBACK (mail_shell_content_notify_preview_size), + shell_content); + container = widget; widget = message_list_new (shell_backend); @@ -487,10 +512,6 @@ mail_shell_content_constructed (GObject *object) bridge = gconf_bridge_get (); - object = G_OBJECT (priv->paned); - key = "/apps/evolution/mail/display/paned_size"; - gconf_bridge_bind_property_delayed (bridge, key, object, "position"); - object = G_OBJECT (shell_content); key = "/apps/evolution/mail/display/show_deleted"; gconf_bridge_bind_property (bridge, key, object, "show-deleted"); @@ -506,6 +527,33 @@ mail_shell_content_constructed (GObject *object) shell_content); } +static void +mail_shell_content_size_allocate (GtkWidget *widget, + GtkAllocation *allocation) +{ + EMailShellContentPrivate *priv; + GConfBridge *bridge; + const gchar *key; + + priv = E_MAIL_SHELL_CONTENT_GET_PRIVATE (widget); + + /* Chain up to parent's size_allocate() method. */ + GTK_WIDGET_CLASS (parent_class)->size_allocate (widget, allocation); + + if (priv->paned_binding_id > 0) + return; + + bridge = gconf_bridge_get (); + + if (priv->vertical_view) + key = "/apps/evolution/mail/display/hpaned_size"; + else + key = "/apps/evolution/mail/display/paned_size"; + + priv->paned_binding_id = gconf_bridge_bind_property_delayed ( + bridge, key, G_OBJECT (widget), "preview-size"); +} + static guint32 mail_shell_content_check_state (EShellContent *shell_content) { @@ -642,6 +690,7 @@ static void mail_shell_content_class_init (EMailShellContentClass *class) { GObjectClass *object_class; + GtkWidgetClass *widget_class; EShellContentClass *shell_content_class; parent_class = g_type_class_peek_parent (class); @@ -653,10 +702,25 @@ mail_shell_content_class_init (EMailShellContentClass *class) object_class->dispose = mail_shell_content_dispose; object_class->constructed = mail_shell_content_constructed; + widget_class = GTK_WIDGET_CLASS (class); + widget_class->size_allocate = mail_shell_content_size_allocate; + shell_content_class = E_SHELL_CONTENT_CLASS (class); shell_content_class->new_search_context = em_search_context_new; shell_content_class->check_state = mail_shell_content_check_state; + g_object_class_install_property ( + object_class, + PROP_PREVIEW_SIZE, + g_param_spec_int ( + "preview-size", + _("Preview Size"), + _("Size of the preview pane in pixels"), + G_MININT, + G_MAXINT, + 100, + G_PARAM_READWRITE)); + g_object_class_install_property ( object_class, PROP_PREVIEW_VISIBLE, @@ -759,6 +823,53 @@ e_mail_shell_content_new (EShellView *shell_view) "shell-view", shell_view, NULL); } +gint +e_mail_shell_content_get_preview_size (EMailShellContent *mail_shell_content) +{ + GtkOrientable *orientable; + GtkOrientation orientation; + gint allocation; + gint position; + + g_return_val_if_fail ( + E_IS_MAIL_SHELL_CONTENT (mail_shell_content), 0); + + orientable = GTK_ORIENTABLE (mail_shell_content->priv->paned); + orientation = gtk_orientable_get_orientation (orientable); + + if (orientation == GTK_ORIENTATION_HORIZONTAL) + allocation = GTK_WIDGET (orientable)->allocation.width; + else + allocation = GTK_WIDGET (orientable)->allocation.height; + + position = gtk_paned_get_position (GTK_PANED (orientable)); + + return MAX (0, allocation - position); +} + +void +e_mail_shell_content_set_preview_size (EMailShellContent *mail_shell_content, + gint preview_size) +{ + GtkOrientable *orientable; + GtkOrientation orientation; + gint allocation; + gint position; + + g_return_if_fail (E_IS_MAIL_SHELL_CONTENT (mail_shell_content)); + + orientable = GTK_ORIENTABLE (mail_shell_content->priv->paned); + orientation = gtk_orientable_get_orientation (orientable); + + if (orientation == GTK_ORIENTATION_HORIZONTAL) + allocation = GTK_WIDGET (orientable)->allocation.width; + else + allocation = GTK_WIDGET (orientable)->allocation.height; + + position = MAX (0, allocation - preview_size); + gtk_paned_set_position (GTK_PANED (orientable), position); +} + gboolean e_mail_shell_content_get_preview_visible (EMailShellContent *mail_shell_content) { @@ -838,41 +949,30 @@ void e_mail_shell_content_set_vertical_view (EMailShellContent *mail_shell_content, gboolean vertical_view) { - GConfBridge *bridge; GtkOrientable *orientable; GtkOrientation orientation; - GtkWidget *paned; + GConfBridge *bridge; guint binding_id; - const gchar *key; g_return_if_fail (E_IS_MAIL_SHELL_CONTENT (mail_shell_content)); - if (vertical_view == mail_shell_content->priv->vertical_view) - return; - bridge = gconf_bridge_get (); - paned = mail_shell_content->priv->paned; binding_id = mail_shell_content->priv->paned_binding_id; - if (binding_id > 0) + if (binding_id > 0) { gconf_bridge_unbind (bridge, binding_id); + mail_shell_content->priv->paned_binding_id = 0; + } - if (vertical_view) { + if (vertical_view) orientation = GTK_ORIENTATION_HORIZONTAL; - key = "/apps/evolution/mail/display/hpaned_size"; - } else { + else orientation = GTK_ORIENTATION_VERTICAL; - key = "/apps/evolution/mail/display/paned_size"; - } - orientable = GTK_ORIENTABLE (paned); + orientable = GTK_ORIENTABLE (mail_shell_content->priv->paned); gtk_orientable_set_orientation (orientable, orientation); - binding_id = gconf_bridge_bind_property_delayed ( - bridge, key, G_OBJECT (paned), "position"); - mail_shell_content->priv->vertical_view = vertical_view; - mail_shell_content->priv->paned_binding_id = binding_id; e_mail_shell_content_update_view_instance (mail_shell_content); diff --git a/modules/mail/e-mail-shell-content.h b/modules/mail/e-mail-shell-content.h index 57d2438705..48a0f9e234 100644 --- a/modules/mail/e-mail-shell-content.h +++ b/modules/mail/e-mail-shell-content.h @@ -65,6 +65,11 @@ GType e_mail_shell_content_get_type (void); void e_mail_shell_content_register_type (GTypeModule *type_module); GtkWidget * e_mail_shell_content_new(EShellView *shell_view); +gint e_mail_shell_content_get_preview_size + (EMailShellContent *mail_shell_content); +void e_mail_shell_content_set_preview_size + (EMailShellContent *mail_shell_content, + gint preview_size); gboolean e_mail_shell_content_get_preview_visible (EMailShellContent *mail_shell_content); void e_mail_shell_content_set_preview_visible -- cgit v1.2.3