mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-06-10 00:04:48 -07:00
Add keybaord shortcut for creating related cards (#2426)
* Extract createCard from actCreateRelatedCard * Merge related cards and reverse related cards before handling * Add "Create all related cards" action to a card * Stop displaying all related tokens if only one token is available * Add shortcut for Creating all tokens related to selected card * Extract method for adding related card actions * Prefer foreach to index based iteration * Guard against null cards, card menus, or cardInfos * Remove QRegExp dependency from commonly depended header
This commit is contained in:
parent
c0e7d0c7c7
commit
b9cd942308
4 changed files with 114 additions and 53 deletions
|
|
@ -24,6 +24,7 @@
|
|||
#include <QPainter>
|
||||
#include <QMenu>
|
||||
#include <QDebug>
|
||||
#include <QRegExp>
|
||||
|
||||
#include "pb/command_change_zone_properties.pb.h"
|
||||
#include "pb/command_reveal_cards.pb.h"
|
||||
|
|
@ -1095,20 +1096,33 @@ void Player::actCreatePredefinedToken()
|
|||
|
||||
void Player::actCreateRelatedCard()
|
||||
{
|
||||
// get the clicked card
|
||||
CardItem * sourceCard = game->getActiveCard();
|
||||
if(!sourceCard)
|
||||
return;
|
||||
|
||||
// get the target card name
|
||||
QAction *action = static_cast<QAction *>(sender());
|
||||
const QString &actionDisplayName = action->text();
|
||||
createCard(sourceCard, dbNameFromTokenDisplayName(actionDisplayName));
|
||||
}
|
||||
|
||||
// removes p/t from tokens (and leading space))
|
||||
// Added split for "Token:" due to change in PR fixing #2317
|
||||
QStringList spaces = action->text().split(tr("Token: "))[1].split(" ");
|
||||
if (spaces.at(0).indexOf("/") != -1) // Strip space from creatures
|
||||
spaces.removeFirst();
|
||||
CardInfo *cardInfo = db->getCard(spaces.join(" "));
|
||||
void Player::actCreateAllRelatedCards()
|
||||
{
|
||||
CardItem * sourceCard = game->getActiveCard();
|
||||
if(!sourceCard)
|
||||
return;
|
||||
|
||||
QStringList relatedCards = * new QStringList();
|
||||
relatedCards.append(sourceCard->getInfo()->getRelatedCards());
|
||||
relatedCards.append(sourceCard->getInfo()->getReverseRelatedCards2Me());
|
||||
|
||||
foreach (const QString &tokenName, relatedCards)
|
||||
{
|
||||
createCard(sourceCard, dbNameFromTokenDisplayName(tokenName));
|
||||
}
|
||||
}
|
||||
|
||||
void Player::createCard(const CardItem *sourceCard, const QString &dbCardName) {
|
||||
CardInfo *cardInfo = db->getCard(dbCardName);
|
||||
if(!cardInfo)
|
||||
return;
|
||||
|
||||
|
|
@ -1177,6 +1191,21 @@ void Player::setCardAttrHelper(const GameEventContext &context, CardItem *card,
|
|||
}
|
||||
}
|
||||
|
||||
// token names take the form of "<Descriptors> <Power>/<Toughness> <Card Name> " or "<Card Name> ".
|
||||
// dbName for tokens should take the form of "<Card Name> ".
|
||||
// trailing whitespace is significant; it is hacked on at the end as an additional identifier in our single key database
|
||||
QString Player::dbNameFromTokenDisplayName(const QString &tokenName) {
|
||||
QRegExp tokenNamePattern(".*/\\S+\\s+(.*)");
|
||||
|
||||
int index = tokenNamePattern.indexIn(tokenName);
|
||||
if (index != -1)
|
||||
{
|
||||
return tokenNamePattern.capturedTexts()[1];
|
||||
} else {
|
||||
return tokenName;
|
||||
}
|
||||
}
|
||||
|
||||
void Player::eventGameSay(const Event_GameSay &event)
|
||||
{
|
||||
emit logSay(this, QString::fromStdString(event.message()));
|
||||
|
|
@ -2286,10 +2315,17 @@ void Player::actPlayFacedown()
|
|||
void Player::refreshShortcuts()
|
||||
{
|
||||
if(shortcutsActive)
|
||||
{
|
||||
setShortcutsActive();
|
||||
|
||||
foreach (const CardItem *cardItem, table->getCards())
|
||||
{
|
||||
updateCardMenu(cardItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Player::updateCardMenu(CardItem *card)
|
||||
void Player::updateCardMenu(const CardItem *card)
|
||||
{
|
||||
QMenu *cardMenu = card->getCardMenu();
|
||||
QMenu *ptMenu = card->getPTMenu();
|
||||
|
|
@ -2348,26 +2384,8 @@ void Player::updateCardMenu(CardItem *card)
|
|||
if (card->getFaceDown())
|
||||
cardMenu->addAction(aPeek);
|
||||
|
||||
if(card->getInfo())
|
||||
{
|
||||
QStringList relatedCards = card->getInfo()->getRelatedCards();
|
||||
QStringList reverserelatedCards2Me = card->getInfo()->getReverseRelatedCards2Me();
|
||||
if(relatedCards.size() || reverserelatedCards2Me.size())
|
||||
{
|
||||
cardMenu->addSeparator();
|
||||
for (int i = 0; i < relatedCards.size(); ++i) {
|
||||
QAction *a = new QAction(tr("Token: ") + relatedCards.at(i), this);
|
||||
connect(a, SIGNAL(triggered()), this, SLOT(actCreateRelatedCard()));
|
||||
cardMenu->addAction(a);
|
||||
}
|
||||
addRelatedCardActions(card, cardMenu);
|
||||
|
||||
for (int i = 0; i < reverserelatedCards2Me.size(); ++i) {
|
||||
QAction *a = new QAction(tr("Token: ") + reverserelatedCards2Me.at(i), this);
|
||||
connect(a, SIGNAL(triggered()), this, SLOT(actCreateRelatedCard()));
|
||||
cardMenu->addAction(a);
|
||||
}
|
||||
}
|
||||
}
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aAttach);
|
||||
if (card->getAttachedTo())
|
||||
|
|
@ -2395,26 +2413,7 @@ void Player::updateCardMenu(CardItem *card)
|
|||
cardMenu->addAction(aDrawArrow);
|
||||
cardMenu->addMenu(moveMenu);
|
||||
|
||||
if(card->getInfo())
|
||||
{
|
||||
QStringList relatedCards = card->getInfo()->getRelatedCards();
|
||||
QStringList reverserelatedCards2Me = card->getInfo()->getReverseRelatedCards2Me();
|
||||
if(relatedCards.size() || reverserelatedCards2Me.size())
|
||||
{
|
||||
cardMenu->addSeparator();
|
||||
for (int i = 0; i < relatedCards.size(); ++i) {
|
||||
QAction *a = new QAction(tr("Token: ") + relatedCards.at(i), this);
|
||||
connect(a, SIGNAL(triggered()), this, SLOT(actCreateRelatedCard()));
|
||||
cardMenu->addAction(a);
|
||||
}
|
||||
|
||||
for (int i = 0; i < reverserelatedCards2Me.size(); ++i) {
|
||||
QAction *a = new QAction(tr("Token: ") + reverserelatedCards2Me.at(i), this);
|
||||
connect(a, SIGNAL(triggered()), this, SLOT(actCreateRelatedCard()));
|
||||
cardMenu->addAction(a);
|
||||
}
|
||||
}
|
||||
}
|
||||
addRelatedCardActions(card, cardMenu);
|
||||
} else {
|
||||
cardMenu->addAction(aPlay);
|
||||
cardMenu->addAction(aPlayFacedown);
|
||||
|
|
@ -2425,6 +2424,49 @@ void Player::updateCardMenu(CardItem *card)
|
|||
}
|
||||
}
|
||||
|
||||
void Player::addRelatedCardActions(const CardItem *card, QMenu *cardMenu) {
|
||||
if (!card || !cardMenu || !card->getInfo())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QStringList relatedCards = *new QStringList();
|
||||
relatedCards.append(card->getInfo()->getRelatedCards());
|
||||
relatedCards.append(card->getInfo()->getReverseRelatedCards2Me());
|
||||
|
||||
switch (relatedCards.length()) {
|
||||
case 0:
|
||||
break;
|
||||
case 1: {
|
||||
cardMenu->addSeparator();
|
||||
QAction *createRelatedCards = new QAction(tr("Token: ") + relatedCards.at(0), this);
|
||||
connect(createRelatedCards, SIGNAL(triggered()), this, SLOT(actCreateAllRelatedCards()));
|
||||
if (shortcutsActive) {
|
||||
createRelatedCards->setShortcut(settingsCache->shortcuts().getSingleShortcut("Player/aCreateRelatedTokens"));
|
||||
}
|
||||
cardMenu->addAction(createRelatedCards);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
cardMenu->addSeparator();
|
||||
foreach (QString cardName, relatedCards)
|
||||
{
|
||||
QAction *createRelated = new QAction(tr("Token: ") + cardName, this);
|
||||
connect(createRelated, SIGNAL(triggered()), this, SLOT(actCreateRelatedCard()));
|
||||
cardMenu->addAction(createRelated);
|
||||
}
|
||||
QAction *createRelatedCards = new QAction(tr("All tokens"), this);
|
||||
connect(createRelatedCards, SIGNAL(triggered()), this, SLOT(actCreateAllRelatedCards()));
|
||||
if (shortcutsActive) {
|
||||
createRelatedCards->setShortcut(settingsCache->shortcuts().getSingleShortcut("Player/aCreateRelatedTokens"));
|
||||
}
|
||||
cardMenu->addAction(createRelatedCards);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Player::setCardMenu(QMenu *menu)
|
||||
{
|
||||
if (aCardMenu)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue