From 1e340b855cbac8174cc1b2e2043d395dcfee5a8d Mon Sep 17 00:00:00 2001 From: Ivo Petrov Date: Tue, 15 Apr 2025 13:51:33 +0100 Subject: [PATCH 1/3] port popup placement --- src/DynamoCore/Graph/Nodes/NodeModel.cs | 1 + src/DynamoCoreWpf/ViewModels/Core/PortViewModel.cs | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/DynamoCore/Graph/Nodes/NodeModel.cs b/src/DynamoCore/Graph/Nodes/NodeModel.cs index b9ded720ea0..cf4cc389a25 100644 --- a/src/DynamoCore/Graph/Nodes/NodeModel.cs +++ b/src/DynamoCore/Graph/Nodes/NodeModel.cs @@ -106,6 +106,7 @@ public abstract class NodeModel : ModelBase, IRenderPackageSource, ID #endregion internal const double HeaderHeight = 46; + internal const double CustomNodeTopBorderHeight = 8; internal static string ExtensionNode = "ExtensionNode"; #region public members diff --git a/src/DynamoCoreWpf/ViewModels/Core/PortViewModel.cs b/src/DynamoCoreWpf/ViewModels/Core/PortViewModel.cs index 2040ba9513b..0cff51b3444 100644 --- a/src/DynamoCoreWpf/ViewModels/Core/PortViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Core/PortViewModel.cs @@ -444,11 +444,12 @@ private CustomPopupPlacement[] PlacePortContextMenu(Size popupSize, Size targetS // Calculate absolute popup halfheight to deduct from the overall y pos // Then add the header, port height and port index position var popupHeightOffset = - popupSize.Height * 0.5; - var headerHeightOffset = 2 * NodeModel.HeaderHeight * zoom; + var headerHeightOffset = NodeModel.HeaderHeight * zoom; var portHalfHeight = PortModel.Height * 0.5 * zoom; - var rowOffset = PortModel.Index * (1.5 * PortModel.Height) * zoom; + var rowOffset = PortModel.Index * PortModel.Height * zoom; + var customNodeOffset = NodeModel.CustomNodeTopBorderHeight * zoom; - var y = popupHeightOffset + headerHeightOffset + portHalfHeight + rowOffset; + var y = popupHeightOffset + headerHeightOffset + portHalfHeight + rowOffset + customNodeOffset; var placement = new CustomPopupPlacement(new Point(x, y), PopupPrimaryAxis.None); From 66a38c111b58fd00f08942bd7439ebd9bf0b59dc Mon Sep 17 00:00:00 2001 From: Ivo Petrov Date: Fri, 30 May 2025 12:51:45 +0100 Subject: [PATCH 2/3] Update PortViewModel.cs --- src/DynamoCoreWpf/ViewModels/Core/PortViewModel.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/DynamoCoreWpf/ViewModels/Core/PortViewModel.cs b/src/DynamoCoreWpf/ViewModels/Core/PortViewModel.cs index 0cff51b3444..93900ab2e2b 100644 --- a/src/DynamoCoreWpf/ViewModels/Core/PortViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Core/PortViewModel.cs @@ -427,6 +427,9 @@ private CustomPopupPlacement[] PlacePortContextMenu(Size popupSize, Size targetS // What matters is the zoom factor measured from the scaled : unscaled node size var zoom = node.WorkspaceViewModel.Zoom; + var source = PresentationSource.FromVisual(Application.Current.MainWindow); + var dpiScale = source?.CompositionTarget?.TransformToDevice.M22 ?? 1.0; + double x; var scaledWidth = autocompletePopupSpacing * targetSize.Width / node.ActualWidth; @@ -449,7 +452,7 @@ private CustomPopupPlacement[] PlacePortContextMenu(Size popupSize, Size targetS var rowOffset = PortModel.Index * PortModel.Height * zoom; var customNodeOffset = NodeModel.CustomNodeTopBorderHeight * zoom; - var y = popupHeightOffset + headerHeightOffset + portHalfHeight + rowOffset + customNodeOffset; + var y = popupHeightOffset + (headerHeightOffset + portHalfHeight + rowOffset + customNodeOffset) * dpiScale; var placement = new CustomPopupPlacement(new Point(x, y), PopupPrimaryAxis.None); From 0d66d0803cb00e794ba7f80b3bec9c22c3cb78ff Mon Sep 17 00:00:00 2001 From: Ivo Petrov Date: Fri, 30 May 2025 15:30:09 +0100 Subject: [PATCH 3/3] Update PortViewModel.cs --- src/DynamoCoreWpf/ViewModels/Core/PortViewModel.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/DynamoCoreWpf/ViewModels/Core/PortViewModel.cs b/src/DynamoCoreWpf/ViewModels/Core/PortViewModel.cs index c862abc9831..ccb6224a899 100644 --- a/src/DynamoCoreWpf/ViewModels/Core/PortViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Core/PortViewModel.cs @@ -423,7 +423,9 @@ private CustomPopupPlacement[] PlacePortContextMenu(Size popupSize, Size targetS var portHalfHeight = PortModel.Height * 0.5 * zoom; var rowOffset = PortModel.Index * PortModel.Height * zoom; var customNodeOffset = NodeModel.CustomNodeTopBorderHeight * zoom; - + + // popupSize.Height is already DPI-scaled (in screen pixels), so we do NOT apply dpiScale to it + // All other layout values are in logical units and must be multiplied by dpiScale for correct placement var y = popupHeightOffset + (headerHeightOffset + portHalfHeight + rowOffset + customNodeOffset) * dpiScale; var placement = new CustomPopupPlacement(new Point(x, y), PopupPrimaryAxis.None);