mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-09-27 08:24:39 -07:00
Some checks are pending
Build Desktop / Configure (push) Waiting to run
Build Desktop / Debian 13 (push) Blocked by required conditions
Build Desktop / Debian 12 (push) Blocked by required conditions
Build Desktop / Fedora 44 (push) Blocked by required conditions
Build Desktop / Fedora 43 (push) Blocked by required conditions
Build Desktop / Servatrice_Debian 12 (push) Blocked by required conditions
Build Desktop / Ubuntu 26.04 (push) Blocked by required conditions
Build Desktop / Ubuntu 24.04 (push) Blocked by required conditions
Build Desktop / Arch (push) Blocked by required conditions
Build Desktop / macOS 14 (push) Blocked by required conditions
Build Desktop / macOS 15 (push) Blocked by required conditions
Build Desktop / macOS 13 Intel (push) Blocked by required conditions
Build Desktop / macOS 15 Debug (push) Blocked by required conditions
Build Desktop / Windows 10 (push) Blocked by required conditions
Build Docker Image / amd64 & arm64 (push) Waiting to run
* Introduce generic IAnimatedItem interface for scene animations GameScene's shared 10ms animation timer previously only knew about CardItems (cardsToAnimate). Generalize it so any scene item can tick on the shared timer instead of owning its own QTimer: - New IAnimatedItem interface with a single animationEvent() tick. - GameScene tracks animated items in a QHash keyed by QObject and auto-unregisters items when they are destroyed, so an item deleted mid-animation (concede, removePlayer, deleteLater) can never leave a dangling pointer in the set. - GameScene::~GameScene disconnects incoming connections before the animation timer is deleted; all timer stops are null-guarded so destruction ordering no longer matters. - AbstractCardItem implements IAnimatedItem with a no-op tick so the existing tap-animation registration path keeps working; CardItem overrides it with the real rotate animation. Took 5 minutes * Add Enable/Disable all animations buttons to settings The animation settings group gets two push buttons that toggle every per-effect animation checkbox at once. The base branch carries the buttons and the shared slots; per-effect toggles (life counter, battlefield, arrow draw) are added by the feature branches on top. --------- Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
141 lines
3.6 KiB
C++
141 lines
3.6 KiB
C++
/**
|
|
* @file abstract_card_item.h
|
|
* @ingroup GameGraphicsCards
|
|
* @brief Base class for graphical card items, providing shared rendering, identity, and interaction logic.
|
|
*/
|
|
|
|
#ifndef ABSTRACTCARDITEM_H
|
|
#define ABSTRACTCARDITEM_H
|
|
|
|
#include "../animated_item.h"
|
|
#include "../card_dimensions.h"
|
|
#include "arrow_target.h"
|
|
#include "graphics_item_type.h"
|
|
|
|
#include <libcockatrice/card/printing/exact_card.h>
|
|
#include <libcockatrice/utility/card_ref.h>
|
|
|
|
class PlayerLogic;
|
|
|
|
class AbstractCardItem : public ArrowTarget, public IAnimatedItem
|
|
{
|
|
Q_OBJECT
|
|
protected:
|
|
ExactCard exactCard;
|
|
int id;
|
|
CardRef cardRef;
|
|
bool tapped;
|
|
bool facedown;
|
|
int tapAngle;
|
|
QString color;
|
|
QColor bgColor;
|
|
|
|
private:
|
|
bool isHovered;
|
|
qreal realZValue;
|
|
private slots:
|
|
void pixmapUpdated();
|
|
|
|
public slots:
|
|
void refreshCardInfo();
|
|
|
|
signals:
|
|
void hovered(AbstractCardItem *card);
|
|
void showCardInfoPopup(const QPoint &pos, const CardRef &cardRef);
|
|
void deleteCardInfoPopup(QString cardName);
|
|
void sigPixmapUpdated();
|
|
void cardShiftClicked(QString cardName);
|
|
void rightClicked(AbstractCardItem *card, QPoint screenPos);
|
|
void playSelected(AbstractCardItem *card);
|
|
void playSelectedFaceDown(AbstractCardItem *card);
|
|
void hideSelected(AbstractCardItem *card);
|
|
void selectionChanged(AbstractCardItem *card, bool selected);
|
|
|
|
public:
|
|
enum
|
|
{
|
|
Type = typeCard
|
|
};
|
|
int type() const override
|
|
{
|
|
return Type;
|
|
}
|
|
explicit AbstractCardItem(QGraphicsItem *parent = nullptr,
|
|
const CardRef &cardRef = {},
|
|
PlayerLogic *_owner = nullptr,
|
|
int _id = -1);
|
|
~AbstractCardItem() override;
|
|
QRectF boundingRect() const override;
|
|
QPainterPath shape() const override;
|
|
QSizeF getTranslatedSize(QPainter *painter) const;
|
|
void paintPicture(QPainter *painter, const QSizeF &translatedSize, int angle);
|
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
|
|
ExactCard getCard() const
|
|
{
|
|
return exactCard;
|
|
}
|
|
const CardInfo &getCardInfo() const;
|
|
int getId() const
|
|
{
|
|
return id;
|
|
}
|
|
void setId(int _id)
|
|
{
|
|
id = _id;
|
|
}
|
|
QString getName() const
|
|
{
|
|
return cardRef.name;
|
|
}
|
|
QString getProviderId() const
|
|
{
|
|
return cardRef.providerId;
|
|
}
|
|
void setCardRef(const CardRef &_cardRef);
|
|
CardRef getCardRef() const
|
|
{
|
|
return cardRef;
|
|
}
|
|
qreal getRealZValue() const
|
|
{
|
|
return realZValue;
|
|
}
|
|
void setRealZValue(qreal _zValue);
|
|
void setHovered(bool _hovered);
|
|
bool getIsHovered() const
|
|
{
|
|
return isHovered;
|
|
}
|
|
QString getColor() const
|
|
{
|
|
return color;
|
|
}
|
|
void setColor(const QString &_color);
|
|
bool getTapped() const
|
|
{
|
|
return tapped;
|
|
}
|
|
void setTapped(bool _tapped, bool canAnimate = false);
|
|
bool getFaceDown() const
|
|
{
|
|
return facedown;
|
|
}
|
|
void setFaceDown(bool _facedown);
|
|
void processHoverEvent();
|
|
void deleteCardInfoPopup()
|
|
{
|
|
emit deleteCardInfoPopup(cardRef.name);
|
|
}
|
|
|
|
/** @brief Default: no per-tick animation. Subclasses override to animate. */
|
|
bool animationEvent() override;
|
|
|
|
protected:
|
|
void transformPainter(QPainter *painter, const QSizeF &translatedSize, int angle);
|
|
void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
|
|
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
|
|
QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) override;
|
|
void cacheBgColor();
|
|
};
|
|
|
|
#endif
|