fix bug with phase highlighting in replays (#5161)

* fix bug with incorrectly highlighted phases

* fix new bug with phases continuously darkening

* use preincrement instead of postincrement

* simplify conditional
This commit is contained in:
RickyRister
2024-11-05 09:23:01 -08:00
committed by GitHub
parent 0c4e8ca290
commit 6652012f4c
4 changed files with 51 additions and 6 deletions

View File

@@ -637,6 +637,19 @@ void TabGame::replayFastForwardButtonToggled(bool checked)
timelineWidget->setTimeScaleFactor(checked ? 10.0 : 1.0);
}
/**
* @brief Handles everything that needs to be reset when doing a replay rewind.
*/
void TabGame::replayRewind()
{
// reset chat log
messageLog->clearChat();
// reset phase markers
currentPhase = -1;
phasesToolbar->reset();
}
void TabGame::incrementGameTime()
{
int seconds = ++secondsElapsed;
@@ -1718,7 +1731,7 @@ void TabGame::createReplayDock()
timelineWidget->setTimeline(replayTimeline);
connect(timelineWidget, SIGNAL(processNextEvent()), this, SLOT(replayNextEvent()));
connect(timelineWidget, SIGNAL(replayFinished()), this, SLOT(replayFinished()));
connect(timelineWidget, &ReplayTimelineWidget::rewound, messageLog, &ChatView::clearChat);
connect(timelineWidget, &ReplayTimelineWidget::rewound, this, &TabGame::replayRewind);
// timeline skip shortcuts
aReplaySkipForward = new QAction(timelineWidget);

View File

@@ -225,6 +225,7 @@ private slots:
void replayFinished();
void replayPlayButtonToggled(bool checked);
void replayFastForwardButtonToggled(bool checked);
void replayRewind();
void incrementGameTime();
void adminLockChanged(bool lock);

View File

@@ -74,13 +74,32 @@ void PhaseButton::updateAnimation()
if (!highlightable)
return;
if (active) {
if (++activeAnimationCounter >= 10)
activeAnimationTimer->stop();
// the counter ticks up to 10 when active and down to 0 when inactive
if (active && activeAnimationCounter < 10) {
++activeAnimationCounter;
} else if (!active && activeAnimationCounter > 0) {
--activeAnimationCounter;
} else {
if (--activeAnimationCounter <= 0)
activeAnimationTimer->stop();
activeAnimationTimer->stop();
}
update();
}
/**
* @brief Immediately resets the button to the inactive state, without going through the animation.
*/
void PhaseButton::reset()
{
activeAnimationTimer->stop();
active = false;
if (highlightable) {
activeAnimationCounter = 0;
} else {
activeAnimationCounter = 9;
}
update();
}
@@ -249,6 +268,16 @@ void PhasesToolbar::phaseButtonClicked()
emit sendGameCommand(cmd, -1);
}
/**
* @brief Immediately resets the toolbar to its initial state, with all phases inactive.
*/
void PhasesToolbar::reset()
{
for (auto &i : buttonList) {
i->reset();
}
}
void PhasesToolbar::actNextTurn()
{
emit sendGameCommand(Command_NextTurn(), -1);

View File

@@ -45,6 +45,7 @@ public:
{
return active;
}
void reset();
void triggerDoubleClickAction();
signals:
void clicked();
@@ -85,6 +86,7 @@ public:
public slots:
void setActivePhase(int phase);
void triggerPhaseAction(int phase);
void reset();
private slots:
void phaseButtonClicked();
void actNextTurn();