1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
4 #include "EditorCommonAPI.h"
5 #include "EditorFramework/Editor.h"
6 #include "ProxyModels/ItemModelAttribute.h"
7 #include "CrySandbox/CrySignal.h"
8 #include "AssetSystem/AssetType.h"
9 #include "IAssetBrowserContext.h"
13 class CAssetDropHandler
;
14 class CAssetFolderFilterModel
;
15 class CAssetFoldersView
;
16 class CBreadcrumbsBar
;
17 class CFilteredFolders
;
18 class CLineEditDelegate
;
19 class CSortFilterProxyModel
;
21 class QAdvancedTreeView
;
22 class QAttributeFilterProxyModel
;
26 class QFilteringPanel
;
27 class QItemSelectionModel
;
30 class QThumbnailsView
;
35 //Thumbnails should now be used, leaving for now in case it is temporarily useful
36 #define ASSET_BROWSER_USE_PREVIEW_WIDGET 0
38 //! The dockable class for the Asset Browser
39 class EDITOR_COMMON_API CAssetBrowser
: public CDockableEditor
, public IAssetBrowserContext
42 Q_PROPERTY(int buttonsSpacing READ GetButtonsSpacing WRITE SetButtonsSpacing
)
43 Q_PROPERTY(int buttonGroupsSpacing READ GetButtonGroupsSpacing WRITE SetButtonGroupsSpacing
)
46 static CCrySignal
<void(CAbstractMenu
&, const std::shared_ptr
<IUIContext
>&)> s_signalMenuCreated
;
47 static CCrySignal
<void(CAbstractMenu
&, const std::vector
<CAsset
*>&, const std::vector
<string
>& folders
, const std::shared_ptr
<IUIContext
>&)> s_signalContextMenuRequested
;
49 CAssetBrowser(bool bHideEngineFolder
= false, QWidget
* pParent
= nullptr);
50 CAssetBrowser(const std::vector
<CAssetType
*>& assetTypes
, bool bHideEngineFolder
= false, QWidget
* pParent
= nullptr);
51 virtual ~CAssetBrowser();
53 //extract actual content from the selection
54 virtual void GetSelection(std::vector
<CAsset
*>& assets
, std::vector
<string
>& folders
) const override
;
56 virtual std::vector
<string
> GetSelectedFolders() const override
;
58 std::vector
<CAsset
*> GetSelectedAssets() const;
59 CAsset
* GetLastSelectedAsset() const;
61 void SelectAsset(const char* szPath
) const;
62 void SelectAsset(const CAsset
& asset
) const;
64 //CEditor implementation
65 virtual const char* GetEditorName() const override
{ return "Asset Browser"; }
66 virtual void SetLayout(const QVariantMap
& state
) override
;
67 virtual QVariantMap
GetLayout() const override
;
69 void GrabFocusSearchBar() { OnFind(); }
70 QFilteringPanel
* GetFilterPanel();
82 void SetViewMode(ViewMode viewMode
);
84 bool IsRecursiveView() const;
85 void SetRecursiveView(bool recursiveView
);
87 bool IsFoldersViewVisible() const;
88 void SetFoldersViewVisible(bool isVisible
);
90 bool AreIrrelevantFoldersHidden() const;
91 void HideIrrelevantFolders(bool isHidden
);
93 CAsset
* QueryNewAsset(const CAssetType
& type
, const CAssetType::SCreateParams
* pCreateParams
);
95 void NotifyContextMenuCreation(CAbstractMenu
& menu
, const std::vector
<CAsset
*>& assets
, const std::vector
<string
>& folders
);
97 int GetButtonsSpacing() const { return m_buttonsSpacing
; }
98 void SetButtonsSpacing(int val
) { m_buttonsSpacing
= val
; }
99 int GetButtonGroupsSpacing() const { return m_buttonGroupsSpacing
; }
100 void SetButtonGroupsSpacing(int val
) { m_buttonGroupsSpacing
= val
; }
103 //! This signal is emitted whenever the selection of folders or assets changes.
104 void SelectionChanged();
107 virtual void mouseReleaseEvent(QMouseEvent
* pEvent
) override
;
109 QAttributeFilterProxyModel
* GetAttributeFilterProxyModel();
110 QItemSelectionModel
* GetItemSelectionModel();
111 const QItemSelectionModel
* GetItemSelectionModel() const;
112 QAdvancedTreeView
* GetDetailsView();
113 QThumbnailsView
* GetThumbnailsView();
115 // The widget has to be visible.
116 void ScrollToSelected();
118 bool ValidatePath(const QString
);
120 virtual void OnActivated(CAsset
* pAsset
);
121 virtual void OnActivated(const QString
& folder
);
123 virtual void UpdatePreview(const QModelIndex
& currentIndex
);
125 // Adaptive layouts enables editor owners to make better use of space
126 bool SupportsAdaptiveLayout() const override
{ return true; }
127 // Triggered on resize for editors that support adaptive layouts
128 void OnAdaptiveLayoutChanged() override
;
129 // Used for determining what layout direction to use if adaptive layout is turned off
130 Qt::Orientation
GetDefaultOrientation() const override
{ return Qt::Horizontal
; }
132 virtual const IEditorContext
* GetContextObject() const override
{ return this; };
135 void SetModel(CAssetFolderFilterModel
* pModel
);
137 void InitAssetTypeFilter(const QStringList assetTypeNames
);
138 void InitNewNameDelegates();
139 void InitViews(bool bHideEngineFolder
);
141 void InitAssetsView();
142 void InitDetailsView();
143 void InitThumbnailsView();
144 void WaitUntilAssetsAreReady();
145 QWidget
* CreateAssetsViewSelector();
147 void FillCreateAssetMenu(CAbstractMenu
* menu
, bool enable
);
149 void BeginCreateAsset(const CAssetType
& type
, const CAssetType::SCreateParams
* pCreateParams
);
150 void EndCreateAsset();
152 QAbstractItemView
* GetFocusedView() const;
154 virtual bool eventFilter(QObject
* object
, QEvent
* event
) override
;
156 void OnSelectionChanged();
158 void UpdateSelectionDependantActions();
159 void UpdatePasteActionState();
161 void OnContextMenu();
162 void AppendFilterDependenciesActions(CAbstractMenu
* pAbstractMenu
, const CAsset
* pAsset
);
163 void OnFolderViewContextMenu();
165 void CreateContextMenu(bool isFolderView
= false);
167 void BuildContextMenuForEmptiness(CAbstractMenu
& abstractMenu
);
168 void BuildContextMenuForFolders(const std::vector
<string
>& folders
, CAbstractMenu
& abstractMenu
);
169 void BuildContextMenuForAssets(const std::vector
<CAsset
*>& assets
, const std::vector
<string
>& folders
, CAbstractMenu
& abstractMenu
);
171 void AddWorkFilesMenu(CAbstractMenu
& abstractMenu
);
173 bool HasSelectedModifiedAsset() const;
175 void OnFolderSelectionChanged(const QStringList
& selectedFolders
);
176 void OnActivated(const QModelIndex
& index
);
177 void OnCurrentChanged(const QModelIndex
& current
, const QModelIndex
& previous
);
178 void Delete(const std::vector
<CAsset
*>& assets
);
180 void OnRenameAsset(CAsset
& asset
);
181 void OnRenameFolder(const QString
& folder
);
182 void OnOpenInExplorer(const QString
& folder
);
185 void OnBreadcrumbClick(const QString
& text
, const QVariant
& data
);
186 void OnBreadcrumbsTextChanged(const QString
& text
);
188 void GenerateThumbnailsAsync(const string
& folder
, const std::function
<void()>& finalize
= std::function
<void()>());
190 void OnSearch(bool isNewSearch
);
191 void UpdateNavigation(bool clearHistory
);
192 void UpdateBreadcrumbsBar(const QString
& path
);
193 void UpdateNonEmptyFolderList();
197 bool OnDiscardChanges();
198 bool OnShowInFileExplorer();
199 bool OnGenerateThumbmails();
201 bool OnRecursiveView();
202 bool OnFolderTreeView();
203 bool OnManageWorkFiles();
204 bool OnDetailsView();
205 bool OnThumbnailsView();
206 bool OnSplitHorizontalView();
207 bool OnSplitVerticalView();
208 bool OnGenerateRepairAllMetadata();
210 bool OnHideIrrelevantFolders();
213 virtual bool OnFind() override
;
229 void Paste(bool pasteNextToOriginal
);
232 CAssetFoldersView
* m_pFoldersView
= nullptr;
233 CBreadcrumbsBar
* m_pBreadcrumbs
= nullptr;
234 QCommandAction
* m_pActionCopy
= nullptr;
235 QCommandAction
* m_pActionCopyName
= nullptr;
236 QCommandAction
* m_pActionCopyPath
= nullptr;
237 QCommandAction
* m_pActionDelete
= nullptr;
238 QCommandAction
* m_pActionDiscardChanges
= nullptr;
239 QCommandAction
* m_pActionDuplicate
= nullptr;
240 QCommandAction
* m_pActionGenerateRepairMetaData
= nullptr;
241 QCommandAction
* m_pActionGenerateThumbnails
= nullptr;
242 QCommandAction
* m_pActionHideIrrelevantFolders
= nullptr;
243 QCommandAction
* m_pActionManageWorkFiles
= nullptr;
244 QCommandAction
* m_pActionPaste
= nullptr;
245 QCommandAction
* m_pActionRecursiveView
= nullptr;
246 QCommandAction
* m_pActionReimport
= nullptr;
247 QCommandAction
* m_pActionRename
= nullptr;
248 QCommandAction
* m_pActionSave
= nullptr;
249 QCommandAction
* m_pActionSaveAll
= nullptr;
250 QCommandAction
* m_pActionShowDetails
= nullptr;
251 QCommandAction
* m_pActionShowFoldersView
= nullptr;
252 QCommandAction
* m_pActionShowInFileExplorer
= nullptr;
253 QCommandAction
* m_pActionShowSplitHorizontally
= nullptr;
254 QCommandAction
* m_pActionShowSplitVertically
= nullptr;
255 QCommandAction
* m_pActionShowThumbnails
= nullptr;
256 #if ASSET_BROWSER_USE_PREVIEW_WIDGET
257 QCommandAction
* m_pActionShowPreview
= nullptr;
260 QAdvancedTreeView
* m_pDetailsView
= nullptr;
261 QBoxLayout
* m_pAssetsViewLayout
= nullptr;
262 QFilteringPanel
* m_pFilterPanel
= nullptr;
263 QItemSelectionModel
* m_pSelection
= nullptr;
264 QLabel
* m_pMultipleFoldersLabel
= nullptr;
265 QSplitter
* m_pFoldersSplitter
= nullptr;
266 QSplitter
* m_pMainViewSplitter
= nullptr;
267 QThumbnailsView
* m_pThumbnailView
= nullptr;
268 QToolButton
* m_pBackButton
= nullptr;
269 QToolButton
* m_pForwardButton
= nullptr;
271 std::unique_ptr
<CAbstractMenu
> m_pThumbnailSizeMenu
;
272 std::unique_ptr
<CAssetDropHandler
> m_pAssetDropHandler
;
273 std::unique_ptr
<CAssetFolderFilterModel
> m_pFolderFilterModel
;
274 std::unique_ptr
<CLineEditDelegate
> m_pDetailsViewNewNameDelegate
; // Note that delegates are not owned by view.
275 std::unique_ptr
<CLineEditDelegate
> m_pThumbnailViewNewNameDelegate
;
276 std::unique_ptr
<CSortFilterProxyModel
> m_pAttributeFilterProxyModel
;
277 std::unique_ptr
<CFilteredFolders
> m_pFilteredFolders
;
279 const std::vector
<CAssetType
*> m_knownAssetTypes
;
282 QVector
<QStringList
> m_navigationHistory
;
283 ViewMode m_viewMode
= Max
;
284 int m_navigationIndex
= -1; //-1 is "all assets"
285 bool m_dontPushNavHistory
= false; //true when folder changes are triggered by back/forward buttons
286 bool m_recursiveSearch
= false;
288 int m_buttonsSpacing
= 4;
289 int m_buttonGroupsSpacing
= 24;
291 #if ASSET_BROWSER_USE_PREVIEW_WIDGET
292 bool OnShowPreview();
293 QContainer
* m_previewWidget
= nullptr;