Merge pull request #4974 from node-red/4969-fix-junction-insert-location

Fix junction insert position via context menu
pull/4949/head^2
Nick O'Leary 2024-12-05 16:23:51 +00:00 committed by GitHub
commit fe22afea6a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 35 additions and 28 deletions

View File

@ -54,15 +54,15 @@ RED.contextMenu = (function () {
} }
} }
const scale = RED.view.scale()
const offset = $("#red-ui-workspace-chart").offset() const offset = $("#red-ui-workspace-chart").offset()
let addX = (options.x - offset.left + $("#red-ui-workspace-chart").scrollLeft()) / scale
let addX = options.x - offset.left + $("#red-ui-workspace-chart").scrollLeft() let addY = (options.y - offset.top + $("#red-ui-workspace-chart").scrollTop()) / scale
let addY = options.y - offset.top + $("#red-ui-workspace-chart").scrollTop()
if (RED.view.snapGrid) { if (RED.view.snapGrid) {
const gridSize = RED.view.gridSize() const gridSize = RED.view.gridSize()
addX = gridSize * Math.floor(addX / gridSize) addX = gridSize * Math.round(addX / gridSize)
addY = gridSize * Math.floor(addY / gridSize) addY = gridSize * Math.round(addY / gridSize)
} }
if (RED.settings.theme("menu.menu-item-action-list", true)) { if (RED.settings.theme("menu.menu-item-action-list", true)) {
@ -87,7 +87,9 @@ RED.contextMenu = (function () {
}, },
(hasLinks) ? { // has least 1 wire selected (hasLinks) ? { // has least 1 wire selected
label: RED._("contextMenu.junction"), label: RED._("contextMenu.junction"),
onselect: 'core:split-wires-with-junctions', onselect: function () {
RED.actions.invoke('core:split-wires-with-junctions', { x: addX, y: addY })
},
disabled: !canEdit || !hasLinks disabled: !canEdit || !hasLinks
} : { } : {
label: RED._("contextMenu.junction"), label: RED._("contextMenu.junction"),

View File

@ -1154,11 +1154,11 @@ RED.view.tools = (function() {
} }
} }
function addJunctionsToWires(wires) { function addJunctionsToWires(options = {}) {
if (RED.workspaces.isLocked()) { if (RED.workspaces.isLocked()) {
return return
} }
let wiresToSplit = wires || (RED.view.selection().links && RED.view.selection().links.filter(e => !e.link)); let wiresToSplit = options.wires || (RED.view.selection().links && RED.view.selection().links.filter(e => !e.link));
if (!wiresToSplit) { if (!wiresToSplit) {
return return
} }
@ -1206,21 +1206,26 @@ RED.view.tools = (function() {
if (links.length === 0) { if (links.length === 0) {
return return
} }
let pointCount = 0 if (addedJunctions.length === 0 && Object.hasOwn(options, 'x') && Object.hasOwn(options, 'y')) {
links.forEach(function(l) { junction.x = options.x
if (l._sliceLocation) { junction.y = options.y
junction.x += l._sliceLocation.x } else {
junction.y += l._sliceLocation.y let pointCount = 0
delete l._sliceLocation links.forEach(function(l) {
pointCount++ if (l._sliceLocation) {
} else { junction.x += l._sliceLocation.x
junction.x += l.source.x + l.source.w/2 + l.target.x - l.target.w/2 junction.y += l._sliceLocation.y
junction.y += l.source.y + l.target.y delete l._sliceLocation
pointCount += 2 pointCount++
} } else {
}) junction.x += l.source.x + l.source.w/2 + l.target.x - l.target.w/2
junction.x = Math.round(junction.x/pointCount) junction.y += l.source.y + l.target.y
junction.y = Math.round(junction.y/pointCount) pointCount += 2
}
})
junction.x = Math.round(junction.x/pointCount)
junction.y = Math.round(junction.y/pointCount)
}
if (RED.view.snapGrid) { if (RED.view.snapGrid) {
let gridSize = RED.view.gridSize() let gridSize = RED.view.gridSize()
junction.x = (gridSize*Math.round(junction.x/gridSize)); junction.x = (gridSize*Math.round(junction.x/gridSize));
@ -1410,7 +1415,7 @@ RED.view.tools = (function() {
RED.actions.add("core:wire-multiple-to-node", function() { wireMultipleToNode() }) RED.actions.add("core:wire-multiple-to-node", function() { wireMultipleToNode() })
RED.actions.add("core:split-wire-with-link-nodes", function () { splitWiresWithLinkNodes() }); RED.actions.add("core:split-wire-with-link-nodes", function () { splitWiresWithLinkNodes() });
RED.actions.add("core:split-wires-with-junctions", function () { addJunctionsToWires() }); RED.actions.add("core:split-wires-with-junctions", function (options) { addJunctionsToWires(options) });
RED.actions.add("core:generate-node-names", generateNodeNames ) RED.actions.add("core:generate-node-names", generateNodeNames )

View File

@ -321,8 +321,8 @@ RED.view = (function() {
evt.stopPropagation() evt.stopPropagation()
RED.contextMenu.show({ RED.contextMenu.show({
type: 'workspace', type: 'workspace',
x:evt.clientX-5, x: evt.clientX,
y:evt.clientY-5 y: evt.clientY
}) })
return false return false
}) })
@ -5174,8 +5174,8 @@ RED.view = (function() {
var delta = Infinity; var delta = Infinity;
for (var i = 0; i < lineLength; i++) { for (var i = 0; i < lineLength; i++) {
var linePos = pathLine.getPointAtLength(i); var linePos = pathLine.getPointAtLength(i);
var posDeltaX = Math.abs(linePos.x-d3.event.offsetX) var posDeltaX = Math.abs(linePos.x-(d3.event.offsetX / scaleFactor))
var posDeltaY = Math.abs(linePos.y-d3.event.offsetY) var posDeltaY = Math.abs(linePos.y-(d3.event.offsetY / scaleFactor))
var posDelta = posDeltaX*posDeltaX + posDeltaY*posDeltaY var posDelta = posDeltaX*posDeltaX + posDeltaY*posDeltaY
if (posDelta < delta) { if (posDelta < delta) {
pos = linePos pos = linePos