1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-13 19:54:17 +02:00

Merge pull request #624 from Toneyisnow/toneyisnow/Fixbug_LobbyScreen_LoadGame

Fix bug: LobbyScreen UI has a bug on the Difficulty toggle group.
This commit is contained in:
Alexander Shishkin
2020-01-23 16:13:51 +03:00
committed by GitHub
3 changed files with 42 additions and 3 deletions

View File

@@ -187,8 +187,18 @@ void CLobbyScreen::updateAfterStateChange()
tabOpt->recreate();
card->changeSelection();
if(card->iconDifficulty)
if (card->iconDifficulty)
{
if (screenType == ESelectionScreen::loadGame)
{
// When loading the game, only one button in the difficulty toggle group should be enabled, so here disable all other buttons first, then make selection
card->iconDifficulty->setSelectedOnly(CSH->si->difficulty);
}
else
{
card->iconDifficulty->setSelected(CSH->si->difficulty);
}
}
if(curTab == tabRand && CSH->si->mapGenOptions)
tabRand->setMapGenOptions(CSH->si->mapGenOptions);

View File

@@ -322,6 +322,11 @@ void CToggleBase::doSelect(bool on)
// for overrides
}
void CToggleBase::setEnabled(bool enabled)
{
// for overrides
}
void CToggleBase::setSelected(bool on)
{
bool changed = (on != selected);
@@ -363,6 +368,11 @@ void CToggleButton::doSelect(bool on)
}
}
void CToggleButton::setEnabled(bool enabled)
{
setState(enabled ? NORMAL : BLOCKED);
}
void CToggleButton::clickLeft(tribool down, bool previousState)
{
// force refresh
@@ -425,6 +435,17 @@ void CToggleGroup::setSelected(int id)
selectionChanged(id);
}
void CToggleGroup::setSelectedOnly(int id)
{
for(auto it = buttons.begin(); it != buttons.end(); it++)
{
int buttonId = it->first;
buttons[buttonId]->setEnabled(buttonId == id);
}
selectionChanged(id);
}
void CToggleGroup::selectionChanged(int to)
{
if (to == selectedID)

View File

@@ -139,12 +139,17 @@ public:
void setSelected(bool on);
void addCallback(std::function<void(bool)> callback);
/// Set whether the toggle is currently enabled for user to use, this is only inplemented in ToggleButton, not for other toggles yet.
virtual void setEnabled(bool enabled);
};
/// A button which can be selected/deselected, checkbox
class CToggleButton : public CButton, public CToggleBase
{
void doSelect(bool on) override;
void setEnabled(bool enabled) override;
public:
CToggleButton(Point position, const std::string &defName, const std::pair<std::string, std::string> &help,
CFunctionList<void(bool)> Callback = 0, int key=0, bool playerColoredButton = false );
@@ -173,6 +178,9 @@ public:
void addToggle(int index, std::shared_ptr<CToggleBase> button);
/// Changes selection to specific value. Will select toggle with this ID, if present
void setSelected(int id);
/// in some cases, e.g. LoadGame difficulty selection, after refreshing the UI, the ToggleGroup should
/// reset all of it's child buttons to BLOCK state, then make selection again
void setSelectedOnly(int id);
};
/// A typical slider for volume with an animated indicator