diff --git a/cockatrice/src/game/player/menu/card_menu.cpp b/cockatrice/src/game/player/menu/card_menu.cpp index 66ca5e46b..34ed254fb 100644 --- a/cockatrice/src/game/player/menu/card_menu.cpp +++ b/cockatrice/src/game/player/menu/card_menu.cpp @@ -75,17 +75,17 @@ CardMenu::CardMenu(Player *_player, const CardItem *_card, bool _shortcutsActive for (int i = 0; i < 6; ++i) { auto *tempAddCounter = new QAction(this); - tempAddCounter->setData(9 + i * 1000); auto *tempRemoveCounter = new QAction(this); - tempRemoveCounter->setData(10 + i * 1000); auto *tempSetCounter = new QAction(this); - tempSetCounter->setData(11 + i * 1000); aAddCounter.append(tempAddCounter); aRemoveCounter.append(tempRemoveCounter); aSetCounter.append(tempSetCounter); - connect(tempAddCounter, &QAction::triggered, playerActions, &PlayerActions::actCardCounterTrigger); - connect(tempRemoveCounter, &QAction::triggered, playerActions, &PlayerActions::actCardCounterTrigger); - connect(tempSetCounter, &QAction::triggered, playerActions, &PlayerActions::actCardCounterTrigger); + connect(tempAddCounter, &QAction::triggered, playerActions, + [playerActions, i] { playerActions->actAddCardCounter(i); }); + connect(tempRemoveCounter, &QAction::triggered, playerActions, + [playerActions, i] { playerActions->actRemoveCardCounter(i); }); + connect(tempSetCounter, &QAction::triggered, playerActions, + [playerActions, i] { playerActions->actSetCardCounter(i); }); } setShortcutsActive(); diff --git a/cockatrice/src/game/player/player_actions.cpp b/cockatrice/src/game/player/player_actions.cpp index 20034df16..9ee097f03 100644 --- a/cockatrice/src/game/player/player_actions.cpp +++ b/cockatrice/src/game/player/player_actions.cpp @@ -1540,80 +1540,77 @@ void PlayerActions::actUnattach() sendGameCommand(prepareGameCommand(commandList)); } -void PlayerActions::actCardCounterTrigger() +void PlayerActions::actAddCardCounter(int counterId) +{ + offsetCardCounter(counterId, 1); +} + +void PlayerActions::actRemoveCardCounter(int counterId) +{ + offsetCardCounter(counterId, -1); +} + +void PlayerActions::offsetCardCounter(int counterId, int offset) { - auto *action = static_cast(sender()); - int counterId = action->data().toInt() / 1000; QList commandList; - switch (action->data().toInt() % 1000) { - case 9: { // increment counter - for (const auto &item : player->getGameScene()->selectedItems()) { - auto *card = static_cast(item); - if (card->getCounters().value(counterId, 0) < MAX_COUNTERS_ON_CARD) { - auto *cmd = new Command_SetCardCounter; - cmd->set_zone(card->getZone()->getName().toStdString()); - cmd->set_card_id(card->getId()); - cmd->set_counter_id(counterId); - cmd->set_counter_value(card->getCounters().value(counterId, 0) + 1); - commandList.append(cmd); - } - } - break; + for (const auto &item : player->getGameScene()->selectedItems()) { + auto *card = static_cast(item); + + int oldValue = card->getCounters().value(counterId, 0); + int newValue = oldValue + offset; + + if (newValue >= 0 && newValue <= MAX_COUNTERS_ON_CARD) { + auto *cmd = new Command_SetCardCounter; + cmd->set_zone(card->getZone()->getName().toStdString()); + cmd->set_card_id(card->getId()); + cmd->set_counter_id(counterId); + cmd->set_counter_value(newValue); + commandList.append(cmd); } - case 10: { // decrement counter - for (const auto &item : player->getGameScene()->selectedItems()) { - auto *card = static_cast(item); - if (card->getCounters().value(counterId, 0)) { - auto *cmd = new Command_SetCardCounter; - cmd->set_zone(card->getZone()->getName().toStdString()); - cmd->set_card_id(card->getId()); - cmd->set_counter_id(counterId); - cmd->set_counter_value(card->getCounters().value(counterId, 0) - 1); - commandList.append(cmd); - } - } - break; - } - case 11: { // set counter with dialog - player->setDialogSemaphore(true); - - // If a single card is selected, we show the old value in the dialog. Otherwise, we show "x" - QList sel = player->getGameScene()->selectedItems(); - QString oldValueForDlg = "x"; - if (sel.size() == 1) { - auto *card = dynamic_cast(sel.first()); - oldValueForDlg = QString::number(card->getCounters().value(counterId, 0)); - } - - auto &cardCounterSettings = SettingsCache::instance().cardCounters(); - QString counterName = cardCounterSettings.displayName(counterId); - - AbstractCounterDialog dialog(counterName, oldValueForDlg, player->getGame()->getTab()); - int ok = dialog.exec(); - - player->setDialogSemaphore(false); - if (player->clearCardsToDelete() || !ok) { - return; - } - - for (const auto &item : sel) { - auto *card = dynamic_cast(item); - - int oldValue = card->getCounters().value(counterId, 0); - Expression exp(oldValue); - int number = static_cast(exp.parse(dialog.textValue())); - - auto *cmd = new Command_SetCardCounter; - cmd->set_zone(card->getZone()->getName().toStdString()); - cmd->set_card_id(card->getId()); - cmd->set_counter_id(counterId); - cmd->set_counter_value(number); - commandList.append(cmd); - } - break; - } - default:; } + + sendGameCommand(prepareGameCommand(commandList)); +} + +void PlayerActions::actSetCardCounter(int counterId) +{ + player->setDialogSemaphore(true); + + // If a single card is selected, we show the old value in the dialog. Otherwise, we show "x" + QList sel = player->getGameScene()->selectedItems(); + QString oldValueForDlg = "x"; + if (sel.size() == 1) { + auto *card = dynamic_cast(sel.first()); + oldValueForDlg = QString::number(card->getCounters().value(counterId, 0)); + } + + auto &cardCounterSettings = SettingsCache::instance().cardCounters(); + QString counterName = cardCounterSettings.displayName(counterId); + + AbstractCounterDialog dialog(counterName, oldValueForDlg, player->getGame()->getTab()); + int ok = dialog.exec(); + + player->setDialogSemaphore(false); + if (player->clearCardsToDelete() || !ok) { + return; + } + + QList commandList; + for (const auto &item : sel) { + auto *card = dynamic_cast(item); + + int oldValue = card->getCounters().value(counterId, 0); + Expression exp(oldValue); + int number = static_cast(exp.parse(dialog.textValue())); + + auto *cmd = new Command_SetCardCounter; + cmd->set_zone(card->getZone()->getName().toStdString()); + cmd->set_card_id(card->getId()); + cmd->set_counter_id(counterId); + cmd->set_counter_value(number); + commandList.append(cmd); + } + sendGameCommand(prepareGameCommand(commandList)); } diff --git a/cockatrice/src/game/player/player_actions.h b/cockatrice/src/game/player/player_actions.h index d4c6daacf..84f3494da 100644 --- a/cockatrice/src/game/player/player_actions.h +++ b/cockatrice/src/game/player/player_actions.h @@ -141,7 +141,9 @@ public slots: void actCreateAllRelatedCards(); void actMoveCardXCardsFromTop(); - void actCardCounterTrigger(); + void actRemoveCardCounter(int counterId); + void actAddCardCounter(int counterId); + void actSetCardCounter(int counterId); void actAttach(); void actUnattach(); void actDrawArrow(); @@ -197,6 +199,8 @@ private: void cmdSetTopCard(Command_MoveCard &cmd); void cmdSetBottomCard(Command_MoveCard &cmd); + void offsetCardCounter(int counterId, int offset); + QVariantList parsePT(const QString &pt); };