From 53b59819ef9302c2f562da7bba4830e479dc9c55 Mon Sep 17 00:00:00 2001 From: Oscar Korz Date: Tue, 30 Apr 2019 09:05:03 -0700 Subject: [PATCH] Allow custom keys for slider monitor --- packages/redux-slider-monitor/README.md | 2 + packages/redux-slider-monitor/package.json | 1 + .../redux-slider-monitor/src/SliderMonitor.js | 56 ++++++++++++++++--- 3 files changed, 52 insertions(+), 7 deletions(-) diff --git a/packages/redux-slider-monitor/README.md b/packages/redux-slider-monitor/README.md index 1cc8ebbd..c338cc45 100755 --- a/packages/redux-slider-monitor/README.md +++ b/packages/redux-slider-monitor/README.md @@ -43,6 +43,8 @@ Pass the `keyboardEnabled` prop to use these shortcuts `ctrl+]`: step forward +You can override these shortcuts with the `playKey`, `stepBackwardKey`, and `stepForwardKey` respectively. These props are parsed by [parse-key](https://github.com/thlorenz/parse-key), just like in `DockMonitor`. + ### Running Examples You can do this: diff --git a/packages/redux-slider-monitor/package.json b/packages/redux-slider-monitor/package.json index 0d653e49..5f20f405 100644 --- a/packages/redux-slider-monitor/package.json +++ b/packages/redux-slider-monitor/package.json @@ -45,6 +45,7 @@ }, "dependencies": { "devui": "^1.0.0-3", + "parse-key": "^0.2.1", "prop-types": "^15.5.8", "redux-devtools-themes": "^1.0.0" } diff --git a/packages/redux-slider-monitor/src/SliderMonitor.js b/packages/redux-slider-monitor/src/SliderMonitor.js index 63e315fe..cec355f2 100644 --- a/packages/redux-slider-monitor/src/SliderMonitor.js +++ b/packages/redux-slider-monitor/src/SliderMonitor.js @@ -6,6 +6,7 @@ import { Toolbar, Divider } from 'devui/lib/Toolbar'; import Slider from 'devui/lib/Slider'; import Button from 'devui/lib/Button'; import SegmentedControl from 'devui/lib/SegmentedControl'; +import parseKey from 'parse-key'; import reducer from './reducers'; import SliderButton from './SliderButton'; @@ -29,7 +30,10 @@ export default class SliderMonitor extends (PureComponent || Component) { select: PropTypes.func.isRequired, hideResetButton: PropTypes.bool, theme: PropTypes.oneOfType([PropTypes.object, PropTypes.string]), - keyboardEnabled: PropTypes.bool + keyboardEnabled: PropTypes.bool, + playKey: PropTypes.string, + stepBackwardKey: PropTypes.string, + stepForwardKey: PropTypes.string }; static defaultProps = { @@ -76,12 +80,52 @@ export default class SliderMonitor extends (PureComponent || Component) { this.props.dispatch(reset()); }; + matchesKey = (key, event) => { + if (!key) { + return false; + } + const parsedKey = parseKey(key); + const charCode = event.keyCode || event.which; + const char = String.fromCharCode(charCode); + return parsedKey.name.toUpperCase() === char.toUpperCase() && + parsedKey.alt === event.altKey && + parsedKey.ctrl === event.ctrlKey && + parsedKey.meta === event.metaKey && + parsedKey.shift === event.shiftKey; + }; + + isPlayKey = event => { + if (this.props.playKey) { + return this.matchesKey(this.props.playKey, event); + } else { + // ctrl+j + return event.ctrlKey && event.keyCode === 74; + } + }; + + isStepBackwardKey = event => { + if (this.props.stepBackwardKey) { + return this.matchesKey(this.props.stepBackwardKey, event); + } else { + // ctrl+] + return event.ctrlKey && event.keyCode === 219; + } + }; + + isStepForwardKey = event => { + if (this.props.stepForwardKey) { + return this.matchesKey(this.props.stepForwardKey, event); + } else { + // ctrl+[ + return event.ctrlKey && event.keyCode === 221; + } + }; + handleKeyPress = event => { if (!this.props.keyboardEnabled) { return null; } - if (event.ctrlKey && event.keyCode === 74) { - // ctrl+j + if (this.isPlayKey(event)) { event.preventDefault(); if (this.state.timer) { @@ -93,12 +137,10 @@ export default class SliderMonitor extends (PureComponent || Component) { } else { this.startReplay(); } - } else if (event.ctrlKey && event.keyCode === 219) { - // ctrl+[ + } else if (this.isStepBackwardKey(event)) { event.preventDefault(); this.stepLeft(); - } else if (event.ctrlKey && event.keyCode === 221) { - // ctrl+] + } else if (this.isStepForwardKey(event)) { event.preventDefault(); this.stepRight(); }