diff --git a/cockatrice/src/carditem.cpp b/cockatrice/src/carditem.cpp index 24c65bfb1..f62fa730e 100644 --- a/cockatrice/src/carditem.cpp +++ b/cockatrice/src/carditem.cpp @@ -366,23 +366,22 @@ void CardItem::playCard(bool faceDown) void CardItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { if (event->button() == Qt::RightButton) { - if (cardMenu) - if (!cardMenu->isEmpty()) { - owner->updateCardMenu(this); - cardMenu->exec(event->screenPos()); - } + if (cardMenu && !cardMenu->isEmpty() && owner) { + owner->updateCardMenu(this); + cardMenu->exec(event->screenPos()); + } } else if ((event->button() == Qt::LeftButton) && !settingsCache->getDoubleClickToPlay()) { - bool hideCard = false; - if (zone->getIsView()) { + if (zone && zone->getIsView()) { ZoneViewZone *view = static_cast(zone); if (view->getRevealZone() && !view->getWriteableRevealZone()) hideCard = true; } - if (hideCard) + if (zone && hideCard) { zone->removeCard(this); - else + } else { playCard(event->modifiers().testFlag(Qt::ShiftModifier)); + } } setCursor(Qt::OpenHandCursor); diff --git a/cockatrice/src/player.cpp b/cockatrice/src/player.cpp index b3f007734..1b0824717 100644 --- a/cockatrice/src/player.cpp +++ b/cockatrice/src/player.cpp @@ -110,6 +110,8 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, TabGame *_pare userInfo = new ServerInfo_User; userInfo->CopyFrom(info); + + connect(settingsCache, SIGNAL(horizontalHandChanged()), this, SLOT(rearrangeZones())); connect(settingsCache, SIGNAL(handJustificationChanged()), this, SLOT(rearrangeZones())); @@ -1766,7 +1768,7 @@ void Player::processGameEvent(GameEvent::GameEventType type, const GameEvent &ev case GameEvent::REVEAL_CARDS: eventRevealCards(event.GetExtension(Event_RevealCards::ext)); break; case GameEvent::CHANGE_ZONE_PROPERTIES: eventChangeZoneProperties(event.GetExtension(Event_ChangeZoneProperties::ext)); break; default: { - qDebug() << "unhandled game event"; + qDebug() << "unhandled game event" << type; } } } @@ -2523,8 +2525,11 @@ void Player::refreshShortcuts() void Player::updateCardMenu(const CardItem *card) { - if (card == nullptr) + // If bad card OR is a spectator (as spectators don't need card menus), return + if (card == nullptr || game->isSpectator()) + { return; + } QMenu *cardMenu = card->getCardMenu(); QMenu *ptMenu = card->getPTMenu(); @@ -2534,20 +2539,30 @@ void Player::updateCardMenu(const CardItem *card) bool revealedCard = false; bool writeableCard = getLocal(); - if (card->getZone() && card->getZone()->getIsView()) { + if (card->getZone() && card->getZone()->getIsView()) + { ZoneViewZone *view = static_cast(card->getZone()); - if (view->getRevealZone()) { + if (view->getRevealZone()) + { if (view->getWriteableRevealZone()) + { writeableCard = true; + } else + { revealedCard = true; + } } } if (revealedCard) + { cardMenu->addAction(aHide); - else if (writeableCard) { - if (moveMenu->isEmpty()) { + } + else if (writeableCard) + { + if (moveMenu->isEmpty()) + { moveMenu->addAction(aMoveToTopLibrary); moveMenu->addAction(aMoveToXfromTopOfLibrary); moveMenu->addAction(aMoveToBottomLibrary); @@ -2559,9 +2574,12 @@ void Player::updateCardMenu(const CardItem *card) moveMenu->addAction(aMoveToExile); } - if (card->getZone()) { - if (card->getZone()->getName() == "table") { - if (ptMenu->isEmpty()) { + if (card->getZone()) + { + if (card->getZone()->getName() == "table") + { + if (ptMenu->isEmpty()) + { ptMenu->addAction(aIncP); ptMenu->addAction(aDecP); ptMenu->addSeparator(); @@ -2579,14 +2597,18 @@ void Player::updateCardMenu(const CardItem *card) cardMenu->addAction(aDoesntUntap); cardMenu->addAction(aFlip); if (card->getFaceDown()) + { cardMenu->addAction(aPeek); + } addRelatedCardActions(card, cardMenu); cardMenu->addSeparator(); cardMenu->addAction(aAttach); if (card->getAttachedTo()) + { cardMenu->addAction(aUnattach); + } cardMenu->addAction(aDrawArrow); cardMenu->addSeparator(); cardMenu->addMenu(ptMenu); @@ -2595,31 +2617,45 @@ void Player::updateCardMenu(const CardItem *card) cardMenu->addAction(aClone); cardMenu->addMenu(moveMenu); - for (int i = 0; i < aAddCounter.size(); ++i) { + for (int i = 0; i < aAddCounter.size(); ++i) + { cardMenu->addSeparator(); cardMenu->addAction(aAddCounter[i]); if (card->getCounters().contains(i)) + { cardMenu->addAction(aRemoveCounter[i]); + } cardMenu->addAction(aSetCounter[i]); } cardMenu->addSeparator(); - } else if (card->getZone()->getName() == "stack") { + } + else if (card->getZone()->getName() == "stack") + { cardMenu->addAction(aDrawArrow); cardMenu->addMenu(moveMenu); addRelatedCardActions(card, cardMenu); - } else { + } + else + { cardMenu->addAction(aPlay); cardMenu->addAction(aPlayFacedown); cardMenu->addMenu(moveMenu); } - } else + } + else + { cardMenu->addMenu(moveMenu); - } else { - if (card->getZone() - && card->getZone()->getName() != "hand") { + } + } + else + { + if (card->getZone() && card->getZone()->getName() != "hand") + { cardMenu->addAction(aDrawArrow); cardMenu->addSeparator(); + addRelatedCardActions(card, cardMenu); + cardMenu->addSeparator(); cardMenu->addAction(aClone); } } @@ -2742,7 +2778,7 @@ void Player::processSceneSizeChange(int newPlayerWidth) void Player::setLastToken(CardInfo *cardInfo) { - if (cardInfo == nullptr) + if (cardInfo == nullptr || aCreateAnotherToken == nullptr) return; lastTokenName = cardInfo->getName(); diff --git a/cockatrice/src/tab_game.cpp b/cockatrice/src/tab_game.cpp index ea0e84e54..077543fc2 100644 --- a/cockatrice/src/tab_game.cpp +++ b/cockatrice/src/tab_game.cpp @@ -593,6 +593,11 @@ void TabGame::adminLockChanged(bool lock) sayEdit->setVisible(v); } +bool TabGame::isSpectator() +{ + return spectator; +} + void TabGame::actGameInfo() { DlgCreateGame dlg(gameInfo, roomGameTypes); @@ -735,7 +740,7 @@ void TabGame::processGameEventContainer(const GameEventContainer &cont, Abstract case GameEvent::GAME_SAY: eventSpectatorSay(event.GetExtension(Event_GameSay::ext), playerId, context); break; case GameEvent::LEAVE: eventSpectatorLeave(event.GetExtension(Event_Leave::ext), playerId, context); break; default: { - qDebug() << "unhandled spectator game event"; + qDebug() << "unhandled spectator game event" << eventType; break; } } diff --git a/cockatrice/src/tab_game.h b/cockatrice/src/tab_game.h index 150f4b370..ac4bcbc4c 100644 --- a/cockatrice/src/tab_game.h +++ b/cockatrice/src/tab_game.h @@ -249,9 +249,10 @@ public: QString getTabText() const; bool getSpectator() const { return spectator; } bool getSpectatorsSeeEverything() const { return gameInfo.spectators_omniscient(); } + bool isSpectator(); Player *getActiveLocalPlayer() const; AbstractClient *getClientForPlayer(int playerId) const; - + void setActiveCard(CardItem *_card) { activeCard = _card; } CardItem *getActiveCard() const { return activeCard; }