Merge branch 'scalefix' into 'main'

GtkScale: improving symmetry and value positioning

Closes #5171

See merge request GNOME/gtk!6935
This commit is contained in:
Matthias Clasen
2024-03-22 16:18:48 +00:00

View File

@@ -150,6 +150,7 @@ struct _GtkScalePrivate
guint draw_value : 1;
guint value_pos : 2;
guint has_markup : 1;
GtkScaleFormatValueFunc format_value_func;
gpointer format_value_func_user_data;
@@ -375,6 +376,27 @@ gtk_scale_allocate_value (GtkScale *scale)
g_return_if_reached ();
break;
}
if (priv->has_markup && (priv->value_pos == GTK_POS_LEFT || priv->value_pos == GTK_POS_RIGHT))
{
if (priv->top_marks_widget)
{
int marks_height;
gtk_widget_measure (priv->top_marks_widget,
GTK_ORIENTATION_VERTICAL, -1,
&marks_height, NULL,
NULL, NULL);
value_alloc.y += marks_height / 2;
}
if (priv->bottom_marks_widget)
{
int marks_height;
gtk_widget_measure (priv->bottom_marks_widget,
GTK_ORIENTATION_VERTICAL, -1,
&marks_height, NULL,
NULL, NULL);
value_alloc.y -= marks_height / 2;
}
}
}
else /* VERTICAL */
{
@@ -403,6 +425,27 @@ gtk_scale_allocate_value (GtkScale *scale)
default:
g_return_if_reached ();
}
if (priv->has_markup && (priv->value_pos == GTK_POS_TOP || priv->value_pos == GTK_POS_BOTTOM))
{
if (priv->top_marks_widget)
{
int marks_width;
gtk_widget_measure (priv->top_marks_widget,
GTK_ORIENTATION_HORIZONTAL, -1,
&marks_width, NULL,
NULL, NULL);
value_alloc.x += marks_width / 2;
}
if (priv->bottom_marks_widget)
{
int marks_width;
gtk_widget_measure (priv->bottom_marks_widget,
GTK_ORIENTATION_HORIZONTAL, -1,
&marks_width, NULL,
NULL, NULL);
value_alloc.x -= marks_width / 2;
}
}
}
gtk_widget_size_allocate (priv->value_widget, &value_alloc, -1);
@@ -1285,6 +1328,7 @@ gtk_scale_get_range_border (GtkRange *range,
if (gtk_orientable_get_orientation (GTK_ORIENTABLE (range)) == GTK_ORIENTATION_HORIZONTAL)
{
int height;
bool need_symmetry = !priv->has_markup && (priv->value_pos == GTK_POS_LEFT || priv->value_pos == GTK_POS_RIGHT || !priv->draw_value);
if (priv->top_marks_widget)
{
@@ -1293,7 +1337,11 @@ gtk_scale_get_range_border (GtkRange *range,
&height, NULL,
NULL, NULL);
if (height > 0)
border->top += height;
{
border->top += height;
if (need_symmetry)
border->bottom += height;
}
}
if (priv->bottom_marks_widget)
@@ -1303,12 +1351,17 @@ gtk_scale_get_range_border (GtkRange *range,
&height, NULL,
NULL, NULL);
if (height > 0)
border->bottom += height;
{
border->bottom += height;
if (need_symmetry)
border->top += height;
}
}
}
else
{
int width;
bool need_symmetry = !priv->has_markup && (priv->value_pos == GTK_POS_TOP || priv->value_pos == GTK_POS_BOTTOM || !priv->draw_value);
if (priv->top_marks_widget)
{
@@ -1317,7 +1370,11 @@ gtk_scale_get_range_border (GtkRange *range,
&width, NULL,
NULL, NULL);
if (width > 0)
border->left += width;
{
border->left += width;
if (need_symmetry)
border->right += width;
}
}
if (priv->bottom_marks_widget)
@@ -1327,7 +1384,11 @@ gtk_scale_get_range_border (GtkRange *range,
&width, NULL,
NULL, NULL);
if (width > 0)
border->right += width;
{
border->right += width;
if (need_symmetry)
border->left += width;
}
}
}
}
@@ -1642,6 +1703,7 @@ gtk_scale_clear_marks (GtkScale *scale)
g_slist_free_full (priv->marks, gtk_scale_mark_free);
priv->marks = NULL;
priv->has_markup = false;
g_clear_pointer (&priv->top_marks_widget, gtk_widget_unparent);
g_clear_pointer (&priv->bottom_marks_widget, gtk_widget_unparent);
@@ -1760,6 +1822,7 @@ gtk_scale_add_mark (GtkScale *scale,
gtk_widget_insert_after (mark->label_widget, mark->widget, NULL);
else
gtk_widget_insert_before (mark->label_widget, mark->widget, NULL);
priv->has_markup = true;
}
m = g_slist_find (priv->marks, mark);