diff --git a/src/components/App.jsx b/src/components/App.jsx index f35ea93..ed06070 100644 --- a/src/components/App.jsx +++ b/src/components/App.jsx @@ -104,7 +104,7 @@ export default class App extends React.Component { { keyCode: keyCodes["i"], handler: () => { - this.changeInspectMode(); + this.setMapState("inspect"); } }, { @@ -164,7 +164,7 @@ export default class App extends React.Component { selectedLayerIndex: 0, sources: {}, vectorLayers: {}, - inspectModeEnabled: false, + mapState: "normal", spec: styleSpec.latest, isOpen: { settings: false, @@ -176,7 +176,6 @@ export default class App extends React.Component { mapOptions: { showTileBoundaries: queryUtil.asBool(queryObj, "show-tile-boundaries") }, - mapFilter: queryObj["color-blindness-emulation"], } this.layerWatcher = new LayerWatcher({ @@ -341,9 +340,9 @@ export default class App extends React.Component { this.onLayersChange(changedLayers) } - changeInspectMode() { + setMapState(newState) { this.setState({ - inspectModeEnabled: !this.state.inspectModeEnabled + mapState: newState }) } @@ -423,13 +422,17 @@ export default class App extends React.Component { mapElement = } else { mapElement = } + let filterName = ""; + if(this.state.mapState.match(/^filter-/)) { + filterName = this.state.mapState.replace(/^filter-/, ""); + } const elementStyle = { - "filter": `url('#${this.state.mapFilter}')` + "filter": `url('#${filterName}')` }; return
@@ -457,12 +460,13 @@ export default class App extends React.Component { const metadata = this.state.mapStyle.metadata || {} const toolbar = diff --git a/src/components/Toolbar.jsx b/src/components/Toolbar.jsx index ab26601..dbd8449 100644 --- a/src/components/Toolbar.jsx +++ b/src/components/Toolbar.jsx @@ -2,6 +2,7 @@ import React from 'react' import PropTypes from 'prop-types' import FileReaderInput from 'react-file-reader-input' import classnames from 'classnames' +import { Wrapper, Button, Menu, MenuItem } from 'react-aria-menubutton' import MdFileDownload from 'react-icons/lib/md/file-download' import MdFileUpload from 'react-icons/lib/md/file-upload' @@ -17,6 +18,11 @@ import MdFontDownload from 'react-icons/lib/md/font-download' import HelpIcon from 'react-icons/lib/md/help-outline' import InspectionIcon from 'react-icons/lib/md/find-in-page' +import ColorIcon from 'react-icons/lib/md/color-lens' +import MapIcon from 'react-icons/lib/md/map' +import ViewIcon from 'react-icons/lib/md/remove-red-eye' + + import logoImage from 'maputnik-design/logos/logo-color.svg' import pkgJson from '../../package.json' @@ -79,7 +85,6 @@ export default class Toolbar extends React.Component { onStyleOpen: PropTypes.func.isRequired, // A dict of source id's and the available source layers sources: PropTypes.object.isRequired, - onInspectModeToggle: PropTypes.func.isRequired, children: PropTypes.node, onToggleModal: PropTypes.func, } @@ -97,7 +102,44 @@ export default class Toolbar extends React.Component { } } + handleSelection(val) { + this.props.onSetMapState(val); + } + render() { + const views = [ + { + id: "map", + title: "Map", + icon: , + }, + { + id: "inspect", + title: "Inspect", + icon: , + }, + { + id: "filter-deuteranopia", + title: "Filter deuteranopia", + icon: , + }, + { + id: "filter-protanopia", + title: "Filter protanopia", + icon: , + }, + { + id: "filter-tritanopia", + title: "Filter tritanopia", + icon: , + }, + { + id: "filter-achromatopsia", + title: "Filter achromatopsia", + icon: , + }, + ]; + return
Style Settings - - - - { this.props.inspectModeEnabled && Map Mode } - { !this.props.inspectModeEnabled && Inspect Mode } - - + + this.handleSelection(val)} + > + + +
    + {views.map((item) => { + return ( +
  • + + + +
  • + ); + })} +
+
+
+ + Help diff --git a/src/styles/_components.scss b/src/styles/_components.scss index 170d855..26a6922 100644 --- a/src/styles/_components.scss +++ b/src/styles/_components.scss @@ -141,3 +141,26 @@ text-align: right; } } + +.map-state-menu { + display: inline-block; + + &__menu { + position: absolute; + z-index: 999999; + background: $color-black; + display: flex; + flex-direction: column; + align-content: stretch; + + li { + display: flex; + flex-direction: column; + + button { + width: 100%; + text-align: left; + } + } + } +}