You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/Editor/MainWindow.h

289 lines
8.1 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#if !defined(Q_MOC_RUN)
#include <AzCore/std/smart_ptr/shared_ptr.h>
#include <AzCore/Component/Component.h>
#include <QComboBox>
#include <QMainWindow>
#include <QScopedPointer>
#include <QSettings>
#include <QList>
#include <QPointer>
#include <QToolButton>
#include <QTimer>
#include "Include/SandboxAPI.h"
#include <AzQtComponents/Components/ToolButtonComboBox.h>
#include <AzQtComponents/Components/Widgets/ToolBar.h>
#include <AzToolsFramework/SourceControl/SourceControlAPI.h>
#include "IEditor.h"
#endif
class AssetImporterManager;
class LevelEditorMenuHandler;
class CMainFrame;
class UndoStackStateAdapter;
class QComboBox;
class KeyboardCustomizationSettings;
class QToolButton;
class MainStatusBar;
class CLayoutWnd;
struct QtViewPane;
class CLayoutViewPane;
class QtViewport;
class QtViewPaneManager;
class EngineConnectionListener;
class ToolbarManager;
class ToolbarCustomizationDialog;
class QWidgetAction;
class ActionManager;
class ShortcutDispatcher;
class CVarMenu;
namespace AzQtComponents
{
class DockMainWindow;
}
namespace AzToolsFramework
{
class Ticker;
}
namespace AzToolsFramework
{
class QtSourceControlNotificationHandler;
}
#define MAINFRM_LAYOUT_NORMAL "NormalLayout"
#define MAINFRM_LAYOUT_PREVIEW "PreviewLayout"
// Subclassing so we can add slots to our toolbar widgets
// Using lambdas is crashy since the lamdba doesn't know when the widget is deleted.
class UndoRedoToolButton
: public QToolButton
{
Q_OBJECT
public:
explicit UndoRedoToolButton(QWidget* parent);
public Q_SLOTS:
void Update(int count);
};
AZ_PUSH_DISABLE_DLL_EXPORT_BASECLASS_WARNING
AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING
class SANDBOX_API MainWindow
: public QMainWindow
, public IEditorNotifyListener
, private AzToolsFramework::SourceControlNotificationBus::Handler
{
AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING
AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING
Q_OBJECT
public:
explicit MainWindow(QWidget* parent = nullptr);
~MainWindow();
#ifdef Q_OS_WIN
HWND GetNativeHandle();
#endif // #ifdef Q_OS_WIN
ActionManager* GetActionManager() const;
void Initialize();
// Returns the old and original main frame which we're porting away from.
// ActionManager still needs it, to SendMessage() to it.
CMainFrame* GetOldMainFrame() const;
bool IsPreview() const;
// The singleton is just a hack for now, it should be removed once everything
// is ported to Qt.
static MainWindow* instance();
MainStatusBar* StatusBar() const;
CLayoutWnd* GetLayout() const;
KeyboardCustomizationSettings* GetShortcutManager() const;
ToolbarManager* GetToolbarManager() const;
void OpenViewPane(int paneId);
void OpenViewPane(QtViewPane* pane);
void SetActiveView(CLayoutViewPane* vp);
QMenu* createPopupMenu() override;
bool IsCustomizingToolbars() const;
/**
* Returns the active view layout (Perspective, Top, Bottom, or Left, etc).
* This particularly useful when in multi-layout mode, it represents the default viewport to use
* when needing to interact with one.
* When the user gives mouse focus to a viewport it becomes the active one, when unfocusing it
* however, it remains the active one, unless another viewport got focus.
*/
CLayoutViewPane* GetActiveView() const;
QtViewport* GetActiveViewport() const;
void AdjustToolBarIconSize(AzQtComponents::ToolBar::ToolBarIconSize size);
void InvalidateControls();
void OnCustomizeToolbar();
void SaveConfig();
void RefreshStyle();
//! Reset timers used for auto saving.
void ResetAutoSaveTimers(bool bForceInit = false);
void ResetBackgroundUpdateTimer();
void UpdateToolsMenu();
int ViewPaneVersion() const;
LevelEditorMenuHandler* GetLevelEditorMenuHandler() { return m_levelEditorMenuHandler; }
bool event(QEvent* event) override;
void OnGotoSliceRoot();
Q_SIGNALS:
void ToggleRefCoordSys();
void UpdateRefCoordSys();
void DeleteSelection();
protected:
void OnEditorNotifyEvent(EEditorNotifyEvent ev) override;
void closeEvent(QCloseEvent* event) override;
void keyPressEvent(QKeyEvent* e) override;
void dragEnterEvent(QDragEnterEvent *event) override;
void dragMoveEvent(QDragMoveEvent* event) override;
void dragLeaveEvent(QDragLeaveEvent* event) override;
void dropEvent(QDropEvent *event) override;
bool focusNextPrevChild(bool next) override;
private:
void OnGameModeChanged(bool inGameMode);
QWidget* CreateToolbarWidget(int id);
void ShowCustomizeToolbarDialog();
void OnGotoSelected();
void ToggleConsole();
void RegisterOpenWndCommands();
void InitCentralWidget();
void InitActions();
void InitToolActionHandlers();
void InitToolBars();
void InitStatusBar();
void OnViewPaneCreated(const QtViewPane* pane);
template <class TValue>
void ReadConfigValue(const QString& key, TValue& value)
{
value = m_settings.value(key, value).template value<TValue>();
}
// AzToolsFramework::SourceControlNotificationBus::Handler:
void ConnectivityStateChanged(const AzToolsFramework::SourceControlState state) override;
QWidget* CreateSpacerRightWidget();
QToolButton* CreateUndoRedoButton(int command);
private Q_SLOTS:
void ShowKeyboardCustomization();
void ExportKeyboardShortcuts();
void ImportKeyboardShortcuts();
void OnStopAllSounds();
void OnRefreshAudioSystem();
void SaveLayout();
void ViewDeletePaneLayout(const QString& layoutName);
void ViewRenamePaneLayout(const QString& layoutName);
void ViewLoadPaneLayout(const QString& layoutName);
void ViewSavePaneLayout(const QString& layoutName);
void OnConnectionStatusClicked();
void OnUpdateConnectionStatus();
void ShowConnectionDisconnectedDialog();
void OnEscapeAction();
void OnOpenAssetImporterManager(const QStringList& list);
private:
bool IsGemEnabled(const QString& uuid, const QString& version) const;
// Broadcast the SystemTick event
void SystemTick();
QStringList coordSysList() const;
void RegisterStdViewClasses();
CMainFrame* m_oldMainFrame;
QtViewPaneManager* m_viewPaneManager;
ShortcutDispatcher* m_shortcutDispatcher = nullptr;
ActionManager* m_actionManager = nullptr;
UndoStackStateAdapter* m_undoStateAdapter;
KeyboardCustomizationSettings* m_keyboardCustomization;
CLayoutViewPane* m_activeView;
QSettings m_settings;
ToolbarManager* const m_toolbarManager;
AssetImporterManager* m_assetImporterManager;
LevelEditorMenuHandler* m_levelEditorMenuHandler;
CLayoutWnd* m_pLayoutWnd;
AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING
AZStd::shared_ptr<EngineConnectionListener> m_connectionListener;
QTimer* m_connectionLostTimer;
QPointer<ToolbarCustomizationDialog> m_toolbarCustomizationDialog;
QScopedPointer<AzToolsFramework::QtSourceControlNotificationHandler> m_sourceControlNotifHandler;
AZ::Event<bool>::Handler m_handleImGuiStateChangeHandler;
AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING
static MainWindow* m_instance;
AzQtComponents::DockMainWindow* m_viewPaneHost;
QTimer* m_autoSaveTimer;
QTimer* m_autoRemindTimer;
QTimer* m_backgroundUpdateTimer;
bool m_connectedToAssetProcessor = false;
bool m_showAPDisconnectDialog = false;
bool m_selectedEntityHasRoot = false;
friend class ToolbarManager;
friend class WidgetAction;
friend class LevelEditorMenuHandler;
};
namespace AzToolsFramework
{
//! A component to reflect scriptable commands for MainWindow
class MainWindowEditorFuncsHandler
: public AZ::Component
{
public:
AZ_COMPONENT(MainWindowEditorFuncsHandler, "{C879102B-C767-4349-8F06-B69119CAC462}")
SANDBOX_API static void Reflect(AZ::ReflectContext* context);
// AZ::Component ...
void Activate() override {}
void Deactivate() override {}
};
} // namespace AZ