TrackViewNodes.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. // Description : TrackView's tree control.
  9. #ifndef CRYINCLUDE_EDITOR_TRACKVIEW_TRACKVIEWNODES_H
  10. #define CRYINCLUDE_EDITOR_TRACKVIEW_TRACKVIEWNODES_H
  11. #pragma once
  12. #if !defined(Q_MOC_RUN)
  13. #include <AzCore/Component/Entity.h>
  14. #include "AnimationContext.h"
  15. #include "TrackViewNode.h"
  16. #include "TrackViewSequence.h"
  17. #include "Undo/Undo.h"
  18. #include <IMovieSystem.h>
  19. #include <QMap>
  20. #include <QTreeWidgetItem>
  21. #include <QWidget>
  22. #endif
  23. // forward declarations.
  24. class CTrackViewNode;
  25. class CTrackViewAnimNode;
  26. class CTrackViewTrack;
  27. class CTrackViewSequence;
  28. class CTrackViewDopeSheetBase;
  29. class CTrackViewDialog;
  30. class QLineEdit;
  31. namespace Ui {
  32. class CTrackViewNodesCtrl;
  33. }
  34. //////////////////////////////////////////////////////////////////////////
  35. class CTrackViewNodesCtrl
  36. : public QWidget
  37. , public ITrackViewSequenceListener
  38. , public IUndoManagerListener
  39. , public IAnimationContextListener
  40. , public ITrackViewSequenceManagerListener
  41. {
  42. Q_OBJECT
  43. public:
  44. class CRecord
  45. : public QTreeWidgetItem
  46. {
  47. friend class CTrackViewNodesCtrl;
  48. public:
  49. enum Roles
  50. {
  51. EnableRole = Qt::UserRole + 1
  52. };
  53. CRecord(CTrackViewNode* pNode = nullptr);
  54. CTrackViewNode* GetNode() const { return m_pNode; }
  55. bool IsGroup() const { return m_pNode->GetChildCount() != 0; }
  56. const QString GetName() const { return QString::fromUtf8(m_pNode->GetName().c_str()); }
  57. // Workaround: CXTPReportRecord::IsVisible is
  58. // unreliable after the last visible element
  59. bool IsVisible() const { return m_bVisible; }
  60. QRect GetRect() const { return treeWidget()->visualItemRect(this); }
  61. private:
  62. bool m_bVisible;
  63. CTrackViewNode* m_pNode;
  64. };
  65. CTrackViewNodesCtrl(QWidget* hParentWnd, CTrackViewDialog* parent = 0);
  66. ~CTrackViewNodesCtrl();
  67. void SetTrackViewDialog(CTrackViewDialog* dlg) { m_pTrackViewDialog = dlg; }
  68. void OnSequenceChanged();
  69. void SetDopeSheet(CTrackViewDopeSheetBase* keysCtrl);
  70. void SetEditLock(bool bLock) { m_bEditLock = bLock; }
  71. float SaveVerticalScrollPos() const;
  72. void RestoreVerticalScrollPos(float fScrollPos);
  73. CRecord* GetNodeRecord(const CTrackViewNode* pNode) const;
  74. virtual void Reload();
  75. virtual void OnFillItems();
  76. // ITrackViewSequenceListener
  77. virtual void OnNodeChanged(CTrackViewNode* pNode, ITrackViewSequenceListener::ENodeChangeType type) override;
  78. virtual void OnNodeRenamed(CTrackViewNode* pNode, const char* pOldName) override;
  79. virtual void OnNodeSelectionChanged(CTrackViewSequence* pSequence) override;
  80. virtual void OnKeysChanged(CTrackViewSequence* pSequence) override;
  81. virtual void OnKeySelectionChanged(CTrackViewSequence* pSequence) override;
  82. // IUndoManagerListener
  83. virtual void BeginUndoTransaction() override;
  84. virtual void EndUndoTransaction() override;
  85. // IAnimationContextListener
  86. void OnSequenceChanged(CTrackViewSequence* pNewSequence) override;
  87. // ITrackViewSequenceManagerListener
  88. void OnSequenceRemoved(CTrackViewSequence* pSequence) override;
  89. // Helper for dialog
  90. QIcon GetIconForTrack(const CTrackViewTrack* pTrack);
  91. void ShowNextResult();
  92. void Update();
  93. static QIcon TrackViewIcon(const CTrackViewTrack* track);
  94. static QIcon TrackViewNodeIcon(AnimNodeType type);
  95. protected:
  96. void paintEvent(QPaintEvent* event) override;
  97. void keyPressEvent(QKeyEvent* event) override;
  98. bool event(QEvent* event) override;
  99. bool eventFilter(QObject* o, QEvent* e) override;
  100. private slots:
  101. void OnNMRclick(QPoint pos);
  102. void OnItemExpanded(QTreeWidgetItem*);
  103. void OnSelectionChanged();
  104. void OnItemDblClick(QTreeWidgetItem* item, int);
  105. void OnFilterChange(const QString& text);
  106. private:
  107. void CreateFolder(CTrackViewAnimNode* pGroupNode);
  108. void EditEvents();
  109. void AddMenuSeperatorConditional(QMenu& menu, bool& bAppended);
  110. void AddGroupNodeAddItems(struct SContextMenu& contextMenu, CTrackViewAnimNode* pAnimNode);
  111. int ShowPopupMenuSingleSelection(struct SContextMenu& contextMenu, CTrackViewSequence* pSequence, CTrackViewNode* pNode);
  112. int ShowPopupMenuMultiSelection(struct SContextMenu& contextMenu);
  113. int ShowPopupMenu(QPoint point, const CRecord* pItemInfo);
  114. bool FillAddTrackMenu(struct STrackMenuTreeNode& menuAddTrack, const CTrackViewAnimNode* pAnimNode);
  115. void CreateAddTrackMenuRec(QMenu& parent, const QString& name, CTrackViewAnimNode* animNode, struct STrackMenuTreeNode& node, unsigned int& currentId);
  116. void SetPopupMenuLock(QMenu* menu);
  117. void CreateSetAnimationLayerPopupMenu(QMenu& menuSetLayer, CTrackViewTrack* pTrack) const;
  118. void AddNodeRecord(CRecord* pParentRecord, CTrackViewNode* pNode);
  119. CRecord* AddTrackRecord(CRecord* pParentRecord, CTrackViewTrack* pTrack);
  120. CRecord* AddAnimNodeRecord(CRecord* pParentRecord, CTrackViewAnimNode* pNode);
  121. void FillNodesRec(CRecord* pRecord, CTrackViewNode* pCurrentNode);
  122. void EraseNodeRecordRec(CTrackViewNode* pNode);
  123. void UpdateNodeRecord(CRecord* pRecord);
  124. void UpdateTrackRecord(CRecord* pRecord, CTrackViewTrack* pTrack);
  125. void UpdateAnimNodeRecord(CRecord* pRecord, CTrackViewAnimNode* pAnimNode);
  126. void FillAutoCompletionListForFilter();
  127. // Utility function for handling material nodes
  128. // It'll return -1 if the found material isn't a multi-material.
  129. static int GetMatNameAndSubMtlIndexFromName(QString& matName, const char* nodeName);
  130. void CustomizeTrackColor(CTrackViewTrack* pTrack);
  131. void ClearCustomTrackColor(CTrackViewTrack* pTrack);
  132. // For drawing dope sheet
  133. void UpdateRecordVisibility();
  134. void UpdateDopeSheet();
  135. int GetInsertPosition(CRecord* pParentRecord, CTrackViewNode* pNode);
  136. void SelectRow(CTrackViewNode* pNode, const bool bEnsureVisible, const bool bDeselectOtherRows);
  137. void DeselectRow(CTrackViewNode* pNode);
  138. CTrackViewDopeSheetBase* m_pDopeSheet;
  139. CTrackViewDialog* m_pTrackViewDialog;
  140. typedef std::vector<CRecord*> ItemInfos;
  141. ItemInfos m_itemInfos;
  142. bool m_bSelectionChanging;
  143. bool m_bEditLock;
  144. QCursor m_arrowCursor;
  145. QCursor m_noIcon;
  146. UINT m_currentMatchIndex;
  147. UINT m_matchCount;
  148. bool m_bIgnoreNotifications;
  149. bool m_bNeedReload;
  150. float m_storedScrollPosition;
  151. // Drag and drop
  152. CTrackViewAnimNodeBundle m_draggedNodes;
  153. std::unordered_map<unsigned int, CAnimParamType> m_menuParamTypeMap;
  154. std::unordered_map<const CTrackViewNode*, CRecord*> m_nodeToRecordMap;
  155. QScopedPointer<Ui::CTrackViewNodesCtrl> ui;
  156. //! Cached map of component icons.
  157. //! Key: Component's RTTI type
  158. //! Value: Icon for this component
  159. AZStd::unordered_map<AZ::Uuid, QIcon> m_componentTypeToIconMap;
  160. };
  161. typedef CTrackViewNode* CTrackViewNodePtr;
  162. Q_DECLARE_METATYPE(CTrackViewNodePtr);
  163. QDataStream& operator<<(QDataStream& out, const CTrackViewNodePtr& obj);
  164. QDataStream& operator>>(QDataStream& in, CTrackViewNodePtr& obj);
  165. #endif // CRYINCLUDE_EDITOR_TRACKVIEW_TRACKVIEWNODES_H