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

Commit

Permalink
Add some tolerances to breadcrumb scrolling
Browse files Browse the repository at this point in the history
See element-hq/element-web#9400
See element-hq/element-web#9394

Tolerances are defined as a device-only setting to give advanced users an option to override the values. No UI is exposed for this. 

The default values are picked for assumptions on comfort, however as people change the tolerances themselves the defaults may need to change.
  • Loading branch information
turt2live committed Apr 8, 2019
1 parent 054011f commit 46f9d68
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 3 deletions.
21 changes: 20 additions & 1 deletion src/components/structures/IndicatorScrollbar.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@ export default class IndicatorScrollbar extends React.Component {
// scroll horizontally rather than vertically. This should only be used on components
// with no vertical scroll opportunity.
verticalScrollsHorizontally: PropTypes.bool,

// An object containing 2 numbers: xyThreshold and yReduction. xyThreshold is the amount
// of horizontal movement required in order to ignore any vertical changes in scroll, and
// only applies when verticalScrollsHorizontally is true. yReduction is the factor to
// multiply the vertical delta by when verticalScrollsHorizontally is true. The default
// behaviour is to have an xyThreshold of infinity and a yReduction of 0.8
scrollTolerances: PropTypes.object,
};

constructor(props) {
Expand Down Expand Up @@ -120,8 +127,20 @@ export default class IndicatorScrollbar extends React.Component {

onMouseWheel = (e) => {
if (this.props.verticalScrollsHorizontally && this._scrollElement) {
const xyThreshold = this.props.scrollTolerances
? this.props.scrollTolerances.xyThreshold
: Number.MAX_SAFE_INTEGER;

const yReduction = this.props.scrollTolerances
? this.props.scrollTolerances.yReduction
: 0.8;

// Don't apply vertical motion to horizontal scrolls. This is meant to eliminate
// trackpads causing excessive scroll motion.
if (e.deltaX >= xyThreshold) return;

// noinspection JSSuspiciousNameCombination
this._scrollElement.scrollLeft += e.deltaY / 2; // divide by 2 to reduce harshness
this._scrollElement.scrollLeft += e.deltaY * yReduction;
}
};

Expand Down
8 changes: 6 additions & 2 deletions src/components/views/rooms/RoomBreadcrumbs.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,10 @@ const MAX_ROOMS = 20;
export default class RoomBreadcrumbs extends React.Component {
constructor(props) {
super(props);
this.state = {rooms: []};
this.state = {
rooms: [],
scrollTolerances: SettingsStore.getValue("breadcrumb_scroll_tolerances"),
};
this.onAction = this.onAction.bind(this);
this._dispatcherRef = null;
}
Expand Down Expand Up @@ -334,7 +337,8 @@ export default class RoomBreadcrumbs extends React.Component {
});
return (
<IndicatorScrollbar ref="scroller" className="mx_RoomBreadcrumbs"
trackHorizontalOverflow={true} verticalScrollsHorizontally={true}>
trackHorizontalOverflow={true} verticalScrollsHorizontally={true}
scrollTolerances={this.state.scrollTolerances}>
{ avatars }
</IndicatorScrollbar>
);
Expand Down
7 changes: 7 additions & 0 deletions src/settings/Settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,13 @@ export const SETTINGS = {
supportedLevels: ['account'],
default: [],
},
"breadcrumb_scroll_tolerances": {
supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS,
default: {
xyThreshold: 10,
yReduction: 0.2,
},
},
"analyticsOptIn": {
supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG,
displayName: _td('Send analytics data'),
Expand Down

0 comments on commit 46f9d68

Please sign in to comment.