Cursors should stay after a code-mod (#113)

* setup to get path to nodes back from ast-mods

* fix cursor setting for constraint buttons that use transformSecondarySketchLinesTagFirst

* fix cursors for constraints that use transformAstSketchLines
This commit is contained in:
Kurt Hutten
2023-04-14 07:49:36 +10:00
committed by GitHub
parent 2fc68e7c82
commit 15699361a0
17 changed files with 410 additions and 312 deletions

View File

@ -25,7 +25,7 @@ import {
giveSketchFnCallTag,
} from '../modifyAst'
import { createFirstArg, getFirstArg, replaceSketchLine } from './sketch'
import { ProgramMemory } from '../executor'
import { PathToNode, ProgramMemory } from '../executor'
import { getSketchSegmentFromSourceRange } from './sketchConstraints'
import { getAngle, roundOff, normaliseAngle } from '../../lib/utils'
@ -785,6 +785,10 @@ const transformMap: TransformMap = {
tooltip: 'angledLine',
createNode: basicAngledLineCreateNode('len', 'ang', 'len'),
},
equalAngle: {
tooltip: 'angledLine',
createNode: basicAngledLineCreateNode('ang', 'len', 'len'),
},
},
},
angledLineOfXLength: {
@ -1319,6 +1323,8 @@ export function getRemoveConstraintsTransforms(
return theTransforms
}
type PathToNodeMap = { [key: number]: PathToNode }
export function transformSecondarySketchLinesTagFirst({
ast,
selectionRanges,
@ -1336,6 +1342,7 @@ export function transformSecondarySketchLinesTagFirst({
}): {
modifiedAst: Program
valueUsedInTransform?: number
pathToNodeMap: PathToNodeMap
tagInfo: {
tag: string
isTagExisting: boolean
@ -1344,25 +1351,30 @@ export function transformSecondarySketchLinesTagFirst({
// let node = JSON.parse(JSON.stringify(ast))
const primarySelection = selectionRanges.codeBasedSelections[0].range
const { modifiedAst, tag, isTagExisting } = giveSketchFnCallTag(
const { modifiedAst, tag, isTagExisting, pathToNode } = giveSketchFnCallTag(
ast,
primarySelection,
forceSegName
)
const result = transformAstSketchLines({
ast: modifiedAst,
selectionRanges: {
...selectionRanges,
codeBasedSelections: selectionRanges.codeBasedSelections.slice(1),
},
referencedSegmentRange: primarySelection,
transformInfos,
programMemory,
referenceSegName: tag,
forceValueUsedInTransform,
})
const updatedPathToNodeMap = incrementPathToNodeMap(result.pathToNodeMap)
updatedPathToNodeMap[0] = pathToNode
return {
...transformAstSketchLines({
ast: modifiedAst,
selectionRanges: {
...selectionRanges,
codeBasedSelections: selectionRanges.codeBasedSelections.slice(1),
},
referencedSegmentRange: primarySelection,
transformInfos,
programMemory,
referenceSegName: tag,
forceValueUsedInTransform,
}),
...result,
pathToNodeMap: updatedPathToNodeMap,
tagInfo: {
tag,
isTagExisting,
@ -1370,6 +1382,17 @@ export function transformSecondarySketchLinesTagFirst({
}
}
function incrementPathToNodeMap(
pathToNodeMap: PathToNodeMap,
increment = 1
): PathToNodeMap {
const newMap: PathToNodeMap = {}
Object.entries(pathToNodeMap).forEach(([key, path]) => {
newMap[Number(key) + increment] = path
})
return newMap
}
export function transformAstSketchLines({
ast,
selectionRanges,
@ -1386,10 +1409,15 @@ export function transformAstSketchLines({
referenceSegName: string
forceValueUsedInTransform?: Value
referencedSegmentRange?: Selection['range']
}): { modifiedAst: Program; valueUsedInTransform?: number } {
}): {
modifiedAst: Program
valueUsedInTransform?: number
pathToNodeMap: PathToNodeMap
} {
// deep clone since we are mutating in a loop, of which any could fail
let node = JSON.parse(JSON.stringify(ast))
let _valueUsedInTransform // TODO should this be an array?
const pathToNodeMap: PathToNodeMap = {}
selectionRanges.codeBasedSelections.forEach(({ range }, index) => {
const callBack = transformInfos?.[index].createNode
@ -1428,29 +1456,36 @@ export function transformAstSketchLines({
.segment
: sketchGroup.value.find((path) => path.name === _referencedSegmentName)
const { to, from } = seg
const { modifiedAst, valueUsedInTransform } = replaceSketchLine({
node: node,
programMemory,
sourceRange: range,
referencedSegment,
fnName: transformTo || (callExp.callee.name as TooTip),
to,
from,
createCallback: callBack({
referenceSegName: _referencedSegmentName,
varValA,
varValB,
tag: callBackTag,
forceValueUsedInTransform,
}),
})
const { modifiedAst, valueUsedInTransform, pathToNode } = replaceSketchLine(
{
node: node,
programMemory,
sourceRange: range,
referencedSegment,
fnName: transformTo || (callExp.callee.name as TooTip),
to,
from,
createCallback: callBack({
referenceSegName: _referencedSegmentName,
varValA,
varValB,
tag: callBackTag,
forceValueUsedInTransform,
}),
}
)
node = modifiedAst
pathToNodeMap[index] = pathToNode
if (typeof valueUsedInTransform === 'number') {
_valueUsedInTransform = valueUsedInTransform
}
})
return { modifiedAst: node, valueUsedInTransform: _valueUsedInTransform }
return {
modifiedAst: node,
valueUsedInTransform: _valueUsedInTransform,
pathToNodeMap,
}
}
function createSegLen(referenceSegName: string): Value {