CPoiMapModel: Simplify list management

This commit is contained in:
Lioncache
2025-12-12 11:46:56 -05:00
parent 7f714eee07
commit e7812fb1e4
2 changed files with 27 additions and 36 deletions

View File

@@ -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();
} }

View File

@@ -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);