/** * @file table_zone.h * @ingroup GameGraphicsZones * @brief TODO: Document this. */ #ifndef TABLEZONE_H #define TABLEZONE_H #include "../../game/board/abstract_card_item.h" #include "../../game/zones/table_zone_logic.h" #include "select_zone.h" /* * TableZone is the grid based rect where CardItems may be placed. * It is the main play zone and can be customized with background images. * * TODO: Refactor methods to make more readable, extract some logic to * private methods (Im looking at you TableZone::reorganizeCards()) */ class TableZone : public SelectZone { Q_OBJECT signals: void sizeChanged(); private: static const int TABLEROWS = 3; /* Margins between table edges and cards, paddings between cards */ static const int MARGIN_LEFT = 20; static const int MARGIN_RIGHT = 15; static const int MARGIN_TOP = 10; static const int MARGIN_BOTTOM = 30; static const int PADDING_X = 35; static const int PADDING_Y = 30; /* Minimum width of the table zone including margins. */ static const int MIN_WIDTH = MARGIN_LEFT + (5 * CardDimensions::WIDTH) + MARGIN_RIGHT; /* Offset sizes when cards are stacked on each other in the grid */ static const int STACKED_CARD_OFFSET_X = CardDimensions::WIDTH / 3; static const int STACKED_CARD_OFFSET_Y = PADDING_Y / 3; /* Width of the box line drawn in the margin around the active player's area */ static const int BOX_LINE_WIDTH = 10; /* Default inactive mask and border gradient */ static const QColor BACKGROUND_COLOR; static const QColor FADE_MASK; static const QColor GRADIENT_COLOR; static const QColor GRADIENT_COLORLESS; /* Size and shape variables */ int width; int height; int currentMinimumWidth; /* Internal cache for widths of stacks of cards by row and column. */ QMap cardStackWidth; /* Holds any custom background image for the TableZone */ QPixmap backgroundPixelMap; /* If this TableZone is currently active */ bool active = false; [[nodiscard]] bool isInverted() const; private slots: /** Loads in any found custom background and updates */ void updateBg(); public slots: /** Reorganizes CardItems in the TableZone */ void reorganizeCards() override; public: /** Constructs TableZone. @param _p the Player @param parent defaults to null */ explicit TableZone(TableZoneLogic *_logic, QGraphicsItem *parent = nullptr); /** @return a QRectF of the TableZone bounding box. */ [[nodiscard]] QRectF boundingRect() const override; /** Render the TableZone @param painter @param option */ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; /** Toggles the selected items as tapped. */ void toggleTapped(); /** See HandleDropEventByGrid */ void handleDropEvent(const QList &dragItems, CardZoneLogic *startZone, const QPoint &dropPoint) override; /** Handles the placement of cards */ void handleDropEventByGrid(const QList &dragItems, CardZoneLogic *startZone, const QPoint &gridPoint); /** @return CardItem from grid location */ [[nodiscard]] CardItem *getCardFromGrid(const QPoint &gridPoint) const; /** @return CardItem from coordinate location */ [[nodiscard]] CardItem *getCardFromCoords(const QPointF &point) const; QPointF closestGridPoint(const QPointF &point) override; static int clampValidTableRow(const int row); /** * Converts a card's logical table row (0=creatures, 1=noncreatures, 2=lands) * to the corresponding grid Y coordinate. Cards with tableRow > 2 (e.g., * instants/sorceries) default to the noncreatures row. */ static int tableRowToGridY(int tableRow); /** Resizes the TableZone in case CardItems are within or outside of the TableZone constraints. */ void resizeToContents(); [[nodiscard]] int getMinimumWidth() const { return currentMinimumWidth; } void setWidth(qreal _width) { prepareGeometryChange(); width = _width; } [[nodiscard]] qreal getWidth() const { return width; } void setActive(bool _active) { active = _active; update(); } private: void paintZoneOutline(QPainter *painter); void paintLandDivider(QPainter *painter); /* Calculates card stack widths so mapping functions work properly */ void computeCardStackWidths(); /* Mapping functions for points to/from gridpoints. */ [[nodiscard]] QPointF mapFromGrid(QPoint gridPoint) const; [[nodiscard]] QPoint mapToGrid(const QPointF &mapPoint) const; /* Helper function to create a single key from a card stack location. */ [[nodiscard]] int getCardStackMapKey(int x, int y) const { return x + (y * 1000); } }; #endif