From a29cf74e05caf084b91973371a619cb5b09625ec Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 30 Mar 2023 06:58:40 +0200 Subject: [PATCH] columnviewcellwidget: Rewrite width unadjusting Use GtkCssBoxes for that purpose. No more scary CSS math necessary in the widget. --- gtk/gtkcolumnviewcellwidget.c | 37 ++++++++++----------------------- gtk/gtkcolumnviewtitle.c | 39 +++++++++++------------------------ 2 files changed, 23 insertions(+), 53 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" @@ -72,35 +72,20 @@ gtk_column_view_cell_widget_teardown_object (GtkListFactoryWidget *fw, gtk_widget_set_focusable (GTK_WIDGET (fw), FALSE); } -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; + GtkCssBoxes boxes; - 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; + if (width <= -1) + return -1; - return MAX (0, width - widget_margins - css_extra); + 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 { @@ -54,35 +54,20 @@ 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; + GtkCssBoxes boxes; - 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; + if (width <= -1) + return -1; - return MAX (0, width - widget_margins - css_extra); + 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)