From cf0fbdacc829236d704f5ae43c3a3d1566de55fb Mon Sep 17 00:00:00 2001 From: Evan Siroky Date: Wed, 2 Aug 2017 23:05:39 -0700 Subject: [PATCH] fix(editor): improve pattern shape editing --- lib/editor/actions/map/index.js | 42 ++++++++++++++++------- lib/editor/actions/map/stopStrategies.js | 21 ++++-------- lib/editor/components/map/ControlPoint.js | 9 ++--- lib/editor/containers/ActiveGtfsEditor.js | 4 +-- lib/editor/util/map.js | 1 + 5 files changed, 44 insertions(+), 33 deletions(-) diff --git a/lib/editor/actions/map/index.js b/lib/editor/actions/map/index.js index 8e2473822..774532a37 100644 --- a/lib/editor/actions/map/index.js +++ b/lib/editor/actions/map/index.js @@ -33,11 +33,18 @@ export function handleControlPointDragEnd (index, controlPoint, evt, pattern) { } } -export function handleControlPointDrag (index, latlng, previous, next, pattern) { +export function handleControlPointDrag (controlPoints, index, latlng, patternShape) { return function (dispatch, getState) { - const { followStreets, patternCoordinates } = getState().editor.editSettings - const defaultToStraightLine = false - recalculatePatternCoordinates(latlng, previous, next, pattern, followStreets, patternCoordinates, defaultToStraightLine) + const {followStreets} = getState().editor.editSettings + recalculatePatternCoordinates( + controlPoints, + 'update', + index, + followStreets, + latlng, + patternShape, + false + ) .then(coords => { if (coords) { dispatch(updatePatternCoordinates(coords)) @@ -50,13 +57,11 @@ export function handleControlPointDrag (index, latlng, previous, next, pattern) } } -export function removingControlPoint (pattern, index, begin, end) { +export function removingControlPoint (pattern, index) { return { type: 'REMOVE_CONTROL_POINT', pattern, - index, - begin, - end + index } } @@ -93,14 +98,25 @@ export function updatePatternCoordinates (coordinates) { } } -export function removeControlPoint (pattern, index, begin, end) { +export function removeControlPoint (controlPoints, index, pattern) { return async function (dispatch, getState) { - const { followStreets, patternCoordinates } = getState().editor.editSettings - const coordinates = await recalculatePatternCoordinates(null, begin, end, pattern, followStreets, patternCoordinates) + const {followStreets} = getState().editor.editSettings + const coordinates = await recalculatePatternCoordinates( + controlPoints, + 'delete', + index, + followStreets, + null, + pattern.shape + ) // update pattern - dispatch(updateActiveGtfsEntity(pattern, 'trippattern', {shape: {type: 'LineString', coordinates}})) + dispatch( + updateActiveGtfsEntity(pattern, 'trippattern', { + shape: {type: 'LineString', coordinates} + }) + ) // remove controlPoint - dispatch(removingControlPoint(pattern, index, begin, end)) + dispatch(removingControlPoint(pattern, index)) } } diff --git a/lib/editor/actions/map/stopStrategies.js b/lib/editor/actions/map/stopStrategies.js index 29eaf86ef..dcc1c51de 100644 --- a/lib/editor/actions/map/stopStrategies.js +++ b/lib/editor/actions/map/stopStrategies.js @@ -238,25 +238,18 @@ export function removeStopFromPattern (pattern, stop, index, controlPoints) { controlPointStopIdx === index ) }) - // if not the first stop, use the previous control point as beginning of slice - const begin = controlPoints[cpIndex - 2] - ? controlPoints[cpIndex - 1].point - : null - // if not last stop, use previous control point as end of slice - const end = controlPoints[cpIndex + 2] - ? controlPoints[cpIndex + 1].point - : null - const {followStreets, patternCoordinates} = getState().editor.editSettings + + const {followStreets} = getState().editor.editSettings let coordinates try { coordinates = await recalculatePatternCoordinates( - null, - begin, - end, - pattern, + controlPoints, + 'delete', + cpIndex, followStreets, - patternCoordinates + null, + pattern.shape ) } catch (err) { console.log(err) diff --git a/lib/editor/components/map/ControlPoint.js b/lib/editor/components/map/ControlPoint.js index 8b0cecb80..38324295d 100644 --- a/lib/editor/components/map/ControlPoint.js +++ b/lib/editor/components/map/ControlPoint.js @@ -7,6 +7,7 @@ export default class ControlPoint extends Component { static propTypes = { activePattern: PropTypes.object, controlPoint: PropTypes.object, + controlPoints: PropTypes.array, editSettings: PropTypes.object, icon: PropTypes.object, index: PropTypes.number, @@ -34,18 +35,18 @@ export default class ControlPoint extends Component { } _onClick = (e) => { - const {permanent, removeControlPoint, activePattern, index, previous, next} = this.props + const {controlPoints, permanent, removeControlPoint, activePattern, index} = this.props // only remove controlPoint if it's not based on pattern stop (i.e., has permanent prop) if (!permanent) { - removeControlPoint(activePattern, index, previous, next) + removeControlPoint(controlPoints, index, activePattern) } } handleDrag = (e) => { - const {activePattern, handleControlPointDrag, index, next, previous} = this.props + const {activePattern, controlPoints, handleControlPointDrag, index} = this.props const latlng = e.latlng this.setState({latlng}) - handleControlPointDrag(index, latlng, previous, next, activePattern) + handleControlPointDrag(controlPoints, index, latlng, activePattern.shape) } _onDragEnd = (e) => { diff --git a/lib/editor/containers/ActiveGtfsEditor.js b/lib/editor/containers/ActiveGtfsEditor.js index 1ca1c3f7c..a6ab1e33e 100644 --- a/lib/editor/containers/ActiveGtfsEditor.js +++ b/lib/editor/containers/ActiveGtfsEditor.js @@ -218,11 +218,11 @@ const mapDispatchToProps = (dispatch, ownProps) => { addStopAtIntersection: (latlng, activePattern) => dispatch(addStopAtIntersection(latlng, activePattern)), addControlPoint: (controlPoint, index) => dispatch(addControlPoint(controlPoint, index)), setActiveStop: ({id, index}) => dispatch(setActiveStop({id, index})), - removeControlPoint: (pattern, index, begin, end) => dispatch(removeControlPoint(pattern, index, begin, end)), + removeControlPoint: (controlPoints, index, pattern) => dispatch(removeControlPoint(controlPoints, index, pattern)), updateControlPoint: (index, point, distance) => dispatch(updateControlPoint(index, point, distance)), constructControlPoint: (pattern, latlng, controlPoints) => dispatch(constructControlPoint(pattern, latlng, controlPoints)), handleControlPointDragEnd: (index, controlPoint, evt, pattern) => dispatch(handleControlPointDragEnd(index, controlPoint, evt, pattern)), - handleControlPointDrag: (index, latlng, previous, next, pattern) => dispatch(handleControlPointDrag(index, latlng, previous, next, pattern)), + handleControlPointDrag: (controlPoints, index, latlng, patternShape) => dispatch(handleControlPointDrag(controlPoints, index, latlng, patternShape)), // EDITOR UI setTutorialHidden: (value) => dispatch(setTutorialHidden(value)) diff --git a/lib/editor/util/map.js b/lib/editor/util/map.js index 10964276e..f3edb55fc 100644 --- a/lib/editor/util/map.js +++ b/lib/editor/util/map.js @@ -146,6 +146,7 @@ export async function recalculatePatternCoordinates ( /** * Convenience function to return the coordinates from a lineSliceAlong operation + * * @param {Number} startDistance * @param {Number} endDistance * @return {Coordinate[]}