summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2023-03-30 06:58:40 +0200
committerBenjamin Otte <otte@redhat.com>2023-04-01 20:49:40 +0200
commita29cf74e05caf084b91973371a619cb5b09625ec (patch)
tree4244f1dee37f0671682bec5a92ae3b5ebd49b461
parentc760131f6ff99cc5db7c5327e5475cbabf8b3efa (diff)
downloadgtk+-a29cf74e05caf084b91973371a619cb5b09625ec.tar.gz
columnviewcellwidget: Rewrite width unadjusting
Use GtkCssBoxes for that purpose. No more scary CSS math necessary in the widget.
-rw-r--r--gtk/gtkcolumnviewcellwidget.c41
-rw-r--r--gtk/gtkcolumnviewtitle.c43
2 files changed, 27 insertions, 57 deletions
diff --git a/gtk/gtkcolumnviewcellwidget.c b/gtk/gtkcolumnviewcellwidget.c
index 7464a3c3f6..ecbc2806d6 100644
--- a/gtk/gtkcolumnviewcellwidget.c
+++ b/gtk/gtkcolumnviewcellwidget.c
@@ -23,8 +23,8 @@
#include "gtkcolumnviewcolumnprivate.h"
#include "gtkcolumnviewrowwidgetprivate.h"
+#include "gtkcssboxesprivate.h"
#include "gtkcssnodeprivate.h"
-#include "gtkcssnumbervalueprivate.h"
#include "gtklistitemprivate.h"
#include "gtklistitemwidgetprivate.h"
#include "gtkprivate.h"
@@ -73,34 +73,19 @@ gtk_column_view_cell_widget_teardown_object (GtkListFactoryWidget *fw,
}
static int
-get_number (GtkCssValue *value)
-{
- double d = _gtk_css_number_value_get (value, 100);
-
- if (d < 1)
- return ceil (d);
- else
- return floor (d);
-}
-
-static int
unadjust_width (GtkWidget *widget,
int width)
{
- GtkCssStyle *style;
- int widget_margins;
- int css_extra;
-
- style = gtk_css_node_get_style (gtk_widget_get_css_node (widget));
- css_extra = get_number (style->size->margin_left) +
- get_number (style->size->margin_right) +
- get_number (style->border->border_left_width) +
- get_number (style->border->border_right_width) +
- get_number (style->size->padding_left) +
- get_number (style->size->padding_right);
- widget_margins = widget->priv->margin.left + widget->priv->margin.right;
-
- return MAX (0, width - widget_margins - css_extra);
+ GtkCssBoxes boxes;
+
+ if (width <= -1)
+ return -1;
+
+ gtk_css_boxes_init_border_box (&boxes,
+ gtk_css_node_get_style (gtk_widget_get_css_node (widget)),
+ 0, 0,
+ width, 100000);
+ return MAX (0, floor (gtk_css_boxes_get_content_rect (&boxes)->size.width));
}
static void
@@ -114,9 +99,9 @@ gtk_column_view_cell_widget_measure (GtkWidget *widget,
{
GtkColumnViewCellWidget *cell = GTK_COLUMN_VIEW_CELL_WIDGET (widget);
GtkWidget *child = gtk_widget_get_first_child (widget);
- int fixed_width = gtk_column_view_column_get_fixed_width (cell->column);
- int unadj_width;
+ int fixed_width, unadj_width;
+ fixed_width = gtk_column_view_column_get_fixed_width (cell->column);
unadj_width = unadjust_width (widget, fixed_width);
if (orientation == GTK_ORIENTATION_VERTICAL)
diff --git a/gtk/gtkcolumnviewtitle.c b/gtk/gtkcolumnviewtitle.c
index 6c7f729f95..b55e980821 100644
--- a/gtk/gtkcolumnviewtitle.c
+++ b/gtk/gtkcolumnviewtitle.c
@@ -24,6 +24,8 @@
#include "gtkcolumnviewprivate.h"
#include "gtkcolumnviewcolumnprivate.h"
#include "gtkcolumnviewsorterprivate.h"
+#include "gtkcssboxesprivate.h"
+#include "gtkcssnodeprivate.h"
#include "gtkprivate.h"
#include "gtklabel.h"
#include "gtkwidgetprivate.h"
@@ -32,8 +34,6 @@
#include "gtkgestureclick.h"
#include "gtkpopovermenu.h"
#include "gtknative.h"
-#include "gtkcssnodeprivate.h"
-#include "gtkcssnumbervalueprivate.h"
struct _GtkColumnViewTitle
{
@@ -55,34 +55,19 @@ struct _GtkColumnViewTitleClass
G_DEFINE_TYPE (GtkColumnViewTitle, gtk_column_view_title, GTK_TYPE_WIDGET)
static int
-get_number (GtkCssValue *value)
-{
- double d = _gtk_css_number_value_get (value, 100);
-
- if (d < 1)
- return ceil (d);
- else
- return floor (d);
-}
-
-static int
unadjust_width (GtkWidget *widget,
int width)
{
- GtkCssStyle *style;
- int widget_margins;
- int css_extra;
-
- style = gtk_css_node_get_style (gtk_widget_get_css_node (widget));
- css_extra = get_number (style->size->margin_left) +
- get_number (style->size->margin_right) +
- get_number (style->border->border_left_width) +
- get_number (style->border->border_right_width) +
- get_number (style->size->padding_left) +
- get_number (style->size->padding_right);
- widget_margins = widget->priv->margin.left + widget->priv->margin.right;
-
- return MAX (0, width - widget_margins - css_extra);
+ GtkCssBoxes boxes;
+
+ if (width <= -1)
+ return -1;
+
+ gtk_css_boxes_init_border_box (&boxes,
+ gtk_css_node_get_style (gtk_widget_get_css_node (widget)),
+ 0, 0,
+ width, 100000);
+ return MAX (0, floor (gtk_css_boxes_get_content_rect (&boxes)->size.width));
}
static void
@@ -96,9 +81,9 @@ gtk_column_view_title_measure (GtkWidget *widget,
{
GtkColumnViewTitle *self = GTK_COLUMN_VIEW_TITLE (widget);
GtkWidget *child = gtk_widget_get_first_child (widget);
- int fixed_width = gtk_column_view_column_get_fixed_width (self->column);
- int unadj_width;
+ int fixed_width, unadj_width;
+ fixed_width = gtk_column_view_column_get_fixed_width (self->column);
unadj_width = unadjust_width (widget, fixed_width);
if (orientation == GTK_ORIENTATION_VERTICAL)