DeselList refactoring
Make CRobotMain hold selected object history instead of every object holding some part of itmaster
parent
9af1422589
commit
94ea1ff106
|
@ -1552,7 +1552,7 @@ void CPyro::ExploStart()
|
||||||
m_camera->SetType(CAM_TYPE_EXPLO);
|
m_camera->SetType(CAM_TYPE_EXPLO);
|
||||||
m_main->DeselectAll();
|
m_main->DeselectAll();
|
||||||
}
|
}
|
||||||
m_object->DeleteDeselList(m_object);
|
m_main->RemoveFromSelectionHistory(m_object);
|
||||||
|
|
||||||
for (int i = 0; i < OBJECTMAXPART; i++)
|
for (int i = 0; i < OBJECTMAXPART; i++)
|
||||||
{
|
{
|
||||||
|
@ -1625,7 +1625,7 @@ void CPyro::BurnStart()
|
||||||
m_camera->SetType(CAM_TYPE_EXPLO);
|
m_camera->SetType(CAM_TYPE_EXPLO);
|
||||||
m_main->DeselectAll();
|
m_main->DeselectAll();
|
||||||
}
|
}
|
||||||
m_object->DeleteDeselList(m_object);
|
m_main->RemoveFromSelectionHistory(m_object);
|
||||||
|
|
||||||
for (int i = 0; i < OBJECTMAXPART; i++)
|
for (int i = 0; i < OBJECTMAXPART; i++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -265,7 +265,6 @@ COldObject::COldObject(int id)
|
||||||
m_bVirusMode = false;
|
m_bVirusMode = false;
|
||||||
m_virusTime = 0.0f;
|
m_virusTime = 0.0f;
|
||||||
m_lastVirusParticle = 0.0f;
|
m_lastVirusParticle = 0.0f;
|
||||||
m_totalDesectList = 0;
|
|
||||||
m_bLock = false;
|
m_bLock = false;
|
||||||
m_bIgnoreBuildCheck = false;
|
m_bIgnoreBuildCheck = false;
|
||||||
m_bExplo = false;
|
m_bExplo = false;
|
||||||
|
@ -347,11 +346,7 @@ void COldObject::DeleteObject(bool bAll)
|
||||||
{
|
{
|
||||||
m_camera->SetControllingObject(0);
|
m_camera->SetControllingObject(0);
|
||||||
}
|
}
|
||||||
|
m_main->RemoveFromSelectionHistory(this);
|
||||||
for (CObject* obj : CObjectManager::GetInstancePointer()->GetAllObjects())
|
|
||||||
{
|
|
||||||
obj->DeleteDeselList(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !bAll )
|
if ( !bAll )
|
||||||
{
|
{
|
||||||
|
@ -711,7 +706,7 @@ bool COldObject::ExplodeObject(ExplosionType type, float force, float decay)
|
||||||
m_camera->SetType(Gfx::CAM_TYPE_EXPLO);
|
m_camera->SetType(Gfx::CAM_TYPE_EXPLO);
|
||||||
m_main->DeselectAll();
|
m_main->DeselectAll();
|
||||||
}
|
}
|
||||||
DeleteDeselList(this);
|
m_main->RemoveFromSelectionHistory(this);
|
||||||
|
|
||||||
if ( m_botVar != 0 )
|
if ( m_botVar != 0 )
|
||||||
{
|
{
|
||||||
|
@ -3272,51 +3267,6 @@ bool COldObject::GetTooltipName(std::string& name)
|
||||||
return !name.empty();
|
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 ; i<OBJECTMAXDESELLIST-1 ; i++ )
|
|
||||||
{
|
|
||||||
m_objectDeselectList[i] = m_objectDeselectList[i+1];
|
|
||||||
}
|
|
||||||
m_totalDesectList --;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_objectDeselectList[m_totalDesectList++] = pObj;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Removes the previously selected object in the list.
|
|
||||||
|
|
||||||
CObject* COldObject::SubDeselList()
|
|
||||||
{
|
|
||||||
if ( m_totalDesectList == 0 ) return 0;
|
|
||||||
|
|
||||||
return m_objectDeselectList[--m_totalDesectList];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Removes an object reference if it is in the list.
|
|
||||||
|
|
||||||
void COldObject::DeleteDeselList(CObject* pObj)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
j = 0;
|
|
||||||
for ( i=0 ; i<m_totalDesectList ; i++ )
|
|
||||||
{
|
|
||||||
if ( m_objectDeselectList[i] != pObj )
|
|
||||||
{
|
|
||||||
m_objectDeselectList[j++] = m_objectDeselectList[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_totalDesectList = j;
|
|
||||||
}
|
|
||||||
|
|
||||||
Math::Vector COldObject::GetPosition() const
|
Math::Vector COldObject::GetPosition() const
|
||||||
{
|
{
|
||||||
return GetPartPosition(0);
|
return GetPartPosition(0);
|
||||||
|
|
|
@ -35,7 +35,6 @@
|
||||||
|
|
||||||
// The father of all parts must always be the part number zero!
|
// The father of all parts must always be the part number zero!
|
||||||
const int OBJECTMAXPART = 40;
|
const int OBJECTMAXPART = 40;
|
||||||
const int OBJECTMAXDESELLIST = 10;
|
|
||||||
|
|
||||||
struct ObjectPart
|
struct ObjectPart
|
||||||
{
|
{
|
||||||
|
@ -279,10 +278,6 @@ public:
|
||||||
|
|
||||||
bool GetTooltipName(std::string& name) override;
|
bool GetTooltipName(std::string& name) override;
|
||||||
|
|
||||||
void AddDeselList(CObject* pObj) override;
|
|
||||||
CObject* SubDeselList() override;
|
|
||||||
void DeleteDeselList(CObject* pObj) override;
|
|
||||||
|
|
||||||
bool CreateShadowCircle(float radius, float intensity, Gfx::EngineShadowType type = Gfx::ENG_SHADOW_NORM);
|
bool CreateShadowCircle(float radius, float intensity, Gfx::EngineShadowType type = Gfx::ENG_SHADOW_NORM);
|
||||||
bool CreateShadowLight(float height, Gfx::Color color);
|
bool CreateShadowLight(float height, Gfx::Color color);
|
||||||
bool CreateEffectLight(float height, Gfx::Color color);
|
bool CreateEffectLight(float height, Gfx::Color color);
|
||||||
|
@ -393,9 +388,6 @@ protected:
|
||||||
int m_totalPart;
|
int m_totalPart;
|
||||||
ObjectPart m_objectPart[OBJECTMAXPART];
|
ObjectPart m_objectPart[OBJECTMAXPART];
|
||||||
|
|
||||||
int m_totalDesectList;
|
|
||||||
CObject* m_objectDeselectList[OBJECTMAXDESELLIST];
|
|
||||||
|
|
||||||
int m_partiSel[4];
|
int m_partiSel[4];
|
||||||
|
|
||||||
float m_infoReturn;
|
float m_infoReturn;
|
||||||
|
|
|
@ -443,24 +443,6 @@ bool COldObjectInterface::GetTooltipName(std::string& name)
|
||||||
throw std::logic_error("GetTooltipName: not implemented!");
|
throw std::logic_error("GetTooltipName: not implemented!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void COldObjectInterface::AddDeselList(CObject* pObj)
|
|
||||||
{
|
|
||||||
throw std::logic_error("AddDeselList: not implemented!");
|
|
||||||
}
|
|
||||||
|
|
||||||
CObject* COldObjectInterface::SubDeselList()
|
|
||||||
{
|
|
||||||
throw std::logic_error("SubDeselList: not implemented!");
|
|
||||||
}
|
|
||||||
|
|
||||||
void COldObjectInterface::DeleteDeselList(CObject* pObj)
|
|
||||||
{
|
|
||||||
// TODO: temporary hack
|
|
||||||
return;
|
|
||||||
//throw std::logic_error("DeleteDeselList: not implemented!");
|
|
||||||
}
|
|
||||||
|
|
||||||
void COldObjectInterface::FlatParent()
|
void COldObjectInterface::FlatParent()
|
||||||
{
|
{
|
||||||
throw std::logic_error("FlatParent: not implemented!");
|
throw std::logic_error("FlatParent: not implemented!");
|
||||||
|
|
|
@ -189,10 +189,6 @@ public:
|
||||||
|
|
||||||
virtual bool GetTooltipName(std::string& name);
|
virtual bool GetTooltipName(std::string& name);
|
||||||
|
|
||||||
virtual void AddDeselList(CObject* pObj);
|
|
||||||
virtual CObject* SubDeselList();
|
|
||||||
virtual void DeleteDeselList(CObject* pObj);
|
|
||||||
|
|
||||||
virtual void FlatParent();
|
virtual void FlatParent();
|
||||||
|
|
||||||
virtual float GetInfoReturn();
|
virtual float GetInfoReturn();
|
||||||
|
|
|
@ -1167,7 +1167,7 @@ void CRobotMain::ExecuteCmd(char *cmd)
|
||||||
|
|
||||||
CObject* prev = DeselectAll();
|
CObject* prev = DeselectAll();
|
||||||
if (prev != nullptr && prev != m_controller)
|
if (prev != nullptr && prev != m_controller)
|
||||||
m_controller->AddDeselList(prev);
|
PushToSelectionHistory(prev);
|
||||||
|
|
||||||
SelectOneObject(m_controller, true);
|
SelectOneObject(m_controller, true);
|
||||||
m_short->UpdateShortcuts();
|
m_short->UpdateShortcuts();
|
||||||
|
@ -1889,7 +1889,7 @@ bool CRobotMain::SelectObject(CObject* obj, bool displayError)
|
||||||
CObject* prev = DeselectAll();
|
CObject* prev = DeselectAll();
|
||||||
|
|
||||||
if (prev != nullptr && prev != obj)
|
if (prev != nullptr && prev != obj)
|
||||||
obj->AddDeselList(prev);
|
PushToSelectionHistory(prev);
|
||||||
|
|
||||||
SelectOneObject(obj, displayError);
|
SelectOneObject(obj, displayError);
|
||||||
m_short->UpdateShortcuts();
|
m_short->UpdateShortcuts();
|
||||||
|
@ -1899,14 +1899,9 @@ bool CRobotMain::SelectObject(CObject* obj, bool displayError)
|
||||||
//! Deselects the selected object
|
//! Deselects the selected object
|
||||||
bool CRobotMain::DeselectObject()
|
bool CRobotMain::DeselectObject()
|
||||||
{
|
{
|
||||||
CObject* obj = nullptr;
|
DeselectAll();
|
||||||
CObject* prev = DeselectAll();
|
|
||||||
|
|
||||||
if (prev == nullptr)
|
|
||||||
obj = SearchHuman();
|
|
||||||
else
|
|
||||||
obj = prev->SubDeselList();
|
|
||||||
|
|
||||||
|
CObject* obj = PopFromSelectionHistory();
|
||||||
if (obj == nullptr)
|
if (obj == nullptr)
|
||||||
obj = SearchHuman();
|
obj = SearchHuman();
|
||||||
|
|
||||||
|
@ -2223,7 +2218,7 @@ bool CRobotMain::DeleteObject()
|
||||||
obj->SetSelect(false); // deselects the object
|
obj->SetSelect(false); // deselects the object
|
||||||
m_camera->SetType(Gfx::CAM_TYPE_EXPLO);
|
m_camera->SetType(Gfx::CAM_TYPE_EXPLO);
|
||||||
DeselectAll();
|
DeselectAll();
|
||||||
obj->DeleteDeselList(obj);
|
RemoveFromSelectionHistory(obj);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -6274,3 +6269,32 @@ bool CRobotMain::CanFactory(ObjectType type, int team)
|
||||||
{
|
{
|
||||||
return CanFactoryError(type, team) == ERR_OK;
|
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());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,8 @@
|
||||||
|
|
||||||
#include "app/pausemanager.h"
|
#include "app/pausemanager.h"
|
||||||
|
|
||||||
|
#include <deque>
|
||||||
|
|
||||||
enum Phase
|
enum Phase
|
||||||
{
|
{
|
||||||
PHASE_INIT,
|
PHASE_INIT,
|
||||||
|
@ -370,6 +372,8 @@ public:
|
||||||
Error CanFactoryError(ObjectType type, int team);
|
Error CanFactoryError(ObjectType type, int team);
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
|
void RemoveFromSelectionHistory(CObject* object);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool EventFrame(const Event &event);
|
bool EventFrame(const Event &event);
|
||||||
bool EventObject(const Event &event);
|
bool EventObject(const Event &event);
|
||||||
|
@ -406,6 +410,8 @@ protected:
|
||||||
|
|
||||||
int AutosaveRotate(bool freeOne);
|
int AutosaveRotate(bool freeOne);
|
||||||
void Autosave();
|
void Autosave();
|
||||||
|
void PushToSelectionHistory(CObject* obj);
|
||||||
|
CObject* PopFromSelectionHistory();
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -582,4 +588,6 @@ protected:
|
||||||
int m_autosaveInterval;
|
int m_autosaveInterval;
|
||||||
int m_autosaveSlots;
|
int m_autosaveSlots;
|
||||||
float m_autosaveLast;
|
float m_autosaveLast;
|
||||||
|
|
||||||
|
std::deque<CObject*> m_selectionHistory;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue