st/scrollview: Add ::content-padding property to StScrollView

This will be needed for fine tuning of the visible area for appGrid
navigation purposes. We most nominally can let it happen via CSS as
the size calculations happen on size allocate, so we want to avoid
triggering relayouts while adapting to the given size.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1630>
This commit is contained in:
Carlos Garnacho 2021-02-19 16:42:34 +01:00 committed by Marge Bot
parent f60a469a34
commit 0d62dadfbc
2 changed files with 29 additions and 0 deletions

View File

@ -97,6 +97,7 @@ st_scroll_view_fade_paint_target (ClutterOffscreenEffect *effect,
gboolean h_scroll_visible, v_scroll_visible; gboolean h_scroll_visible, v_scroll_visible;
ClutterActorBox allocation, content_box, paint_box; ClutterActorBox allocation, content_box, paint_box;
ClutterMargin *content_padding;
float fade_area_topleft[2]; float fade_area_topleft[2];
float fade_area_bottomright[2]; float fade_area_bottomright[2];
@ -108,6 +109,13 @@ st_scroll_view_fade_paint_target (ClutterOffscreenEffect *effect,
clutter_actor_get_allocation_box (self->actor, &allocation); clutter_actor_get_allocation_box (self->actor, &allocation);
st_theme_node_get_content_box (st_widget_get_theme_node (ST_WIDGET (self->actor)), st_theme_node_get_content_box (st_widget_get_theme_node (ST_WIDGET (self->actor)),
(const ClutterActorBox *)&allocation, &content_box); (const ClutterActorBox *)&allocation, &content_box);
g_object_get (self->actor, "content-padding", &content_padding, NULL);
content_box.x1 += content_padding->left;
content_box.x2 -= content_padding->right;
content_box.y1 += content_padding->top;
content_box.y2 -= content_padding->bottom;
clutter_margin_free (content_padding);
/* /*
* The FBO is based on the paint_volume's size which can be larger then the actual * The FBO is based on the paint_volume's size which can be larger then the actual

View File

@ -84,6 +84,8 @@ struct _StScrollViewPrivate
StAdjustment *vadjustment; StAdjustment *vadjustment;
ClutterActor *vscroll; ClutterActor *vscroll;
ClutterMargin content_padding;
StPolicyType hscrollbar_policy; StPolicyType hscrollbar_policy;
StPolicyType vscrollbar_policy; StPolicyType vscrollbar_policy;
@ -116,6 +118,7 @@ enum {
PROP_VSCROLLBAR_VISIBLE, PROP_VSCROLLBAR_VISIBLE,
PROP_MOUSE_SCROLL, PROP_MOUSE_SCROLL,
PROP_OVERLAY_SCROLLBARS, PROP_OVERLAY_SCROLLBARS,
PROP_CONTENT_PADDING,
N_PROPS N_PROPS
}; };
@ -156,6 +159,9 @@ st_scroll_view_get_property (GObject *object,
case PROP_OVERLAY_SCROLLBARS: case PROP_OVERLAY_SCROLLBARS:
g_value_set_boolean (value, priv->overlay_scrollbars); g_value_set_boolean (value, priv->overlay_scrollbars);
break; break;
case PROP_CONTENT_PADDING:
g_value_set_boxed (value, &priv->content_padding);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
} }
@ -233,6 +239,9 @@ st_scroll_view_set_property (GObject *object,
priv->hscrollbar_policy, priv->hscrollbar_policy,
g_value_get_enum (value)); g_value_get_enum (value));
break; break;
case PROP_CONTENT_PADDING:
priv->content_padding = * (ClutterMargin *) g_value_get_boxed (value);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
} }
@ -545,6 +554,11 @@ st_scroll_view_allocate (ClutterActor *actor,
st_theme_node_get_content_box (theme_node, box, &content_box); st_theme_node_get_content_box (theme_node, box, &content_box);
content_box.x1 += priv->content_padding.left;
content_box.x2 -= priv->content_padding.right;
content_box.y1 += priv->content_padding.top;
content_box.y2 += priv->content_padding.bottom;
avail_width = content_box.x2 - content_box.x1; avail_width = content_box.x2 - content_box.x1;
avail_height = content_box.y2 - content_box.y1; avail_height = content_box.y2 - content_box.y1;
@ -933,6 +947,13 @@ st_scroll_view_class_init (StScrollViewClass *klass)
FALSE, FALSE,
ST_PARAM_READWRITE); ST_PARAM_READWRITE);
props[PROP_CONTENT_PADDING] =
g_param_spec_boxed ("content-padding",
"Content padding",
"Content padding",
CLUTTER_TYPE_MARGIN,
ST_PARAM_READWRITE);
g_object_class_install_properties (object_class, N_PROPS, props); g_object_class_install_properties (object_class, N_PROPS, props);
} }