mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-09-21 00:55:09 -07:00
[Client] Add zone management to the deck state manager (#7204)
* [Client] Add zone management to the deck state manager State-layer operations for custom deck zones, plus the shared prompt dialog that later editor menus will call into. - moveCardToZone relocates every copy of a card row into any zone, refusing non-card rows and tokens so miswired selections can never shred a group or turn tokens into deck cards. The current zone is found by walking ancestors, which also handles legacy top-level zones. - createCustomZone, renameCustomZone, moveCustomZone and removeCustomZone wrap the tree API with memento history, model rebuilds and deck hash refreshes via modifyTree. - Same-board zone moves return success without minting a history entry, keeping the undo log honest. - promptForNewZone asks for a name and the parent zone, keeps Ok disabled until the trimmed name passes a caller-supplied validator (shown inline as an error), and reports its own translation context. Took 14 minutes # Commit time for manual adjustment: # Took 6 minutes # Commit time for manual adjustment: # Took 33 seconds * [DeckEditor] Address zone-management review feedback - Expose DecklistNodeTree::hasZoneName and use it in validateNewZoneName so the uniqueness scan covers custom zones on every board, not just the standard ones. - Hide the board selector in the rename dialog path where it is not used. - Emit deckHashChanged after refreshDeckHash so the deck hash label stays current after zone create/rename/move/remove. * [DeckEditor] Notify card set changes after zone edits and drop the board scan - modifyTree emits cardNodesChanged alongside deckHashChanged so the banner-card combo and printing in-deck counts refresh after removing a zone that still holds cards - DecklistNodeTree::findCustomZoneByName is public and moveCustomZone uses it, locating zones under non-standard boards (e.g. tokens) instead of scanning only main/side/maybeboard --------- Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
This commit is contained in:
parent
e8ec28572f
commit
9677fad342
9 changed files with 589 additions and 2 deletions
|
|
@ -213,6 +213,42 @@ TEST(DeckListZones, MoveCustomZoneMovesCards)
|
|||
EXPECT_FALSE(tree->moveCustomZone("Removal", "not_a_board"));
|
||||
}
|
||||
|
||||
TEST(DeckListZones, MoveCustomZoneFailsForUnknownBoard)
|
||||
{
|
||||
DeckList deck;
|
||||
auto *tree = deck.getTree();
|
||||
|
||||
ASSERT_NE(tree->addCustomZone(DECK_ZONE_MAIN, "Removal"), nullptr);
|
||||
tree->addCard("Lightning Bolt", 2, "Removal", -1);
|
||||
|
||||
EXPECT_FALSE(tree->moveCustomZone("Removal", "not_a_board"));
|
||||
|
||||
// The zone is still under main.
|
||||
EXPECT_EQ(tree->getCustomZones(DECK_ZONE_MAIN).size(), 1);
|
||||
}
|
||||
|
||||
// Regression: findCustomZoneByName walks every top-level zone, so a custom zone
|
||||
// an imported deck carries under a non-standard board (tokens) is still found and
|
||||
// movable. The pre-fix manager-level moveCustomZone only scanned the standard
|
||||
// boards and returned false for these with no feedback.
|
||||
TEST(DeckListZones, MoveCustomZoneNestedUnderTokensBoard)
|
||||
{
|
||||
DeckList deck;
|
||||
auto *tree = deck.getTree();
|
||||
auto *root = tree->getRoot();
|
||||
|
||||
auto *tokens = new InnerDecklistNode(DECK_ZONE_TOKENS, root);
|
||||
auto *removal = new InnerDecklistNode("Removal", tokens);
|
||||
new DecklistCardNode("Lightning Bolt", 2, removal, -1);
|
||||
|
||||
EXPECT_TRUE(tree->findCustomZoneByName("Removal"));
|
||||
EXPECT_TRUE(tree->moveCustomZone("Removal", DECK_ZONE_SIDE));
|
||||
|
||||
auto pairs = collectBoardCardPairs(deck);
|
||||
EXPECT_FALSE(hasPair(pairs, DECK_ZONE_TOKENS, "Lightning Bolt"));
|
||||
EXPECT_TRUE(hasPair(pairs, DECK_ZONE_SIDE, "Lightning Bolt"));
|
||||
}
|
||||
|
||||
TEST(DeckListZones, RemoveCustomZoneRemovesCards)
|
||||
{
|
||||
DeckList deck;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue