entry: Move spinbutton size hack

If we want to do special sizing for the text, we need to do it for the
text. Otherwise paddings, borders and entyr icons will screw up
everything.
This commit is contained in:
Benjamin Otte 2016-01-25 15:42:18 +01:00
parent 02fab14b3b
commit 3982f05be4
3 changed files with 44 additions and 34 deletions

View File

@ -148,7 +148,6 @@
* .insertion-cursor. * .insertion-cursor.
*/ */
#define MIN_ENTRY_WIDTH 150 #define MIN_ENTRY_WIDTH 150
#define MAX_ICONS 2 #define MAX_ICONS 2
@ -3509,12 +3508,19 @@ gtk_entry_measure (GtkCssGadget *gadget,
char_pixels = (MAX (char_width, digit_width) + PANGO_SCALE - 1) / PANGO_SCALE; char_pixels = (MAX (char_width, digit_width) + PANGO_SCALE - 1) / PANGO_SCALE;
if (priv->width_chars < 0) if (priv->width_chars < 0)
min = MIN_ENTRY_WIDTH; {
if (GTK_IS_SPIN_BUTTON (entry))
min = gtk_spin_button_get_text_width (GTK_SPIN_BUTTON (entry));
else
min = MIN_ENTRY_WIDTH;
}
else else
min = char_pixels * priv->width_chars; {
min = char_pixels * priv->width_chars;
}
if (priv->max_width_chars < 0) if (priv->max_width_chars < 0)
nat = MIN_ENTRY_WIDTH; nat = min;
else else
nat = char_pixels * priv->max_width_chars; nat = char_pixels * priv->max_width_chars;

View File

@ -24,6 +24,7 @@
#include <gtk/gtkentrycompletion.h> #include <gtk/gtkentrycompletion.h>
#include <gtk/gtkentry.h> #include <gtk/gtkentry.h>
#include <gtk/gtkcssgadgetprivate.h> #include <gtk/gtkcssgadgetprivate.h>
#include <gtk/gtkspinbutton.h>
G_BEGIN_DECLS G_BEGIN_DECLS
@ -91,6 +92,9 @@ GtkCssGadget* gtk_entry_get_gadget (GtkEntry *entry);
void _gtk_entry_grab_focus (GtkEntry *entry, void _gtk_entry_grab_focus (GtkEntry *entry,
gboolean select_all); gboolean select_all);
/* in gtkspinbutton.c (because I'm too lazy to create gtkspinbuttonprivate.h) */
gint gtk_spin_button_get_text_width (GtkSpinButton *spin_button);
G_END_DECLS G_END_DECLS
#endif /* __GTK_ENTRY_PRIVATE_H__ */ #endif /* __GTK_ENTRY_PRIVATE_H__ */

View File

@ -1185,6 +1185,36 @@ gtk_spin_button_format_for_value (GtkSpinButton *spin_button,
return buf; return buf;
} }
gint
gtk_spin_button_get_text_width (GtkSpinButton *spin_button)
{
GtkSpinButtonPrivate *priv = spin_button->priv;
gint width, w;
PangoLayout *layout;
gchar *str;
layout = pango_layout_copy (gtk_entry_get_layout (GTK_ENTRY (spin_button)));
/* Get max of MIN_SPIN_BUTTON_WIDTH, size of upper, size of lower */
width = MIN_SPIN_BUTTON_WIDTH;
str = gtk_spin_button_format_for_value (spin_button,
gtk_adjustment_get_upper (priv->adjustment));
w = measure_string_width (layout, str);
width = MAX (width, w);
g_free (str);
str = gtk_spin_button_format_for_value (spin_button,
gtk_adjustment_get_lower (priv->adjustment));
w = measure_string_width (layout, str);
width = MAX (width, w);
g_free (str);
g_object_unref (layout);
return width;
}
static void static void
gtk_spin_button_get_preferred_width (GtkWidget *widget, gtk_spin_button_get_preferred_width (GtkWidget *widget,
gint *minimum, gint *minimum,
@ -1192,39 +1222,9 @@ gtk_spin_button_get_preferred_width (GtkWidget *widget,
{ {
GtkSpinButton *spin_button = GTK_SPIN_BUTTON (widget); GtkSpinButton *spin_button = GTK_SPIN_BUTTON (widget);
GtkSpinButtonPrivate *priv = spin_button->priv; GtkSpinButtonPrivate *priv = spin_button->priv;
GtkEntry *entry = GTK_ENTRY (widget);
GTK_WIDGET_CLASS (gtk_spin_button_parent_class)->get_preferred_width (widget, minimum, natural); GTK_WIDGET_CLASS (gtk_spin_button_parent_class)->get_preferred_width (widget, minimum, natural);
if (gtk_entry_get_width_chars (entry) < 0)
{
gint width, w;
PangoLayout *layout;
gchar *str;
layout = pango_layout_copy (gtk_entry_get_layout (entry));
/* Get max of MIN_SPIN_BUTTON_WIDTH, size of upper, size of lower */
width = MIN_SPIN_BUTTON_WIDTH;
str = gtk_spin_button_format_for_value (spin_button,
gtk_adjustment_get_upper (priv->adjustment));
w = measure_string_width (layout, str);
width = MAX (width, w);
g_free (str);
str = gtk_spin_button_format_for_value (spin_button,
gtk_adjustment_get_lower (priv->adjustment));
w = measure_string_width (layout, str);
width = MAX (width, w);
g_free (str);
*minimum = width;
*natural = width;
g_object_unref (layout);
}
if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
{ {
gint down_panel_width; gint down_panel_width;