mirror of
https://github.com/AxioDL/PrimeWorldEditor.git
synced 2025-08-11 06:29:08 +00:00
109 lines
2.7 KiB
C++
109 lines
2.7 KiB
C++
#include "CSkeletonHierarchyModel.h"
|
|
#include "Editor/UICommon.h"
|
|
|
|
CSkeletonHierarchyModel::CSkeletonHierarchyModel(QObject *pParent /*= 0*/)
|
|
: QAbstractItemModel(pParent)
|
|
, mpSkeleton(nullptr)
|
|
{
|
|
}
|
|
|
|
QModelIndex CSkeletonHierarchyModel::index(int Row, int Column, const QModelIndex& rkParent) const
|
|
{
|
|
if (!hasIndex(Row, Column, rkParent))
|
|
return QModelIndex();
|
|
|
|
if (!rkParent.isValid())
|
|
{
|
|
if (mpSkeleton)
|
|
return createIndex(Row, Column, mpSkeleton->RootBone());
|
|
else
|
|
return QModelIndex();
|
|
}
|
|
|
|
CBone *pBone = (CBone*) rkParent.internalPointer();
|
|
if (Row < (int) pBone->NumChildren())
|
|
return createIndex(Row, Column, pBone->ChildByIndex(Row));
|
|
else
|
|
return QModelIndex();
|
|
}
|
|
|
|
QModelIndex CSkeletonHierarchyModel::parent(const QModelIndex& rkChild) const
|
|
{
|
|
CBone *pBone = (CBone*) rkChild.internalPointer();
|
|
|
|
if (pBone->Parent())
|
|
{
|
|
// Determine parent index
|
|
CBone *pParent = pBone->Parent();
|
|
|
|
if (pParent->Parent())
|
|
{
|
|
CBone *pGrandparent = pParent->Parent();
|
|
|
|
for (uint32 iChild = 0; iChild < pGrandparent->NumChildren(); iChild++)
|
|
{
|
|
if (pGrandparent->ChildByIndex(iChild) == pParent)
|
|
return createIndex(iChild, 0, pParent);
|
|
}
|
|
}
|
|
|
|
else return createIndex(0, 0, pParent);
|
|
}
|
|
|
|
return QModelIndex();
|
|
}
|
|
|
|
int CSkeletonHierarchyModel::rowCount(const QModelIndex& rkParent) const
|
|
{
|
|
if (!mpSkeleton) return 0;
|
|
CBone *pBone = (CBone*) rkParent.internalPointer();
|
|
return (pBone ? pBone->NumChildren() : 1);
|
|
}
|
|
|
|
int CSkeletonHierarchyModel::columnCount(const QModelIndex& /*rkParent*/) const
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
QVariant CSkeletonHierarchyModel::data(const QModelIndex& rkIndex, int Role) const
|
|
{
|
|
if (Role == Qt::DisplayRole || Role == Qt::ToolTipRole)
|
|
{
|
|
CBone *pBone = (CBone*) rkIndex.internalPointer();
|
|
return TO_QSTRING(pBone->Name());
|
|
}
|
|
|
|
return QVariant::Invalid;
|
|
}
|
|
|
|
CBone* CSkeletonHierarchyModel::BoneForIndex(const QModelIndex& rkIndex) const
|
|
{
|
|
return (CBone*) (rkIndex.internalPointer());
|
|
}
|
|
|
|
QModelIndex CSkeletonHierarchyModel::IndexForBone(CBone *pBone) const
|
|
{
|
|
CBone *pParent = pBone->Parent();
|
|
if (!pParent) return index(0, 0, QModelIndex());
|
|
|
|
QModelIndex ParentIndex = IndexForBone(pParent);
|
|
|
|
for (uint32 iChild = 0; iChild < pParent->NumChildren(); iChild++)
|
|
{
|
|
if (pParent->ChildByIndex(iChild) == pBone)
|
|
return index(iChild, 0, ParentIndex);
|
|
}
|
|
|
|
return QModelIndex();
|
|
}
|
|
|
|
void CSkeletonHierarchyModel::SetSkeleton(CSkeleton *pSkel)
|
|
{
|
|
if (mpSkeleton != pSkel)
|
|
{
|
|
beginResetModel();
|
|
mpSkeleton = pSkel;
|
|
endResetModel();
|
|
}
|
|
}
|