@@ -21,7 +21,8 @@ namespace FlaxEditor.Windows
|
||||
private readonly GameRoot _guiRoot;
|
||||
private bool _showGUI = true;
|
||||
private bool _showDebugDraw = false;
|
||||
private bool _isMaximized = false;
|
||||
private bool _isMaximized = false, _isUnlockingMouse = false;
|
||||
private bool _cursorVisible = true;
|
||||
private float _gameStartTime;
|
||||
private GUI.Docking.DockState _maximizeRestoreDockState;
|
||||
private GUI.Docking.DockPanel _maximizeRestoreDockTo;
|
||||
@@ -460,14 +461,20 @@ namespace FlaxEditor.Windows
|
||||
{
|
||||
if (Editor.StateMachine.IsPlayMode)
|
||||
{
|
||||
Screen.CursorVisible = true;
|
||||
Focus(null);
|
||||
Editor.Windows.MainWindow.Focus();
|
||||
if (Editor.Windows.PropertiesWin.IsDocked)
|
||||
Editor.Windows.PropertiesWin.Focus();
|
||||
// Cache cursor
|
||||
_cursorVisible = Screen.CursorVisible;
|
||||
_cursorLockMode = Screen.CursorLock;
|
||||
Screen.CursorVisible = true;
|
||||
if (Screen.CursorLock == CursorLockMode.Clipped)
|
||||
Screen.CursorLock = CursorLockMode.None;
|
||||
|
||||
// Defocus
|
||||
_isUnlockingMouse = true;
|
||||
Focus(null);
|
||||
_isUnlockingMouse = false;
|
||||
Editor.Windows.MainWindow.Focus();
|
||||
if (Editor.Windows.PropertiesWin.IsDocked)
|
||||
Editor.Windows.PropertiesWin.Focus();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -552,9 +559,11 @@ namespace FlaxEditor.Windows
|
||||
Root.MousePosition = center;
|
||||
}
|
||||
|
||||
// Restore lock mode
|
||||
// Restore cursor
|
||||
if (_cursorLockMode != CursorLockMode.None)
|
||||
Screen.CursorLock = _cursorLockMode;
|
||||
if (!_cursorVisible)
|
||||
Screen.CursorVisible = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -563,11 +572,16 @@ namespace FlaxEditor.Windows
|
||||
{
|
||||
base.OnEndContainsFocus();
|
||||
|
||||
// Restore cursor visibility (could be hidden by the game)
|
||||
Screen.CursorVisible = true;
|
||||
if (!_isUnlockingMouse)
|
||||
{
|
||||
// Cache cursor
|
||||
_cursorVisible = Screen.CursorVisible;
|
||||
_cursorLockMode = Screen.CursorLock;
|
||||
|
||||
// Cache lock mode
|
||||
_cursorLockMode = Screen.CursorLock;
|
||||
// Restore cursor visibility (could be hidden by the game)
|
||||
if (!_cursorVisible)
|
||||
Screen.CursorVisible = true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@@ -15,7 +15,8 @@
|
||||
|
||||
Nullable<bool> Fullscreen;
|
||||
Nullable<Float2> Size;
|
||||
static CursorLockMode CursorLock = CursorLockMode::None;
|
||||
bool CursorVisible = true;
|
||||
CursorLockMode CursorLock = CursorLockMode::None;
|
||||
|
||||
class ScreenService : public EngineService
|
||||
{
|
||||
@@ -25,6 +26,7 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
void Update() override;
|
||||
void Draw() override;
|
||||
};
|
||||
|
||||
@@ -88,12 +90,7 @@ Float2 Screen::GameViewportToScreen(const Float2& viewportPos)
|
||||
|
||||
bool Screen::GetCursorVisible()
|
||||
{
|
||||
#if USE_EDITOR
|
||||
const auto win = Editor::Managed->GetGameWindow(true);
|
||||
#else
|
||||
const auto win = Engine::MainWindow;
|
||||
#endif
|
||||
return win ? win->GetCursor() != CursorType::Hidden : true;
|
||||
return CursorVisible;
|
||||
}
|
||||
|
||||
void Screen::SetCursorVisible(const bool value)
|
||||
@@ -107,6 +104,7 @@ void Screen::SetCursorVisible(const bool value)
|
||||
{
|
||||
win->SetCursor(value ? CursorType::Default : CursorType::Hidden);
|
||||
}
|
||||
CursorVisible = value;
|
||||
}
|
||||
|
||||
CursorLockMode Screen::GetCursorLock()
|
||||
@@ -137,6 +135,14 @@ void Screen::SetCursorLock(CursorLockMode mode)
|
||||
CursorLock = mode;
|
||||
}
|
||||
|
||||
void ScreenService::Update()
|
||||
{
|
||||
#if USE_EDITOR
|
||||
// Sync current cursor state in Editor (eg. when viewport focus can change)
|
||||
Screen::SetCursorVisible(CursorVisible);
|
||||
#endif
|
||||
}
|
||||
|
||||
void ScreenService::Draw()
|
||||
{
|
||||
#if USE_EDITOR
|
||||
|
||||
Reference in New Issue
Block a user