diff --git a/cockatrice/src/client/tabs/tab_game.cpp b/cockatrice/src/client/tabs/tab_game.cpp index 76dc478fb..a400cbfa9 100644 --- a/cockatrice/src/client/tabs/tab_game.cpp +++ b/cockatrice/src/client/tabs/tab_game.cpp @@ -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); diff --git a/cockatrice/src/client/tabs/tab_game.h b/cockatrice/src/client/tabs/tab_game.h index 499a9e415..16befd8bc 100644 --- a/cockatrice/src/client/tabs/tab_game.h +++ b/cockatrice/src/client/tabs/tab_game.h @@ -225,6 +225,7 @@ private slots: void replayFinished(); void replayPlayButtonToggled(bool checked); void replayFastForwardButtonToggled(bool checked); + void replayRewind(); void incrementGameTime(); void adminLockChanged(bool lock); diff --git a/cockatrice/src/client/ui/phases_toolbar.cpp b/cockatrice/src/client/ui/phases_toolbar.cpp index fdc0227ba..f43d9f00d 100644 --- a/cockatrice/src/client/ui/phases_toolbar.cpp +++ b/cockatrice/src/client/ui/phases_toolbar.cpp @@ -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); diff --git a/cockatrice/src/client/ui/phases_toolbar.h b/cockatrice/src/client/ui/phases_toolbar.h index 3567e741b..1595c65d5 100644 --- a/cockatrice/src/client/ui/phases_toolbar.h +++ b/cockatrice/src/client/ui/phases_toolbar.h @@ -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();