Translate vertical scrolling to horizontal movement in breadcrumbs

Fixes https://github.com/vector-im/riot-web/issues/9314
This commit is contained in:
Travis Ralston 2019-04-04 16:43:04 -06:00
parent 37afa9fc0e
commit 138fd4ec87
3 changed files with 22 additions and 1 deletions

View file

@ -118,12 +118,19 @@ export default class AutoHideScrollbar extends React.Component {
return this.containerRef.scrollTop; return this.containerRef.scrollTop;
} }
onWheel = (e) => {
if (this.props.onWheel) {
this.props.onWheel(e);
}
};
render() { render() {
return (<div return (<div
ref={this._collectContainerRef} ref={this._collectContainerRef}
style={this.props.style} style={this.props.style}
className={["mx_AutoHideScrollbar", this.props.className].join(" ")} className={["mx_AutoHideScrollbar", this.props.className].join(" ")}
onScroll={this.props.onScroll} onScroll={this.props.onScroll}
onWheel={this.onWheel}
> >
<div className="mx_AutoHideScrollbar_offset"> <div className="mx_AutoHideScrollbar_offset">
{ this.props.children } { this.props.children }

View file

@ -24,6 +24,11 @@ export default class IndicatorScrollbar extends React.Component {
// and mx_IndicatorScrollbar_rightOverflowIndicator elements to the list for positioning // and mx_IndicatorScrollbar_rightOverflowIndicator elements to the list for positioning
// by the parent element. // by the parent element.
trackHorizontalOverflow: PropTypes.bool, trackHorizontalOverflow: PropTypes.bool,
// If true, when the user tries to use their mouse wheel in the component it will
// scroll horizontally rather than vertically. This should only be used on components
// with no vertical scroll opportunity.
verticalScrollsHorizontally: PropTypes.bool,
}; };
constructor(props) { constructor(props) {
@ -106,6 +111,13 @@ export default class IndicatorScrollbar extends React.Component {
} }
} }
onMouseWheel = (e) => {
if (this.props.verticalScrollsHorizontally && this._scrollElement) {
// noinspection JSSuspiciousNameCombination
this._scrollElement.scrollLeft += e.deltaY / 2; // divide by 2 to reduce harshness
}
};
render() { render() {
const leftIndicatorStyle = {left: this.state.leftIndicatorOffset}; const leftIndicatorStyle = {left: this.state.leftIndicatorOffset};
const rightIndicatorStyle = {right: this.state.rightIndicatorOffset}; const rightIndicatorStyle = {right: this.state.rightIndicatorOffset};
@ -117,6 +129,7 @@ export default class IndicatorScrollbar extends React.Component {
return (<AutoHideScrollbar return (<AutoHideScrollbar
ref={this._collectScrollerComponent} ref={this._collectScrollerComponent}
wrappedRef={this._collectScroller} wrappedRef={this._collectScroller}
onWheel={this.onMouseWheel}
{... this.props} {... this.props}
> >
{ leftOverflowIndicator } { leftOverflowIndicator }

View file

@ -242,7 +242,8 @@ export default class RoomBreadcrumbs extends React.Component {
); );
}); });
return ( return (
<IndicatorScrollbar ref="scroller" className="mx_RoomBreadcrumbs" trackHorizontalOverflow={true}> <IndicatorScrollbar ref="scroller" className="mx_RoomBreadcrumbs"
trackHorizontalOverflow={true} verticalScrollsHorizontally={true}>
{ avatars } { avatars }
</IndicatorScrollbar> </IndicatorScrollbar>
); );