mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-06-10 00:04:48 -07:00
Rework card menu handling (#6069)
* extract cardMenu from CardItem * move cardMenu saving to TabGame * delete TabGame::updateCardMenu * move checking to updateCardMenu * unset activeCard when all cards are unselected
This commit is contained in:
parent
1649f30389
commit
03bebbe4c2
6 changed files with 106 additions and 123 deletions
|
|
@ -449,11 +449,6 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, T
|
|||
initSayMenu();
|
||||
}
|
||||
|
||||
aCardMenu = new QAction(this);
|
||||
aCardMenu->setEnabled(false);
|
||||
playerMenu->addSeparator();
|
||||
playerMenu->addAction(aCardMenu);
|
||||
|
||||
if (local || judge) {
|
||||
|
||||
for (auto &playerList : playerLists) {
|
||||
|
|
@ -870,8 +865,6 @@ void Player::retranslateUi()
|
|||
}
|
||||
}
|
||||
|
||||
aCardMenu->setText(tr("Selec&ted cards"));
|
||||
|
||||
if (local) {
|
||||
sayMenu->setTitle(tr("S&ay"));
|
||||
}
|
||||
|
|
@ -3904,20 +3897,12 @@ void Player::refreshShortcuts()
|
|||
}
|
||||
}
|
||||
|
||||
void Player::updateCardMenu(const CardItem *card)
|
||||
QMenu *Player::createCardMenu(const CardItem *card)
|
||||
{
|
||||
// If bad card OR is a spectator (as spectators don't need card menus), return
|
||||
// only update the menu if the card is actually selected
|
||||
if (card == nullptr || (game->isSpectator() && !judge) || game->getActiveCard() != card) {
|
||||
return;
|
||||
if (card == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
QMenu *cardMenu = card->getCardMenu();
|
||||
QMenu *ptMenu = card->getPTMenu();
|
||||
QMenu *moveMenu = card->getMoveMenu();
|
||||
|
||||
cardMenu->clear();
|
||||
|
||||
bool revealedCard = false;
|
||||
bool writeableCard = getLocalOrJudge();
|
||||
if (auto *view = qobject_cast<ZoneViewZone *>(card->getZone())) {
|
||||
|
|
@ -3930,6 +3915,8 @@ void Player::updateCardMenu(const CardItem *card)
|
|||
}
|
||||
}
|
||||
|
||||
QMenu *cardMenu = new QMenu;
|
||||
|
||||
if (revealedCard) {
|
||||
cardMenu->addAction(aHide);
|
||||
cardMenu->addAction(aClone);
|
||||
|
|
@ -3940,18 +3927,6 @@ void Player::updateCardMenu(const CardItem *card)
|
|||
} else if (writeableCard) {
|
||||
bool canModifyCard = judge || card->getOwner() == this;
|
||||
|
||||
if (moveMenu->isEmpty() && canModifyCard) {
|
||||
moveMenu->addAction(aMoveToTopLibrary);
|
||||
moveMenu->addAction(aMoveToXfromTopOfLibrary);
|
||||
moveMenu->addAction(aMoveToBottomLibrary);
|
||||
moveMenu->addSeparator();
|
||||
moveMenu->addAction(aMoveToHand);
|
||||
moveMenu->addSeparator();
|
||||
moveMenu->addAction(aMoveToGraveyard);
|
||||
moveMenu->addSeparator();
|
||||
moveMenu->addAction(aMoveToExile);
|
||||
}
|
||||
|
||||
if (card->getZone()) {
|
||||
if (card->getZone()->getName() == "table") {
|
||||
// Card is on the battlefield
|
||||
|
|
@ -3967,23 +3942,7 @@ void Player::updateCardMenu(const CardItem *card)
|
|||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aSelectAll);
|
||||
cardMenu->addAction(aSelectRow);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ptMenu->isEmpty()) {
|
||||
ptMenu->addAction(aIncP);
|
||||
ptMenu->addAction(aDecP);
|
||||
ptMenu->addAction(aFlowP);
|
||||
ptMenu->addSeparator();
|
||||
ptMenu->addAction(aIncT);
|
||||
ptMenu->addAction(aDecT);
|
||||
ptMenu->addAction(aFlowT);
|
||||
ptMenu->addSeparator();
|
||||
ptMenu->addAction(aIncPT);
|
||||
ptMenu->addAction(aDecPT);
|
||||
ptMenu->addSeparator();
|
||||
ptMenu->addAction(aSetPT);
|
||||
ptMenu->addAction(aResetPT);
|
||||
return cardMenu;
|
||||
}
|
||||
|
||||
cardMenu->addAction(aTap);
|
||||
|
|
@ -4003,11 +3962,11 @@ void Player::updateCardMenu(const CardItem *card)
|
|||
}
|
||||
cardMenu->addAction(aDrawArrow);
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addMenu(ptMenu);
|
||||
cardMenu->addMenu(createPtMenu());
|
||||
cardMenu->addAction(aSetAnnotation);
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aClone);
|
||||
cardMenu->addMenu(moveMenu);
|
||||
cardMenu->addMenu(createMoveMenu());
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aSelectAll);
|
||||
cardMenu->addAction(aSelectRow);
|
||||
|
|
@ -4031,7 +3990,7 @@ void Player::updateCardMenu(const CardItem *card)
|
|||
cardMenu->addAction(aDrawArrow);
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aClone);
|
||||
cardMenu->addMenu(moveMenu);
|
||||
cardMenu->addMenu(createMoveMenu());
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aSelectAll);
|
||||
} else {
|
||||
|
|
@ -4052,7 +4011,7 @@ void Player::updateCardMenu(const CardItem *card)
|
|||
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aClone);
|
||||
cardMenu->addMenu(moveMenu);
|
||||
cardMenu->addMenu(createMoveMenu());
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aSelectAll);
|
||||
cardMenu->addAction(aSelectColumn);
|
||||
|
|
@ -4082,7 +4041,7 @@ void Player::updateCardMenu(const CardItem *card)
|
|||
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aClone);
|
||||
cardMenu->addMenu(moveMenu);
|
||||
cardMenu->addMenu(createMoveMenu());
|
||||
|
||||
// actions that are really wonky when done from deck or sideboard
|
||||
if (card->getZone()->getName() == "hand") {
|
||||
|
|
@ -4103,7 +4062,7 @@ void Player::updateCardMenu(const CardItem *card)
|
|||
}
|
||||
}
|
||||
} else {
|
||||
cardMenu->addMenu(moveMenu);
|
||||
cardMenu->addMenu(createMoveMenu());
|
||||
}
|
||||
} else {
|
||||
if (card->getZone() && card->getZone()->getName() != "hand") {
|
||||
|
|
@ -4117,6 +4076,42 @@ void Player::updateCardMenu(const CardItem *card)
|
|||
cardMenu->addAction(aSelectAll);
|
||||
}
|
||||
}
|
||||
|
||||
return cardMenu;
|
||||
}
|
||||
|
||||
QMenu *Player::createMoveMenu() const
|
||||
{
|
||||
QMenu *moveMenu = new QMenu("Move to");
|
||||
moveMenu->addAction(aMoveToTopLibrary);
|
||||
moveMenu->addAction(aMoveToXfromTopOfLibrary);
|
||||
moveMenu->addAction(aMoveToBottomLibrary);
|
||||
moveMenu->addSeparator();
|
||||
moveMenu->addAction(aMoveToHand);
|
||||
moveMenu->addSeparator();
|
||||
moveMenu->addAction(aMoveToGraveyard);
|
||||
moveMenu->addSeparator();
|
||||
moveMenu->addAction(aMoveToExile);
|
||||
return moveMenu;
|
||||
}
|
||||
|
||||
QMenu *Player::createPtMenu() const
|
||||
{
|
||||
QMenu *ptMenu = new QMenu("Power / toughness");
|
||||
ptMenu->addAction(aIncP);
|
||||
ptMenu->addAction(aDecP);
|
||||
ptMenu->addAction(aFlowP);
|
||||
ptMenu->addSeparator();
|
||||
ptMenu->addAction(aIncT);
|
||||
ptMenu->addAction(aDecT);
|
||||
ptMenu->addAction(aFlowT);
|
||||
ptMenu->addSeparator();
|
||||
ptMenu->addAction(aIncPT);
|
||||
ptMenu->addAction(aDecPT);
|
||||
ptMenu->addSeparator();
|
||||
ptMenu->addAction(aSetPT);
|
||||
ptMenu->addAction(aResetPT);
|
||||
return ptMenu;
|
||||
}
|
||||
|
||||
void Player::addRelatedCardView(const CardItem *card, QMenu *cardMenu)
|
||||
|
|
@ -4226,23 +4221,30 @@ void Player::addRelatedCardActions(const CardItem *card, QMenu *cardMenu)
|
|||
}
|
||||
}
|
||||
|
||||
void Player::setCardMenu(QMenu *menu)
|
||||
/**
|
||||
* Creates a card menu from the given card and sets it as the currently active card menu.
|
||||
* Will first check if the card should have a card menu, and no-ops if not.
|
||||
*
|
||||
* @param card The card to create the menu for. Pass nullptr to disable the card menu.
|
||||
* @return The new card menu, or nullptr if failed.
|
||||
*/
|
||||
QMenu *Player::updateCardMenu(const CardItem *card)
|
||||
{
|
||||
if (aCardMenu != nullptr) {
|
||||
aCardMenu->setEnabled(menu != nullptr);
|
||||
if (menu) {
|
||||
aCardMenu->setMenu(menu);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QMenu *Player::getCardMenu() const
|
||||
{
|
||||
if (aCardMenu != nullptr) {
|
||||
return aCardMenu->menu();
|
||||
} else {
|
||||
if (!card) {
|
||||
emit cardMenuUpdated(nullptr);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// If is spectator (as spectators don't need card menus), return
|
||||
// only update the menu if the card is actually selected
|
||||
if ((game->isSpectator() && !judge) || game->getActiveCard() != card) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
QMenu *menu = createCardMenu(card);
|
||||
emit cardMenuUpdated(menu);
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
QString Player::getName() const
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue