aboutsummaryrefslogtreecommitdiffstats
path: root/widgets
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2011-09-04 23:45:25 +0800
committerMatthew Barnes <mbarnes@redhat.com>2011-10-06 20:16:21 +0800
commit0e064de971dd8b5e565558cd14efdca8ae4dbcb0 (patch)
tree12e8b8975e524abeed91c6612834f7499c59cadf /widgets
parent224f26b84d9c12b0dd1d337f51c14b6ebb901007 (diff)
downloadgsoc2013-evolution-0e064de971dd8b5e565558cd14efdca8ae4dbcb0.tar
gsoc2013-evolution-0e064de971dd8b5e565558cd14efdca8ae4dbcb0.tar.gz
gsoc2013-evolution-0e064de971dd8b5e565558cd14efdca8ae4dbcb0.tar.bz2
gsoc2013-evolution-0e064de971dd8b5e565558cd14efdca8ae4dbcb0.tar.lz
gsoc2013-evolution-0e064de971dd8b5e565558cd14efdca8ae4dbcb0.tar.xz
gsoc2013-evolution-0e064de971dd8b5e565558cd14efdca8ae4dbcb0.tar.zst
gsoc2013-evolution-0e064de971dd8b5e565558cd14efdca8ae4dbcb0.zip
EAttachmentPaned: Add "resize-toplevel" property.
Similiar to the new GtkExpander:resize-toplevel property in GTK+ 3.2, but adapted to the fact that EAttachmentPaned's expander has no direct child widget, and instead acts on the child widget in the lower pane. CompEditor now uses this to fix the weird vertical resizing behavior when its attachment bar is expanded and then collapsed again.
Diffstat (limited to 'widgets')
-rw-r--r--widgets/misc/e-attachment-paned.c122
-rw-r--r--widgets/misc/e-attachment-paned.h5
2 files changed, 114 insertions, 13 deletions
diff --git a/widgets/misc/e-attachment-paned.c b/widgets/misc/e-attachment-paned.c
index b842aecf8d..2903c84227 100644
--- a/widgets/misc/e-attachment-paned.c
+++ b/widgets/misc/e-attachment-paned.c
@@ -53,7 +53,8 @@ struct _EAttachmentPanedPrivate {
GtkWidget *content_area;
gint active_view;
- guint expanded : 1;
+ gboolean expanded;
+ gboolean resize_toplevel;
};
enum {
@@ -61,7 +62,8 @@ enum {
PROP_ACTIVE_VIEW,
PROP_DRAGGING,
PROP_EDITABLE,
- PROP_EXPANDED
+ PROP_EXPANDED,
+ PROP_RESIZE_TOPLEVEL
};
/* Forward Declarations */
@@ -87,6 +89,9 @@ attachment_paned_notify_cb (EAttachmentPaned *paned,
GParamSpec *pspec,
GtkExpander *expander)
{
+ GtkAllocation toplevel_allocation;
+ GtkWidget *toplevel;
+ GtkWidget *child;
GtkLabel *label;
const gchar *text;
@@ -99,6 +104,47 @@ attachment_paned_notify_cb (EAttachmentPaned *paned,
text = _("Show Attachment _Bar");
gtk_label_set_text_with_mnemonic (label, text);
+
+ /* Resize the top-level window if required conditions are met.
+ * This is based on gtk_expander_resize_toplevel(), but adapted
+ * to the fact our GtkExpander has no direct child widget. */
+
+ if (!e_attachment_paned_get_resize_toplevel (paned))
+ return;
+
+ if (!gtk_widget_get_realized (GTK_WIDGET (paned)))
+ return;
+
+ child = gtk_paned_get_child2 (GTK_PANED (paned));
+ toplevel = gtk_widget_get_toplevel (GTK_WIDGET (paned));
+
+ if (toplevel == NULL)
+ return;
+
+ if (!gtk_widget_get_realized (GTK_WIDGET (toplevel)))
+ return;
+
+ gtk_widget_get_allocation (toplevel, &toplevel_allocation);
+
+ if (gtk_expander_get_expanded (expander)) {
+ GtkRequisition child_requisition;
+
+ gtk_widget_get_preferred_size (
+ child, &child_requisition, NULL);
+
+ toplevel_allocation.height += child_requisition.height;
+ } else {
+ GtkAllocation child_allocation;
+
+ gtk_widget_get_allocation (child, &child_allocation);
+
+ toplevel_allocation.height -= child_allocation.height;
+ }
+
+ gtk_window_resize (
+ GTK_WINDOW (toplevel),
+ toplevel_allocation.width,
+ toplevel_allocation.height);
}
static void
@@ -177,6 +223,12 @@ attachment_paned_set_property (GObject *object,
E_ATTACHMENT_PANED (object),
g_value_get_boolean (value));
return;
+
+ case PROP_RESIZE_TOPLEVEL:
+ e_attachment_paned_set_resize_toplevel (
+ E_ATTACHMENT_PANED (object),
+ g_value_get_boolean (value));
+ return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -191,25 +243,36 @@ attachment_paned_get_property (GObject *object,
switch (property_id) {
case PROP_ACTIVE_VIEW:
g_value_set_int (
- value, e_attachment_paned_get_active_view (
+ value,
+ e_attachment_paned_get_active_view (
E_ATTACHMENT_PANED (object)));
return;
case PROP_DRAGGING:
g_value_set_boolean (
- value, e_attachment_view_get_dragging (
+ value,
+ e_attachment_view_get_dragging (
E_ATTACHMENT_VIEW (object)));
return;
case PROP_EDITABLE:
g_value_set_boolean (
- value, e_attachment_view_get_editable (
+ value,
+ e_attachment_view_get_editable (
E_ATTACHMENT_VIEW (object)));
return;
case PROP_EXPANDED:
g_value_set_boolean (
- value, e_attachment_paned_get_expanded (
+ value,
+ e_attachment_paned_get_expanded (
+ E_ATTACHMENT_PANED (object)));
+ return;
+
+ case PROP_RESIZE_TOPLEVEL:
+ g_value_set_boolean (
+ value,
+ e_attachment_paned_get_resize_toplevel (
E_ATTACHMENT_PANED (object)));
return;
}
@@ -494,7 +557,14 @@ e_attachment_paned_class_init (EAttachmentPanedClass *class)
NUM_VIEWS,
0,
G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT));
+ G_PARAM_CONSTRUCT |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_override_property (
+ object_class, PROP_DRAGGING, "dragging");
+
+ g_object_class_override_property (
+ object_class, PROP_EDITABLE, "editable");
g_object_class_install_property (
object_class,
@@ -505,13 +575,20 @@ e_attachment_paned_class_init (EAttachmentPanedClass *class)
NULL,
FALSE,
G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT));
-
- g_object_class_override_property (
- object_class, PROP_DRAGGING, "dragging");
+ G_PARAM_CONSTRUCT |
+ G_PARAM_STATIC_STRINGS));
- g_object_class_override_property (
- object_class, PROP_EDITABLE, "editable");
+ g_object_class_install_property (
+ object_class,
+ PROP_RESIZE_TOPLEVEL,
+ g_param_spec_boolean (
+ "resize-toplevel",
+ "Resize-Toplevel",
+ NULL,
+ FALSE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT |
+ G_PARAM_STATIC_STRINGS));
}
static void
@@ -768,6 +845,25 @@ e_attachment_paned_set_expanded (EAttachmentPaned *paned,
g_object_notify (G_OBJECT (paned), "expanded");
}
+gboolean
+e_attachment_paned_get_resize_toplevel (EAttachmentPaned *paned)
+{
+ g_return_val_if_fail (E_IS_ATTACHMENT_PANED (paned), FALSE);
+
+ return paned->priv->resize_toplevel;
+}
+
+void
+e_attachment_paned_set_resize_toplevel (EAttachmentPaned *paned,
+ gboolean resize_toplevel)
+{
+ g_return_if_fail (E_IS_ATTACHMENT_PANED (paned));
+
+ paned->priv->resize_toplevel = resize_toplevel;
+
+ g_object_notify (G_OBJECT (paned), "resize-toplevel");
+}
+
void
e_attachment_paned_drag_data_received (EAttachmentPaned *paned,
GdkDragContext *context,
diff --git a/widgets/misc/e-attachment-paned.h b/widgets/misc/e-attachment-paned.h
index a9022a7bc6..7daffd5508 100644
--- a/widgets/misc/e-attachment-paned.h
+++ b/widgets/misc/e-attachment-paned.h
@@ -70,6 +70,11 @@ void e_attachment_paned_set_active_view
gboolean e_attachment_paned_get_expanded (EAttachmentPaned *paned);
void e_attachment_paned_set_expanded (EAttachmentPaned *paned,
gboolean expanded);
+gboolean e_attachment_paned_get_resize_toplevel
+ (EAttachmentPaned *paned);
+void e_attachment_paned_set_resize_toplevel
+ (EAttachmentPaned *paned,
+ gboolean resize_toplevel);
void e_attachment_paned_drag_data_received
(EAttachmentPaned *paned,
GdkDragContext *context,