!XB (Sandbox) (DEV-8348) Embedded Asset Browser must show a filtered list of assets...
[CRYENGINE.git] / Code / Sandbox / Plugins / EditorCommon / AssetSystem / Browser / AssetBrowser.h
blob23b574f6150fdbc7e47208c166b74e53ac9fa80a
1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
2 #pragma once
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"
11 #include <QWidget>
13 class CAssetDropHandler;
14 class CAssetFolderFilterModel;
15 class CAssetFoldersView;
16 class CBreadcrumbsBar;
17 class CFilteredFolders;
18 class CLineEditDelegate;
19 class CSortFilterProxyModel;
20 class QAction;
21 class QAdvancedTreeView;
22 class QAttributeFilterProxyModel;
23 class QBoxLayout;
24 class QButtonGroup;
25 class QCommandAction;
26 class QFilteringPanel;
27 class QItemSelectionModel;
28 class QMenu;
29 class QSplitter;
30 class QThumbnailsView;
31 class QTimer;
32 class QToolButton;
33 struct IUIContext;
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
41 Q_OBJECT
42 Q_PROPERTY(int buttonsSpacing READ GetButtonsSpacing WRITE SetButtonsSpacing)
43 Q_PROPERTY(int buttonGroupsSpacing READ GetButtonGroupsSpacing WRITE SetButtonGroupsSpacing)
45 public:
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();
72 enum ViewMode
74 Details,
75 Thumbnails,
76 VSplit,
77 HSplit,
79 Max
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; }
102 signals:
103 //! This signal is emitted whenever the selection of folders or assets changes.
104 void SelectionChanged();
106 protected:
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; };
134 private:
135 void SetModel(CAssetFolderFilterModel* pModel);
136 void InitActions();
137 void InitAssetTypeFilter(const QStringList assetTypeNames);
138 void InitNewNameDelegates();
139 void InitViews(bool bHideEngineFolder);
140 void InitMenus();
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);
183 void OnNavBack();
184 void OnNavForward();
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();
195 void EditNewAsset();
197 bool OnDiscardChanges();
198 bool OnShowInFileExplorer();
199 bool OnGenerateThumbmails();
200 bool OnSaveAll();
201 bool OnRecursiveView();
202 bool OnFolderTreeView();
203 bool OnManageWorkFiles();
204 bool OnDetailsView();
205 bool OnThumbnailsView();
206 bool OnSplitHorizontalView();
207 bool OnSplitVerticalView();
208 bool OnGenerateRepairAllMetadata();
209 bool OnReimport();
210 bool OnHideIrrelevantFolders();
212 // CEditor
213 virtual bool OnFind() override;
214 // ~CEditor
216 bool OnDelete();
217 bool OnOpen();
218 bool OnCopy();
219 bool OnPaste();
220 bool OnDuplicate();
221 bool OnImport();
222 bool OnNewFolder();
223 bool OnRename();
224 bool OnSave();
226 void OnCopyName();
227 void OnCopyPath();
229 void Paste(bool pasteNextToOriginal);
231 //ui components
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;
258 #endif
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;
281 //state variables
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;
294 #endif