You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/Editor/TrackView/TrackViewNodes.h

225 lines
7.1 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
// Description : TrackView's tree control.
#ifndef CRYINCLUDE_EDITOR_TRACKVIEW_TRACKVIEWNODES_H
#define CRYINCLUDE_EDITOR_TRACKVIEW_TRACKVIEWNODES_H
#pragma once
#if !defined(Q_MOC_RUN)
#include <AzCore/Component/Entity.h>
#include "TrackViewNode.h"
#include "TrackViewSequence.h"
#include "Undo/Undo.h"
#include "Export/ExportManager.h"
#include <IMovieSystem.h>
#include <QMap>
#include <QTreeWidgetItem>
#include <QWidget>
#endif
// forward declarations.
class CTrackViewNode;
class CTrackViewAnimNode;
class CTrackViewTrack;
class CTrackViewSequence;
class CTrackViewDopeSheetBase;
class CTrackViewDialog;
class QLineEdit;
namespace Ui {
class CTrackViewNodesCtrl;
}
//////////////////////////////////////////////////////////////////////////
class CTrackViewNodesCtrl
: public QWidget
, public ITrackViewSequenceListener
, public IUndoManagerListener
{
Q_OBJECT
public:
class CRecord
: public QTreeWidgetItem
{
friend class CTrackViewNodesCtrl;
public:
enum Roles
{
EnableRole = Qt::UserRole + 1
};
CRecord(CTrackViewNode* pNode = nullptr);
CTrackViewNode* GetNode() const { return m_pNode; }
bool IsGroup() const { return m_pNode->GetChildCount() != 0; }
const QString GetName() const { return QString::fromUtf8(m_pNode->GetName().c_str()); }
// Workaround: CXTPReportRecord::IsVisible is
// unreliable after the last visible element
bool IsVisible() const { return m_bVisible; }
QRect GetRect() const { return treeWidget()->visualItemRect(this); }
private:
bool m_bVisible;
CTrackViewNode* m_pNode;
};
CTrackViewNodesCtrl(QWidget* hParentWnd, CTrackViewDialog* parent = 0);
~CTrackViewNodesCtrl();
void SetTrackViewDialog(CTrackViewDialog* dlg) { m_pTrackViewDialog = dlg; }
void OnSequenceChanged();
void SetDopeSheet(CTrackViewDopeSheetBase* keysCtrl);
void SetEditLock(bool bLock) { m_bEditLock = bLock; }
float SaveVerticalScrollPos() const;
void RestoreVerticalScrollPos(float fScrollPos);
CRecord* GetNodeRecord(const CTrackViewNode* pNode) const;
virtual void Reload();
virtual void OnFillItems();
// ITrackViewSequenceListener
virtual void OnNodeChanged(CTrackViewNode* pNode, ITrackViewSequenceListener::ENodeChangeType type) override;
virtual void OnNodeRenamed(CTrackViewNode* pNode, const char* pOldName) override;
virtual void OnNodeSelectionChanged(CTrackViewSequence* pSequence) override;
virtual void OnKeysChanged(CTrackViewSequence* pSequence) override;
virtual void OnKeySelectionChanged(CTrackViewSequence* pSequence) override;
// IUndoManagerListener
virtual void BeginUndoTransaction() override;
virtual void EndUndoTransaction() override;
// Helper for dialog
QIcon GetIconForTrack(const CTrackViewTrack* pTrack);
void ShowNextResult();
void Update();
protected:
void paintEvent(QPaintEvent* event) override;
void keyPressEvent(QKeyEvent* event) override;
bool event(QEvent* event) override;
bool eventFilter(QObject* o, QEvent* e) override;
private slots:
void OnNMRclick(QPoint pos);
void OnItemExpanded(QTreeWidgetItem*);
void OnSelectionChanged();
void OnItemDblClick(QTreeWidgetItem* item, int);
void OnFilterChange(const QString& text);
private:
void CreateFolder(CTrackViewAnimNode* pGroupNode);
void EditEvents();
void ImportFromFBX();
CTrackViewTrack* GetTrackViewTrack(const Export::EntityAnimData* pAnimData, CTrackViewTrackBundle trackBundle, const QString& nodeName);
void AddMenuSeperatorConditional(QMenu& menu, bool& bAppended);
void AddGroupNodeAddItems(struct SContextMenu& contextMenu, CTrackViewAnimNode* pAnimNode);
int ShowPopupMenuSingleSelection(struct SContextMenu& contextMenu, CTrackViewSequence* pSequence, CTrackViewNode* pNode);
int ShowPopupMenuMultiSelection(struct SContextMenu& contextMenu);
int ShowPopupMenu(QPoint point, const CRecord* pItemInfo);
bool FillAddTrackMenu(struct STrackMenuTreeNode& menuAddTrack, const CTrackViewAnimNode* pAnimNode);
void CreateAddTrackMenuRec(QMenu& parent, const QString& name, CTrackViewAnimNode* animNode, struct STrackMenuTreeNode& node, unsigned int& currentId);
void SetPopupMenuLock(QMenu* menu);
void CreateSetAnimationLayerPopupMenu(QMenu& menuSetLayer, CTrackViewTrack* pTrack) const;
int GetIconIndexForTrack(const CTrackViewTrack* pTrack) const;
int GetIconIndexForNode(AnimNodeType type) const;
void AddNodeRecord(CRecord* pParentRecord, CTrackViewNode* pNode);
CRecord* AddTrackRecord(CRecord* pParentRecord, CTrackViewTrack* pTrack);
CRecord* AddAnimNodeRecord(CRecord* pParentRecord, CTrackViewAnimNode* pNode);
void FillNodesRec(CRecord* pRecord, CTrackViewNode* pCurrentNode);
void EraseNodeRecordRec(CTrackViewNode* pNode);
void UpdateNodeRecord(CRecord* pRecord);
void UpdateTrackRecord(CRecord* pRecord, CTrackViewTrack* pTrack);
void UpdateAnimNodeRecord(CRecord* pRecord, CTrackViewAnimNode* pAnimNode);
void FillAutoCompletionListForFilter();
// Utility function for handling material nodes
// It'll return -1 if the found material isn't a multi-material.
static int GetMatNameAndSubMtlIndexFromName(QString& matName, const char* nodeName);
void CustomizeTrackColor(CTrackViewTrack* pTrack);
void ClearCustomTrackColor(CTrackViewTrack* pTrack);
// For drawing dope sheet
void UpdateRecordVisibility();
void UpdateDopeSheet();
int GetInsertPosition(CRecord* pParentRecord, CTrackViewNode* pNode);
void SelectRow(CTrackViewNode* pNode, const bool bEnsureVisible, const bool bDeselectOtherRows);
void DeselectRow(CTrackViewNode* pNode);
CTrackViewDopeSheetBase* m_pDopeSheet;
CTrackViewDialog* m_pTrackViewDialog;
typedef std::vector<CRecord*> ItemInfos;
ItemInfos m_itemInfos;
bool m_bSelectionChanging;
bool m_bEditLock;
QCursor m_arrowCursor;
QCursor m_noIcon;
UINT m_currentMatchIndex;
UINT m_matchCount;
bool m_bIgnoreNotifications;
bool m_bNeedReload;
float m_storedScrollPosition;
// Drag and drop
CTrackViewAnimNodeBundle m_draggedNodes;
std::unordered_map<unsigned int, CAnimParamType> m_menuParamTypeMap;
std::unordered_map<const CTrackViewNode*, CRecord*> m_nodeToRecordMap;
QMap<int, QIcon> m_imageList;
QScopedPointer<Ui::CTrackViewNodesCtrl> ui;
//! Cached map of component icons.
//! Key: Component's RTTI type
//! Value: Icon for this component
AZStd::unordered_map<AZ::Uuid, QIcon> m_componentTypeToIconMap;
};
typedef CTrackViewNode* CTrackViewNodePtr;
Q_DECLARE_METATYPE(CTrackViewNodePtr);
QDataStream& operator<<(QDataStream& out, const CTrackViewNodePtr& obj);
QDataStream& operator>>(QDataStream& in, CTrackViewNodePtr& obj);
#endif // CRYINCLUDE_EDITOR_TRACKVIEW_TRACKVIEWNODES_H