mirror of
https://github.com/AxioDL/PrimeWorldEditor.git
synced 2025-12-18 17:35:43 +00:00
CPoiMapModel: Simplify list management
This commit is contained in:
@@ -70,8 +70,7 @@ void CPoiMapModel::AddPOI(const CScriptNode* pPOI)
|
|||||||
const int NewIndex = static_cast<int>(mpPoiToWorld->NumMappedPOIs());
|
const int NewIndex = static_cast<int>(mpPoiToWorld->NumMappedPOIs());
|
||||||
beginInsertRows(QModelIndex(), NewIndex, NewIndex);
|
beginInsertRows(QModelIndex(), NewIndex, NewIndex);
|
||||||
|
|
||||||
auto* pList = new QList<CModelNode*>();
|
mModelMap.insert(pPOI, {});
|
||||||
mModelMap[pPOI] = pList;
|
|
||||||
mpPoiToWorld->AddPoi(pPOI->Instance()->InstanceID());
|
mpPoiToWorld->AddPoi(pPOI->Instance()->InstanceID());
|
||||||
|
|
||||||
endInsertRows();
|
endInsertRows();
|
||||||
@@ -82,9 +81,9 @@ void CPoiMapModel::AddMapping(const QModelIndex& rkIndex, CModelNode *pNode)
|
|||||||
const CScriptNode* pPOI = PoiNodePointer(rkIndex);
|
const CScriptNode* pPOI = PoiNodePointer(rkIndex);
|
||||||
AddPOI(pPOI);
|
AddPOI(pPOI);
|
||||||
|
|
||||||
QList<CModelNode*> *pList = mModelMap[pPOI];
|
auto& list = mModelMap[pPOI];
|
||||||
if (!pList->contains(pNode))
|
if (!list.contains(pNode))
|
||||||
pList->append(pNode);
|
list.append(pNode);
|
||||||
|
|
||||||
mpPoiToWorld->AddPoiMeshMap(pPOI->Instance()->InstanceID(), pNode->FindMeshID());
|
mpPoiToWorld->AddPoiMeshMap(pPOI->Instance()->InstanceID(), pNode->FindMeshID());
|
||||||
}
|
}
|
||||||
@@ -93,25 +92,23 @@ void CPoiMapModel::RemovePOI(const QModelIndex& rkIndex)
|
|||||||
{
|
{
|
||||||
beginRemoveRows(QModelIndex(), rkIndex.row(), rkIndex.row());
|
beginRemoveRows(QModelIndex(), rkIndex.row(), rkIndex.row());
|
||||||
const CScriptNode* pPOI = PoiNodePointer(rkIndex);
|
const CScriptNode* pPOI = PoiNodePointer(rkIndex);
|
||||||
|
const auto iter = mModelMap.find(pPOI);
|
||||||
|
|
||||||
if (mModelMap.contains(pPOI))
|
if (iter != mModelMap.cend())
|
||||||
{
|
mModelMap.erase(iter);
|
||||||
delete mModelMap[pPOI];
|
|
||||||
mModelMap.remove(pPOI);
|
|
||||||
}
|
|
||||||
|
|
||||||
mpPoiToWorld->RemovePoi(pPOI->Instance()->InstanceID());
|
mpPoiToWorld->RemovePoi(pPOI->Instance()->InstanceID());
|
||||||
endRemoveRows();
|
endRemoveRows();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPoiMapModel::RemoveMapping(const QModelIndex& rkIndex, CModelNode *pNode)
|
void CPoiMapModel::RemoveMapping(const QModelIndex& rkIndex, const CModelNode *pNode)
|
||||||
{
|
{
|
||||||
const CScriptNode* pPOI = PoiNodePointer(rkIndex);
|
const CScriptNode* pPOI = PoiNodePointer(rkIndex);
|
||||||
|
const auto iter = mModelMap.find(pPOI);
|
||||||
|
|
||||||
if (mModelMap.contains(pPOI))
|
if (iter != mModelMap.cend())
|
||||||
{
|
{
|
||||||
QList<CModelNode*> *pList = mModelMap[pPOI];
|
iter->removeOne(pNode);
|
||||||
pList->removeOne(pNode);
|
|
||||||
mpPoiToWorld->RemovePoiMeshMap(pPOI->Instance()->InstanceID(), pNode->FindMeshID());
|
mpPoiToWorld->RemovePoiMeshMap(pPOI->Instance()->InstanceID(), pNode->FindMeshID());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -125,17 +122,16 @@ bool CPoiMapModel::IsPoiTracked(const CScriptNode* pPOI) const
|
|||||||
return mModelMap.contains(pPOI);
|
return mModelMap.contains(pPOI);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPoiMapModel::IsModelMapped(const QModelIndex& rkIndex, CModelNode *pNode) const
|
bool CPoiMapModel::IsModelMapped(const QModelIndex& rkIndex, const CModelNode *pNode) const
|
||||||
{
|
{
|
||||||
if (!pNode)
|
if (!pNode)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const CScriptNode* pPOI = PoiNodePointer(rkIndex);
|
const CScriptNode* pPOI = PoiNodePointer(rkIndex);
|
||||||
if (mModelMap.contains(pPOI))
|
const auto iter = mModelMap.constFind(pPOI);
|
||||||
{
|
|
||||||
QList<CModelNode*> *pList = mModelMap[pPOI];
|
if (iter != mModelMap.cend())
|
||||||
return pList->contains(pNode);
|
return iter->contains(pNode);
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -153,15 +149,15 @@ CScriptNode* CPoiMapModel::PoiNodePointer(const QModelIndex& rkIndex) const
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
const QList<CModelNode*>& CPoiMapModel::GetPoiMeshList(const QModelIndex& rkIndex) const
|
const QList<CModelNode*>& CPoiMapModel::GetPoiMeshList(const QModelIndex& rkIndex)
|
||||||
{
|
{
|
||||||
const CScriptNode* pPOI = PoiNodePointer(rkIndex);
|
const CScriptNode* pPOI = PoiNodePointer(rkIndex);
|
||||||
return GetPoiMeshList(pPOI);
|
return GetPoiMeshList(pPOI);
|
||||||
}
|
}
|
||||||
|
|
||||||
const QList<CModelNode*>& CPoiMapModel::GetPoiMeshList(const CScriptNode *pPOI) const
|
const QList<CModelNode*>& CPoiMapModel::GetPoiMeshList(const CScriptNode *pPOI)
|
||||||
{
|
{
|
||||||
return *mModelMap[pPOI];
|
return mModelMap[pPOI];
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPoiMapModel::OnMapChange(CWorld*, CGameArea *pArea)
|
void CPoiMapModel::OnMapChange(CWorld*, CGameArea *pArea)
|
||||||
@@ -188,25 +184,20 @@ void CPoiMapModel::OnMapChange(CWorld*, CGameArea *pArea)
|
|||||||
|
|
||||||
if (const auto* pPoiNode = mpEditor->Scene()->NodeForInstanceID(pkMap->PoiID))
|
if (const auto* pPoiNode = mpEditor->Scene()->NodeForInstanceID(pkMap->PoiID))
|
||||||
{
|
{
|
||||||
auto* pModelList = new QList<CModelNode*>();
|
QList<CModelNode*> modelList;
|
||||||
|
|
||||||
for (const auto modelID : pkMap->ModelIDs)
|
for (const auto modelID : pkMap->ModelIDs)
|
||||||
{
|
{
|
||||||
if (NodeMap.contains(modelID))
|
if (NodeMap.contains(modelID))
|
||||||
pModelList->push_back(NodeMap[modelID]);
|
modelList.push_back(NodeMap[modelID]);
|
||||||
}
|
}
|
||||||
|
|
||||||
mModelMap[pPoiNode] = pModelList;
|
mModelMap[pPoiNode] = std::move(modelList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QList<QList<CModelNode*>*> Lists = mModelMap.values();
|
|
||||||
|
|
||||||
for (auto* list : Lists)
|
|
||||||
delete list;
|
|
||||||
|
|
||||||
mModelMap.clear();
|
mModelMap.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class CPoiMapModel : public QAbstractListModel
|
|||||||
CGameArea *mpArea = nullptr;
|
CGameArea *mpArea = nullptr;
|
||||||
TResPtr<CPoiToWorld> mpPoiToWorld;
|
TResPtr<CPoiToWorld> mpPoiToWorld;
|
||||||
|
|
||||||
QMap<const CScriptNode*, QList<CModelNode*>*> mModelMap;
|
QMap<const CScriptNode*, QList<CModelNode*>> mModelMap;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit CPoiMapModel(CWorldEditor *pEditor, QObject *pParent = nullptr);
|
explicit CPoiMapModel(CWorldEditor *pEditor, QObject *pParent = nullptr);
|
||||||
@@ -32,13 +32,13 @@ public:
|
|||||||
void AddPOI(const CScriptNode* pPOI);
|
void AddPOI(const CScriptNode* pPOI);
|
||||||
void AddMapping(const QModelIndex& rkIndex, CModelNode* pNode);
|
void AddMapping(const QModelIndex& rkIndex, CModelNode* pNode);
|
||||||
void RemovePOI(const QModelIndex& rkIndex);
|
void RemovePOI(const QModelIndex& rkIndex);
|
||||||
void RemoveMapping(const QModelIndex& rkIndex, CModelNode* pNode);
|
void RemoveMapping(const QModelIndex& rkIndex, const CModelNode* pNode);
|
||||||
bool IsPoiTracked(const CScriptNode* pPOI) const;
|
bool IsPoiTracked(const CScriptNode* pPOI) const;
|
||||||
bool IsModelMapped(const QModelIndex& rkIndex, CModelNode* pNode) const;
|
bool IsModelMapped(const QModelIndex& rkIndex, const CModelNode* pNode) const;
|
||||||
|
|
||||||
CScriptNode* PoiNodePointer(const QModelIndex& rkIndex) const;
|
CScriptNode* PoiNodePointer(const QModelIndex& rkIndex) const;
|
||||||
const QList<CModelNode*>& GetPoiMeshList(const QModelIndex& rkIndex) const;
|
const QList<CModelNode*>& GetPoiMeshList(const QModelIndex& rkIndex);
|
||||||
const QList<CModelNode*>& GetPoiMeshList(const CScriptNode* pPOI) const;
|
const QList<CModelNode*>& GetPoiMeshList(const CScriptNode* pPOI);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void OnMapChange(CWorld*, CGameArea *pArea);
|
void OnMapChange(CWorld*, CGameArea *pArea);
|
||||||
|
|||||||
Reference in New Issue
Block a user