!B (Sandbox) (CE-21795) Importing models with multisubmaterials via fbx switches...
[CRYENGINE.git] / Code / Sandbox / Plugins / EditorSchematyc2 / Editor / BrowserWidget.h
blob1a96ed3f4f1559644ad0cad1bf684ed1fe21ec0e
1 // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
3 // #SchematycTODO : Rename ScriptBrowser!
5 #pragma once
7 #include <QAbstractItemModel>
8 #include <QTreeView>
9 #include <QWidget>
10 #include <CrySchematyc2/Script/IScriptRegistry.h>
11 #include <CrySchematyc2/TemplateUtils/TemplateUtils_Signalv2.h>
13 class QBoxLayout;
14 class QItemSelection;
15 class QLineEdit;
16 class QMenu;
17 class QParentWndWidget;
18 class QPushButton;
19 class QSplitter;
21 namespace Schematyc2
23 class CBrowserFilter;
25 namespace BrowserUtils
27 class CFileChangeListener;
30 class CBrowserRules
32 public:
34 bool CanAddScriptElement(EScriptElementType scriptElementType, const SGUID& scopeGUID) const;
35 const char* GetScriptElementFilter(EScriptElementType scriptElementType) const;
38 struct EBrowserColumn
40 enum : int
42 Name = 0,
43 Status,
44 Count
48 enum class EBrowserItemType
50 Root = 0,
51 Filter,
52 ScriptElement
55 enum class EBrowserItemStatusFlags // #SchematycTODO : Rename EBrowserItemFlags?
57 None = 0,
59 Local = BIT(0),
60 InPak = BIT(1),
61 ReadOnly = BIT(2),
62 SourceControl = BIT(3),
63 CheckedOut = BIT(4),
65 ContainsWarnings = BIT(5),
66 ContainsErrors = BIT(6),
68 FileMask = Local | InPak | ReadOnly | SourceControl | CheckedOut,
69 ValidationMask = ContainsWarnings | ContainsErrors
72 DECLARE_ENUM_CLASS_FLAGS(EBrowserItemStatusFlags)
74 class CBrowserModel : public QAbstractItemModel
76 Q_OBJECT
78 public:
80 class CItem;
82 DECLARE_SHARED_POINTERS(CItem)
84 typedef std::vector<CItemPtr> Items; // #SchematycTODO : Do we really need to use shared pointers?
86 class CItem
88 public:
90 CItem(EBrowserItemType type, const char* szName, const char* szIcon = nullptr);
91 CItem(IScriptElement* pScriptElement, const char* szName, const char* szIcon);
93 EBrowserItemType GetType() const;
95 void SetName(const char* szName);
96 const char* GetName() const;
97 const char* GetPath() const;
98 const char* GetIcon() const;
100 void SetStatusFlags(EBrowserItemStatusFlags statusFlags);
101 EBrowserItemStatusFlags GetStatusFlags() const;
102 const char* GetStatusText() const;
103 const char* GetStatusIcon() const;
104 void SetStatusToolTip(const char* szStatusToolTip);
105 const char* GetStatusToolTip() const;
106 QVariant GetColor() const;
108 IScriptElement* GetScriptElement() const;
110 CItem* GetParent();
111 void AddChild(const CItemPtr& pChild);
112 void RemoveChild(CItem* pChild);
113 int GetChildCount() const;
114 int GetChildIdx(CItem* pChild);
115 CItem* GetChildByIdx(int childIdx);
116 CItem* GetChildByTypeAndName(EBrowserItemType type, const char* szName);
117 CItem* GetChildByPath(const char* szPath);
118 void SortChildren();
120 void Validate();
121 void OnChildValidate(EBrowserItemStatusFlags statusFlags);
123 private:
125 EBrowserItemType m_type;
126 string m_name;
127 string m_path;
128 string m_icon;
129 EBrowserItemStatusFlags m_statusFlags;
130 string m_statusToolTip;
131 IScriptElement* m_pScriptElement;
132 CItem* m_pParent;
133 Items m_children;
136 typedef std::unordered_map<SGUID, CItem*> ScriptElementItems;
138 private:
140 enum class ETaskStatus
142 Done,
143 Repeat
146 struct ITask
148 virtual ~ITask() {}
150 // #SchematycTODO : Add some kind of delay system?
152 virtual ETaskStatus Execute(CBrowserModel& model) = 0;
155 DECLARE_SHARED_POINTERS(ITask)
157 typedef std::queue<ITaskPtr> Tasks;
159 class CSourceControlRefreshTask : public ITask
161 public:
163 CSourceControlRefreshTask(const SGUID& guid);
165 // ITask
166 ETaskStatus Execute(CBrowserModel& model) override;
167 // ~ITask
169 public:
171 SGUID m_guid;
174 public:
176 CBrowserModel(QObject* pParent);
178 // QAbstractItemModel
179 QModelIndex index(int row, int column, const QModelIndex& parent) const override;
180 QModelIndex parent(const QModelIndex& index) const override;
181 int rowCount(const QModelIndex& index) const override;
182 int columnCount(const QModelIndex& parent) const override;
183 bool hasChildren(const QModelIndex &parent) const override;
184 QVariant data(const QModelIndex& index, int role) const override;
185 bool setData(const QModelIndex &index, const QVariant &value, int role) override;
186 QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
187 Qt::ItemFlags flags(const QModelIndex& index ) const override;
188 // ~QAbstractItemModel
190 void ProcessTasks();
191 void Reset();
193 QModelIndex ItemToIndex(CItem* pItem, int column = 0) const;
194 CItem* ItemFromIndex(const QModelIndex& index) const;
195 CItem* GetScriptElementItem(const SGUID& guid);
197 public slots:
199 private:
201 void Populate();
202 void OnScriptRegistryChange(EScriptRegistryChange change, IScriptElement* pScriptElement);
203 void OnScriptElementAdded(IScriptElement& scriptElement);
204 void OnScriptElementRemoved(IScriptElement& scriptElement);
205 CItemPtr CreateScriptElementItem(IScriptElement& scriptElement, CItem* pParentItem);
206 void ScheduleTask(const ITaskPtr& pTask);
208 private:
210 CBrowserRules m_rules;
211 CItemPtr m_pRootItem;
212 ScriptElementItems m_scriptElementItems;
213 Tasks m_tasks;
214 TemplateUtils::CConnectionScope m_connectionScope;
217 class CBrowserTreeView : public QTreeView
219 Q_OBJECT
221 public:
223 CBrowserTreeView(QWidget* pParent);
225 signals:
227 void keyPress(QKeyEvent* pKeyEvent, bool& bEventHandled);
229 protected:
231 virtual void keyPressEvent(QKeyEvent* pKeyEvent) override;
234 typedef TemplateUtils::CSignalv2<void (IScriptElement*)> BrowserSelectionSignal;
236 struct SBrowserSignals
238 BrowserSelectionSignal selection;
241 class CBrowserWidget : public QWidget
243 Q_OBJECT
245 public:
247 CBrowserWidget(QWidget* pParent);
249 ~CBrowserWidget();
251 void InitLayout();
252 void Reset();
254 SBrowserSignals& Signals();
256 public slots:
258 void OnBackButtonClicked();
259 void OnSearchFilterChanged(const QString& text);
260 void OnTreeViewDoubleClicked(const QModelIndex& index);
261 void OnTreeViewCustomContextMenuRequested(const QPoint& position);
262 void OnTreeViewKeyPress(QKeyEvent* pKeyEvent, bool& bEventHandled);
263 void OnSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected);
264 void OnAddItem();
265 void OnRenameItem();
266 void OnRemoveItem();
267 void OnSave();
268 void OnAddToSourceControl();
269 void OnGetLatestRevision();
270 void OnCheckOut();
271 void OnRevert();
272 void OnDiffAgainstLatestRevision();
273 void OnShowInExplorer();
274 void OnExtract();
276 protected:
278 virtual void keyPressEvent(QKeyEvent* pKeyEvent) override;
279 virtual void timerEvent(QTimerEvent* pTimerEvent) override;
281 private:
283 void ExpandAll();
284 void PopulateFilterMenu(QMenu& menu);
285 void PopulateAddMenu(QMenu& menu);
286 void SetFocus(const QModelIndex& index);
287 bool HandleKeyPress(QKeyEvent* pKeyEvent);
289 QModelIndex GetTreeViewSelection() const;
290 QModelIndex TreeViewToModelIndex(const QModelIndex& index) const;
291 QModelIndex TreeViewFromModelIndex(const QModelIndex& index) const;
293 private:
295 QBoxLayout* m_pMainLayout;
296 QBoxLayout* m_pFilterLayout;
297 QBoxLayout* m_pControlLayout;
298 QMenu* m_pFilterButtonMenu;
299 QPushButton* m_pFilterButton;
300 QLineEdit* m_pSearchFilter;
301 QPushButton* m_pBackButton;
302 QMenu* m_pAddButtonMenu;
303 QPushButton* m_pAddButton;
304 CBrowserTreeView* m_pTreeView;
305 CBrowserModel* m_pModel;
306 CBrowserFilter* m_pFilter;
307 SBrowserSignals m_signals;
310 class CBrowserWnd : public CWnd
312 DECLARE_MESSAGE_MAP()
314 public:
316 CBrowserWnd();
318 ~CBrowserWnd();
320 void Init();
321 void InitLayout();
322 void Reset();
324 SBrowserSignals& Signals();
326 private:
328 afx_msg void OnSize(UINT nType, int cx, int cy);
330 QParentWndWidget* m_pParentWndWidget;
331 CBrowserWidget* m_pBrowserWidget;
332 QBoxLayout* m_pLayout;