Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix bug: LobbyScreen UI has a bug on the Difficulty toggle group. #624

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
16 changes: 13 additions & 3 deletions client/lobby/CLobbyScreen.cpp
Expand Up @@ -187,9 +187,19 @@ void CLobbyScreen::updateAfterStateChange()
tabOpt->recreate();

card->changeSelection();
if(card->iconDifficulty)
card->iconDifficulty->setSelected(CSH->si->difficulty);

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);
}
Expand Down
23 changes: 23 additions & 0 deletions client/widgets/Buttons.cpp
Expand Up @@ -23,6 +23,8 @@
#include "../windows/InfoWindows.h"
#include "../../lib/CConfigHandler.h"

using namespace std;
Toneyisnow marked this conversation as resolved.
Show resolved Hide resolved

void CButton::update()
{
if (overlay)
Expand Down Expand Up @@ -322,6 +324,11 @@ void CToggleBase::doSelect(bool on)
// for overrides
}

void CToggleBase::setEnabled(bool enabled)
{
// for overrides
}

void CToggleBase::setSelected(bool on)
{
bool changed = (on != selected);
Expand Down Expand Up @@ -363,6 +370,11 @@ void CToggleButton::doSelect(bool on)
}
}

void CToggleButton::setEnabled(bool enabled)
{
setState(enabled ? NORMAL : BLOCKED);
}

void CToggleButton::clickLeft(tribool down, bool previousState)
{
// force refresh
Expand Down Expand Up @@ -425,6 +437,17 @@ void CToggleGroup::setSelected(int id)
selectionChanged(id);
}

void CToggleGroup::setSelectedOnly(int id)
{
for (map<int, shared_ptr<CToggleBase> >::iterator it = buttons.begin(); it != buttons.end(); it++)
Toneyisnow marked this conversation as resolved.
Show resolved Hide resolved
{
int buttonId = it->first;
buttons[buttonId]->setEnabled(buttonId == id);
}

selectionChanged(id);
}

void CToggleGroup::selectionChanged(int to)
{
if (to == selectedID)
Expand Down
8 changes: 8 additions & 0 deletions client/widgets/Buttons.h
Expand Up @@ -139,12 +139,17 @@ class CToggleBase
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 );
Expand Down Expand Up @@ -173,6 +178,9 @@ class CToggleGroup : public CIntObject
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
Expand Down