1 // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
3 // #SchematycTODO : Rename ScriptBrowser!
7 #include <QAbstractItemModel>
10 #include <CrySchematyc2/Script/IScriptRegistry.h>
11 #include <CrySchematyc2/TemplateUtils/TemplateUtils_Signalv2.h>
17 class QParentWndWidget
;
25 namespace BrowserUtils
27 class CFileChangeListener
;
34 bool CanAddScriptElement(EScriptElementType scriptElementType
, const SGUID
& scopeGUID
) const;
35 const char* GetScriptElementFilter(EScriptElementType scriptElementType
) const;
48 enum class EBrowserItemType
55 enum class EBrowserItemStatusFlags
// #SchematycTODO : Rename EBrowserItemFlags?
62 SourceControl
= BIT(3),
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
82 DECLARE_SHARED_POINTERS(CItem
)
84 typedef std::vector
<CItemPtr
> Items
; // #SchematycTODO : Do we really need to use shared pointers?
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;
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
);
121 void OnChildValidate(EBrowserItemStatusFlags statusFlags
);
125 EBrowserItemType m_type
;
129 EBrowserItemStatusFlags m_statusFlags
;
130 string m_statusToolTip
;
131 IScriptElement
* m_pScriptElement
;
136 typedef std::unordered_map
<SGUID
, CItem
*> ScriptElementItems
;
140 enum class ETaskStatus
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
163 CSourceControlRefreshTask(const SGUID
& guid
);
166 ETaskStatus
Execute(CBrowserModel
& model
) override
;
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
193 QModelIndex
ItemToIndex(CItem
* pItem
, int column
= 0) const;
194 CItem
* ItemFromIndex(const QModelIndex
& index
) const;
195 CItem
* GetScriptElementItem(const SGUID
& guid
);
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
);
210 CBrowserRules m_rules
;
211 CItemPtr m_pRootItem
;
212 ScriptElementItems m_scriptElementItems
;
214 TemplateUtils::CConnectionScope m_connectionScope
;
217 class CBrowserTreeView
: public QTreeView
223 CBrowserTreeView(QWidget
* pParent
);
227 void keyPress(QKeyEvent
* pKeyEvent
, bool& bEventHandled
);
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
247 CBrowserWidget(QWidget
* pParent
);
254 SBrowserSignals
& Signals();
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
);
268 void OnAddToSourceControl();
269 void OnGetLatestRevision();
272 void OnDiffAgainstLatestRevision();
273 void OnShowInExplorer();
278 virtual void keyPressEvent(QKeyEvent
* pKeyEvent
) override
;
279 virtual void timerEvent(QTimerEvent
* pTimerEvent
) override
;
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;
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()
324 SBrowserSignals
& Signals();
328 afx_msg
void OnSize(UINT nType
, int cx
, int cy
);
330 QParentWndWidget
* m_pParentWndWidget
;
331 CBrowserWidget
* m_pBrowserWidget
;
332 QBoxLayout
* m_pLayout
;