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:
parent
a2624e36f3
commit
b5305aa5e4
5 changed files with 72 additions and 29 deletions
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in a new issue