diff --git a/cockatrice/src/arrowitem.cpp b/cockatrice/src/arrowitem.cpp index 4db9722a..5d0bc70b 100644 --- a/cockatrice/src/arrowitem.cpp +++ b/cockatrice/src/arrowitem.cpp @@ -138,8 +138,8 @@ void ArrowItem::mousePressEvent(QGraphicsSceneMouseEvent *event) } QList colliding = scene()->items(event->scenePos()); - for (int i = 0; i < colliding.size(); ++i) { - if (qgraphicsitem_cast(colliding[i])) { + for (QGraphicsItem *item : colliding) { + if (qgraphicsitem_cast(item)) { event->ignore(); return; } @@ -205,8 +205,8 @@ void ArrowDragItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) } update(); - for (int i = 0; i < childArrows.size(); ++i) { - childArrows[i]->mouseMoveEvent(event); + for (ArrowDragItem *child : childArrows) { + child->mouseMoveEvent(event); } } @@ -251,8 +251,9 @@ void ArrowDragItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) } delArrow(); - for (int i = 0; i < childArrows.size(); ++i) - childArrows[i]->mouseReleaseEvent(event); + for (ArrowDragItem *child : childArrows) { + child->mouseReleaseEvent(event); + } } ArrowAttachItem::ArrowAttachItem(ArrowTarget *_startItem) @@ -260,6 +261,11 @@ ArrowAttachItem::ArrowAttachItem(ArrowTarget *_startItem) { } +void ArrowAttachItem::addChildArrow(ArrowAttachItem *childArrow) +{ + childArrows.append(childArrow); +} + void ArrowAttachItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if (!startItem) @@ -295,9 +301,13 @@ void ArrowAttachItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) updatePath(); } update(); + + for (ArrowAttachItem *child : childArrows) { + child->mouseMoveEvent(event); + } } -void ArrowAttachItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * /*event*/) +void ArrowAttachItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { if (!startItem) return; @@ -319,4 +329,8 @@ void ArrowAttachItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * /*event*/) } delArrow(); + + for (ArrowAttachItem *child : childArrows) { + child->mouseReleaseEvent(event); + } } diff --git a/cockatrice/src/arrowitem.h b/cockatrice/src/arrowitem.h index d5b1c512..04d4bc20 100644 --- a/cockatrice/src/arrowitem.h +++ b/cockatrice/src/arrowitem.h @@ -85,8 +85,12 @@ protected: class ArrowAttachItem : public ArrowItem { Q_OBJECT +private: + QList childArrows; + public: ArrowAttachItem(ArrowTarget *_startItem); + void addChildArrow(ArrowAttachItem *childArrow); protected: void mouseMoveEvent(QGraphicsSceneMouseEvent *event); diff --git a/cockatrice/src/carditem.cpp b/cockatrice/src/carditem.cpp index 42b0766e..fea3166e 100644 --- a/cockatrice/src/carditem.cpp +++ b/cockatrice/src/carditem.cpp @@ -286,15 +286,36 @@ void CardItem::drawArrow(const QColor &arrowColor) scene()->addItem(arrow); arrow->grabMouse(); - QListIterator itemIterator(scene()->selectedItems()); - while (itemIterator.hasNext()) { - CardItem *c = qgraphicsitem_cast(itemIterator.next()); - if (!c || (c == this)) + for (const auto &item : scene()->selectedItems()) { + CardItem *card = qgraphicsitem_cast(item); + if (card == nullptr || card == this) continue; - if (c->getZone() != zone) + if (card->getZone() != zone) continue; - ArrowDragItem *childArrow = new ArrowDragItem(arrowOwner, c, arrowColor); + ArrowDragItem *childArrow = new ArrowDragItem(arrowOwner, card, arrowColor); + scene()->addItem(childArrow); + arrow->addChildArrow(childArrow); + } +} + +void CardItem::drawAttachArrow() +{ + if (static_cast(owner->parent())->getSpectator()) + return; + + auto *arrow = new ArrowAttachItem(this); + scene()->addItem(arrow); + arrow->grabMouse(); + + for (const auto &item : scene()->selectedItems()) { + CardItem *card = qgraphicsitem_cast(item); + if (card == nullptr) + continue; + if (card->getZone() != zone) + continue; + + ArrowAttachItem *childArrow = new ArrowAttachItem(card); scene()->addItem(childArrow); arrow->addChildArrow(childArrow); } @@ -332,19 +353,19 @@ void CardItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) createDragItem(id, event->pos(), event->scenePos(), facedown || forceFaceDown); dragItem->grabMouse(); - QList sel = scene()->selectedItems(); - int j = 0; - for (int i = 0; i < sel.size(); i++) { - CardItem *c = static_cast(sel.at(i)); - if ((c == this) || (c->getZone() != zone)) + int childIndex = 0; + for (const auto &item : scene()->selectedItems()) { + CardItem *card = static_cast(item); + if ((card == this) || (card->getZone() != zone)) continue; - ++j; + ++childIndex; QPointF childPos; if (zone->getHasCardAttr()) - childPos = c->pos() - pos(); + childPos = card->pos() - pos(); else - childPos = QPointF(j * CARD_WIDTH / 2, 0); - CardDragItem *drag = new CardDragItem(c, c->getId(), childPos, c->getFaceDown() || forceFaceDown, dragItem); + childPos = QPointF(childIndex * CARD_WIDTH / 2, 0); + CardDragItem *drag = + new CardDragItem(card, card->getId(), childPos, card->getFaceDown() || forceFaceDown, dragItem); drag->setPos(dragItem->pos() + childPos); scene()->addItem(drag); } diff --git a/cockatrice/src/carditem.h b/cockatrice/src/carditem.h index dc09d0d6..51a18714 100644 --- a/cockatrice/src/carditem.h +++ b/cockatrice/src/carditem.h @@ -157,6 +157,7 @@ public: CardDragItem *createDragItem(int _id, const QPointF &_pos, const QPointF &_scenePos, bool faceDown); void deleteDragItem(); void drawArrow(const QColor &arrowColor); + void drawAttachArrow(); void playCard(bool faceDown); protected: diff --git a/cockatrice/src/player.cpp b/cockatrice/src/player.cpp index 03c22d81..0c6fad77 100644 --- a/cockatrice/src/player.cpp +++ b/cockatrice/src/player.cpp @@ -3186,9 +3186,7 @@ void Player::actAttach() return; } - auto *arrow = new ArrowAttachItem(card); - scene()->addItem(arrow); - arrow->grabMouse(); + card->drawAttachArrow(); } void Player::actUnattach() @@ -3197,10 +3195,15 @@ void Player::actUnattach() return; } - Command_AttachCard cmd; - cmd.set_start_zone(game->getActiveCard()->getZone()->getName().toStdString()); - cmd.set_card_id(game->getActiveCard()->getId()); - sendGameCommand(cmd); + QList commandList; + for (QGraphicsItem *item : scene()->selectedItems()) { + auto *card = static_cast(item); + auto *cmd = new Command_AttachCard; + cmd->set_start_zone(card->getZone()->getName().toStdString()); + cmd->set_card_id(card->getId()); + commandList.append(cmd); + } + sendGameCommand(prepareGameCommand(commandList)); } void Player::actCardCounterTrigger()