[gtk+/wip/css-is-awesome: 2/3] Add support for min-width, min-height, max-width and max-height
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/css-is-awesome: 2/3] Add support for min-width, min-height, max-width and max-height
- Date: Fri, 1 Nov 2013 18:58:53 +0000 (UTC)
commit 1354e4193ed68c9d372e72853d7ddcc9db0b21db
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Fri Nov 1 14:51:34 2013 -0400
Add support for min-width, min-height, max-width and max-height
Do this through the new helper classes. Yes, this means that if the
widget isn't using the new helper methods, it won't get constrainment
support... the price we pay for backwards compatibility...
gtk/gtkcssstylepropertyimpl.c | 43 +++++++++++++++++++++++++++++++
gtk/gtkcsstypesprivate.h | 4 +++
gtk/gtkwidget.c | 57 +++++++++++++++++++++++++++++++++++++++-
3 files changed, 102 insertions(+), 2 deletions(-)
---
diff --git a/gtk/gtkcssstylepropertyimpl.c b/gtk/gtkcssstylepropertyimpl.c
index 3ff3d76..a5c3b08 100644
--- a/gtk/gtkcssstylepropertyimpl.c
+++ b/gtk/gtkcssstylepropertyimpl.c
@@ -844,6 +844,16 @@ parse_border_width (GtkCssStyleProperty *property,
}
static GtkCssValue *
+parse_size (GtkCssStyleProperty *property,
+ GtkCssParser *parser)
+{
+ return _gtk_css_number_value_parse (parser,
+ GTK_CSS_POSITIVE_ONLY
+ | GTK_CSS_NUMBER_AS_PIXELS
+ | GTK_CSS_PARSE_LENGTH);
+}
+
+static GtkCssValue *
background_repeat_value_parse_one (GtkCssParser *parser)
{
GtkCssValue *value = _gtk_css_background_repeat_value_try_parse (parser);
@@ -975,6 +985,39 @@ _gtk_css_style_property_init_properties (void)
NULL,
_gtk_css_shadows_value_new_none ());
+ gtk_css_style_property_register ("min-width",
+ GTK_CSS_PROPERTY_MIN_WIDTH,
+ G_TYPE_INT,
+ GTK_STYLE_PROPERTY_ANIMATED,
+ parse_size,
+ query_length_as_int,
+ assign_length_from_int,
+ _gtk_css_number_value_new (0.0, GTK_CSS_PX));
+ gtk_css_style_property_register ("min-height",
+ GTK_CSS_PROPERTY_MIN_HEIGHT,
+ G_TYPE_INT,
+ GTK_STYLE_PROPERTY_ANIMATED,
+ parse_size,
+ query_length_as_int,
+ assign_length_from_int,
+ _gtk_css_number_value_new (0.0, GTK_CSS_PX));
+ gtk_css_style_property_register ("max-width",
+ GTK_CSS_PROPERTY_MAX_WIDTH,
+ G_TYPE_INT,
+ GTK_STYLE_PROPERTY_ANIMATED,
+ parse_size,
+ query_length_as_int,
+ assign_length_from_int,
+ _gtk_css_number_value_new (G_MAXUINT64, GTK_CSS_PX));
+ gtk_css_style_property_register ("max-height",
+ GTK_CSS_PROPERTY_MAX_HEIGHT,
+ G_TYPE_INT,
+ GTK_STYLE_PROPERTY_ANIMATED,
+ parse_size,
+ query_length_as_int,
+ assign_length_from_int,
+ _gtk_css_number_value_new (G_MAXUINT64, GTK_CSS_PX));
+
gtk_css_style_property_register ("margin-top",
GTK_CSS_PROPERTY_MARGIN_TOP,
G_TYPE_INT,
diff --git a/gtk/gtkcsstypesprivate.h b/gtk/gtkcsstypesprivate.h
index 72511d9..1d0424a 100644
--- a/gtk/gtkcsstypesprivate.h
+++ b/gtk/gtkcsstypesprivate.h
@@ -82,6 +82,10 @@ enum { /*< skip >*/
GTK_CSS_PROPERTY_TEXT_SHADOW,
GTK_CSS_PROPERTY_ICON_SHADOW,
GTK_CSS_PROPERTY_BOX_SHADOW,
+ GTK_CSS_PROPERTY_MIN_WIDTH,
+ GTK_CSS_PROPERTY_MIN_HEIGHT,
+ GTK_CSS_PROPERTY_MAX_WIDTH,
+ GTK_CSS_PROPERTY_MAX_HEIGHT,
GTK_CSS_PROPERTY_MARGIN_TOP,
GTK_CSS_PROPERTY_MARGIN_LEFT,
GTK_CSS_PROPERTY_MARGIN_BOTTOM,
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index f6494ad..958056f 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -16030,6 +16030,42 @@ get_height_inc (GtkStyleContext *context)
_gtk_css_number_value_get (_gtk_style_context_peek_property (context,
GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH), 0));
}
+static void
+constrain_width (GtkStyleContext *context,
+ int *width)
+{
+ int min_width, max_width;
+
+ if (!width)
+ return;
+
+ min_width = _gtk_css_number_value_get (_gtk_style_context_peek_property (context,
GTK_CSS_PROPERTY_MIN_WIDTH), 0);
+ max_width = _gtk_css_number_value_get (_gtk_style_context_peek_property (context,
GTK_CSS_PROPERTY_MAX_WIDTH), 0);
+
+ if (*width < min_width)
+ *width = min_width;
+ if (*width > max_width)
+ *width = max_width;
+}
+
+static void
+constrain_height (GtkStyleContext *context,
+ int *height)
+{
+ int min_height, max_height;
+
+ if (!height)
+ return;
+
+ min_height = _gtk_css_number_value_get (_gtk_style_context_peek_property (context,
GTK_CSS_PROPERTY_MIN_HEIGHT), 0);
+ max_height = _gtk_css_number_value_get (_gtk_style_context_peek_property (context,
GTK_CSS_PROPERTY_MAX_HEIGHT), 0);
+
+ if (*height < min_height)
+ *height = min_height;
+ if (*height > max_height)
+ *height = max_height;
+}
+
/**
* _gtk_widget_get_context_box:
* @context: A #GtkWidget
@@ -16058,8 +16094,19 @@ _gtk_widget_get_content_box (GtkWidget *widget,
content_box->y = (_gtk_css_number_value_get (_gtk_style_context_peek_property (context,
GTK_CSS_PROPERTY_PADDING_TOP), 0) +
_gtk_css_number_value_get (_gtk_style_context_peek_property (context,
GTK_CSS_PROPERTY_BORDER_TOP_WIDTH), 0));
- content_box->width = MAX (box->width - get_width_inc (context), 0);
- content_box->height = MAX (box->height - get_height_inc (context), 0);
+ content_box->width = box->width;
+ content_box->height = box->height;
+
+ constrain_width (&content_box->width);
+ constrain_height (&content_box->height);
+
+ content_box->width -= get_width_inc (context);
+ content_box->height -= get_height_inc (context);
+
+ if (content_box->width < 0)
+ content_box->width = 0;
+ if (content_box->height < 0)
+ content_box->height = 0;
}
/**
@@ -16113,6 +16160,9 @@ _gtk_widget_adjust_preferred_width (GtkWidget *widget,
*minimum_width += width_inc;
if (natural_width)
*natural_width += width_inc;
+
+ constrain_width (minimum_width);
+ constrain_width (natural_width);
}
/**
@@ -16165,4 +16215,7 @@ _gtk_widget_adjust_preferred_height (GtkWidget *widget,
*minimum_height += height_inc;
if (natural_height)
*natural_height += height_inc;
+
+ constrain_width (minimum_height);
+ constrain_width (natural_height);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]