Make browser item spacing adjustable from CSS

This commit is contained in:
Přemysl Eric Janouch 2021-11-22 15:08:34 +01:00
parent 0bec06b55d
commit 8070c7f9ee
Signed by: p
GPG Key ID: A0420B94F92B9493

View File

@ -43,6 +43,7 @@ struct _FastivBrowser {
FastivIoThumbnailSize item_size; ///< Thumbnail size FastivIoThumbnailSize item_size; ///< Thumbnail size
int item_height; ///< Thumbnail height in pixels int item_height; ///< Thumbnail height in pixels
int item_spacing; ///< Space between items in pixels
GArray *entries; ///< [Entry] GArray *entries; ///< [Entry]
GArray *layouted_rows; ///< [Row] GArray *layouted_rows; ///< [Row]
@ -60,10 +61,6 @@ typedef struct row Row;
static const double g_permitted_width_multiplier = 2; static const double g_permitted_width_multiplier = 2;
// Could be split out to also-idiomatic row-spacing/column-spacing properties.
// TODO(p): Make a property for this.
static const int g_item_spacing = 1;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
struct entry { struct entry {
@ -106,7 +103,7 @@ static void
append_row(FastivBrowser *self, int *y, int x, GArray *items_array) append_row(FastivBrowser *self, int *y, int x, GArray *items_array)
{ {
if (self->layouted_rows->len) if (self->layouted_rows->len)
*y += g_item_spacing; *y += self->item_spacing;
*y += self->item_border_y; *y += self->item_border_y;
g_array_append_val(self->layouted_rows, ((Row) { g_array_append_val(self->layouted_rows, ((Row) {
@ -143,8 +140,8 @@ relayout(FastivBrowser *self, int width)
2 * self->item_border_x; 2 * self->item_border_x;
if (!items->len) { if (!items->len) {
// Just insert it, whether or not there's any space. // Just insert it, whether or not there's any space.
} else if (x + g_item_spacing + width <= available_width) { } else if (x + self->item_spacing + width <= available_width) {
x += g_item_spacing; x += self->item_spacing;
} else { } else {
append_row(self, &y, append_row(self, &y,
padding.left + MAX(0, available_width - x) / 2, items); padding.left + MAX(0, available_width - x) / 2, items);
@ -661,6 +658,11 @@ fastiv_browser_style_updated(GtkWidget *widget)
GtkStyleContext *style = gtk_widget_get_style_context(widget); GtkStyleContext *style = gtk_widget_get_style_context(widget);
GtkBorder border = {}, margin = {}; GtkBorder border = {}, margin = {};
int item_spacing = self->item_spacing;
gtk_widget_style_get(widget, "spacing", &self->item_spacing, NULL);
if (item_spacing != self->item_spacing)
gtk_widget_queue_resize(widget);
// Using a pseudo-class, because GTK+ regions are deprecated. // Using a pseudo-class, because GTK+ regions are deprecated.
gtk_style_context_save(style); gtk_style_context_save(style);
gtk_style_context_add_class(style, "item"); gtk_style_context_add_class(style, "item");
@ -743,6 +745,12 @@ fastiv_browser_class_init(FastivBrowserClass *klass)
widget_class->motion_notify_event = fastiv_browser_motion_notify_event; widget_class->motion_notify_event = fastiv_browser_motion_notify_event;
widget_class->style_updated = fastiv_browser_style_updated; widget_class->style_updated = fastiv_browser_style_updated;
// Could be split to also-idiomatic row-spacing/column-spacing properties.
// The GParamSpec is sinked by this call.
gtk_widget_class_install_style_property(widget_class,
g_param_spec_int("spacing", "Spacing", "Space between items",
0, G_MAXINT, 1, G_PARAM_READWRITE));
// TODO(p): Later override "screen_changed", recreate Pango layouts there, // TODO(p): Later override "screen_changed", recreate Pango layouts there,
// if we get to have any, or otherwise reflect DPI changes. // if we get to have any, or otherwise reflect DPI changes.
gtk_widget_class_set_css_name(widget_class, "fastiv-browser"); gtk_widget_class_set_css_name(widget_class, "fastiv-browser");