From 458a2df57cc1dcd86a392fc40d071a739cc143a4 Mon Sep 17 00:00:00 2001 From: Tyfon <29051038+tyfon7@users.noreply.github.com> Date: Thu, 25 Jul 2024 12:19:34 -0700 Subject: [PATCH] Fix right-mouse multiselect clearing on context menu --- Multiselect/DrawMultiSelect.cs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/Multiselect/DrawMultiSelect.cs b/Multiselect/DrawMultiSelect.cs index bf3e469..eaefc31 100644 --- a/Multiselect/DrawMultiSelect.cs +++ b/Multiselect/DrawMultiSelect.cs @@ -63,8 +63,8 @@ public class DrawMultiSelect : MonoBehaviour { bool shiftDown = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift); - // Only need to check we aren't over draggables/clickables if the multiselect key is left mouse - if (Settings.SelectionBoxKey.Value.MainKey == KeyCode.Mouse0 && !shiftDown && !MouseIsOverClickable()) + // Special case: if selection key is mouse0 (left), don't start selection if over a clickable + if (Settings.SelectionBoxKey.Value.MainKey == KeyCode.Mouse0 && !shiftDown && MouseIsOverClickable()) { return; } @@ -75,7 +75,11 @@ public class DrawMultiSelect : MonoBehaviour if (!secondary) { - MultiSelect.Clear(); + // Special case: if selection key is any mouse key (center,right), don't clear selection on mouse down if over item + if (Settings.SelectionBoxKey.Value.MainKey != KeyCode.Mouse1 && Settings.SelectionBoxKey.Value.MainKey != KeyCode.Mouse2 || !MouseIsOverItem()) + { + MultiSelect.Clear(); + } } } @@ -165,12 +169,17 @@ public class DrawMultiSelect : MonoBehaviour } } - private bool MouseIsOverClickable() + private bool MouseIsOverItem() { // checking ItemUiContext is a quick and easy way to know the mouse is over an item - if (ItemUiContext.Instance.R().ItemContext != null) + return ItemUiContext.Instance.R().ItemContext != null; + } + + private bool MouseIsOverClickable() + { + if (MouseIsOverItem()) { - return false; + return true; } PointerEventData eventData = new(EventSystem.current) @@ -194,11 +203,11 @@ public class DrawMultiSelect : MonoBehaviour if (draggables.Any() || clickables.Any()) { - return false; + return true; } } - return true; + return false; } private bool IsOnTop(Rect itemRect, Transform itemTransform, GraphicRaycaster raycaster)