diff --git a/Source/Editor/Gizmo/GizmoBase.cs b/Source/Editor/Gizmo/GizmoBase.cs
index 6159c7673..1d8ccd233 100644
--- a/Source/Editor/Gizmo/GizmoBase.cs
+++ b/Source/Editor/Gizmo/GizmoBase.cs
@@ -22,6 +22,11 @@ namespace FlaxEditor.Gizmo
///
public bool IsActive => Owner.Gizmos.Active == this;
+ ///
+ /// Gets a value indicating whether this gizmo is using mouse currently (eg. user moving objects).
+ ///
+ public virtual bool IsControllingMouse => false;
+
///
/// Initializes a new instance of the class.
///
diff --git a/Source/Editor/Gizmo/TransformGizmoBase.cs b/Source/Editor/Gizmo/TransformGizmoBase.cs
index 170bcb5b1..9df9b858b 100644
--- a/Source/Editor/Gizmo/TransformGizmoBase.cs
+++ b/Source/Editor/Gizmo/TransformGizmoBase.cs
@@ -1,5 +1,6 @@
// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
+using System;
using System.Collections.Generic;
using FlaxEngine;
@@ -65,6 +66,16 @@ namespace FlaxEditor.Gizmo
///
public Transform LastDelta { get; private set; }
+ ///
+ /// Occurs when transforming selection started.
+ ///
+ public event Action TransformingStarted;
+
+ ///
+ /// Occurs when transforming selection ended.
+ ///
+ public event Action TransformingEnded;
+
///
/// Initializes a new instance of the class.
///
@@ -118,10 +129,10 @@ namespace FlaxEditor.Gizmo
return;
// End action
- OnEndTransforming();
- _startTransforms.Clear();
_isTransforming = false;
_isDuplicating = false;
+ OnEndTransforming();
+ _startTransforms.Clear();
}
private void UpdateGizmoPosition()
@@ -366,6 +377,9 @@ namespace FlaxEditor.Gizmo
}
}
+ ///
+ public override bool IsControllingMouse => _isTransforming;
+
///
public override void Update(float dt)
{
@@ -531,6 +545,7 @@ namespace FlaxEditor.Gizmo
///
protected virtual void OnStartTransforming()
{
+ TransformingStarted?.Invoke();
}
///
@@ -548,6 +563,7 @@ namespace FlaxEditor.Gizmo
///
protected virtual void OnEndTransforming()
{
+ TransformingEnded?.Invoke();
}
///
diff --git a/Source/Editor/Tools/Foliage/PaintFoliageGizmo.cs b/Source/Editor/Tools/Foliage/PaintFoliageGizmo.cs
index b24f503aa..9e6d78920 100644
--- a/Source/Editor/Tools/Foliage/PaintFoliageGizmo.cs
+++ b/Source/Editor/Tools/Foliage/PaintFoliageGizmo.cs
@@ -169,6 +169,9 @@ namespace FlaxEditor.Tools.Foliage
PaintEnded?.Invoke();
}
+ ///
+ public override bool IsControllingMouse => IsPainting;
+
///
public override void Update(float dt)
{
diff --git a/Source/Editor/Tools/Terrain/PaintTerrainGizmo.cs b/Source/Editor/Tools/Terrain/PaintTerrainGizmo.cs
index 51372f290..de95e4005 100644
--- a/Source/Editor/Tools/Terrain/PaintTerrainGizmo.cs
+++ b/Source/Editor/Tools/Terrain/PaintTerrainGizmo.cs
@@ -135,6 +135,9 @@ namespace FlaxEditor.Tools.Terrain
PaintEnded?.Invoke();
}
+ ///
+ public override bool IsControllingMouse => IsPainting;
+
///
public override void Update(float dt)
{
diff --git a/Source/Editor/Tools/Terrain/SculptTerrainGizmo.cs b/Source/Editor/Tools/Terrain/SculptTerrainGizmo.cs
index 88cd83d46..5900bc601 100644
--- a/Source/Editor/Tools/Terrain/SculptTerrainGizmo.cs
+++ b/Source/Editor/Tools/Terrain/SculptTerrainGizmo.cs
@@ -135,6 +135,9 @@ namespace FlaxEditor.Tools.Terrain
PaintEnded?.Invoke();
}
+ ///
+ public override bool IsControllingMouse => IsPainting;
+
///
public override void Update(float dt)
{
diff --git a/Source/Editor/Tools/VertexPainting.cs b/Source/Editor/Tools/VertexPainting.cs
index 29d9daedc..ad2a93251 100644
--- a/Source/Editor/Tools/VertexPainting.cs
+++ b/Source/Editor/Tools/VertexPainting.cs
@@ -540,6 +540,9 @@ namespace FlaxEditor.Tools
_paintUpdateCount = 0;
}
+ ///
+ public override bool IsControllingMouse => IsPainting;
+
///
public override void Update(float dt)
{
diff --git a/Source/Editor/Viewport/EditorGizmoViewport.cs b/Source/Editor/Viewport/EditorGizmoViewport.cs
index 93b2c7fbe..5c9fcf034 100644
--- a/Source/Editor/Viewport/EditorGizmoViewport.cs
+++ b/Source/Editor/Viewport/EditorGizmoViewport.cs
@@ -73,6 +73,9 @@ namespace FlaxEditor.Viewport
///
public Undo Undo { get; }
+ ///
+ protected override bool IsControllingMouse => Gizmos.Active?.IsControllingMouse ?? false;
+
///
protected override void AddUpdateCallbacks(RootControl root)
{
diff --git a/Source/Editor/Viewport/EditorViewport.cs b/Source/Editor/Viewport/EditorViewport.cs
index 6e2288979..9c4dcc253 100644
--- a/Source/Editor/Viewport/EditorViewport.cs
+++ b/Source/Editor/Viewport/EditorViewport.cs
@@ -136,7 +136,7 @@ namespace FlaxEditor.Viewport
// Input
- private bool _isControllingMouse;
+ private bool _isControllingMouse, _isViewportControllingMouse;
private int _deltaFilteringStep;
private Vector2 _startPos;
private Vector2 _mouseDeltaLast;
@@ -653,6 +653,11 @@ namespace FlaxEditor.Viewport
task.Begin += OnRenderBegin;
}
+ ///
+ /// Gets a value indicating whether this viewport is using mouse currently (eg. user moving objects).
+ ///
+ protected virtual bool IsControllingMouse => false;
+
///
/// Orients the viewport.
///
@@ -972,7 +977,16 @@ namespace FlaxEditor.Viewport
// Update input
{
// Get input buttons and keys (skip if viewport has no focus or mouse is over a child control)
- bool useMouse = Mathf.IsInRange(_viewMousePos.X, 0, Width) && Mathf.IsInRange(_viewMousePos.Y, 0, Height);
+ var isViewportControllingMouse = IsControllingMouse;
+ if (isViewportControllingMouse != _isViewportControllingMouse)
+ {
+ _isViewportControllingMouse = isViewportControllingMouse;
+ if (isViewportControllingMouse)
+ StartMouseCapture();
+ else
+ EndMouseCapture();
+ }
+ bool useMouse = IsControllingMouse || (Mathf.IsInRange(_viewMousePos.X, 0, Width) && Mathf.IsInRange(_viewMousePos.Y, 0, Height));
_prevInput = _input;
var hit = GetChildAt(_viewMousePos, c => c.Visible && !(c is CanvasRootControl));
if (ContainsFocus && hit == null)
diff --git a/Source/Editor/Viewport/PrefabWindowViewport.cs b/Source/Editor/Viewport/PrefabWindowViewport.cs
index e189a8e62..3cdd6ae0e 100644
--- a/Source/Editor/Viewport/PrefabWindowViewport.cs
+++ b/Source/Editor/Viewport/PrefabWindowViewport.cs
@@ -356,6 +356,9 @@ namespace FlaxEditor.Viewport
///
public Undo Undo { get; }
+ ///
+ protected override bool IsControllingMouse => Gizmos.Active?.IsControllingMouse ?? false;
+
///
protected override void AddUpdateCallbacks(RootControl root)
{