Add IGUIEnvironment::addToDeletionQueue to allow save removal of gui elements while iterating over them

Basically same as ISceneManager::addToDeletionQueue.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6164 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
cutealien
2020-12-09 16:26:25 +00:00
parent 0368c5b09d
commit bd2b44aa1c
4 changed files with 48 additions and 2 deletions

View File

@ -101,6 +101,8 @@ CGUIEnvironment::CGUIEnvironment(io::IFileSystem* fs, video::IVideoDriver* drive
//! destructor
CGUIEnvironment::~CGUIEnvironment()
{
clearDeletionQueue();
if ( HoveredNoSubelement && HoveredNoSubelement != this )
{
HoveredNoSubelement->drop();
@ -212,6 +214,8 @@ void CGUIEnvironment::drawAll(bool useScreenSize)
draw();
OnPostRender ( os::Timer::getTime () );
clearDeletionQueue();
}
@ -470,6 +474,28 @@ void CGUIEnvironment::OnPostRender( u32 time )
IGUIElement::OnPostRender ( time );
}
void CGUIEnvironment::addToDeletionQueue(IGUIElement* element)
{
if (!element)
return;
element->grab();
DeletionQueue.push_back(element);
}
void CGUIEnvironment::clearDeletionQueue()
{
if (DeletionQueue.empty())
return;
for (u32 i=0; i<DeletionQueue.size(); ++i)
{
DeletionQueue[i]->remove();
DeletionQueue[i]->drop();
}
DeletionQueue.clear();
}
//
void CGUIEnvironment::updateHoveredElement(core::position2d<s32> mousePos)

View File

@ -269,8 +269,14 @@ public:
//! Get the way the gui does handle focus changes
virtual u32 getFocusBehavior() const _IRR_OVERRIDE_;
//! Adds a IGUIElement to deletion queue.
virtual void addToDeletionQueue(IGUIElement* element) _IRR_OVERRIDE_;
private:
//! clears the deletion queue
void clearDeletionQueue();
void updateHoveredElement(core::position2d<s32> mousePos);
void loadBuiltInFont();
@ -322,6 +328,8 @@ private:
IEventReceiver* UserReceiver;
IOSOperator* Operator;
u32 FocusFlags;
core::array<IGUIElement*> DeletionQueue;
static const io::path DefaultFontName;
};