Clean up dangling QAction* wrappers for PlayerMenus in TabGame::processPlayerLeave(Player* leavingPlayer)

Took 37 seconds
This commit is contained in:
Lukas Brübach 2025-10-03 11:11:22 +02:00
parent c2612015aa
commit 694cfc1fa1

View file

@ -650,14 +650,6 @@ void TabGame::notifyPlayerKicked()
msgBox.exec(); msgBox.exec();
} }
void TabGame::processPlayerLeave(Player *leavingPlayer)
{
QString playerName = "@" + leavingPlayer->getPlayerInfo()->getName();
removePlayerFromAutoCompleteList(playerName);
scene->removePlayer(leavingPlayer);
}
Player *TabGame::addPlayer(Player *newPlayer) Player *TabGame::addPlayer(Player *newPlayer)
{ {
QString newPlayerName = "@" + newPlayer->getPlayerInfo()->getName(); QString newPlayerName = "@" + newPlayer->getPlayerInfo()->getName();
@ -707,6 +699,31 @@ void TabGame::addLocalPlayer(Player *newPlayer, int playerId)
} }
} }
void TabGame::processPlayerLeave(Player *leavingPlayer)
{
QString playerName = "@" + leavingPlayer->getPlayerInfo()->getName();
removePlayerFromAutoCompleteList(playerName);
scene->removePlayer(leavingPlayer);
// When we inserted the playerMenu into the gameMenu earlier, Qt wrapped the playerMenu into a QAction*, which lives
// independently and does not get cleaned up when the source menu gets destroyed. We have to manually clean here.
if (leavingPlayer->getPlayerMenu()) {
QMenu *menu = leavingPlayer->getPlayerMenu()->getPlayerMenu();
if (menu) {
// Find and remove the QAction pointing to this menu
QList<QAction*> actions = gameMenu->actions();
for (QAction *act : actions) {
if (act->menu() == menu) {
gameMenu->removeAction(act);
delete act; // deletes the QAction wrapper around the submenu
break;
}
}
}
}
}
void TabGame::processRemotePlayerDeckSelect(QString deckList, int playerId, QString playerName) void TabGame::processRemotePlayerDeckSelect(QString deckList, int playerId, QString playerName)
{ {
DeckList loader; DeckList loader;