Skip to content

Commit

Permalink
Merge pull request visgl#140 from forrert/onclick
Browse files Browse the repository at this point in the history
Adds `onClick` prop handler
  • Loading branch information
abmai authored Dec 6, 2016
2 parents 5ab0eb7 + e9bcc7a commit 1d030a4
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 8 deletions.
84 changes: 84 additions & 0 deletions example/examples/click.react.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
// Copyright (c) 2015 Uber Technologies, Inc.

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

import window from 'global/window';
const windowAlert = window.alert;

import React, {PropTypes, Component} from 'react';
import autobind from 'autobind-decorator';

import MapGL from '../../src';

const PROP_TYPES = {
width: PropTypes.number.isRequired,
height: PropTypes.number.isRequired
};

export default class ClickExample extends Component {

constructor(props) {
super(props);
this.state = {
viewport: {
latitude: 37.7736092599127,
longitude: -122.42312591099463,
zoom: 12.011557070552028,
startDragLngLat: null,
isDragging: false
}
};
}

@autobind
_onChangeViewport(viewport) {
if (this.props.onChangeViewport) {
return this.props.onChangeViewport(viewport);
}
this.setState({viewport});
}

@autobind
_onClickFeatures(features) {
const placeNames = features
.filter(feature => feature.layer['source-layer'] === 'place_label')
.map(feature => feature.properties.name);
windowAlert(placeNames);
}

@autobind
_onClick(coordinates, pos) {
windowAlert(`${coordinates}\n${JSON.stringify(pos)}`);
}

render() {
const viewport = {
...this.state.viewport,
...this.props
};
return (
<MapGL { ...viewport }
onChangeViewport={ this._onChangeViewport }
onClickFeatures={ this._onClickFeatures }
onClick={ this._onClick }/>
);
}
}

ClickExample.propTypes = PROP_TYPES;
2 changes: 2 additions & 0 deletions example/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import ScatterplotExample from './examples/scatterplot.react';
import RouteExample from './examples/route.react';
import StyleDiffingExample from './examples/style-diffing.react';
import TiltExample from './examples/tilt.react';
import ClickExample from './examples/click.react';

function getAccessToken() {
const match = window.location.search.match(/access_token=([^&\/]*)/);
Expand Down Expand Up @@ -82,6 +83,7 @@ export default class App extends Component {
<GeodataCreator { ...common }/>
<NotInteractiveExample { ...common }/>
<StyleDiffingExample { ...common }/>
<ClickExample {...common }/>
</div>
);
}
Expand Down
30 changes: 22 additions & 8 deletions src/map.react.js
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,13 @@ const PROP_TYPES = {
*/
attributionControl: PropTypes.bool,

/**
* Called when the map is clicked. The handler is called with the clicked
* coordinates (https://www.mapbox.com/mapbox-gl-js/api/#LngLat) and the
* screen coordinates (https://www.mapbox.com/mapbox-gl-js/api/#PointLike).
*/
onClick: PropTypes.func,

/**
* Called when a feature is clicked on. Uses Mapbox's
* queryRenderedFeatures API to find features under the pointer:
Expand Down Expand Up @@ -597,21 +604,28 @@ export default class MapGL extends Component {
}

@autobind _onMouseClick(opt) {
if (!this.props.onClickFeatures) {
if (!this.props.onClickFeatures && !this.props.onClick) {
return;
}

const map = this._getMap();
const pos = opt.pos;

// Radius enables point features, like marker symbols, to be clicked.
const size = this.props.clickRadius;
const bbox = [[pos.x - size, pos.y - size], [pos.x + size, pos.y + size]];
const features = map.queryRenderedFeatures(bbox, this._queryParams);
if (!features.length && this.props.ignoreEmptyFeatures) {
return;
if (this.props.onClick) {
const latLong = map.unproject(opt.pos);
this.props.onClick(latLong, pos);
}

if (this.props.onClickFeatures) {
// Radius enables point features, like marker symbols, to be clicked.
const size = this.props.clickRadius;
const bbox = [[pos.x - size, pos.y - size], [pos.x + size, pos.y + size]];
const features = map.queryRenderedFeatures(bbox, this._queryParams);
if (!features.length && this.props.ignoreEmptyFeatures) {
return;
}
this.props.onClickFeatures(features);
}
this.props.onClickFeatures(features);
}

@autobind _onZoom({pos, scale}) {
Expand Down

0 comments on commit 1d030a4

Please sign in to comment.