diff --git a/cockatrice/src/game/zones/view_zone_logic.cpp b/cockatrice/src/game/zones/view_zone_logic.cpp index 2ef04284a..de00581d1 100644 --- a/cockatrice/src/game/zones/view_zone_logic.cpp +++ b/cockatrice/src/game/zones/view_zone_logic.cpp @@ -154,6 +154,14 @@ void ZoneViewZoneLogic::removeCard(int position, bool toNewZone) reorganizeCards(); } +void ZoneViewZoneLogic::clearCards() +{ + for (auto card : cards) { + card->deleteLater(); + } + cards.clear(); +} + void ZoneViewZoneLogic::setWriteableRevealZone(bool _writeableRevealZone) { diff --git a/cockatrice/src/game/zones/view_zone_logic.h b/cockatrice/src/game/zones/view_zone_logic.h index 04ed20e45..e3080d044 100644 --- a/cockatrice/src/game/zones/view_zone_logic.h +++ b/cockatrice/src/game/zones/view_zone_logic.h @@ -41,6 +41,10 @@ public: bool prepareAddCard(int x); void removeCard(int position, bool toNewZone); void updateCardIds(CardAction action); + + /** @brief Removes all cards from the view, without touching anything else. Used in replay rewind */ + void clearCards(); + int getNumberCards() const { return numberCards; diff --git a/cockatrice/src/game_graphics/game_scene.cpp b/cockatrice/src/game_graphics/game_scene.cpp index 17af7618b..e4466f95d 100644 --- a/cockatrice/src/game_graphics/game_scene.cpp +++ b/cockatrice/src/game_graphics/game_scene.cpp @@ -735,6 +735,16 @@ void GameScene::clearViews() } } +void GameScene::emptyActiveViews() +{ + for (auto zoneView : zoneViews) { + auto logic = qobject_cast(zoneView->getZone()->getLogic()); + if (!logic->getRevealZone()) { + logic->clearCards(); + } + } +} + /** * @brief Closes the most recently added zone view. */ diff --git a/cockatrice/src/game_graphics/game_scene.h b/cockatrice/src/game_graphics/game_scene.h index 859d7a6eb..cf81eec9d 100644 --- a/cockatrice/src/game_graphics/game_scene.h +++ b/cockatrice/src/game_graphics/game_scene.h @@ -227,6 +227,9 @@ public slots: /** @brief Closes all zone views. */ void clearViews(); + /** @brief Empties the contents of all non-reveal zone views. Used for replay rewinding */ + void emptyActiveViews(); + /** @brief Closes the most recently added zone view. */ void closeMostRecentZoneView(); QTransform getViewTransform() const; diff --git a/cockatrice/src/interface/widgets/tabs/tab_game.cpp b/cockatrice/src/interface/widgets/tabs/tab_game.cpp index 035ab1004..23976340b 100644 --- a/cockatrice/src/interface/widgets/tabs/tab_game.cpp +++ b/cockatrice/src/interface/widgets/tabs/tab_game.cpp @@ -259,7 +259,7 @@ void TabGame::linkCardToChat(const QString &cardName) sayEdit->setFocus(); } -void TabGame::resetChatAndPhase() +void TabGame::resetForRewind() { // reset chat log messageLog->clearChat(); @@ -267,6 +267,9 @@ void TabGame::resetChatAndPhase() // reset phase markers game->getGameState()->setCurrentPhase(-1); + // reset view zones + static_cast(gameView->scene())->emptyActiveViews(); + // reset spectator state so the replay can rebuild it from the start game->getPlayerManager()->clearSpectators(); playerListWidget->clearSpectators(); @@ -1270,7 +1273,7 @@ void TabGame::createReplayDock(GameReplay *replay) replayDock->setWidget(replayWidget); replayDock->setFloating(false); - connect(replayWidget, &ReplayWidget::rewound, this, &TabGame::resetChatAndPhase); + connect(replayWidget, &ReplayWidget::rewound, this, &TabGame::resetForRewind); connect(replayWidget, &ReplayWidget::eventReplayed, game->getGameEventHandler(), [this](const auto &event, auto options) { game->getGameEventHandler()->processGameEventContainer(event, nullptr, options); diff --git a/cockatrice/src/interface/widgets/tabs/tab_game.h b/cockatrice/src/interface/widgets/tabs/tab_game.h index a05b49a9f..29a2f40a3 100644 --- a/cockatrice/src/interface/widgets/tabs/tab_game.h +++ b/cockatrice/src/interface/widgets/tabs/tab_game.h @@ -204,7 +204,7 @@ public: public slots: void viewCardInfo(const CardRef &cardRef = {}) const; - void resetChatAndPhase(); + void resetForRewind(); void updateTimeElapsedLabel(QString newTime); void addPlayerToAutoCompleteList(QString playerName); void removePlayerFromAutoCompleteList(QString playerName);