From ac44a22e3b0d6f59edca1c435d2086ec0c7b1819 Mon Sep 17 00:00:00 2001 From: Dmitry Lavrushko Date: Thu, 26 Sep 2019 14:16:45 +0000 Subject: [PATCH] !B (Sandbox) (CE-22110) EE: Unable to switch between presets open in two docked EE instances Copied from Perforce Change: 2034314 --- .../Plugins/EditorCommon/EditorFramework/Editor.h | 3 +++ .../EditorFramework/EventLoopHandler.cpp | 30 ++++++++++++++++++---- .../EditorFramework/EventLoopHandler.h | 23 ++++++++++------- .../EditorEnvironment/EnvironmentEditor.cpp | 12 ++++----- .../Plugins/EditorEnvironment/EnvironmentEditor.h | 11 ++++---- 5 files changed, 52 insertions(+), 27 deletions(-) diff --git a/Code/Sandbox/Plugins/EditorCommon/EditorFramework/Editor.h b/Code/Sandbox/Plugins/EditorCommon/EditorFramework/Editor.h index 88d78354c..cc96b2efd 100644 --- a/Code/Sandbox/Plugins/EditorCommon/EditorFramework/Editor.h +++ b/Code/Sandbox/Plugins/EditorCommon/EditorFramework/Editor.h @@ -112,6 +112,9 @@ public: CAbstractMenu* GetMenu(const char* menuName); CAbstractMenu* GetMenu(MenuItems menuItem); + // Panel or widget descendant is focused + virtual void OnFocus() {} + protected: void customEvent(QEvent* pEvent) override; void resizeEvent(QResizeEvent* pEvent) override; diff --git a/Code/Sandbox/Plugins/EditorCommon/EditorFramework/EventLoopHandler.cpp b/Code/Sandbox/Plugins/EditorCommon/EditorFramework/EventLoopHandler.cpp index 81f6581fe..3b42664cf 100644 --- a/Code/Sandbox/Plugins/EditorCommon/EditorFramework/EventLoopHandler.cpp +++ b/Code/Sandbox/Plugins/EditorCommon/EditorFramework/EventLoopHandler.cpp @@ -1,14 +1,16 @@ // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved. -#include + +#include "StdAfx.h" #include "EventLoopHandler.h" +#include "EditorFramework/Editor.h" +#include "EditorFramework/Events.h" #include #include -#include "Events.h" - CEventLoopHandler::CEventLoopHandler() : m_pDefaultHandler(nullptr) + , m_pFocusedEditor(nullptr) { qApp->installEventFilter(this); qApp->installNativeEventFilter(this); @@ -25,8 +27,8 @@ bool CEventLoopHandler::eventFilter(QObject* object, QEvent* event) //Custom events are only sent to the target widget and not propagated to parent. //This is an acceptable way to reimplement the event loop for all of our custom events - const int type = event->type(); - if (type > SandboxEvent::First && type < SandboxEvent::Max) + const int eventType = event->type(); + if (eventType > SandboxEvent::First && eventType < SandboxEvent::Max) { SandboxEvent* sandboxEvent = static_cast(event); if (sandboxEvent->m_fallbackToParent && !sandboxEvent->m_beingHandled && object->isWidgetType()) @@ -54,6 +56,24 @@ bool CEventLoopHandler::eventFilter(QObject* object, QEvent* event) } } } + else if (eventType == QEvent::FocusIn) + { + CEditor* pEditor = qobject_cast(object); + while (!pEditor) + { + object = object->parent(); + if (!object) + break; + + pEditor = qobject_cast(object); + } + + if (pEditor && pEditor != m_pFocusedEditor) + { + pEditor->OnFocus(); + m_pFocusedEditor = pEditor; + } + } return false;//Defer to processing by Qt event loop } diff --git a/Code/Sandbox/Plugins/EditorCommon/EditorFramework/EventLoopHandler.h b/Code/Sandbox/Plugins/EditorCommon/EditorFramework/EventLoopHandler.h index 6d8d2cc2d..ee79d0d8f 100644 --- a/Code/Sandbox/Plugins/EditorCommon/EditorFramework/EventLoopHandler.h +++ b/Code/Sandbox/Plugins/EditorCommon/EditorFramework/EventLoopHandler.h @@ -2,10 +2,14 @@ #pragma once #include "EditorCommonAPI.h" -#include + #include -#include +#include + #include +#include + +class CEditor; class EDITOR_COMMON_API CEventLoopHandler : public QObject, public QAbstractNativeEventFilter { @@ -15,24 +19,25 @@ public: ~CEventLoopHandler(); void SetDefaultHandler(QWidget* pDefaultHandler) { m_pDefaultHandler = pDefaultHandler; } - void AddNativeHandler(uintptr_t id, std::function ); + void AddNativeHandler(uintptr_t id, std::function); void RemoveNativeHandler(uintptr_t id); private: struct CallBack { - CallBack(size_t id, std::function cb) + CallBack(size_t id, std::function cb) : m_id(id) , m_cb(cb) {} - size_t m_id; - std::function m_cb; + size_t m_id; + std::function m_cb; }; virtual bool eventFilter(QObject* object, QEvent* event) override; - virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *) override; + virtual bool nativeEventFilter(const QByteArray& eventType, void* message, long*) override; - QWidget* m_pDefaultHandler; - std::vector m_nativeListeners; + QWidget* m_pDefaultHandler; + CEditor* m_pFocusedEditor; + std::vector m_nativeListeners; }; diff --git a/Code/Sandbox/Plugins/EditorEnvironment/EnvironmentEditor.cpp b/Code/Sandbox/Plugins/EditorEnvironment/EnvironmentEditor.cpp index 711c204f1..611d1412f 100644 --- a/Code/Sandbox/Plugins/EditorEnvironment/EnvironmentEditor.cpp +++ b/Code/Sandbox/Plugins/EditorEnvironment/EnvironmentEditor.cpp @@ -167,14 +167,12 @@ void CEnvironmentEditor::OnDiscardAssetChanges(CEditableAsset& editAsset) OnOpenAsset(pAsset); } -bool CEnvironmentEditor::event(QEvent* event) +void CEnvironmentEditor::OnFocus() { - if (event->type() == QEvent::WindowActivate) + CAssetEditor::OnFocus(); + + if (!m_presetFileName.empty()) { - if (!m_presetFileName.empty()) - { - GetTimeOfDay()->PreviewPreset(m_presetFileName); - } + GetTimeOfDay()->PreviewPreset(m_presetFileName); } - return CAssetEditor::event(event); } diff --git a/Code/Sandbox/Plugins/EditorEnvironment/EnvironmentEditor.h b/Code/Sandbox/Plugins/EditorEnvironment/EnvironmentEditor.h index 5beb5de0b..53196df7e 100644 --- a/Code/Sandbox/Plugins/EditorEnvironment/EnvironmentEditor.h +++ b/Code/Sandbox/Plugins/EditorEnvironment/EnvironmentEditor.h @@ -18,11 +18,11 @@ public: static ITimeOfDay* GetTimeOfDay(); private: - void RegisterActions(); - bool OnUndo() { return false; } - bool OnRedo() { return false; } + void RegisterActions(); + bool OnUndo() { return false; } + bool OnRedo() { return false; } - virtual const char* GetEditorName() const override { return "Environment Editor"; } + virtual const char* GetEditorName() const override { return "Environment Editor"; } virtual std::unique_ptr CreateEditingSession() override; virtual bool OnOpenAsset(CAsset* pAsset) override; @@ -30,8 +30,7 @@ private: virtual void OnDiscardAssetChanges(CEditableAsset& editAsset) override; virtual void OnInitialize() override; virtual void OnCreateDefaultLayout(CDockableContainer* pSender, QWidget* pAssetBrowser) override; - - virtual bool event(QEvent* event) override; + virtual void OnFocus() override; private: ITimeOfDay::IPreset* m_pPreset; -- 2.11.4.GIT