Fixed exiting a race & starting a new one in a cleaner way

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/irrlicht@4138 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria 2009-10-20 18:10:46 +00:00
parent 325b7aff3e
commit 584d203aa4
7 changed files with 29 additions and 25 deletions

View File

@ -62,6 +62,7 @@ namespace GUIEngine
void clear() void clear()
{ {
g_env->clear(); g_env->clear();
if (g_current_screen != NULL) g_current_screen->elementsWereDeleted();
g_current_screen = NULL; g_current_screen = NULL;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------

View File

@ -304,16 +304,16 @@ void Screen::addWidgetsRecursively(ptr_vector<Widget>& widgets, Widget* parent)
*/ */
void Screen::elementsWereDeleted(ptr_vector<Widget>* within_vector) void Screen::elementsWereDeleted(ptr_vector<Widget>* within_vector)
{ {
if(within_vector == NULL) within_vector = &m_widgets; if (within_vector == NULL) within_vector = &m_widgets;
const unsigned short widgets_amount = within_vector->size(); const unsigned short widgets_amount = within_vector->size();
for(int n=0; n<widgets_amount; n++) for (int n=0; n<widgets_amount; n++)
{ {
Widget& widget = (*within_vector)[n]; Widget& widget = (*within_vector)[n];
widget.m_element = NULL; widget.elementRemoved();
if(widget.m_children.size() > 0) if (widget.m_children.size() > 0)
{ {
elementsWereDeleted( &(widget.m_children) ); elementsWereDeleted( &(widget.m_children) );
} }

View File

@ -293,6 +293,11 @@ namespace GUIEngine
* Call after Widget was read from XML file and laid out. * Call after Widget was read from XML file and laid out.
*/ */
virtual void add(); virtual void add();
/**
* Called when irrLicht widgets cleared. Forget all references to them, they're no more valid.
*/
virtual void elementRemoved() { m_element = NULL; }
}; };

View File

@ -243,17 +243,19 @@ void DynamicRibbonWidget::addItem( const irr::core::stringw& user_name, const st
m_items.push_back(desc); m_items.push_back(desc);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void DynamicRibbonWidget::clearItems(bool widgetsToo) void DynamicRibbonWidget::clearItems()
{ {
m_items.clear(); m_items.clear();
if (widgetsToo)
{
m_children.clearWithoutDeleting();
m_rows.clearWithoutDeleting();
}
m_previous_item_count = 0;
} }
void DynamicRibbonWidget::elementRemoved()
{
Widget::elementRemoved();
m_previous_item_count = 0;
m_rows.clearWithoutDeleting();
}
#if 0 #if 0
#pragma mark - #pragma mark -
#pragma mark Getters #pragma mark Getters

View File

@ -151,7 +151,7 @@ namespace GUIEngine
/** Clears all items added through 'addItem'. You can then add new items with 'addItem' and call /** Clears all items added through 'addItem'. You can then add new items with 'addItem' and call
'updateItemDisplay' to update the display. */ 'updateItemDisplay' to update the display. */
void clearItems(bool widgetsToo=false); void clearItems();
/** Register a listener to be notified of selection changes within the ribbon */ /** Register a listener to be notified of selection changes within the ribbon */
void registerHoverListener(DynamicRibbonHoverListener* listener); void registerHoverListener(DynamicRibbonHoverListener* listener);
@ -180,6 +180,11 @@ namespace GUIEngine
const std::vector<ItemDescription>& getItems() const { return m_items; } const std::vector<ItemDescription>& getItems() const { return m_items; }
void setSelection(int item_id, const int playerID); void setSelection(int item_id, const int playerID);
/**
* Called when irrLicht widgets cleared. Forget all references to them, they're no more valid.
*/
virtual void elementRemoved();
}; };
} }

View File

@ -627,11 +627,6 @@ void KartSelectionScreen::tearDown()
{ {
//g_player_karts.clearWithoutDeleting(); //g_player_karts.clearWithoutDeleting();
g_player_karts.clearAndDeleteAll(); g_player_karts.clearAndDeleteAll();
// List is rebuilt everytime.
DynamicRibbonWidget* w = this->getWidget<DynamicRibbonWidget>("karts");
assert(w != NULL);
w->clearItems(true);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
@ -653,6 +648,7 @@ void KartSelectionScreen::init()
// Build kart list // Build kart list
// (it is built everytikme, to account for .g. locking) // (it is built everytikme, to account for .g. locking)
w->clearItems();
std::vector<int> group = kart_properties_manager->getKartsInGroup("standard"); std::vector<int> group = kart_properties_manager->getKartsInGroup("standard");
const int kart_amount = group.size(); const int kart_amount = group.size();

View File

@ -66,7 +66,9 @@ void TracksScreen::init()
DynamicRibbonWidget* w = this->getWidget<DynamicRibbonWidget>("tracks"); DynamicRibbonWidget* w = this->getWidget<DynamicRibbonWidget>("tracks");
assert( w != NULL ); assert( w != NULL );
// Re-build track list everytime (accounts for locking changes, etc.)
w->clearItems();
const int trackAmount = track_manager->getNumberOfTracks(); const int trackAmount = track_manager->getNumberOfTracks();
bool hasLockedTracks = false; bool hasLockedTracks = false;
for (int n=0; n<trackAmount; n++) for (int n=0; n<trackAmount; n++)
@ -90,11 +92,4 @@ void TracksScreen::init()
void TracksScreen::tearDown() void TracksScreen::tearDown()
{ {
// List is rebuilt everytime (for instance, locking might change, etc.)
DynamicRibbonWidget* w = this->getWidget<DynamicRibbonWidget>("tracks");
assert(w != NULL);
// FIXME : the 'true' argument to force deleting references to irrLicht widgets is an ugly hack
// Ideally the widget should find out by itself and take care of that.
w->clearItems(true);
} }