Parent card menu submenus to the menu that owns them

QMenu::addMenu(QMenu *) does not take ownership of the submenu, and these
submenus were created without a parent. Since CardMenu is rebuilt from
scratch on every right-click, each rebuild leaked the MoveMenu, PtMenu,
card counters and related-cards submenus.

Pass the owning CardMenu as the QWidget parent so Qt's parent-child
mechanism frees them with it.
This commit is contained in:
DawnFire42 2026-08-10 12:46:25 -04:00 • committed by Lukas Brübach
parent daa8671b4d
commit 7b22533646
5 changed files with 12 additions and 12 deletions

View file

@ -123,7 +123,7 @@ CardMenu::CardMenu(PlayerGraphicsItem *_player, CardItem *_card, bool _shortcuts
aRevealToAll = new QAction(this); aRevealToAll = new QAction(this);
mCardCounters = new QMenu; mCardCounters = new QMenu(this);
// Card counters // Card counters
for (int i = 0; i < 6; ++i) { for (int i = 0; i < 6; ++i) {
@ -225,7 +225,7 @@ void CardMenu::createTableMenu(bool canModifyCard)
} }
addSeparator(); addSeparator();
addAction(aClone); addAction(aClone);
addMenu(new MoveMenu(player)); addMenu(new MoveMenu(player, this));
addSeparator(); addSeparator();
addAction(aAttach); addAction(aAttach);
if (card->getAttachedTo()) { if (card->getAttachedTo()) {
@ -233,7 +233,7 @@ void CardMenu::createTableMenu(bool canModifyCard)
} }
addAction(aDrawArrow); addAction(aDrawArrow);
addSeparator(); addSeparator();
addMenu(new PtMenu(player)); addMenu(new PtMenu(player, this));
addAction(aSetAnnotation); addAction(aSetAnnotation);
addSeparator(); addSeparator();
addAction(aReduceLifeByPower); addAction(aReduceLifeByPower);
@ -275,7 +275,7 @@ void CardMenu::createStackMenu(bool canModifyCard)
addAction(aPlayFacedown); addAction(aPlayFacedown);
addSeparator(); addSeparator();
addAction(aClone); addAction(aClone);
addMenu(new MoveMenu(player)); addMenu(new MoveMenu(player, this));
addSeparator(); addSeparator();
addAction(aAttach); addAction(aAttach);
addAction(aDrawArrow); addAction(aDrawArrow);
@ -304,7 +304,7 @@ void CardMenu::createGraveyardOrExileMenu(bool canModifyCard)
addAction(aPlayFacedown); addAction(aPlayFacedown);
addSeparator(); addSeparator();
addAction(aClone); addAction(aClone);
addMenu(new MoveMenu(player)); addMenu(new MoveMenu(player, this));
addSeparator(); addSeparator();
addAction(aAttach); addAction(aAttach);
addAction(aDrawArrow); addAction(aDrawArrow);
@ -342,7 +342,7 @@ void CardMenu::createHandOrCustomZoneMenu(bool canModifyCard)
addSeparator(); addSeparator();
addAction(aClone); addAction(aClone);
addMenu(new MoveMenu(player)); addMenu(new MoveMenu(player, this));
// actions that are really wonky when done from deck or sideboard // actions that are really wonky when done from deck or sideboard
if (card->getZone()->getName() == ZoneNames::HAND) { if (card->getZone()->getName() == ZoneNames::HAND) {
@ -366,7 +366,7 @@ void CardMenu::createHandOrCustomZoneMenu(bool canModifyCard)
void CardMenu::createZonelessMenu(bool canModifyCard) void CardMenu::createZonelessMenu(bool canModifyCard)
{ {
if (canModifyCard) { if (canModifyCard) {
addMenu(new MoveMenu(player)); addMenu(new MoveMenu(player, this));
} }
} }
@ -415,7 +415,7 @@ void CardMenu::addRelatedCardView()
} }
addSeparator(); addSeparator();
auto viewRelatedCards = new QMenu(tr("View related cards")); auto viewRelatedCards = new QMenu(tr("View related cards"), this);
addMenu(viewRelatedCards); addMenu(viewRelatedCards);
for (const CardRelation *relatedCard : relatedCards) { for (const CardRelation *relatedCard : relatedCards) {
QString relatedCardName = relatedCard->getName(); QString relatedCardName = relatedCard->getName();

View file

@ -10,7 +10,7 @@
#include <libcockatrice/game/player/player_actions.h> #include <libcockatrice/game/player/player_actions.h>
#include <libcockatrice/game/player/player_logic.h> #include <libcockatrice/game/player/player_logic.h>
MoveMenu::MoveMenu(PlayerGraphicsItem *player) : QMenu(tr("Move to")) MoveMenu::MoveMenu(PlayerGraphicsItem *player, QWidget *parent) : QMenu(tr("Move to"), parent)
{ {
aMoveToTopLibrary = new QAction(this); aMoveToTopLibrary = new QAction(this);
aMoveToTopLibrary->setData(cmMoveToTopLibrary); aMoveToTopLibrary->setData(cmMoveToTopLibrary);

View file

@ -17,7 +17,7 @@ class MoveMenu : public QMenu
Q_OBJECT Q_OBJECT
public: public:
explicit MoveMenu(PlayerGraphicsItem *player); explicit MoveMenu(PlayerGraphicsItem *player, QWidget *parent);
void setShortcutsActive(); void setShortcutsActive();
void retranslateUi(); void retranslateUi();

View file

@ -9,7 +9,7 @@
#include <libcockatrice/game/player/player_actions.h> #include <libcockatrice/game/player/player_actions.h>
#include <libcockatrice/game/player/player_logic.h> #include <libcockatrice/game/player/player_logic.h>
PtMenu::PtMenu(PlayerGraphicsItem *player) : QMenu(tr("Power / toughness")) PtMenu::PtMenu(PlayerGraphicsItem *player, QWidget *parent) : QMenu(tr("Power / toughness"), parent)
{ {
PlayerActions *playerActions = player->getLogic()->getPlayerActions(); PlayerActions *playerActions = player->getLogic()->getPlayerActions();

View file

@ -18,7 +18,7 @@ class PtMenu : public QMenu
Q_OBJECT Q_OBJECT
public: public:
explicit PtMenu(PlayerGraphicsItem *player); explicit PtMenu(PlayerGraphicsItem *player, QWidget *parent);
void retranslateUi(); void retranslateUi();
void setShortcutsActive(); void setShortcutsActive();