diff --git a/src/components/App.jsx b/src/components/App.jsx index 4e77676..9265b93 100644 --- a/src/components/App.jsx +++ b/src/components/App.jsx @@ -12,6 +12,12 @@ import Toolbar from './Toolbar' import AppLayout from './AppLayout' import MessagePanel from './MessagePanel' +import SettingsModal from './modals/SettingsModal' +import ExportModal from './modals/ExportModal' +import SourcesModal from './modals/SourcesModal' +import OpenModal from './modals/OpenModal' +import ShortcutsModal from './modals/ShortcutsModal' + import { downloadGlyphsMetadata, downloadSpriteMetadata } from '../libs/metadata' import * as styleSpec from '@mapbox/mapbox-gl-style-spec/style-spec' import style from '../libs/style.js' @@ -50,39 +56,75 @@ export default class App extends React.Component { onLocalStyleChange: mapStyle => this.onStyleChanged(mapStyle, false) }) + + const keyCodes = { + "esc": 27, + "?": 191, + "o": 79, + "e": 69, + "s": 83, + "p": 80, + "i": 73, + "m": 77, + } + + const shortcuts = [ + { + keyCode: keyCodes["?"], + handler: () => { + this.toggleModal("shortcuts"); + } + }, + { + keyCode: keyCodes["o"], + handler: () => { + this.toggleModal("open"); + } + }, + { + keyCode: keyCodes["e"], + handler: () => { + this.toggleModal("export"); + } + }, + { + keyCode: keyCodes["s"], + handler: () => { + this.toggleModal("sources"); + } + }, + { + keyCode: keyCodes["p"], + handler: () => { + this.toggleModal("settings"); + } + }, + { + keyCode: keyCodes["i"], + handler: () => { + this.changeInspectMode(); + } + }, + { + keyCode: keyCodes["m"], + handler: () => { + document.querySelector(".mapboxgl-canvas").focus(); + } + }, + ] + document.body.addEventListener("keyup", (e) => { - if(e.keyCode === 27) { + if(e.keyCode === keyCodes["esc"]) { e.target.blur(); document.body.focus(); } else if(document.activeElement === document.body) { - console.log(">>> e", e.keyCode); - if(e.keyCode === 191) { - console.log("TODO: SHORTCUTS"); - } - else if(e.keyCode === 79) { - console.log("TODO: OPEN"); - } - else if(e.keyCode === 69) { - console.log("TODO: EXPORT"); - } - else if(e.keyCode === 83) { - console.log("TODO: SOURCES"); - } - else if(e.keyCode === 80) { - console.log("TODO: METADATA"); - } - else if(e.keyCode === 73) { - console.log("TODO: INSPECT"); - } - else if(e.keyCode === 76) { - console.log("TODO: LAYER LIST"); - } - else if(e.keyCode === 67) { - console.log("TODO: CURRENT LAYER"); - } - else if(e.keyCode === 77) { - console.log("TODO: MAP"); + const shortcut = shortcuts.find((shortcut) => { + return (shortcut.keyCode === e.keyCode) + }) + + if(shortcut) { + shortcut.handler(e); } } }) @@ -120,6 +162,13 @@ export default class App extends React.Component { vectorLayers: {}, inspectModeEnabled: false, spec: styleSpec.latest, + isOpen: { + settings: false, + sources: false, + open: false, + shortcuts: false, + export: false, + } } this.layerWatcher = new LayerWatcher({ @@ -374,6 +423,15 @@ export default class App extends React.Component { this.setState({ selectedLayerIndex: idx }) } + toggleModal(modalName) { + this.setState({ + isOpen: { + ...this.state.isOpen, + [modalName]: !this.state.isOpen[modalName] + } + }) + } + render() { const layers = this.state.mapStyle.layers || [] const selectedLayer = layers.length > 0 ? layers[this.state.selectedLayerIndex] : null @@ -386,6 +444,7 @@ export default class App extends React.Component { onStyleChanged={this.onStyleChanged.bind(this)} onStyleOpen={this.onStyleChanged.bind(this)} onInspectModeToggle={this.changeInspectMode.bind(this)} + onToggleModal={this.toggleModal.bind(this)} /> const layerList = : null + + const modals =
+ + + + + +
+ return } } diff --git a/src/components/AppLayout.jsx b/src/components/AppLayout.jsx index 1804686..63fc5c6 100644 --- a/src/components/AppLayout.jsx +++ b/src/components/AppLayout.jsx @@ -39,6 +39,7 @@ class AppLayout extends React.Component { {this.props.bottom} } + {this.props.modals} } } diff --git a/src/components/Toolbar.jsx b/src/components/Toolbar.jsx index caa1c5e..2d85653 100644 --- a/src/components/Toolbar.jsx +++ b/src/components/Toolbar.jsx @@ -18,10 +18,6 @@ import HelpIcon from 'react-icons/lib/md/help-outline' import InspectionIcon from 'react-icons/lib/md/find-in-page' import logoImage from 'maputnik-design/logos/logo-color.svg' -import SettingsModal from './modals/SettingsModal' -import ExportModal from './modals/ExportModal' -import SourcesModal from './modals/SourcesModal' -import OpenModal from './modals/OpenModal' import pkgJson from '../../package.json' import style from '../libs/style' @@ -99,40 +95,8 @@ export default class Toolbar extends React.Component { } } - toggleModal(modalName) { - this.setState({ - isOpen: { - ...this.state.isOpen, - [modalName]: !this.state.isOpen[modalName] - } - }) - } - render() { return
- - - -
- + Open - + Export - + Sources - + Style Settings diff --git a/src/components/modals/ShortcutsModal.jsx b/src/components/modals/ShortcutsModal.jsx new file mode 100644 index 0000000..a8db17e --- /dev/null +++ b/src/components/modals/ShortcutsModal.jsx @@ -0,0 +1,75 @@ +import React from 'react' +import PropTypes from 'prop-types' + +import Button from '../Button' +import Modal from './Modal' + + +class ShortcutsModal extends React.Component { + static propTypes = { + isOpen: PropTypes.bool.isRequired, + onOpenToggle: PropTypes.func.isRequired, + } + + constructor(props) { + super(props); + } + + render() { + const help = [ + { + key: "?", + text: "Show shortcuts menu" + }, + { + key: "o", + text: "Open modal" + }, + { + key: "e", + text: "Export modal" + }, + { + key: "s", + text: "Sources modal" + }, + { + key: "p", + text: "Source settings modal" + }, + { + key: "i", + text: "Toggle map" + }, + { + key: "m", + text: "Focus map" + }, + ] + + + return +
+
    + {help.map((item) => { + return
  • + {item.key} {item.text} +
  • + })} +
+

+ +

+
+
+ } +} + +export default ShortcutsModal