From d43aacefc971d8fc77d1d91ac98168966707256a Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 31 May 2020 21:07:38 -0400 Subject: [PATCH] columnview: Add GtkColumnViewColumn:fixed-width Add a fixed-width property similar to the same property of GtkTreeViewColumn. --- docs/reference/gtk/gtk4-sections.txt | 2 + gtk/gtkcolumnviewcell.c | 8 +++ gtk/gtkcolumnviewcolumn.c | 95 +++++++++++++++++++++++++++- gtk/gtkcolumnviewcolumn.h | 6 ++ gtk/gtkcolumnviewtitle.c | 8 +++ 5 files changed, 118 insertions(+), 1 deletion(-) diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt index 05011437d4..c88feaa21a 100644 --- a/docs/reference/gtk/gtk4-sections.txt +++ b/docs/reference/gtk/gtk4-sections.txt @@ -535,6 +535,8 @@ gtk_column_view_column_set_visible gtk_column_view_column_get_visible gtk_column_view_column_set_header_menu gtk_column_view_column_get_header_menu +gtk_column_view_column_set_fixed_width +gtk_column_view_column_get_fixed_width GTK_COLUMN_VIEW_COLUMN diff --git a/gtk/gtkcolumnviewcell.c b/gtk/gtkcolumnviewcell.c index 4efe269879..0b41719e54 100644 --- a/gtk/gtkcolumnviewcell.c +++ b/gtk/gtkcolumnviewcell.c @@ -53,10 +53,18 @@ gtk_column_view_cell_measure (GtkWidget *widget, int *minimum_baseline, int *natural_baseline) { + GtkColumnViewCell *cell = GTK_COLUMN_VIEW_CELL (widget); GtkWidget *child = gtk_widget_get_first_child (widget); if (child) gtk_widget_measure (child, orientation, for_size, minimum, natural, minimum_baseline, natural_baseline); + + if (orientation == GTK_ORIENTATION_HORIZONTAL) + { + int fixed_width = gtk_column_view_column_get_fixed_width (cell->column); + if (fixed_width > -1) + *minimum = *natural = fixed_width; + } } static void diff --git a/gtk/gtkcolumnviewcolumn.c b/gtk/gtkcolumnviewcolumn.c index d01cf0344e..fa0e0982bb 100644 --- a/gtk/gtkcolumnviewcolumn.c +++ b/gtk/gtkcolumnviewcolumn.c @@ -61,7 +61,9 @@ struct _GtkColumnViewColumn int allocation_offset; int allocation_size; - gboolean visible; + int fixed_width; + + guint visible : 1; GMenuModel *menu; @@ -83,6 +85,7 @@ enum PROP_SORTER, PROP_VISIBLE, PROP_HEADER_MENU, + PROP_FIXED_WIDTH, N_PROPS }; @@ -141,6 +144,10 @@ gtk_column_view_column_get_property (GObject *object, g_value_set_object (value, self->menu); break; + case PROP_FIXED_WIDTH: + g_value_set_int (value, self->fixed_width); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -177,6 +184,10 @@ gtk_column_view_column_set_property (GObject *object, gtk_column_view_column_set_header_menu (self, g_value_get_object (value)); break; + case PROP_FIXED_WIDTH: + gtk_column_view_column_set_fixed_width (self, g_value_get_int (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -264,6 +275,19 @@ gtk_column_view_column_class_init (GtkColumnViewColumnClass *klass) G_TYPE_MENU_MODEL, G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + /** + * GtkColumnViewColumn:fixed-width: + * + * If not -1, this is the width that the column is allocated, + * regardless of the size of its content. + */ + properties[PROP_FIXED_WIDTH] = + g_param_spec_int ("fixed-width", + P_("Fixed width"), + P_("Fixed width of this column"), + -1, G_MAXINT, -1, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (gobject_class, N_PROPS, properties); } @@ -273,6 +297,7 @@ gtk_column_view_column_init (GtkColumnViewColumn *self) self->minimum_size_request = -1; self->natural_size_request = -1; self->visible = TRUE; + self->fixed_width = -1; } /** @@ -382,6 +407,12 @@ gtk_column_view_column_measure (GtkColumnViewColumn *self, int *minimum, int *natural) { + if (self->fixed_width > -1) + { + self->minimum_size_request = self->fixed_width; + self->natural_size_request = self->fixed_width; + } + if (self->minimum_size_request < 0) { GtkColumnViewCell *cell; @@ -788,3 +819,65 @@ gtk_column_view_column_get_header_menu (GtkColumnViewColumn *self) return self->menu; } + +/** + * gtk_column_view_column_set_fixed_width: + * @self: a #GtkColumnViewColumn + * @fixed_width: the new fixed width, or -1 + * + * If @fixed_width is not -1, sets the fixed width of @column; + * otherwise unsets it. + * + * Setting a fixed width overrides the automatically calculated + * width. Interactive resizing also sets the “fixed-width” property. + */ +void +gtk_column_view_column_set_fixed_width (GtkColumnViewColumn *self, + int fixed_width) +{ + GtkOverflow overflow; + + g_return_if_fail (GTK_IS_COLUMN_VIEW_COLUMN (self)); + g_return_if_fail (fixed_width >= -1); + + if (self->fixed_width == fixed_width) + return; + + self->fixed_width = fixed_width; + + if (fixed_width > -1) + overflow = GTK_OVERFLOW_HIDDEN; + else + overflow = GTK_OVERFLOW_VISIBLE; + + if (self->header && + overflow != gtk_widget_get_overflow (GTK_WIDGET (self->header))) + { + GtkColumnViewCell *cell; + + gtk_widget_set_overflow (GTK_WIDGET (self->header), overflow); + + for (cell = self->first_cell; cell; cell = gtk_column_view_cell_get_next (cell)) + gtk_widget_set_overflow (GTK_WIDGET (cell), overflow); + } + + gtk_column_view_column_queue_resize (self); + + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_FIXED_WIDTH]); +} + +/** + * gtk_column_view_column_get_fixed_width: + * @self: a #GtkColumnViewColumn + * + * Gets the fixed width of the column. + * + * Returns: the fixed with of the column + */ +int +gtk_column_view_column_get_fixed_width (GtkColumnViewColumn *self) +{ + g_return_val_if_fail (GTK_IS_COLUMN_VIEW_COLUMN (self), -1); + + return self->fixed_width; +} diff --git a/gtk/gtkcolumnviewcolumn.h b/gtk/gtkcolumnviewcolumn.h index dbe27c48f6..6738bfe67b 100644 --- a/gtk/gtkcolumnviewcolumn.h +++ b/gtk/gtkcolumnviewcolumn.h @@ -79,11 +79,17 @@ GDK_AVAILABLE_IN_ALL gboolean gtk_column_view_column_get_visible (GtkColumnViewColumn *self); GDK_AVAILABLE_IN_ALL + void gtk_column_view_column_set_header_menu (GtkColumnViewColumn *self, GMenuModel *menu); GDK_AVAILABLE_IN_ALL GMenuModel * gtk_column_view_column_get_header_menu (GtkColumnViewColumn *self); +void gtk_column_view_column_set_fixed_width (GtkColumnViewColumn *self, + int fixed_width); +GDK_AVAILABLE_IN_ALL +int gtk_column_view_column_get_fixed_width (GtkColumnViewColumn *self); + G_END_DECLS #endif /* __GTK_COLUMN_VIEW_COLUMN_H__ */ diff --git a/gtk/gtkcolumnviewtitle.c b/gtk/gtkcolumnviewtitle.c index ae66022ac9..53dc56df8f 100644 --- a/gtk/gtkcolumnviewtitle.c +++ b/gtk/gtkcolumnviewtitle.c @@ -61,10 +61,18 @@ gtk_column_view_title_measure (GtkWidget *widget, int *minimum_baseline, int *natural_baseline) { + GtkColumnViewTitle *self = GTK_COLUMN_VIEW_TITLE (widget); GtkWidget *child = gtk_widget_get_first_child (widget); if (child) gtk_widget_measure (child, orientation, for_size, minimum, natural, minimum_baseline, natural_baseline); + + if (orientation == GTK_ORIENTATION_HORIZONTAL) + { + int fixed_width = gtk_column_view_column_get_fixed_width (self->column); + if (fixed_width > -1) + *minimum = *natural = fixed_width; + } } static void