From 94ea1ff106061bec812ea23edb28ef981ad4fb68 Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Tue, 14 Jul 2015 22:05:12 +0200 Subject: [PATCH] DeselList refactoring Make CRobotMain hold selected object history instead of every object holding some part of it --- src/graphics/engine/pyro.cpp | 4 +-- src/object/old_object.cpp | 54 ++--------------------------- src/object/old_object.h | 8 ----- src/object/old_object_interface.cpp | 18 ---------- src/object/old_object_interface.h | 4 --- src/object/robotmain.cpp | 44 +++++++++++++++++------ src/object/robotmain.h | 8 +++++ 7 files changed, 46 insertions(+), 94 deletions(-) diff --git a/src/graphics/engine/pyro.cpp b/src/graphics/engine/pyro.cpp index a9622787..eec9bc2e 100644 --- a/src/graphics/engine/pyro.cpp +++ b/src/graphics/engine/pyro.cpp @@ -1552,7 +1552,7 @@ void CPyro::ExploStart() m_camera->SetType(CAM_TYPE_EXPLO); m_main->DeselectAll(); } - m_object->DeleteDeselList(m_object); + m_main->RemoveFromSelectionHistory(m_object); for (int i = 0; i < OBJECTMAXPART; i++) { @@ -1625,7 +1625,7 @@ void CPyro::BurnStart() m_camera->SetType(CAM_TYPE_EXPLO); m_main->DeselectAll(); } - m_object->DeleteDeselList(m_object); + m_main->RemoveFromSelectionHistory(m_object); for (int i = 0; i < OBJECTMAXPART; i++) { diff --git a/src/object/old_object.cpp b/src/object/old_object.cpp index fe301349..f6ec4dde 100644 --- a/src/object/old_object.cpp +++ b/src/object/old_object.cpp @@ -265,7 +265,6 @@ COldObject::COldObject(int id) m_bVirusMode = false; m_virusTime = 0.0f; m_lastVirusParticle = 0.0f; - m_totalDesectList = 0; m_bLock = false; m_bIgnoreBuildCheck = false; m_bExplo = false; @@ -347,11 +346,7 @@ void COldObject::DeleteObject(bool bAll) { m_camera->SetControllingObject(0); } - - for (CObject* obj : CObjectManager::GetInstancePointer()->GetAllObjects()) - { - obj->DeleteDeselList(this); - } + m_main->RemoveFromSelectionHistory(this); if ( !bAll ) { @@ -711,7 +706,7 @@ bool COldObject::ExplodeObject(ExplosionType type, float force, float decay) m_camera->SetType(Gfx::CAM_TYPE_EXPLO); m_main->DeselectAll(); } - DeleteDeselList(this); + m_main->RemoveFromSelectionHistory(this); if ( m_botVar != 0 ) { @@ -3272,51 +3267,6 @@ bool COldObject::GetTooltipName(std::string& name) return !name.empty(); } - -// Adds the object previously selected in the list. - -void COldObject::AddDeselList(CObject* pObj) -{ - int i; - - if ( m_totalDesectList >= OBJECTMAXDESELLIST ) - { - for ( i=0 ; iAddDeselList(prev); + PushToSelectionHistory(prev); SelectOneObject(m_controller, true); m_short->UpdateShortcuts(); @@ -1889,7 +1889,7 @@ bool CRobotMain::SelectObject(CObject* obj, bool displayError) CObject* prev = DeselectAll(); if (prev != nullptr && prev != obj) - obj->AddDeselList(prev); + PushToSelectionHistory(prev); SelectOneObject(obj, displayError); m_short->UpdateShortcuts(); @@ -1899,14 +1899,9 @@ bool CRobotMain::SelectObject(CObject* obj, bool displayError) //! Deselects the selected object bool CRobotMain::DeselectObject() { - CObject* obj = nullptr; - CObject* prev = DeselectAll(); - - if (prev == nullptr) - obj = SearchHuman(); - else - obj = prev->SubDeselList(); + DeselectAll(); + CObject* obj = PopFromSelectionHistory(); if (obj == nullptr) obj = SearchHuman(); @@ -2223,7 +2218,7 @@ bool CRobotMain::DeleteObject() obj->SetSelect(false); // deselects the object m_camera->SetType(Gfx::CAM_TYPE_EXPLO); DeselectAll(); - obj->DeleteDeselList(obj); + RemoveFromSelectionHistory(obj); return true; } @@ -6274,3 +6269,32 @@ bool CRobotMain::CanFactory(ObjectType type, int team) { return CanFactoryError(type, team) == ERR_OK; } + +void CRobotMain::PushToSelectionHistory(CObject* obj) +{ + if (!m_selectionHistory.empty() && m_selectionHistory.back() == obj) + return; // already in history + + m_selectionHistory.push_back(obj); + + if (m_selectionHistory.size() > 50) // to avoid infinite growth + m_selectionHistory.pop_front(); +} + +CObject* CRobotMain::PopFromSelectionHistory() +{ + if (m_selectionHistory.empty()) + return nullptr; + + CObject* obj = m_selectionHistory.back(); + m_selectionHistory.pop_back(); + return obj; +} + +void CRobotMain::RemoveFromSelectionHistory(CObject* object) +{ + auto it = std::remove_if(m_selectionHistory.begin(), m_selectionHistory.end(), + [object](const CObject* obj) { return obj == object; }); + m_selectionHistory.erase(it, m_selectionHistory.end()); +} + diff --git a/src/object/robotmain.h b/src/object/robotmain.h index b06f8440..11bca831 100644 --- a/src/object/robotmain.h +++ b/src/object/robotmain.h @@ -38,6 +38,8 @@ #include "app/pausemanager.h" +#include + enum Phase { PHASE_INIT, @@ -370,6 +372,8 @@ public: Error CanFactoryError(ObjectType type, int team); //@} + void RemoveFromSelectionHistory(CObject* object); + protected: bool EventFrame(const Event &event); bool EventObject(const Event &event); @@ -406,6 +410,8 @@ protected: int AutosaveRotate(bool freeOne); void Autosave(); + void PushToSelectionHistory(CObject* obj); + CObject* PopFromSelectionHistory(); protected: @@ -582,4 +588,6 @@ protected: int m_autosaveInterval; int m_autosaveSlots; float m_autosaveLast; + + std::deque m_selectionHistory; };