[gtk+] GtkScaleButton: Try harder not to pop over
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] GtkScaleButton: Try harder not to pop over
- Date: Fri, 4 Jul 2014 05:20:35 +0000 (UTC)
commit d9e475ed6a2ceac38b565123a3091508944eec37
Author: Matthias Clasen <mclasen redhat com>
Date: Fri Jul 4 01:06:31 2014 -0400
GtkScaleButton: Try harder not to pop over
When the popover does fit in the window, change the orientation
to make it fit.
gtk/gtkscalebutton.c | 54 +++++++++++++++++++++++++++++++++++++------------
1 files changed, 41 insertions(+), 13 deletions(-)
---
diff --git a/gtk/gtkscalebutton.c b/gtk/gtkscalebutton.c
index c8479ea..11aee50 100644
--- a/gtk/gtkscalebutton.c
+++ b/gtk/gtkscalebutton.c
@@ -54,6 +54,7 @@
#include "gtkscale.h"
#include "gtkbox.h"
#include "gtkwindow.h"
+#include "gtkwindowprivate.h"
#include "gtktypebuiltins.h"
#include "gtkintl.h"
#include "a11y/gtkscalebuttonaccessible.h"
@@ -105,6 +106,7 @@ struct _GtkScaleButtonPrivate
GtkIconSize size;
GtkOrientation orientation;
+ GtkOrientation applied_orientation;
guint click_id;
@@ -350,6 +352,7 @@ gtk_scale_button_init (GtkScaleButton *button)
priv->click_id = 0;
priv->orientation = GTK_ORIENTATION_VERTICAL;
+ priv->applied_orientation = GTK_ORIENTATION_VERTICAL;
gtk_widget_init_template (GTK_WIDGET (button));
gtk_popover_set_relative_to (GTK_POPOVER (priv->dock), GTK_WIDGET (button));
@@ -709,17 +712,15 @@ gtk_scale_button_get_popup (GtkScaleButton *button)
}
static void
-gtk_scale_button_set_orientation_private (GtkScaleButton *button,
- GtkOrientation orientation)
+apply_orientation (GtkScaleButton *button,
+ GtkOrientation orientation)
{
GtkScaleButtonPrivate *priv = button->priv;
- if (orientation != priv->orientation)
+ if (priv->applied_orientation != orientation)
{
- priv->orientation = orientation;
-
- gtk_orientable_set_orientation (GTK_ORIENTABLE (priv->box),
- orientation);
+ priv->applied_orientation = orientation;
+ gtk_orientable_set_orientation (GTK_ORIENTABLE (priv->box), orientation);
gtk_container_child_set (GTK_CONTAINER (priv->box),
priv->plus_button,
"pack-type",
@@ -733,22 +734,30 @@ gtk_scale_button_set_orientation_private (GtkScaleButton *button,
GTK_PACK_END : GTK_PACK_START,
NULL);
- gtk_orientable_set_orientation (GTK_ORIENTABLE (priv->scale),
- orientation);
+ gtk_orientable_set_orientation (GTK_ORIENTABLE (priv->scale), orientation);
if (orientation == GTK_ORIENTATION_VERTICAL)
{
- gtk_widget_set_size_request (GTK_WIDGET (priv->scale),
- -1, SCALE_SIZE);
+ gtk_widget_set_size_request (GTK_WIDGET (priv->scale), -1, SCALE_SIZE);
gtk_range_set_inverted (GTK_RANGE (priv->scale), TRUE);
}
else
{
- gtk_widget_set_size_request (GTK_WIDGET (priv->scale),
- SCALE_SIZE, -1);
+ gtk_widget_set_size_request (GTK_WIDGET (priv->scale), SCALE_SIZE, -1);
gtk_range_set_inverted (GTK_RANGE (priv->scale), FALSE);
}
+ }
+}
+
+static void
+gtk_scale_button_set_orientation_private (GtkScaleButton *button,
+ GtkOrientation orientation)
+{
+ GtkScaleButtonPrivate *priv = button->priv;
+ if (priv->orientation != orientation)
+ {
+ priv->orientation = orientation;
g_object_notify (G_OBJECT (button), "orientation");
}
}
@@ -796,9 +805,28 @@ gtk_scale_popup (GtkWidget *widget)
{
GtkScaleButton *button = GTK_SCALE_BUTTON (widget);
GtkScaleButtonPrivate *priv = button->priv;
+ GtkWidget *toplevel;
+ GtkBorder border;
+ GtkRequisition req;
+ gint w, h;
+ gint size;
gtk_widget_show (priv->dock);
+ toplevel = gtk_widget_get_toplevel (widget);
+ _gtk_window_get_shadow_width (GTK_WINDOW (toplevel), &border);
+ w = gtk_widget_get_allocated_width (toplevel) - border.left - border.right;
+ h = gtk_widget_get_allocated_height (toplevel) - border.top - border.bottom;
+ gtk_widget_get_preferred_size (priv->dock, NULL, &req);
+ size = MAX (req.width, req.height);
+
+ if (size > w)
+ apply_orientation (button, GTK_ORIENTATION_VERTICAL);
+ else if (size > h)
+ apply_orientation (button, GTK_ORIENTATION_HORIZONTAL);
+ else
+ apply_orientation (button, priv->orientation);
+
return TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]