libgimpwidgets: improve a bit the position of progress and normal text.

The logics to get the progress position is not proper because the text
area (as returned by gtk_entry_get_text_area()) is actually slightly
smaller than the progress area. Unfortunately it doesn't look like there
is an API to get the exact progress area. This commit improves a bit the
situation by starting the progress rectangle when excluding the
intersection of 2 rectangles in pango at the start of the text area (not
at 0).

It's still not perfect as the progress width will be anyway a bit too
small and we don't have the data to compute it properly, but it's better
than it used to be. I also set several variables to double instead of
int to be more accurate, though this part doesn't help much.

Finally I used the ink extents rather than the logical extents. Since we
are here to draw, this is the ink extents which is really needed.

Note: for the bug to be visible, you need to have a different text color
for the progress and non-progress part of the scale.

Also I'm unsure about the right-to-left logics which seems very broken.
This commit is contained in:
Jehan 2022-02-16 17:42:53 +01:00
parent ab1fc79a07
commit dfd05c0717

View file

@ -373,16 +373,16 @@ gimp_spin_scale_draw (GtkWidget *widget,
GtkStateFlags state;
gint minimum_width;
gint natural_width;
PangoRectangle logical;
PangoRectangle ink;
gint layout_offset_x;
gint layout_offset_y;
GdkRGBA text_color;
GdkRGBA bar_text_color;
gdouble progress_fraction;
gint progress_x;
gint progress_y;
gint progress_width;
gint progress_height;
gdouble progress_x;
gdouble progress_y;
gdouble progress_width;
gdouble progress_height;
gtk_widget_get_allocation (widget, &allocation);
@ -417,16 +417,16 @@ gimp_spin_scale_draw (GtkWidget *widget,
pango_layout_set_width (private->layout,
PANGO_SCALE *
(allocation.width - minimum_width));
pango_layout_get_pixel_extents (private->layout, NULL, &logical);
pango_layout_get_pixel_extents (private->layout, &ink, NULL);
gtk_entry_get_layout_offsets (GTK_ENTRY (widget), NULL, &layout_offset_y);
if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
layout_offset_x = text_area.x + text_area.width - logical.width - 2;
layout_offset_x = text_area.x + text_area.width - ink.width - 2;
else
layout_offset_x = text_area.x + 2;
layout_offset_x -= logical.x;
layout_offset_x -= ink.x;
gtk_style_context_get_color (style, state, &text_color);
@ -441,16 +441,16 @@ gimp_spin_scale_draw (GtkWidget *widget,
{
progress_fraction = 1.0 - progress_fraction;
progress_x = text_area.width * progress_fraction;
progress_y = 0;
progress_x = (gdouble) text_area.width * progress_fraction + text_area.x;
progress_y = 0.0;
progress_width = text_area.width - progress_x;
progress_height = text_area.height;
}
else
{
progress_x = 0;
progress_y = 0;
progress_width = text_area.width * progress_fraction;
progress_x = text_area.x;
progress_y = 0.0;
progress_width = (gdouble) text_area.width * progress_fraction;
progress_height = text_area.height;
}