From 9c4f4ffad15f7238c7922613709786804bf38f19 Mon Sep 17 00:00:00 2001 From: Nakshatra Sharma Date: Fri, 30 Jan 2026 00:04:33 +0530 Subject: [PATCH 1/4] fix: right-click delete in lower part of board (#829) Sync selection to context menu position so Delete/Copy/Cut work everywhere. --- src/simulator/src/ux.js | 27 ++++++++++++++++++++++++++- v1/src/simulator/src/ux.js | 27 ++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/simulator/src/ux.js b/src/simulator/src/ux.js index 01a93243..3d2e9cf0 100644 --- a/src/simulator/src/ux.js +++ b/src/simulator/src/ux.js @@ -7,7 +7,8 @@ import { layoutModeGet } from './layoutMode' import { scheduleUpdate, wireToBeCheckedSet, - updateCanvasSet + updateCanvasSet, + update } from './engine' import { simulationArea } from './simulationArea' import logixFunction from './data' @@ -53,12 +54,36 @@ function hideContextMenu() { ctxPos.visible = false }, 200) // Hide after 2 sec } + +var UNIT = 10 + +function syncSelectionToContextMenuPosition() { + var canvas = simulationArea.canvas + if (!canvas || typeof globalScope === 'undefined') return + var rect = canvas.getBoundingClientRect() + var rawX = (ctxPos.x - rect.left) * DPR + var rawY = (ctxPos.y - rect.top) * DPR + simulationArea.mouseDownRawX = rawX + simulationArea.mouseDownRawY = rawY + simulationArea.mouseDownX = Math.round(((rawX - globalScope.ox) / globalScope.scale) / UNIT) * UNIT + simulationArea.mouseDownY = Math.round(((rawY - globalScope.oy) / globalScope.scale) / UNIT) * UNIT + simulationArea.mouseRawX = rawX + simulationArea.mouseRawY = rawY + simulationArea.mouseXf = (rawX - globalScope.ox) / globalScope.scale + simulationArea.mouseYf = (rawY - globalScope.oy) / globalScope.scale + simulationArea.mouseX = simulationArea.mouseDownX + simulationArea.mouseY = simulationArea.mouseDownY + simulationArea.mouseDown = true + update(globalScope, true) +} + /** * Function displays context menu * @category ux */ function showContextMenu() { if (layoutModeGet()) return false // Hide context menu when it is in Layout Mode + syncSelectionToContextMenuPosition() $('#contextMenu').css({ visibility: 'visible', opacity: 1, diff --git a/v1/src/simulator/src/ux.js b/v1/src/simulator/src/ux.js index 01a93243..3d2e9cf0 100644 --- a/v1/src/simulator/src/ux.js +++ b/v1/src/simulator/src/ux.js @@ -7,7 +7,8 @@ import { layoutModeGet } from './layoutMode' import { scheduleUpdate, wireToBeCheckedSet, - updateCanvasSet + updateCanvasSet, + update } from './engine' import { simulationArea } from './simulationArea' import logixFunction from './data' @@ -53,12 +54,36 @@ function hideContextMenu() { ctxPos.visible = false }, 200) // Hide after 2 sec } + +var UNIT = 10 + +function syncSelectionToContextMenuPosition() { + var canvas = simulationArea.canvas + if (!canvas || typeof globalScope === 'undefined') return + var rect = canvas.getBoundingClientRect() + var rawX = (ctxPos.x - rect.left) * DPR + var rawY = (ctxPos.y - rect.top) * DPR + simulationArea.mouseDownRawX = rawX + simulationArea.mouseDownRawY = rawY + simulationArea.mouseDownX = Math.round(((rawX - globalScope.ox) / globalScope.scale) / UNIT) * UNIT + simulationArea.mouseDownY = Math.round(((rawY - globalScope.oy) / globalScope.scale) / UNIT) * UNIT + simulationArea.mouseRawX = rawX + simulationArea.mouseRawY = rawY + simulationArea.mouseXf = (rawX - globalScope.ox) / globalScope.scale + simulationArea.mouseYf = (rawY - globalScope.oy) / globalScope.scale + simulationArea.mouseX = simulationArea.mouseDownX + simulationArea.mouseY = simulationArea.mouseDownY + simulationArea.mouseDown = true + update(globalScope, true) +} + /** * Function displays context menu * @category ux */ function showContextMenu() { if (layoutModeGet()) return false // Hide context menu when it is in Layout Mode + syncSelectionToContextMenuPosition() $('#contextMenu').css({ visibility: 'visible', opacity: 1, From 7601e4d35ad39c29d597d0f8e763414a97e25ee0 Mon Sep 17 00:00:00 2001 From: Nakshatra Sharma Date: Fri, 30 Jan 2026 00:25:16 +0530 Subject: [PATCH 2/4] fix: restore mouseDown state after context menu sync --- src/simulator/src/ux.js | 2 ++ v1/src/simulator/src/ux.js | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/simulator/src/ux.js b/src/simulator/src/ux.js index 3d2e9cf0..491ecb5d 100644 --- a/src/simulator/src/ux.js +++ b/src/simulator/src/ux.js @@ -73,8 +73,10 @@ function syncSelectionToContextMenuPosition() { simulationArea.mouseYf = (rawY - globalScope.oy) / globalScope.scale simulationArea.mouseX = simulationArea.mouseDownX simulationArea.mouseY = simulationArea.mouseDownY + var wasMouseDown = simulationArea.mouseDown simulationArea.mouseDown = true update(globalScope, true) + simulationArea.mouseDown = wasMouseDown } /** diff --git a/v1/src/simulator/src/ux.js b/v1/src/simulator/src/ux.js index 3d2e9cf0..491ecb5d 100644 --- a/v1/src/simulator/src/ux.js +++ b/v1/src/simulator/src/ux.js @@ -73,8 +73,10 @@ function syncSelectionToContextMenuPosition() { simulationArea.mouseYf = (rawY - globalScope.oy) / globalScope.scale simulationArea.mouseX = simulationArea.mouseDownX simulationArea.mouseY = simulationArea.mouseDownY + var wasMouseDown = simulationArea.mouseDown simulationArea.mouseDown = true update(globalScope, true) + simulationArea.mouseDown = wasMouseDown } /** From 657a07882e33a00f99f4bb6a34ec4a2eb337a97b Mon Sep 17 00:00:00 2001 From: Nakshatra Sharma Date: Sat, 31 Jan 2026 23:36:37 +0530 Subject: [PATCH 3/4] fix: right click delete in lower part of board (#829) Preserve simulationArea.mouseDown value in syncSelectionToContextMenuPosition() to avoid leaving the simulator in a forced 'dragging' state after right click operations. Changed variable name from wasMouseDown to prevMouseDown for clarity. --- src/simulator/src/ux.js | 4 ++-- v1/src/simulator/src/ux.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/simulator/src/ux.js b/src/simulator/src/ux.js index 491ecb5d..851042f0 100644 --- a/src/simulator/src/ux.js +++ b/src/simulator/src/ux.js @@ -73,10 +73,10 @@ function syncSelectionToContextMenuPosition() { simulationArea.mouseYf = (rawY - globalScope.oy) / globalScope.scale simulationArea.mouseX = simulationArea.mouseDownX simulationArea.mouseY = simulationArea.mouseDownY - var wasMouseDown = simulationArea.mouseDown + var prevMouseDown = simulationArea.mouseDown simulationArea.mouseDown = true update(globalScope, true) - simulationArea.mouseDown = wasMouseDown + simulationArea.mouseDown = prevMouseDown } /** diff --git a/v1/src/simulator/src/ux.js b/v1/src/simulator/src/ux.js index 491ecb5d..851042f0 100644 --- a/v1/src/simulator/src/ux.js +++ b/v1/src/simulator/src/ux.js @@ -73,10 +73,10 @@ function syncSelectionToContextMenuPosition() { simulationArea.mouseYf = (rawY - globalScope.oy) / globalScope.scale simulationArea.mouseX = simulationArea.mouseDownX simulationArea.mouseY = simulationArea.mouseDownY - var wasMouseDown = simulationArea.mouseDown + var prevMouseDown = simulationArea.mouseDown simulationArea.mouseDown = true update(globalScope, true) - simulationArea.mouseDown = wasMouseDown + simulationArea.mouseDown = prevMouseDown } /** From c8a4765b7a64086b7c3bfbde0e54122c4592c5be Mon Sep 17 00:00:00 2001 From: Nakshatra Sharma Date: Thu, 5 Feb 2026 03:25:22 +0530 Subject: [PATCH 4/4] fix: complete right-click delete in lower canvas (DPR + z-index + event propagation) - Fixed DPR coordinate calculation using window.devicePixelRatio instead of undefined global - Increased context menu z-index to 1000 to ensure clicks reach menu items above canvas - Added @mousedown.stop to prevent canvas deselection when clicking context menu The original PR code had an undefined DPR variable causing NaN coordinates. Additionally, the canvas was intercepting menu clicks and deselecting components before Delete could execute, especially in lower canvas where menu appeared far from the selected component. --- src/components/ContextMenu/ContextMenu.vue | 2 +- src/simulator/src/ux.js | 7 ++++--- src/styles/css/UX.css | 21 ++++++++++++--------- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/components/ContextMenu/ContextMenu.vue b/src/components/ContextMenu/ContextMenu.vue index d060d4f6..3bb03693 100644 --- a/src/components/ContextMenu/ContextMenu.vue +++ b/src/components/ContextMenu/ContextMenu.vue @@ -1,5 +1,5 @@