From f964b6b24f3d18b484cc2db755396895170c94f3 Mon Sep 17 00:00:00 2001 From: Christian Daniel Jensen Date: Mon, 2 Nov 2026 01:56:35 -0700 Subject: [PATCH] Continuumatrice: render interactive public piles with themed icons --- .../game_graphics/player/menu/player_menu.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/cockatrice/src/game_graphics/player/menu/player_menu.cpp b/cockatrice/src/game_graphics/player/menu/player_menu.cpp index 582586ac2..0ecd6f21b 100644 --- a/cockatrice/src/game_graphics/player/menu/player_menu.cpp +++ b/cockatrice/src/game_graphics/player/menu/player_menu.cpp @@ -20,12 +20,14 @@ #include "tally_menu.h" #include "utility_menu.h" +#include #include #include #include #include #include #include +#include PlayerMenu::PlayerMenu(PlayerGraphicsItem *_player) : QObject(_player), player(_player) { @@ -45,6 +47,19 @@ PlayerMenu::PlayerMenu(PlayerGraphicsItem *_player) : QObject(_player), player(_ graveMenu = addManagedMenu(player, playerMenu); rfgMenu = addManagedMenu(player, playerMenu); + // Context menus with double-click view action, following Exile's pattern. + const auto addPublicPileMenu = [this, _player](const QString &title, const QString &zone) { + auto *menu = playerMenu->addMenu(title); + auto *view = menu->addAction(tr("View %1").arg(title)); + connect(view, &QAction::triggered, this, [_player, zone]() { + _player->getLogic()->onRequestZoneViewToggle(zone, -1, false); + }); + return menu; + }; + limboMenu = addPublicPileMenu(tr("Limbo"), QString::fromLatin1(ZoneNames::LIMBO)); + refugeMenu = addPublicPileMenu(tr("Refuge"), QString::fromLatin1(ZoneNames::REFUGE)); + oblivionMenu = addPublicPileMenu(tr("Oblivion"), QString::fromLatin1(ZoneNames::OBLIVION)); + if (player->getLogic()->getPlayerInfo()->getLocalOrJudge()) { sideboardMenu = addManagedMenu(player, playerMenu); customZonesMenu = addManagedMenu(player); @@ -80,6 +95,9 @@ void PlayerMenu::setMenusForGraphicItems() player->getTableZoneGraphicsItem()->setMenu(playerMenu); player->getGraveyardZoneGraphicsItem()->setMenu(graveMenu, graveMenu->aViewGraveyard); player->getRfgZoneGraphicsItem()->setMenu(rfgMenu, rfgMenu->aViewRfg); + player->getLimboZoneGraphicsItem()->setMenu(limboMenu, limboMenu->actions().constFirst()); + player->getRefugeZoneGraphicsItem()->setMenu(refugeMenu, refugeMenu->actions().constFirst()); + player->getOblivionZoneGraphicsItem()->setMenu(oblivionMenu, oblivionMenu->actions().constFirst()); if (player->getLogic()->getPlayerInfo()->getLocalOrJudge()) { player->getHandZoneGraphicsItem()->setMenu(handMenu); player->getDeckZoneGraphicsItem()->setMenu(libraryMenu, libraryMenu->aDrawCard);