Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Commit

Permalink
Merge pull request #4494 from pv/auxpanel-scrolling-persisted
Browse files Browse the repository at this point in the history
Prevent PersistedElements overflowing scrolled areas
  • Loading branch information
turt2live authored May 19, 2020
2 parents 5a1bf03 + d690d4b commit b96c1ad
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 3 deletions.
4 changes: 4 additions & 0 deletions res/css/views/rooms/_AppsDrawer.scss
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,10 @@ $AppsDrawerBodyHeight: 273px;
height: $AppsDrawerBodyHeight;
}

.mx_AppTile_persistedWrapper > div {
height: 100%;
}

.mx_AppTile_mini .mx_AppTile_persistedWrapper {
height: 114px;
}
Expand Down
58 changes: 56 additions & 2 deletions src/components/views/elements/PersistedElement.js
Original file line number Diff line number Diff line change
Expand Up @@ -156,16 +156,70 @@ export default class PersistedElement extends React.Component {
child.style.display = visible ? 'block' : 'none';
}

/*
* Clip element bounding rectangle to that of the parent elements.
* This is not a full visibility check, but prevents the persisted
* element from overflowing parent containers when inside a scrolled
* area.
*/
_getClippedBoundingClientRect(element) {
let parentElement = element.parentElement;
let rect = element.getBoundingClientRect();

rect = new DOMRect(rect.left, rect.top, rect.width, rect.height);

while (parentElement) {
const parentRect = parentElement.getBoundingClientRect();

if (parentRect.left > rect.left) {
rect.width = rect.width - (parentRect.left - rect.left);
rect.x = parentRect.x;
}

if (parentRect.top > rect.top) {
rect.height = rect.height - (parentRect.top - rect.top);
rect.y = parentRect.y;
}

if (parentRect.right < rect.right) {
rect.width = rect.width - (rect.right - parentRect.right);
}

if (parentRect.bottom < rect.bottom) {
rect.height = rect.height - (rect.bottom - parentRect.bottom);
}

parentElement = parentElement.parentElement;
}

if (rect.width < 0) rect.width = 0;
if (rect.height < 0) rect.height = 0;

return rect;
}

updateChildPosition(child, parent) {
if (!child || !parent) return;

const parentRect = parent.getBoundingClientRect();
const clipRect = this._getClippedBoundingClientRect(parent);

Object.assign(child.parentElement.style, {
position: 'absolute',
top: clipRect.top + 'px',
left: clipRect.left + 'px',
width: clipRect.width + 'px',
height: clipRect.height + 'px',
overflow: "hidden",
});

Object.assign(child.style, {
position: 'absolute',
top: parentRect.top + 'px',
left: parentRect.left + 'px',
top: (parentRect.top - clipRect.top) + 'px',
left: (parentRect.left - clipRect.left) + 'px',
width: parentRect.width + 'px',
height: parentRect.height + 'px',
overflow: "hidden",
});
}

Expand Down
11 changes: 10 additions & 1 deletion src/components/views/rooms/AuxPanel.js
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,15 @@ export default createReactClass({
return counters;
},

_onScroll: function(rect) {
if (this.props.onResize) {
this.props.onResize();
}

/* Force refresh of PersistedElements which may be partially hidden */
window.dispatchEvent(new Event('resize'));
},

render: function() {
const CallView = sdk.getComponent("voip.CallView");
const TintableSvg = sdk.getComponent("elements.TintableSvg");
Expand Down Expand Up @@ -265,7 +274,7 @@ export default createReactClass({
}

return (
<AutoHideScrollbar className={classes} style={style} >
<AutoHideScrollbar className={classes} style={style} onScroll={this._onScroll}>
{ stateViews }
{ appsDrawer }
{ fileDropTarget }
Expand Down

0 comments on commit b96c1ad

Please sign in to comment.