mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-07-06 21:43:55 -07:00
Adjust to rebase.
Took 28 minutes Took 7 seconds Took 2 minutes Took 8 minutes Took 13 seconds
This commit is contained in:
parent
b4adb20a5f
commit
cbee3726c9
16 changed files with 50 additions and 48 deletions
|
|
@ -1,60 +0,0 @@
|
|||
#include "commander_tax_counter.h"
|
||||
|
||||
#include "counter_state.h"
|
||||
#include "translate_counter_name.h"
|
||||
|
||||
#include <QColor>
|
||||
#include <QFontDatabase>
|
||||
#include <QPainter>
|
||||
|
||||
static constexpr qreal CORNER_RADIUS = 4.0;
|
||||
static constexpr qreal FONT_SIZE_RATIO = 0.6;
|
||||
static constexpr int OVERLAY_ALPHA = 191;
|
||||
static const QColor OVERLAY_BG_NORMAL{40, 40, 40, OVERLAY_ALPHA};
|
||||
static const QColor OVERLAY_BG_HOVERED{70, 70, 70, OVERLAY_ALPHA};
|
||||
|
||||
CommanderTaxCounter::CommanderTaxCounter(CounterState *state, PlayerLogic *player, QGraphicsItem *parent)
|
||||
: AbstractCounter(state, player, false, false, parent), size(TaxCounterSizes::TAX_COUNTER_SIZE)
|
||||
{
|
||||
setCacheMode(DeviceCoordinateCache);
|
||||
setAcceptHoverEvents(true);
|
||||
setCursor(Qt::ArrowCursor);
|
||||
|
||||
setToolTip(tr("%1: %2").arg(TranslateCounterName::getDisplayName(getName())).arg(getValue()));
|
||||
}
|
||||
|
||||
QRectF CommanderTaxCounter::boundingRect() const
|
||||
{
|
||||
return QRectF(0, 0, size, size);
|
||||
}
|
||||
|
||||
void CommanderTaxCounter::paint(QPainter *painter,
|
||||
[[maybe_unused]] const QStyleOptionGraphicsItem *option,
|
||||
[[maybe_unused]] QWidget *widget)
|
||||
{
|
||||
painter->save();
|
||||
|
||||
QRectF rect = boundingRect().adjusted(1, 1, -1, -1);
|
||||
|
||||
QColor bgColor = hovered ? OVERLAY_BG_HOVERED : OVERLAY_BG_NORMAL;
|
||||
|
||||
painter->setPen(Qt::NoPen);
|
||||
painter->setBrush(bgColor);
|
||||
painter->drawRoundedRect(rect, CORNER_RADIUS, CORNER_RADIUS);
|
||||
|
||||
QFont f = QFontDatabase::systemFont(QFontDatabase::GeneralFont);
|
||||
f.setPixelSize(static_cast<int>(size * FONT_SIZE_RATIO));
|
||||
f.setWeight(QFont::Bold);
|
||||
painter->setFont(f);
|
||||
painter->setPen(Qt::white);
|
||||
painter->drawText(rect, Qt::AlignCenter, QString::number(value));
|
||||
|
||||
painter->restore();
|
||||
}
|
||||
|
||||
void CommanderTaxCounter::setValue(int _value)
|
||||
{
|
||||
int clampedValue = qMax(0, _value);
|
||||
AbstractCounter::setValue(clampedValue);
|
||||
setToolTip(tr("%1: %2").arg(TranslateCounterName::getDisplayName(getName())).arg(clampedValue));
|
||||
}
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
/**
|
||||
* @file commander_tax_counter.h
|
||||
* @ingroup GameGraphicsPlayers
|
||||
* @brief Square counter for commander tax, clamped to non-negative values.
|
||||
*/
|
||||
|
||||
#ifndef COCKATRICE_COMMANDER_TAX_COUNTER_H
|
||||
#define COCKATRICE_COMMANDER_TAX_COUNTER_H
|
||||
|
||||
#include "abstract_counter.h"
|
||||
|
||||
/**
|
||||
* @namespace TaxCounterSizes
|
||||
* @brief Size constants for commander tax counter layout.
|
||||
*/
|
||||
namespace TaxCounterSizes
|
||||
{
|
||||
|
||||
/** @brief Size of commander tax counter icons (width and height) */
|
||||
constexpr int TAX_COUNTER_SIZE = 24;
|
||||
|
||||
/** @brief Margin around and between tax counter icons */
|
||||
constexpr int TAX_COUNTER_MARGIN = 2;
|
||||
|
||||
} // namespace TaxCounterSizes
|
||||
|
||||
/**
|
||||
* @class CommanderTaxCounter
|
||||
* @brief Counter for tracking commander tax in Commander format.
|
||||
*
|
||||
* Displays cumulative cost increase for casting a commander. The counter
|
||||
* is manually adjusted by the player to track their commander tax. Values
|
||||
* are clamped to >= 0.
|
||||
*
|
||||
* Appearance: square with rounded corners, semi-transparent background,
|
||||
* positioned at top-left of command zone.
|
||||
*
|
||||
* Two instances per player: CounterIds::CommanderTax and CounterIds::PartnerTax.
|
||||
* Each counter supports an active/inactive state (inherited from AbstractCounter):
|
||||
* commander tax starts active; partner tax starts inactive until explicitly
|
||||
* enabled by the player via the context menu.
|
||||
*
|
||||
* @see AbstractCounter
|
||||
* @see AbstractCounter::setActive()
|
||||
* @see CounterIds
|
||||
*/
|
||||
class CommanderTaxCounter : public AbstractCounter
|
||||
{
|
||||
Q_OBJECT
|
||||
private:
|
||||
int size;
|
||||
|
||||
public:
|
||||
/**
|
||||
* @brief Constructs a CommanderTaxCounter.
|
||||
* @param state Counter state containing id, name, value, etc.
|
||||
* @param player The player who owns this counter
|
||||
* @param parent Parent graphics item (typically the command zone)
|
||||
*/
|
||||
CommanderTaxCounter(CounterState *state, PlayerLogic *player, QGraphicsItem *parent = nullptr);
|
||||
|
||||
[[nodiscard]] QRectF boundingRect() const override;
|
||||
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
|
||||
|
||||
/**
|
||||
* @brief Overrides AbstractCounter::setValue to clamp values to >= 0 and update the tooltip.
|
||||
* @param _value New value (clamped if negative)
|
||||
*/
|
||||
void setValue(int _value) override;
|
||||
};
|
||||
|
||||
#endif // COCKATRICE_COMMANDER_TAX_COUNTER_H
|
||||
|
|
@ -7,7 +7,6 @@
|
|||
#include "../../game_graphics/zones/table_zone.h"
|
||||
#include "../../interface/widgets/tabs/tab_game.h"
|
||||
#include "../../interface/widgets/utility/get_text_with_max.h"
|
||||
|
||||
#include "../zones/view_zone_logic.h"
|
||||
|
||||
#include <libcockatrice/card/database/card_database_manager.h>
|
||||
|
|
@ -1637,14 +1636,13 @@ static bool isUnwritableRevealZone(CardZoneLogic *zone)
|
|||
|
||||
void PlayerActions::playSelectedCards(QList<CardItem *> selectedCards, const bool faceDown)
|
||||
{
|
||||
playSelectedCardsImpl(faceDown, nullptr);
|
||||
playSelectedCardsImpl(selectedCards, faceDown, nullptr);
|
||||
}
|
||||
|
||||
void PlayerActions::playSelectedCardsImpl(bool faceDown,
|
||||
void PlayerActions::playSelectedCardsImpl(QList<CardItem *> selectedCards,
|
||||
bool faceDown,
|
||||
const std::function<void(CardItem *, const QString &)> &postPlayCallback)
|
||||
{
|
||||
QList<CardItem *> selectedCards = player->getGameScene()->selectedCards();
|
||||
|
||||
// CardIds will get shuffled downwards when cards leave the deck.
|
||||
// We need to iterate through the cards in reverse order so cardIds don't get changed out from under us as we play
|
||||
// out the cards one-by-one.
|
||||
|
|
@ -1662,9 +1660,9 @@ void PlayerActions::playSelectedCardsImpl(bool faceDown,
|
|||
}
|
||||
}
|
||||
|
||||
void PlayerActions::actPlayAndIncreaseTax()
|
||||
void PlayerActions::actPlayAndIncreaseTax(QList<CardItem *> selectedCards)
|
||||
{
|
||||
playSelectedCardsImpl(false, [this](CardItem * /*card*/, const QString &originalZone) {
|
||||
playSelectedCardsImpl(selectedCards, false, [this](CardItem * /*card*/, const QString &originalZone) {
|
||||
if (originalZone == ZoneNames::COMMAND) {
|
||||
AbstractCounter *ctr = player->getCounterWidget(CounterIds::CommanderTax);
|
||||
if (ctr && ctr->isActive()) {
|
||||
|
|
@ -1674,9 +1672,9 @@ void PlayerActions::actPlayAndIncreaseTax()
|
|||
});
|
||||
}
|
||||
|
||||
void PlayerActions::actPlayAndIncreasePartnerTax()
|
||||
void PlayerActions::actPlayAndIncreasePartnerTax(QList<CardItem *> selectedCards)
|
||||
{
|
||||
playSelectedCardsImpl(false, [this](CardItem * /*card*/, const QString &originalZone) {
|
||||
playSelectedCardsImpl(selectedCards, false, [this](CardItem * /*card*/, const QString &originalZone) {
|
||||
if (originalZone == ZoneNames::COMMAND) {
|
||||
AbstractCounter *ctr = player->getCounterWidget(CounterIds::PartnerTax);
|
||||
if (ctr && ctr->isActive()) {
|
||||
|
|
|
|||
|
|
@ -128,9 +128,9 @@ public slots:
|
|||
void actPlay(QList<CardItem *> selectedCards);
|
||||
void actPlayFacedown(QList<CardItem *> selectedCards);
|
||||
/** @brief Plays the selected card and increments the primary commander tax counter. */
|
||||
void actPlayAndIncreaseTax();
|
||||
void actPlayAndIncreaseTax(QList<CardItem *> selectedCards);
|
||||
/** @brief Plays the selected card and increments the partner commander tax counter. */
|
||||
void actPlayAndIncreasePartnerTax();
|
||||
void actPlayAndIncreasePartnerTax(QList<CardItem *> selectedCards);
|
||||
/** @brief Modifies a tax counter by delta if it is active. */
|
||||
void actModifyTaxCounter(int counterId, int delta);
|
||||
/** @brief Toggles a tax counter's active state (only if inactive or value is 0). */
|
||||
|
|
@ -258,10 +258,14 @@ private:
|
|||
|
||||
/**
|
||||
* @brief Shared implementation for playing selected cards with an optional post-play callback.
|
||||
* @param selectedCards
|
||||
* @param selectedCards
|
||||
* @param selectedCards
|
||||
* @param postPlayCallback Called after each card is played, receiving the card and its *original* zone name
|
||||
* (captured before playCard, since playCard sends a move command that may change the card's zone).
|
||||
*/
|
||||
void playSelectedCardsImpl(bool faceDown,
|
||||
void playSelectedCardsImpl(QList<CardItem *> selectedCards,
|
||||
bool faceDown,
|
||||
const std::function<void(CardItem *, const QString &)> &postPlayCallback = nullptr);
|
||||
|
||||
void cmdSetTopCard(Command_MoveCard &cmd);
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@
|
|||
#include "../../game_graphics/board/card_item.h"
|
||||
#include "../../game_graphics/zones/view_zone.h"
|
||||
#include "../../interface/widgets/tabs/tab_game.h"
|
||||
#include "../board/abstract_counter.h"
|
||||
#include "../board/arrow_data.h"
|
||||
#include "../board/card_list.h"
|
||||
#include "player_actions.h"
|
||||
|
|
@ -287,11 +286,12 @@ void PlayerEventHandler::eventSetCounterActive(const Event_SetCounterActive &eve
|
|||
}
|
||||
state->setActive(event.active());
|
||||
|
||||
AbstractCounter *widget = player->getGraphicsItem()->getCounterWidget(event.counter_id());
|
||||
// TODO: The counters data should emit this and the widget hook up to it. Don't reach into graphics like this.
|
||||
/*AbstractCounter *widget = player->getGraphicsItem()->getCounterWidget(event.counter_id());
|
||||
if (widget) {
|
||||
widget->setActive(event.active());
|
||||
emit player->rearrangeCounters();
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
void PlayerEventHandler::eventDelCounter(const Event_DelCounter &event)
|
||||
|
|
|
|||
|
|
@ -2,9 +2,11 @@
|
|||
|
||||
#include "../../game_graphics/board/arrow_item.h"
|
||||
#include "../../game_graphics/board/card_item.h"
|
||||
#include "../../game_graphics/board/commander_tax_counter.h"
|
||||
#include "../../game_graphics/board/counter_general.h"
|
||||
#include "../../game_graphics/game_scene.h"
|
||||
#include "../../game_graphics/player/player_target.h"
|
||||
#include "../../game_graphics/zones/command_zone.h"
|
||||
#include "../../game_graphics/zones/hand_zone.h"
|
||||
#include "../../game_graphics/zones/pile_zone.h"
|
||||
#include "../../game_graphics/zones/stack_zone.h"
|
||||
|
|
@ -12,10 +14,6 @@
|
|||
#include "../../interface/theme_manager.h"
|
||||
#include "../../interface/widgets/tabs/tab_game.h"
|
||||
#include "../board/card_list.h"
|
||||
#include "../board/commander_tax_counter.h"
|
||||
#include "../board/counter_general.h"
|
||||
#include "../game_scene.h"
|
||||
#include "../zones/command_zone.h"
|
||||
#include "player_actions.h"
|
||||
|
||||
#include <QDebug>
|
||||
|
|
@ -320,7 +318,9 @@ CounterState *PlayerLogic::getLifeCounter() const
|
|||
|
||||
AbstractCounter *PlayerLogic::getCounterWidget(int counterId) const
|
||||
{
|
||||
return graphicsItem->getCounterWidget(counterId);
|
||||
Q_UNUSED(counterId);
|
||||
return nullptr;
|
||||
// TODO: Do not reach into graphics like this return graphicsItem->getCounterWidget(counterId);
|
||||
}
|
||||
|
||||
bool PlayerLogic::clearCardsToDelete()
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
#include <libcockatrice/filters/filter_string.h>
|
||||
#include <libcockatrice/protocol/pb/card_attributes.pb.h>
|
||||
#include <libcockatrice/protocol/pb/game_event.pb.h>
|
||||
#include <libcockatrice/protocol/pb/serverinfo_card.pb.h>
|
||||
#include <libcockatrice/utility/zone_names.h>
|
||||
|
||||
inline Q_LOGGING_CATEGORY(PlayerLog, "player");
|
||||
|
|
|
|||
|
|
@ -1,176 +0,0 @@
|
|||
#include "command_zone.h"
|
||||
|
||||
#include "../../client/settings/cache_settings.h"
|
||||
#include "../../game_graphics/zones/select_zone.h"
|
||||
#include "../../interface/theme_manager.h"
|
||||
#include "../board/card_drag_item.h"
|
||||
#include "../board/card_item.h"
|
||||
#include "../board/commander_tax_counter.h"
|
||||
#include "../player/player_actions.h"
|
||||
#include "../player/player_logic.h"
|
||||
#include "../z_values.h"
|
||||
|
||||
#include <QGraphicsSceneMouseEvent>
|
||||
#include <QPainter>
|
||||
#include <libcockatrice/protocol/pb/command_move_card.pb.h>
|
||||
#include <libcockatrice/utility/counter_ids.h>
|
||||
|
||||
CommandZone::CommandZone(CommandZoneLogic *_logic, int _zoneHeight, QGraphicsItem *parent)
|
||||
: SelectZone(_logic, parent), zoneHeight(_zoneHeight)
|
||||
{
|
||||
connect(themeManager, &ThemeManager::themeChanged, this, &CommandZone::updateBg);
|
||||
updateBg();
|
||||
setCacheMode(DeviceCoordinateCache);
|
||||
setupClipContainer(ZValues::CARD_BASE);
|
||||
}
|
||||
|
||||
void CommandZone::updateBg()
|
||||
{
|
||||
update();
|
||||
}
|
||||
|
||||
QRectF CommandZone::boundingRect() const
|
||||
{
|
||||
return {0, 0, ZoneSizes::COMMAND_ZONE_WIDTH, currentHeight()};
|
||||
}
|
||||
|
||||
qreal CommandZone::currentHeight() const
|
||||
{
|
||||
return minimized ? qMax(zoneHeight * MINIMIZED_HEIGHT_RATIO, static_cast<double>(minimumHeight)) : zoneHeight;
|
||||
}
|
||||
|
||||
void CommandZone::setMinimumHeight(int height)
|
||||
{
|
||||
if (minimumHeight == height) {
|
||||
return;
|
||||
}
|
||||
minimumHeight = height;
|
||||
prepareGeometryChange();
|
||||
updateClipRect();
|
||||
reorganizeCards();
|
||||
update();
|
||||
// NOTE: Do NOT emit minimizedChanged here. The minimized STATE has not changed,
|
||||
// only the minimum height constraint. Emitting here causes an infinite loop:
|
||||
// rearrangeZones -> rearrangeCounters -> rearrangeTaxCounters -> setMinimumHeight
|
||||
// -> minimizedChanged -> rearrangeZones (loop!)
|
||||
}
|
||||
|
||||
bool CommandZone::isMinimized() const
|
||||
{
|
||||
return minimized;
|
||||
}
|
||||
|
||||
void CommandZone::toggleMinimized()
|
||||
{
|
||||
minimized = !minimized;
|
||||
|
||||
prepareGeometryChange();
|
||||
updateClipRect();
|
||||
reorganizeCards();
|
||||
update();
|
||||
|
||||
emit minimizedChanged(minimized);
|
||||
}
|
||||
|
||||
void CommandZone::paint(QPainter *painter,
|
||||
[[maybe_unused]] const QStyleOptionGraphicsItem *option,
|
||||
[[maybe_unused]] QWidget *widget)
|
||||
{
|
||||
QBrush brush = themeManager->getExtraBgBrush(ThemeManager::Command, getLogic()->getPlayer()->getZoneId());
|
||||
|
||||
QPointF scenePos = mapToScene(QPointF(0, 0));
|
||||
painter->setBrushOrigin(-scenePos);
|
||||
|
||||
painter->fillRect(boundingRect(), brush);
|
||||
}
|
||||
|
||||
void CommandZone::handleDropEvent(const QList<CardDragItem *> &dragItems,
|
||||
CardZoneLogic *startZone,
|
||||
const QPoint &dropPoint)
|
||||
{
|
||||
if (startZone == nullptr || startZone->getPlayer() == nullptr || dragItems.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
int index = calcDropIndexFromY(dropPoint.y(), MIN_CARD_VISIBLE);
|
||||
|
||||
// Same-zone no-op: don't move a card onto itself
|
||||
const auto &cards = getLogic()->getCards();
|
||||
if (!cards.isEmpty() && startZone == getLogic() && cards.at(index)->getId() == dragItems.at(0)->getId()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Command_MoveCard cmd;
|
||||
cmd.set_start_player_id(startZone->getPlayer()->getPlayerInfo()->getId());
|
||||
cmd.set_start_zone(startZone->getName().toStdString());
|
||||
cmd.set_target_player_id(getLogic()->getPlayer()->getPlayerInfo()->getId());
|
||||
cmd.set_target_zone(getLogic()->getName().toStdString());
|
||||
cmd.set_x(index);
|
||||
cmd.set_y(0);
|
||||
|
||||
for (const CardDragItem *item : dragItems) {
|
||||
if (item) {
|
||||
auto *cardToMove = cmd.mutable_cards_to_move()->add_card();
|
||||
cardToMove->set_card_id(item->getId());
|
||||
if (item->isForceFaceDown()) {
|
||||
cardToMove->set_face_down(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
getLogic()->getPlayer()->getPlayerActions()->sendGameCommand(cmd);
|
||||
}
|
||||
|
||||
void CommandZone::reorganizeCards()
|
||||
{
|
||||
restoreStaleEscapedCards();
|
||||
updateClipRect();
|
||||
|
||||
const auto &cards = getLogic()->getCards();
|
||||
if (cards.isEmpty()) {
|
||||
update();
|
||||
return;
|
||||
}
|
||||
|
||||
auto params = buildStackParams(MIN_CARD_VISIBLE);
|
||||
params.allowBottomOverflow = true;
|
||||
layoutCardsVertically(params);
|
||||
update();
|
||||
}
|
||||
|
||||
void CommandZone::rearrangeTaxCounters()
|
||||
{
|
||||
bool commandZoneVisible = isVisible();
|
||||
int activeTaxCounterCount = 0;
|
||||
|
||||
auto *graphicsItem = getLogic()->getPlayer()->getGraphicsItem();
|
||||
if (!graphicsItem) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (AbstractCounter *ctr : graphicsItem->getTaxCounterWidgets()) {
|
||||
qreal y = TaxCounterSizes::TAX_COUNTER_MARGIN +
|
||||
activeTaxCounterCount * (TaxCounterSizes::TAX_COUNTER_SIZE + TaxCounterSizes::TAX_COUNTER_MARGIN);
|
||||
ctr->setPos(TaxCounterSizes::TAX_COUNTER_MARGIN, y);
|
||||
ctr->setZValue(ZValues::TAX_COUNTERS);
|
||||
bool visible = commandZoneVisible && ctr->isActive();
|
||||
ctr->setVisible(visible);
|
||||
if (visible) {
|
||||
++activeTaxCounterCount;
|
||||
}
|
||||
}
|
||||
|
||||
int minHeight = activeTaxCounterCount * (TaxCounterSizes::TAX_COUNTER_SIZE + TaxCounterSizes::TAX_COUNTER_MARGIN) +
|
||||
TaxCounterSizes::TAX_COUNTER_MARGIN;
|
||||
setMinimumHeight(minHeight);
|
||||
}
|
||||
|
||||
void CommandZone::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
|
||||
{
|
||||
if (event->button() == Qt::LeftButton) {
|
||||
toggleMinimized();
|
||||
event->accept();
|
||||
} else {
|
||||
SelectZone::mouseDoubleClickEvent(event);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,103 +0,0 @@
|
|||
/**
|
||||
* @file command_zone.h
|
||||
* @ingroup GameGraphicsZones
|
||||
* @brief Graphics layer for the command zone, used for Commander format.
|
||||
*/
|
||||
|
||||
#ifndef COCKATRICE_COMMAND_ZONE_H
|
||||
#define COCKATRICE_COMMAND_ZONE_H
|
||||
|
||||
#include "../../game_graphics/zones/select_zone.h"
|
||||
#include "../card_dimensions.h"
|
||||
#include "command_zone_logic.h"
|
||||
|
||||
#include <QLoggingCategory>
|
||||
|
||||
inline Q_LOGGING_CATEGORY(CommandZoneLog, "command_zone");
|
||||
|
||||
/**
|
||||
* @namespace ZoneSizes
|
||||
* @brief Size constants for the command zone and its sub-elements.
|
||||
*/
|
||||
namespace ZoneSizes
|
||||
{
|
||||
|
||||
/** @brief Height of the command zone (accommodates a card plus padding) */
|
||||
constexpr qreal COMMAND_ZONE_HEIGHT = CardDimensions::HEIGHT + 8;
|
||||
|
||||
/** @brief Width of the command zone (matches stack zone) */
|
||||
constexpr qreal COMMAND_ZONE_WIDTH = CardDimensions::WIDTH_F * 1.5;
|
||||
|
||||
} // namespace ZoneSizes
|
||||
|
||||
/**
|
||||
* @class CommandZone
|
||||
* @brief Graphics layer for the command zone in Commander format games.
|
||||
*
|
||||
* Always visible when enabled. Supports multiple cards using a zigzag
|
||||
* horizontal stacking pattern: single cards display centered, multiple
|
||||
* cards alternate left-right with vertical overlap compression.
|
||||
* Can be minimized to 25% height via double-click.
|
||||
*
|
||||
* @see CommandZoneLogic for card data management
|
||||
* @see CommanderTaxCounter for the tax counter overlay
|
||||
*/
|
||||
class CommandZone : public SelectZone
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
static constexpr qreal MINIMUM_STACKING_HEIGHT = 50.0;
|
||||
|
||||
private:
|
||||
static constexpr double MINIMIZED_HEIGHT_RATIO = 0.25;
|
||||
int zoneHeight; ///< Full height in pixels when expanded
|
||||
bool minimized = false; ///< Whether zone is at 25% height
|
||||
int minimumHeight = 0; ///< Floor for minimized height (e.g. to fit tax counters)
|
||||
|
||||
public:
|
||||
/**
|
||||
* @brief Constructs a CommandZone graphics item.
|
||||
* @param _logic Logic layer managing card data
|
||||
* @param _zoneHeight Zone height in pixels
|
||||
* @param parent Parent graphics item
|
||||
*/
|
||||
CommandZone(CommandZoneLogic *_logic, int _zoneHeight, QGraphicsItem *parent);
|
||||
|
||||
/**
|
||||
* @brief Handles card drops, calculating insertion position from drop point.
|
||||
* @param dragItems Cards being dragged
|
||||
* @param startZone Source zone
|
||||
* @param dropPoint Drop position in local coordinates
|
||||
*/
|
||||
void
|
||||
handleDropEvent(const QList<CardDragItem *> &dragItems, CardZoneLogic *startZone, const QPoint &dropPoint) override;
|
||||
|
||||
/** @brief Returns the bounding rectangle, accounting for minimized state. */
|
||||
[[nodiscard]] QRectF boundingRect() const override;
|
||||
/** @brief Paints the zone background using the Commander theme brush. */
|
||||
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
|
||||
/** @brief Repositions cards using zigzag horizontal stacking with overlap compression. */
|
||||
void reorganizeCards() override;
|
||||
|
||||
/** @brief Toggles between full and 25% minimized height. */
|
||||
void toggleMinimized();
|
||||
[[nodiscard]] bool isMinimized() const;
|
||||
/** @brief Returns the current display height (full or minimized). */
|
||||
[[nodiscard]] qreal currentHeight() const;
|
||||
/** @brief Sets the minimum height floor, e.g. to ensure tax counters remain visible. */
|
||||
void setMinimumHeight(int height);
|
||||
/** @brief Lays out visible tax counters vertically in the top-left corner of the command zone. */
|
||||
void rearrangeTaxCounters();
|
||||
|
||||
signals:
|
||||
/** @brief Emitted when the zone toggles between minimized and expanded states. */
|
||||
void minimizedChanged(bool isMinimized);
|
||||
|
||||
protected:
|
||||
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override;
|
||||
|
||||
private slots:
|
||||
void updateBg();
|
||||
};
|
||||
|
||||
#endif // COCKATRICE_COMMAND_ZONE_H
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
#include "command_zone_logic.h"
|
||||
|
||||
#include "../board/card_item.h"
|
||||
#include "../../game_graphics/board/card_item.h"
|
||||
#include "card_zone_algorithms.h"
|
||||
|
||||
CommandZoneLogic::CommandZoneLogic(PlayerLogic *_player,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue