Attach and Unattach apply to entire selection (#4651)

* (un)attach applies to entire selection

* additional code formatting, just because it's nicer

Co-authored-by: ebbit1q <ebbit1q@gmail.com>
This commit is contained in:
cajun 2022-08-25 20:26:29 -05:00 committed by GitHub
parent a2624e36f3
commit b5305aa5e4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 72 additions and 29 deletions

View file

@ -138,8 +138,8 @@ void ArrowItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
} }
QList<QGraphicsItem *> colliding = scene()->items(event->scenePos()); QList<QGraphicsItem *> colliding = scene()->items(event->scenePos());
for (int i = 0; i < colliding.size(); ++i) { for (QGraphicsItem *item : colliding) {
if (qgraphicsitem_cast<CardItem *>(colliding[i])) { if (qgraphicsitem_cast<CardItem *>(item)) {
event->ignore(); event->ignore();
return; return;
} }
@ -205,8 +205,8 @@ void ArrowDragItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
} }
update(); update();
for (int i = 0; i < childArrows.size(); ++i) { for (ArrowDragItem *child : childArrows) {
childArrows[i]->mouseMoveEvent(event); child->mouseMoveEvent(event);
} }
} }
@ -251,8 +251,9 @@ void ArrowDragItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
} }
delArrow(); delArrow();
for (int i = 0; i < childArrows.size(); ++i) for (ArrowDragItem *child : childArrows) {
childArrows[i]->mouseReleaseEvent(event); child->mouseReleaseEvent(event);
}
} }
ArrowAttachItem::ArrowAttachItem(ArrowTarget *_startItem) 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) void ArrowAttachItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{ {
if (!startItem) if (!startItem)
@ -295,9 +301,13 @@ void ArrowAttachItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
updatePath(); updatePath();
} }
update(); update();
for (ArrowAttachItem *child : childArrows) {
child->mouseMoveEvent(event);
}
} }
void ArrowAttachItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * /*event*/) void ArrowAttachItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{ {
if (!startItem) if (!startItem)
return; return;
@ -319,4 +329,8 @@ void ArrowAttachItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * /*event*/)
} }
delArrow(); delArrow();
for (ArrowAttachItem *child : childArrows) {
child->mouseReleaseEvent(event);
}
} }

View file

@ -85,8 +85,12 @@ protected:
class ArrowAttachItem : public ArrowItem class ArrowAttachItem : public ArrowItem
{ {
Q_OBJECT Q_OBJECT
private:
QList<ArrowAttachItem *> childArrows;
public: public:
ArrowAttachItem(ArrowTarget *_startItem); ArrowAttachItem(ArrowTarget *_startItem);
void addChildArrow(ArrowAttachItem *childArrow);
protected: protected:
void mouseMoveEvent(QGraphicsSceneMouseEvent *event); void mouseMoveEvent(QGraphicsSceneMouseEvent *event);

View file

@ -286,15 +286,36 @@ void CardItem::drawArrow(const QColor &arrowColor)
scene()->addItem(arrow); scene()->addItem(arrow);
arrow->grabMouse(); arrow->grabMouse();
QListIterator<QGraphicsItem *> itemIterator(scene()->selectedItems()); for (const auto &item : scene()->selectedItems()) {
while (itemIterator.hasNext()) { CardItem *card = qgraphicsitem_cast<CardItem *>(item);
CardItem *c = qgraphicsitem_cast<CardItem *>(itemIterator.next()); if (card == nullptr || card == this)
if (!c || (c == this))
continue; continue;
if (c->getZone() != zone) if (card->getZone() != zone)
continue; 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<TabGame *>(owner->parent())->getSpectator())
return;
auto *arrow = new ArrowAttachItem(this);
scene()->addItem(arrow);
arrow->grabMouse();
for (const auto &item : scene()->selectedItems()) {
CardItem *card = qgraphicsitem_cast<CardItem *>(item);
if (card == nullptr)
continue;
if (card->getZone() != zone)
continue;
ArrowAttachItem *childArrow = new ArrowAttachItem(card);
scene()->addItem(childArrow); scene()->addItem(childArrow);
arrow->addChildArrow(childArrow); arrow->addChildArrow(childArrow);
} }
@ -332,19 +353,19 @@ void CardItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
createDragItem(id, event->pos(), event->scenePos(), facedown || forceFaceDown); createDragItem(id, event->pos(), event->scenePos(), facedown || forceFaceDown);
dragItem->grabMouse(); dragItem->grabMouse();
QList<QGraphicsItem *> sel = scene()->selectedItems(); int childIndex = 0;
int j = 0; for (const auto &item : scene()->selectedItems()) {
for (int i = 0; i < sel.size(); i++) { CardItem *card = static_cast<CardItem *>(item);
CardItem *c = static_cast<CardItem *>(sel.at(i)); if ((card == this) || (card->getZone() != zone))
if ((c == this) || (c->getZone() != zone))
continue; continue;
++j; ++childIndex;
QPointF childPos; QPointF childPos;
if (zone->getHasCardAttr()) if (zone->getHasCardAttr())
childPos = c->pos() - pos(); childPos = card->pos() - pos();
else else
childPos = QPointF(j * CARD_WIDTH / 2, 0); childPos = QPointF(childIndex * CARD_WIDTH / 2, 0);
CardDragItem *drag = new CardDragItem(c, c->getId(), childPos, c->getFaceDown() || forceFaceDown, dragItem); CardDragItem *drag =
new CardDragItem(card, card->getId(), childPos, card->getFaceDown() || forceFaceDown, dragItem);
drag->setPos(dragItem->pos() + childPos); drag->setPos(dragItem->pos() + childPos);
scene()->addItem(drag); scene()->addItem(drag);
} }

View file

@ -157,6 +157,7 @@ public:
CardDragItem *createDragItem(int _id, const QPointF &_pos, const QPointF &_scenePos, bool faceDown); CardDragItem *createDragItem(int _id, const QPointF &_pos, const QPointF &_scenePos, bool faceDown);
void deleteDragItem(); void deleteDragItem();
void drawArrow(const QColor &arrowColor); void drawArrow(const QColor &arrowColor);
void drawAttachArrow();
void playCard(bool faceDown); void playCard(bool faceDown);
protected: protected:

View file

@ -3186,9 +3186,7 @@ void Player::actAttach()
return; return;
} }
auto *arrow = new ArrowAttachItem(card); card->drawAttachArrow();
scene()->addItem(arrow);
arrow->grabMouse();
} }
void Player::actUnattach() void Player::actUnattach()
@ -3197,10 +3195,15 @@ void Player::actUnattach()
return; return;
} }
Command_AttachCard cmd; QList<const ::google::protobuf::Message *> commandList;
cmd.set_start_zone(game->getActiveCard()->getZone()->getName().toStdString()); for (QGraphicsItem *item : scene()->selectedItems()) {
cmd.set_card_id(game->getActiveCard()->getId()); auto *card = static_cast<CardItem *>(item);
sendGameCommand(cmd); 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() void Player::actCardCounterTrigger()