st/scroll-view: Make fade effect take ClutterMargin

Instead of taking just vertical/horizontal offsets, take a ClutterMargin
to allow us set the fade offsets on each direction specifically. Also,
handle negative values in margins, the fade effect will run in the negative
space left by the scrollview padding instead. Another difference now is
that areas outside the extents of the effect will be transparent, instead
of the effect ending abruptly past the given extents.

This will be used by the app grid, in order to selectively let see either
of next/prev pages while navigating.

While at it, fix code style issues in st_scroll_view_update_fade_effect(),
and clean up unused variables from the GLSL code.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1630>
This commit is contained in:
Carlos Garnacho
2021-02-03 12:07:34 +01:00
committed by Marge Bot
parent 8cb3825d48
commit f60a469a34
5 changed files with 89 additions and 105 deletions

View File

@ -46,8 +46,7 @@ struct _StScrollViewFade
guint fade_edges : 1;
float vfade_offset;
float hfade_offset;
ClutterMargin fade_margins;
};
G_DEFINE_TYPE (StScrollViewFade,
@ -57,8 +56,7 @@ G_DEFINE_TYPE (StScrollViewFade,
enum {
PROP_0,
PROP_VFADE_OFFSET,
PROP_HFADE_OFFSET,
PROP_FADE_MARGINS,
PROP_FADE_EDGES,
N_PROPS
@ -136,6 +134,15 @@ st_scroll_view_fade_paint_target (ClutterOffscreenEffect *effect,
if (h_scroll_visible)
fade_area_bottomright[1] -= clutter_actor_get_height (hscroll);
if (self->fade_margins.left < 0)
fade_area_topleft[0] -= ABS (self->fade_margins.left);
if (self->fade_margins.right < 0)
fade_area_bottomright[0] += ABS (self->fade_margins.right);
if (self->fade_margins.top < 0)
fade_area_topleft[1] -= ABS (self->fade_margins.top);
if (self->fade_margins.bottom < 0)
fade_area_bottomright[1] += ABS (self->fade_margins.bottom);
st_adjustment_get_values (self->vadjustment, &value, &lower, &upper, NULL, NULL, &page_size);
value = (value - lower) / (upper - page_size - lower);
clutter_shader_effect_set_uniform (shader, "fade_edges_top", G_TYPE_INT, 1, self->fade_edges ? value >= 0.0 : value > 0.0);
@ -146,8 +153,10 @@ st_scroll_view_fade_paint_target (ClutterOffscreenEffect *effect,
clutter_shader_effect_set_uniform (shader, "fade_edges_left", G_TYPE_INT, 1, self->fade_edges ? value >= 0.0 : value > 0.0);
clutter_shader_effect_set_uniform (shader, "fade_edges_right", G_TYPE_INT, 1, self->fade_edges ? value <= 1.0 : value < 1.0);
clutter_shader_effect_set_uniform (shader, "vfade_offset", G_TYPE_FLOAT, 1, self->vfade_offset);
clutter_shader_effect_set_uniform (shader, "hfade_offset", G_TYPE_FLOAT, 1, self->hfade_offset);
clutter_shader_effect_set_uniform (shader, "fade_offset_top", G_TYPE_FLOAT, 1, ABS (self->fade_margins.top));
clutter_shader_effect_set_uniform (shader, "fade_offset_bottom", G_TYPE_FLOAT, 1, ABS (self->fade_margins.bottom));
clutter_shader_effect_set_uniform (shader, "fade_offset_left", G_TYPE_FLOAT, 1, ABS (self->fade_margins.left));
clutter_shader_effect_set_uniform (shader, "fade_offset_right", G_TYPE_FLOAT, 1, ABS (self->fade_margins.right));
clutter_shader_effect_set_uniform (shader, "tex", G_TYPE_INT, 1, 0);
clutter_shader_effect_set_uniform (shader, "height", G_TYPE_FLOAT, 1, clutter_actor_get_height (self->actor));
clutter_shader_effect_set_uniform (shader, "width", G_TYPE_FLOAT, 1, clutter_actor_get_width (self->actor));
@ -266,39 +275,21 @@ st_scroll_view_fade_dispose (GObject *gobject)
}
static void
st_scroll_view_vfade_set_offset (StScrollViewFade *self,
float fade_offset)
st_scroll_view_set_fade_margins (StScrollViewFade *self,
ClutterMargin *fade_margins)
{
if (self->vfade_offset == fade_offset)
if (self->fade_margins.left == fade_margins->left &&
self->fade_margins.right == fade_margins->right &&
self->fade_margins.top == fade_margins->top &&
self->fade_margins.bottom == fade_margins->bottom)
return;
g_object_freeze_notify (G_OBJECT (self));
self->vfade_offset = fade_offset;
self->fade_margins = *fade_margins;
if (self->actor != NULL)
clutter_actor_queue_redraw (self->actor);
g_object_notify_by_pspec (G_OBJECT (self), props[PROP_VFADE_OFFSET]);
g_object_thaw_notify (G_OBJECT (self));
}
static void
st_scroll_view_hfade_set_offset (StScrollViewFade *self,
float fade_offset)
{
if (self->hfade_offset == fade_offset)
return;
g_object_freeze_notify (G_OBJECT (self));
self->hfade_offset = fade_offset;
if (self->actor != NULL)
clutter_actor_queue_redraw (self->actor);
g_object_notify_by_pspec (G_OBJECT (self), props[PROP_HFADE_OFFSET]);
g_object_thaw_notify (G_OBJECT (self));
g_object_notify_by_pspec (G_OBJECT (self), props[PROP_FADE_MARGINS]);
}
static void
@ -329,11 +320,8 @@ st_scroll_view_fade_set_property (GObject *object,
switch (prop_id)
{
case PROP_VFADE_OFFSET:
st_scroll_view_vfade_set_offset (self, g_value_get_float (value));
break;
case PROP_HFADE_OFFSET:
st_scroll_view_hfade_set_offset (self, g_value_get_float (value));
case PROP_FADE_MARGINS:
st_scroll_view_set_fade_margins (self, g_value_get_boxed (value));
break;
case PROP_FADE_EDGES:
st_scroll_view_fade_set_fade_edges (self, g_value_get_boolean (value));
@ -354,11 +342,8 @@ st_scroll_view_fade_get_property (GObject *object,
switch (prop_id)
{
case PROP_HFADE_OFFSET:
g_value_set_float (value, self->hfade_offset);
break;
case PROP_VFADE_OFFSET:
g_value_set_float (value, self->vfade_offset);
case PROP_FADE_MARGINS:
g_value_set_boxed (value, &self->fade_margins);
break;
case PROP_FADE_EDGES:
g_value_set_boolean (value, self->fade_edges);
@ -391,29 +376,15 @@ st_scroll_view_fade_class_init (StScrollViewFadeClass *klass)
offscreen_class->paint_target = st_scroll_view_fade_paint_target;
/**
* StScrollViewFade:vfade-offset:
* StScrollViewFade:fade-margins:
*
* The height of area which is faded at the top and bottom edges of the
* #StScrollViewFade.
* The margins widths that are faded.
*/
props[PROP_VFADE_OFFSET] =
g_param_spec_float ("vfade-offset",
"Vertical Fade Offset",
"The height of the area which is faded at the edge",
0.f, G_MAXFLOAT, DEFAULT_FADE_OFFSET,
ST_PARAM_READWRITE);
/**
* StScrollViewFade:hfade-offset:
*
* The height of area which is faded at the left and right edges of the
* #StScrollViewFade.
*/
props[PROP_HFADE_OFFSET] =
g_param_spec_float ("hfade-offset",
"Horizontal Fade Offset",
"The width of the area which is faded at the edge",
0.f, G_MAXFLOAT, DEFAULT_FADE_OFFSET,
props[PROP_FADE_MARGINS] =
g_param_spec_boxed ("fade-margins",
"Fade margins",
"The margin widths that are faded",
CLUTTER_TYPE_MARGIN,
ST_PARAM_READWRITE);
/**
@ -434,8 +405,12 @@ st_scroll_view_fade_class_init (StScrollViewFadeClass *klass)
static void
st_scroll_view_fade_init (StScrollViewFade *self)
{
self->vfade_offset = DEFAULT_FADE_OFFSET;
self->hfade_offset = DEFAULT_FADE_OFFSET;
self->fade_margins = (ClutterMargin) {
DEFAULT_FADE_OFFSET,
DEFAULT_FADE_OFFSET,
DEFAULT_FADE_OFFSET,
DEFAULT_FADE_OFFSET,
};
}
/**