mirror of
https://github.com/vcmi/vcmi.git
synced 2024-11-24 08:32:34 +02:00
Fix updating of hero & town lists on adventure map
This commit is contained in:
parent
65d3b96ed0
commit
3e1125570d
@ -587,9 +587,11 @@ void CPlayerInterface::garrisonsChanged(std::vector<const CGObjectInstance *> ob
|
|||||||
void CPlayerInterface::buildChanged(const CGTownInstance *town, BuildingID buildingID, int what) //what: 1 - built, 2 - demolished
|
void CPlayerInterface::buildChanged(const CGTownInstance *town, BuildingID buildingID, int what) //what: 1 - built, 2 - demolished
|
||||||
{
|
{
|
||||||
EVENT_HANDLER_CALLED_BY_CLIENT;
|
EVENT_HANDLER_CALLED_BY_CLIENT;
|
||||||
|
adventureInt->onTownChanged(town);
|
||||||
|
|
||||||
if (castleInt)
|
if (castleInt)
|
||||||
{
|
{
|
||||||
castleInt->townlist->update(town);
|
castleInt->townlist->updateElement(town);
|
||||||
|
|
||||||
if (castleInt->town == town)
|
if (castleInt->town == town)
|
||||||
{
|
{
|
||||||
@ -604,8 +606,10 @@ void CPlayerInterface::buildChanged(const CGTownInstance *town, BuildingID build
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Perform totalRedraw in order to force redraw of updated town list icon from adventure map
|
||||||
|
GH.windows().totalRedraw();
|
||||||
}
|
}
|
||||||
adventureInt->onTownChanged(town);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlayerInterface::battleStartBefore(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2)
|
void CPlayerInterface::battleStartBefore(const CCreatureSet *army1, const CCreatureSet *army2, int3 tile, const CGHeroInstance *hero1, const CGHeroInstance *hero2)
|
||||||
|
@ -92,7 +92,7 @@ void AdventureMapInterface::onHeroMovementStarted(const CGHeroInstance * hero)
|
|||||||
|
|
||||||
void AdventureMapInterface::onHeroChanged(const CGHeroInstance *h)
|
void AdventureMapInterface::onHeroChanged(const CGHeroInstance *h)
|
||||||
{
|
{
|
||||||
widget->getHeroList()->update(h);
|
widget->getHeroList()->updateElement(h);
|
||||||
|
|
||||||
if (h && h == LOCPLINT->localState->getCurrentHero() && !widget->getInfoBar()->showingComponents())
|
if (h && h == LOCPLINT->localState->getCurrentHero() && !widget->getInfoBar()->showingComponents())
|
||||||
widget->getInfoBar()->showSelection();
|
widget->getInfoBar()->showSelection();
|
||||||
@ -102,7 +102,7 @@ void AdventureMapInterface::onHeroChanged(const CGHeroInstance *h)
|
|||||||
|
|
||||||
void AdventureMapInterface::onTownChanged(const CGTownInstance * town)
|
void AdventureMapInterface::onTownChanged(const CGTownInstance * town)
|
||||||
{
|
{
|
||||||
widget->getTownList()->update(town);
|
widget->getTownList()->updateElement(town);
|
||||||
|
|
||||||
if (town && town == LOCPLINT->localState->getCurrentTown() && !widget->getInfoBar()->showingComponents())
|
if (town && town == LOCPLINT->localState->getCurrentTown() && !widget->getInfoBar()->showingComponents())
|
||||||
widget->getInfoBar()->showSelection();
|
widget->getInfoBar()->showSelection();
|
||||||
@ -365,8 +365,8 @@ void AdventureMapInterface::onPlayerTurnStarted(PlayerColor playerID)
|
|||||||
widget->getInfoBar()->showSelection();
|
widget->getInfoBar()->showSelection();
|
||||||
}
|
}
|
||||||
|
|
||||||
widget->getHeroList()->update();
|
widget->getHeroList()->updateWidget();
|
||||||
widget->getTownList()->update();
|
widget->getTownList()->updateWidget();
|
||||||
|
|
||||||
const CGHeroInstance * heroToSelect = nullptr;
|
const CGHeroInstance * heroToSelect = nullptr;
|
||||||
|
|
||||||
|
@ -280,19 +280,19 @@ void CHeroList::select(const CGHeroInstance * hero)
|
|||||||
selectIndex(vstd::find_pos(LOCPLINT->localState->getWanderingHeroes(), hero));
|
selectIndex(vstd::find_pos(LOCPLINT->localState->getWanderingHeroes(), hero));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHeroList::update(const CGHeroInstance * hero)
|
void CHeroList::updateElement(const CGHeroInstance * hero)
|
||||||
|
{
|
||||||
|
updateWidget();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CHeroList::updateWidget()
|
||||||
{
|
{
|
||||||
//this hero is already present, update its status
|
|
||||||
for(auto & elem : listBox->getItems())
|
for(auto & elem : listBox->getItems())
|
||||||
{
|
{
|
||||||
auto item = std::dynamic_pointer_cast<CHeroItem>(elem);
|
auto item = std::dynamic_pointer_cast<CHeroItem>(elem);
|
||||||
if(item && item->hero == hero && vstd::contains(LOCPLINT->localState->getWanderingHeroes(), hero))
|
if (item)
|
||||||
{
|
|
||||||
item->update();
|
item->update();
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//simplest solution for now: reset list and restore selection
|
|
||||||
|
|
||||||
listBox->resize(LOCPLINT->localState->getWanderingHeroes().size());
|
listBox->resize(LOCPLINT->localState->getWanderingHeroes().size());
|
||||||
if (LOCPLINT->localState->getCurrentHero())
|
if (LOCPLINT->localState->getCurrentHero())
|
||||||
@ -363,9 +363,19 @@ void CTownList::select(const CGTownInstance * town)
|
|||||||
selectIndex(vstd::find_pos(LOCPLINT->localState->getOwnedTowns(), town));
|
selectIndex(vstd::find_pos(LOCPLINT->localState->getOwnedTowns(), town));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTownList::update(const CGTownInstance *)
|
void CTownList::updateElement(const CGTownInstance * town)
|
||||||
{
|
{
|
||||||
//simplest solution for now: reset list and restore selection
|
updateWidget();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTownList::updateWidget()
|
||||||
|
{
|
||||||
|
for(auto & elem : listBox->getItems())
|
||||||
|
{
|
||||||
|
auto item = std::dynamic_pointer_cast<CTownItem>(elem);
|
||||||
|
if (item)
|
||||||
|
item->update();
|
||||||
|
}
|
||||||
|
|
||||||
listBox->resize(LOCPLINT->localState->getOwnedTowns().size());
|
listBox->resize(LOCPLINT->localState->getOwnedTowns().size());
|
||||||
if (LOCPLINT->localState->getCurrentTown())
|
if (LOCPLINT->localState->getCurrentTown())
|
||||||
@ -373,4 +383,3 @@ void CTownList::update(const CGTownInstance *)
|
|||||||
|
|
||||||
CList::update();
|
CList::update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,6 +77,9 @@ protected:
|
|||||||
|
|
||||||
virtual std::shared_ptr<CIntObject> createItem(size_t index) = 0;
|
virtual std::shared_ptr<CIntObject> createItem(size_t index) = 0;
|
||||||
|
|
||||||
|
/// should be called when list is invalidated
|
||||||
|
void update();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// functions that will be called when selection changes
|
/// functions that will be called when selection changes
|
||||||
CFunctionList<void()> onSelect;
|
CFunctionList<void()> onSelect;
|
||||||
@ -87,8 +90,6 @@ public:
|
|||||||
void setScrollUpButton(std::shared_ptr<CButton> button);
|
void setScrollUpButton(std::shared_ptr<CButton> button);
|
||||||
void setScrollDownButton(std::shared_ptr<CButton> button);
|
void setScrollDownButton(std::shared_ptr<CButton> button);
|
||||||
|
|
||||||
/// should be called when list is invalidated
|
|
||||||
void update();
|
|
||||||
|
|
||||||
/// set of methods to switch selection
|
/// set of methods to switch selection
|
||||||
void selectIndex(int which);
|
void selectIndex(int which);
|
||||||
@ -137,7 +138,10 @@ public:
|
|||||||
void select(const CGHeroInstance * hero = nullptr);
|
void select(const CGHeroInstance * hero = nullptr);
|
||||||
|
|
||||||
/// Update hero. Will add or remove it from the list if needed
|
/// Update hero. Will add or remove it from the list if needed
|
||||||
void update(const CGHeroInstance * hero = nullptr);
|
void updateElement(const CGHeroInstance * hero);
|
||||||
|
|
||||||
|
/// Update all heroes
|
||||||
|
void updateWidget();
|
||||||
};
|
};
|
||||||
|
|
||||||
/// List of towns which is shown at the right of the adventure map screen or in the town screen
|
/// List of towns which is shown at the right of the adventure map screen or in the town screen
|
||||||
@ -167,6 +171,9 @@ public:
|
|||||||
void select(const CGTownInstance * town = nullptr);
|
void select(const CGTownInstance * town = nullptr);
|
||||||
|
|
||||||
/// Update town. Will add or remove it from the list if needed
|
/// Update town. Will add or remove it from the list if needed
|
||||||
void update(const CGTownInstance * town = nullptr);
|
void updateElement(const CGTownInstance * town);
|
||||||
|
|
||||||
|
/// Update all towns
|
||||||
|
void updateWidget();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user