diff options
| author | Georgios Andreadis <g.andreadis@student.tudelft.nl> | 2017-09-26 19:34:17 +0200 |
|---|---|---|
| committer | Georgios Andreadis <g.andreadis@student.tudelft.nl> | 2017-09-26 19:34:17 +0200 |
| commit | 3ccc6c95acfe71fee5884ccb32c685adc53127cf (patch) | |
| tree | bb6535ba87b91552e32964689f50f22401a6fe6a /src/actions | |
| parent | 9ed6d7932876cb7654ad154d028ba41bef12a7b5 (diff) | |
Refactor zooming logic out to action
This also enables a more straight-forward implementation of the functionality that the zoom buttons offer.
Diffstat (limited to 'src/actions')
| -rw-r--r-- | src/actions/map.js | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/actions/map.js b/src/actions/map.js index ef691873..47d4714d 100644 --- a/src/actions/map.js +++ b/src/actions/map.js @@ -1,3 +1,10 @@ +import { + MAP_MAX_SCALE, + MAP_MIN_SCALE, + MAP_SCALE_PER_EVENT, + MAP_SIZE_IN_PIXELS +} from "../components/app/map/MapConstants"; + export const SET_MAP_POSITION = "SET_MAP_POSITION"; export const SET_MAP_DIMENSIONS = "SET_MAP_DIMENSIONS"; export const SET_MAP_SCALE = "SET_MAP_SCALE"; @@ -24,3 +31,46 @@ export function setMapScale(scale) { scale }; } + +export function zoomInOnCenter(zoomIn) { + return (dispatch, getState) => { + const state = getState(); + + dispatch(zoomInOnPosition(zoomIn, state.map.dimensions.width / 2, state.map.dimensions.height / 2)); + } +} + +export function zoomInOnPosition(zoomIn, x, y) { + return (dispatch, getState) => { + const state = getState(); + + const centerPoint = { + x: x / state.map.scale - state.map.position.x / state.map.scale, + y: y / state.map.scale - state.map.position.y / state.map.scale, + }; + const newScale = zoomIn ? state.map.scale * MAP_SCALE_PER_EVENT : state.map.scale / MAP_SCALE_PER_EVENT; + const boundedScale = Math.min(Math.max(MAP_MIN_SCALE, newScale), MAP_MAX_SCALE); + + const newX = -(centerPoint.x - x / boundedScale) * boundedScale; + const newY = -(centerPoint.y - y / boundedScale) * boundedScale; + + dispatch(setMapPositionWithBoundsCheck(newX, newY)); + dispatch(setMapScale(boundedScale)); + } +} + +export function setMapPositionWithBoundsCheck(x, y) { + return (dispatch, getState) => { + const state = getState(); + + const scaledMapSize = MAP_SIZE_IN_PIXELS * state.map.scale; + const updatedX = x > 0 ? 0 : + (x < -scaledMapSize + state.map.dimensions.width + ? -scaledMapSize + state.map.dimensions.width : x); + const updatedY = y > 0 ? 0 : + (y < -scaledMapSize + state.map.dimensions.height + ? -scaledMapSize + state.map.dimensions.height : y); + + dispatch(setMapPosition(updatedX, updatedY)); + } +} |
