Merge remote-tracking branch 'upstream/master' into maintenance/update-deps-2018-10-06

Conflicts:
	src/components/App.jsx
	src/components/Toolbar.jsx
This commit is contained in:
orangemug 2018-10-06 21:39:26 +01:00
commit 1bf10cd6d6
7 changed files with 142 additions and 23 deletions

View file

@ -107,7 +107,7 @@ export default class App extends React.Component {
{ {
keyCode: keyCodes["i"], keyCode: keyCodes["i"],
handler: () => { handler: () => {
this.changeInspectMode(); this.setMapState("inspect");
} }
}, },
{ {
@ -167,7 +167,7 @@ export default class App extends React.Component {
selectedLayerIndex: 0, selectedLayerIndex: 0,
sources: {}, sources: {},
vectorLayers: {}, vectorLayers: {},
inspectModeEnabled: false, mapState: "map",
spec: latest, spec: latest,
isOpen: { isOpen: {
settings: false, settings: false,
@ -181,7 +181,6 @@ export default class App extends React.Component {
showTileBoundaries: queryUtil.asBool(queryObj, "show-tile-boundaries"), showTileBoundaries: queryUtil.asBool(queryObj, "show-tile-boundaries"),
showCollisionBoxes: queryUtil.asBool(queryObj, "show-collision-boxes") showCollisionBoxes: queryUtil.asBool(queryObj, "show-collision-boxes")
}, },
mapFilter: queryObj["color-blindness-emulation"],
} }
this.layerWatcher = new LayerWatcher({ this.layerWatcher = new LayerWatcher({
@ -363,9 +362,9 @@ export default class App extends React.Component {
this.onLayersChange(changedLayers) this.onLayersChange(changedLayers)
} }
changeInspectMode = () => { setMapState = (newState) => {
this.setState({ this.setState({
inspectModeEnabled: !this.state.inspectModeEnabled mapState: newState
}) })
} }
@ -449,17 +448,21 @@ export default class App extends React.Component {
/> />
} else { } else {
mapElement = <MapboxGlMap {...mapProps} mapElement = <MapboxGlMap {...mapProps}
inspectModeEnabled={this.state.inspectModeEnabled} inspectModeEnabled={this.state.mapState === "inspect"}
highlightedLayer={this.state.mapStyle.layers[this.state.selectedLayerIndex]} highlightedLayer={this.state.mapStyle.layers[this.state.selectedLayerIndex]}
onLayerSelect={this.onLayerSelect} /> onLayerSelect={this.onLayerSelect} />
} }
const elementStyle = {}; let filterName;
if(this.state.mapFilter) { if(this.state.mapState.match(/^filter-/)) {
elementStyle.filter = `url('#${this.state.mapFilter}')`; filterName = this.state.mapState.replace(/^filter-/, "");
} }
const elementStyle = {};
if (filterName) {
elementStyle.filter = `url('#${filterName}')`;
};
return <div style={elementStyle}> return <div style={elementStyle} className="maputnik-map__container">
{mapElement} {mapElement}
</div> </div>
} }
@ -488,12 +491,13 @@ export default class App extends React.Component {
const metadata = this.state.mapStyle.metadata || {} const metadata = this.state.mapStyle.metadata || {}
const toolbar = <Toolbar const toolbar = <Toolbar
mapState={this.state.mapState}
mapStyle={this.state.mapStyle} mapStyle={this.state.mapStyle}
inspectModeEnabled={this.state.inspectModeEnabled} inspectModeEnabled={this.state.mapState === "inspect"}
sources={this.state.sources} sources={this.state.sources}
onStyleChanged={this.onStyleChanged} onStyleChanged={this.onStyleChanged}
onStyleOpen={this.onStyleChanged} onStyleOpen={this.onStyleChanged}
onInspectModeToggle={this.changeInspectMode} onSetMapState={this.setMapState}
onToggleModal={this.toggleModal.bind(this)} onToggleModal={this.toggleModal.bind(this)}
/> />

View file

@ -4,6 +4,11 @@ import classnames from 'classnames'
import {MdFileDownload, MdOpenInBrowser, MdSettings, MdLayers, MdHelpOutline, MdFindInPage, MdAssignmentTurnedIn} from 'react-icons/md' import {MdFileDownload, MdOpenInBrowser, MdSettings, MdLayers, MdHelpOutline, MdFindInPage, MdAssignmentTurnedIn} from 'react-icons/md'
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 logoImage from 'maputnik-design/logos/logo-color.svg'
import pkgJson from '../../package.json' import pkgJson from '../../package.json'
@ -60,6 +65,22 @@ class ToolbarLinkHighlighted extends React.Component {
} }
} }
class ToolbarSelect extends React.Component {
static propTypes = {
children: PropTypes.node,
wdKey: PropTypes.string
}
render() {
return <div
className='maputnik-toolbar-select'
data-wd-key={this.props.wdKey}
>
{this.props.children}
</div>
}
}
class ToolbarAction extends React.Component { class ToolbarAction extends React.Component {
static propTypes = { static propTypes = {
children: PropTypes.node, children: PropTypes.node,
@ -87,9 +108,10 @@ export default class Toolbar extends React.Component {
onStyleOpen: PropTypes.func.isRequired, onStyleOpen: PropTypes.func.isRequired,
// A dict of source id's and the available source layers // A dict of source id's and the available source layers
sources: PropTypes.object.isRequired, sources: PropTypes.object.isRequired,
onInspectModeToggle: PropTypes.func.isRequired,
children: PropTypes.node, children: PropTypes.node,
onToggleModal: PropTypes.func, onToggleModal: PropTypes.func,
onSetMapState: PropTypes.func,
mapState: PropTypes.string,
} }
state = { state = {
@ -102,7 +124,48 @@ export default class Toolbar extends React.Component {
} }
} }
handleSelection(val) {
this.props.onSetMapState(val);
}
render() { render() {
const views = [
{
id: "map",
title: "Map",
icon: <MapIcon/>,
},
{
id: "inspect",
title: "Inspect",
icon: <InspectionIcon/>,
},
{
id: "filter-deuteranopia",
title: "Map (deuteranopia)",
icon: <ColorIcon/>,
},
{
id: "filter-protanopia",
title: "Map (protanopia)",
icon: <ColorIcon/>,
},
{
id: "filter-tritanopia",
title: "Map (tritanopia)",
icon: <ColorIcon/>,
},
{
id: "filter-achromatopsia",
title: "Map (achromatopsia)",
icon: <ColorIcon/>,
},
];
const currentView = views.find((view) => {
return view.id === this.props.mapState;
});
return <div className='maputnik-toolbar'> return <div className='maputnik-toolbar'>
<div className="maputnik-toolbar__inner"> <div className="maputnik-toolbar__inner">
<div <div
@ -141,13 +204,21 @@ export default class Toolbar extends React.Component {
<MdSettings /> <MdSettings />
<IconText>Style Settings</IconText> <IconText>Style Settings</IconText>
</ToolbarAction> </ToolbarAction>
<ToolbarAction wdKey="nav:inspect" onClick={this.props.onInspectModeToggle}>
<ToolbarSelect wdKey="nav:inspect">
<MdFindInPage /> <MdFindInPage />
<IconText> <IconText>View </IconText>
{ this.props.inspectModeEnabled && <span>Map Mode</span> } <select onChange={(e) => this.handleSelection(e.target.value)}>
{ !this.props.inspectModeEnabled && <span>Inspect Mode</span> } {views.map((item) => {
</IconText> return (
</ToolbarAction> <option key={item.id} value={item.id}>
{item.title}
</option>
);
})}
</select>
</ToolbarSelect>
<ToolbarLink href={"https://github.com/maputnik/editor/wiki"}> <ToolbarLink href={"https://github.com/maputnik/editor/wiki"}>
<MdHelpOutline /> <MdHelpOutline />
<IconText>Help</IconText> <IconText>Help</IconText>

View file

@ -178,7 +178,7 @@ export default class MapboxGlMap extends React.Component {
render() { render() {
if(IS_SUPPORTED) { if(IS_SUPPORTED) {
return <div return <div
className="maputnik-map" className="maputnik-map__map"
ref={x => this.container = x} ref={x => this.container = x}
></div> ></div>
} }

View file

@ -1,5 +1,5 @@
// MAP // MAP
.maputnik-map { .maputnik-map__container {
display: flex; display: flex;
position: fixed !important; position: fixed !important;
top: $toolbar-height + $toolbar-offset; top: $toolbar-height + $toolbar-offset;
@ -23,6 +23,11 @@
} }
} }
.maputnik-map__map {
width: 100%;
height: 100%;
}
// DOC LABEL // DOC LABEL
.maputnik-doc { .maputnik-doc {
&-target { &-target {
@ -171,3 +176,32 @@
color: $color-red; color: $color-red;
} }
} }
.maputnik-dialog {
&__buttons {
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;
}
}
}
}

View file

@ -96,6 +96,16 @@
@extend .maputnik-toolbar-link; @extend .maputnik-toolbar-link;
} }
.maputnik-toolbar-select {
background: inherit;
border-width: 0;
@extend .maputnik-toolbar-link;
}
.maputnik-toolbar-select select {
margin-left: 4px;
}
.maputnik-icon-text { .maputnik-icon-text {
padding-left: $margin-1; padding-left: $margin-1;
} }

View file

@ -100,7 +100,7 @@ describe("modals", function() {
"geojson:example" "geojson:example"
])); ]));
browser.click(wd.$("nav:inspect")); browser.selectByValue(wd.$("nav:inspect", "select"), "inspect");
}) })
}) })

View file

@ -83,7 +83,7 @@ describe('screenshots', function() {
browser.waitForExist(".maputnik-toolbar-link"); browser.waitForExist(".maputnik-toolbar-link");
browser.flushReactUpdates(); browser.flushReactUpdates();
browser.click(wd.$("nav:inspect")) browser.selectByValue(wd.$("nav:inspect", "select"), "inspect");
browser.flushReactUpdates(); browser.flushReactUpdates();
browser.takeScreenShot("/inspect.png") browser.takeScreenShot("/inspect.png")