diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt
index c2dd3b5e0..ca16d3d15 100644
--- a/cockatrice/CMakeLists.txt
+++ b/cockatrice/CMakeLists.txt
@@ -82,6 +82,9 @@ set(cockatrice_SOURCES
src/utility/logger.cpp
src/client/ui/widgets/cards/card_info_picture_enlarged_widget.cpp
src/client/ui/widgets/cards/card_info_picture_with_text_overlay_widget.cpp
+ src/client/ui/widgets/cards/additional_info/color_identity_widget.cpp
+ src/client/ui/widgets/cards/additional_info/mana_cost_widget.cpp
+ src/client/ui/widgets/cards/additional_info/mana_symbol_widget.cpp
src/client/ui/widgets/general/display/banner_widget.cpp
src/client/ui/widgets/general/display/labeled_input.cpp
src/client/ui/widgets/general/display/dynamic_font_size_label.cpp
@@ -182,7 +185,6 @@ set(cockatrice_SOURCES
src/client/menus/deck_editor/deck_editor_menu.cpp
src/client/tabs/visual_deck_storage/tab_deck_storage_visual.cpp
src/client/ui/widgets/cards/deck_preview_card_picture_widget.cpp
- src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_widget.cpp
src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_filter_widget.cpp
src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_tag_addition_widget.cpp
src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_tag_display_widget.cpp
diff --git a/cockatrice/cockatrice.qrc b/cockatrice/cockatrice.qrc
index 38c40561f..f88cf83d3 100644
--- a/cockatrice/cockatrice.qrc
+++ b/cockatrice/cockatrice.qrc
@@ -40,11 +40,70 @@
resources/icons/update.png
resources/icons/view.svg
+ resources/icons/mana/0.svg
+ resources/icons/mana/1.svg
+ resources/icons/mana/2.svg
+ resources/icons/mana/3.svg
+ resources/icons/mana/4.svg
+ resources/icons/mana/5.svg
+ resources/icons/mana/6.svg
+ resources/icons/mana/7.svg
+ resources/icons/mana/8.svg
+ resources/icons/mana/9.svg
+ resources/icons/mana/10.svg
+ resources/icons/mana/11.svg
+ resources/icons/mana/12.svg
+ resources/icons/mana/13.svg
+ resources/icons/mana/14.svg
+ resources/icons/mana/15.svg
+ resources/icons/mana/16.svg
+ resources/icons/mana/17.svg
+ resources/icons/mana/18.svg
+ resources/icons/mana/19.svg
+ resources/icons/mana/20.svg
+ resources/icons/mana/2B.svg
+ resources/icons/mana/2G.svg
+ resources/icons/mana/2R.svg
+ resources/icons/mana/2U.svg
+ resources/icons/mana/2W.svg
resources/icons/mana/B.svg
+ resources/icons/mana/BG.svg
+ resources/icons/mana/BGP.svg
+ resources/icons/mana/BP.svg
+ resources/icons/mana/BR.svg
+ resources/icons/mana/BRP.svg
+ resources/icons/mana/C.svg
+ resources/icons/mana/CB.svg
+ resources/icons/mana/CG.svg
+ resources/icons/mana/CR.svg
+ resources/icons/mana/CU.svg
+ resources/icons/mana/CW.svg
resources/icons/mana/G.svg
+ resources/icons/mana/GP.svg
+ resources/icons/mana/GU.svg
+ resources/icons/mana/GUP.svg
+ resources/icons/mana/GW.svg
+ resources/icons/mana/GWP.svg
resources/icons/mana/R.svg
+ resources/icons/mana/RG.svg
+ resources/icons/mana/RGP.svg
+ resources/icons/mana/RP.svg
+ resources/icons/mana/RW.svg
+ resources/icons/mana/RWP.svg
+ resources/icons/mana/S.svg
resources/icons/mana/U.svg
+ resources/icons/mana/UB.svg
+ resources/icons/mana/UBP.svg
+ resources/icons/mana/UP.svg
+ resources/icons/mana/UR.svg
+ resources/icons/mana/URP.svg
resources/icons/mana/W.svg
+ resources/icons/mana/WB.svg
+ resources/icons/mana/WBP.svg
+ resources/icons/mana/WP.svg
+ resources/icons/mana/WU.svg
+ resources/icons/mana/WUP.svg
+ resources/icons/mana/X.svg
resources/config/general.svg
resources/config/appearance.svg
diff --git a/cockatrice/src/client/ui/widgets/cards/additional_info/color_identity_widget.cpp b/cockatrice/src/client/ui/widgets/cards/additional_info/color_identity_widget.cpp
new file mode 100644
index 000000000..4ba0ab76b
--- /dev/null
+++ b/cockatrice/src/client/ui/widgets/cards/additional_info/color_identity_widget.cpp
@@ -0,0 +1,92 @@
+#include "color_identity_widget.h"
+
+#include "mana_symbol_widget.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+ColorIdentityWidget::ColorIdentityWidget(QWidget *parent, CardInfoPtr _card) : QWidget(parent), card(_card)
+{
+ layout = new QHBoxLayout(this);
+ layout->setSpacing(5); // Small spacing between icons
+ layout->setContentsMargins(0, 0, 0, 0);
+ layout->setAlignment(Qt::AlignCenter); // Ensure icons are centered
+ setLayout(layout);
+
+ if (card) {
+ QString manaCost = card->getColors(); // Get mana cost string
+ QStringList symbols = parseColorIdentity(manaCost); // Parse mana cost string
+
+ for (const QString &symbol : symbols) {
+ ManaSymbolWidget *manaSymbol = new ManaSymbolWidget(this, symbol, true);
+ layout->addWidget(manaSymbol);
+ }
+ }
+}
+
+ColorIdentityWidget::ColorIdentityWidget(QWidget *parent, QString manaCost) : QWidget(parent), card(nullptr)
+{
+ layout = new QHBoxLayout(this);
+ layout->setSpacing(5); // Small spacing between icons
+ layout->setContentsMargins(0, 0, 0, 0);
+ layout->setAlignment(Qt::AlignCenter); // Ensure icons are centered
+ setLayout(layout);
+
+ QStringList symbols = parseColorIdentity(manaCost); // Parse mana cost string
+
+ for (const QString &symbol : symbols) {
+ ManaSymbolWidget *manaSymbol = new ManaSymbolWidget(this, symbol);
+ layout->addWidget(manaSymbol);
+ }
+}
+
+void ColorIdentityWidget::resizeEvent(QResizeEvent *event)
+{
+ QWidget::resizeEvent(event);
+ QList manaSymbols = findChildren();
+
+ if (!manaSymbols.isEmpty()) {
+ int totalWidth = event->size().width();
+ int totalHeight = totalWidth / 6; // Set height to 1/4 of the width
+ setFixedHeight(totalHeight);
+
+ int spacing = layout->spacing();
+ int count = manaSymbols.size();
+ int availableWidth = totalWidth - (spacing * (count - 1));
+ int iconSize = qMin(availableWidth / count, totalHeight); // Ensure icons fit within the new height
+
+ for (ManaSymbolWidget *manaSymbol : manaSymbols) {
+ manaSymbol->setFixedSize(iconSize, iconSize);
+ }
+ }
+}
+
+QStringList ColorIdentityWidget::parseColorIdentity(const QString &cmc)
+{
+ QStringList symbols;
+
+ // Handle split costs (e.g., "3U // 4UU")
+ QStringList splitCosts = cmc.split(" // ");
+ for (const QString &part : splitCosts) {
+ QRegularExpression regex(R"(\{([^}]+)\}|(\d+)|([WUBRGCSPX]))");
+ QRegularExpressionMatchIterator matches = regex.globalMatch(part);
+ while (matches.hasNext()) {
+ QRegularExpressionMatch match = matches.next();
+ if (match.captured(1).isEmpty()) { // If no `{}` group was captured, check other groups
+ if (!match.captured(2).isEmpty()) {
+ symbols.append(match.captured(2)); // Number match
+ } else {
+ symbols.append(match.captured(3)); // Single mana letter match
+ }
+ } else {
+ symbols.append(match.captured(1)); // `{}` enclosed match
+ }
+ }
+ }
+
+ return symbols;
+}
diff --git a/cockatrice/src/client/ui/widgets/cards/additional_info/color_identity_widget.h b/cockatrice/src/client/ui/widgets/cards/additional_info/color_identity_widget.h
new file mode 100644
index 000000000..1e81e7c26
--- /dev/null
+++ b/cockatrice/src/client/ui/widgets/cards/additional_info/color_identity_widget.h
@@ -0,0 +1,25 @@
+#ifndef COLOR_IDENTITY_WIDGET_H
+#define COLOR_IDENTITY_WIDGET_H
+
+#include "../../../../../game/cards/card_database.h"
+
+#include
+#include
+
+class ColorIdentityWidget : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit ColorIdentityWidget(QWidget *parent, CardInfoPtr card);
+ explicit ColorIdentityWidget(QWidget *parent, QString manaCost);
+
+ QStringList parseColorIdentity(const QString &manaString);
+public slots:
+ void resizeEvent(QResizeEvent *event) override;
+
+private:
+ CardInfoPtr card;
+ QHBoxLayout *layout;
+};
+
+#endif // COLOR_IDENTITY_WIDGET_H
diff --git a/cockatrice/src/client/ui/widgets/cards/additional_info/mana_cost_widget.cpp b/cockatrice/src/client/ui/widgets/cards/additional_info/mana_cost_widget.cpp
new file mode 100644
index 000000000..cfab4d8b2
--- /dev/null
+++ b/cockatrice/src/client/ui/widgets/cards/additional_info/mana_cost_widget.cpp
@@ -0,0 +1,79 @@
+#include "mana_cost_widget.h"
+
+#include "mana_symbol_widget.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+ManaCostWidget::ManaCostWidget(QWidget *parent, CardInfoPtr _card) : QWidget(parent), card(_card)
+{
+ layout = new QHBoxLayout(this);
+ layout->setSpacing(5); // Small spacing between icons
+ layout->setContentsMargins(0, 0, 0, 0);
+ setLayout(layout);
+
+ setFixedHeight(50); // Fixed height
+
+ if (card) {
+ QString manaCost = card->getManaCost(); // Get mana cost string
+ QStringList symbols = parseManaCost(manaCost); // Parse mana cost string
+
+ for (const QString &symbol : symbols) {
+ ManaSymbolWidget *manaSymbol = new ManaSymbolWidget(this, symbol, true, false);
+ layout->addWidget(manaSymbol);
+ }
+ }
+
+ // Set minimum width based on number of icons
+ // setMinimumWidth(symbols.size() * 50 + (symbols.size() - 1) * 5);
+}
+
+void ManaCostWidget::resizeEvent(QResizeEvent *event)
+{
+ QWidget::resizeEvent(event);
+ QList manaSymbols = findChildren();
+
+ if (!manaSymbols.isEmpty()) {
+ int totalWidth = event->size().width();
+ int spacing = layout->spacing();
+ int count = manaSymbols.size();
+
+ // Available width minus total spacing
+ int availableWidth = totalWidth - (spacing * (count - 1));
+ int iconSize = qMin(50, availableWidth / count);
+
+ for (ManaSymbolWidget *manaSymbol : manaSymbols) {
+ manaSymbol->setFixedSize(iconSize, iconSize);
+ }
+ }
+}
+
+QStringList ManaCostWidget::parseManaCost(const QString &cmc)
+{
+ QStringList symbols;
+
+ // Handle split costs (e.g., "3U // 4UU")
+ QStringList splitCosts = cmc.split(" // ");
+ for (const QString &part : splitCosts) {
+ QRegularExpression regex(R"(\{([^}]+)\}|(\d+)|([WUBRGCSPX]))");
+ QRegularExpressionMatchIterator matches = regex.globalMatch(part);
+ while (matches.hasNext()) {
+ QRegularExpressionMatch match = matches.next();
+ if (match.captured(1).isEmpty()) { // If no `{}` group was captured, check other groups
+ if (!match.captured(2).isEmpty()) {
+ symbols.append(match.captured(2)); // Number match
+ } else {
+ symbols.append(match.captured(3)); // Single mana letter match
+ }
+ } else {
+ symbols.append(match.captured(1)); // `{}` enclosed match
+ }
+ }
+ }
+
+ return symbols;
+}
diff --git a/cockatrice/src/client/ui/widgets/cards/additional_info/mana_cost_widget.h b/cockatrice/src/client/ui/widgets/cards/additional_info/mana_cost_widget.h
new file mode 100644
index 000000000..0872183f3
--- /dev/null
+++ b/cockatrice/src/client/ui/widgets/cards/additional_info/mana_cost_widget.h
@@ -0,0 +1,24 @@
+#ifndef MANA_COST_WIDGET_H
+#define MANA_COST_WIDGET_H
+
+#include "../../../../../game/cards/card_database.h"
+
+#include
+#include
+
+class ManaCostWidget : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit ManaCostWidget(QWidget *parent, CardInfoPtr card);
+
+ QStringList parseManaCost(const QString &manaString);
+public slots:
+ void resizeEvent(QResizeEvent *event) override;
+
+private:
+ CardInfoPtr card;
+ QHBoxLayout *layout;
+};
+
+#endif // MANA_COST_WIDGET_H
diff --git a/cockatrice/src/client/ui/widgets/cards/additional_info/mana_symbol_widget.cpp b/cockatrice/src/client/ui/widgets/cards/additional_info/mana_symbol_widget.cpp
new file mode 100644
index 000000000..578374490
--- /dev/null
+++ b/cockatrice/src/client/ui/widgets/cards/additional_info/mana_symbol_widget.cpp
@@ -0,0 +1,70 @@
+#include "mana_symbol_widget.h"
+
+#include
+
+ManaSymbolWidget::ManaSymbolWidget(QWidget *parent, QString _symbol, bool _isActive, bool _mayBeToggled)
+ : QLabel(parent), symbol(_symbol), isActive(_isActive), mayBeToggled(_mayBeToggled)
+{
+ loadManaIcon();
+ setPixmap(manaIcon.scaled(50, 50, Qt::KeepAspectRatio, Qt::SmoothTransformation));
+ setMaximumWidth(50);
+
+ // Initialize opacity effect
+ opacityEffect = new QGraphicsOpacityEffect(this);
+ setGraphicsEffect(opacityEffect);
+ updateOpacity();
+}
+
+void ManaSymbolWidget::setColorActive(bool active)
+{
+ if (isActive != active) {
+ isActive = active;
+ updateOpacity();
+ emit colorToggled(getSymbolChar(), isActive);
+ }
+}
+
+void ManaSymbolWidget::updateOpacity()
+{
+ qreal opacity = isActive ? 1.0 : 0.5;
+ opacityEffect->setOpacity(opacity);
+}
+
+void ManaSymbolWidget::mousePressEvent(QMouseEvent *event)
+{
+ Q_UNUSED(event);
+ if (mayBeToggled) {
+ isActive = !isActive;
+ updateOpacity();
+ emit colorToggled(getSymbolChar(), isActive);
+ }
+}
+
+void ManaSymbolWidget::resizeEvent(QResizeEvent *event)
+{
+ QLabel::resizeEvent(event);
+ setPixmap(manaIcon.scaled(event->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
+}
+
+void ManaSymbolWidget::loadManaIcon()
+{
+ qDebug() << "Symbol: " << symbol;
+ QString filename = "theme:icons/mana/";
+
+ if (symbol == "W" || symbol == "U" || symbol == "B" || symbol == "R" || symbol == "G" || symbol == "C" ||
+ symbol == "S" || symbol == "X") {
+ filename += symbol + ".svg";
+ } else if (symbol.toInt() >= 0 && symbol.toInt() <= 20) {
+ filename += symbol + ".svg"; // Handle generic mana costs
+ qDebug() << "ManaIcon: " << filename;
+ } else if (symbol.contains('/')) {
+ QString cleanSymbol = symbol;
+ cleanSymbol.remove('{').remove('}').remove('/'); // Clean up hybrid & Phyrexian mana
+ filename += cleanSymbol + ".svg";
+ } else {
+ qDebug() << "ManaIcon: " << symbol << " was not a number.";
+ filename += symbol + ".svg"; // Fallback
+ }
+
+ manaIcon = QPixmap(filename);
+}
diff --git a/cockatrice/src/client/ui/widgets/cards/additional_info/mana_symbol_widget.h b/cockatrice/src/client/ui/widgets/cards/additional_info/mana_symbol_widget.h
new file mode 100644
index 000000000..6ecf54b34
--- /dev/null
+++ b/cockatrice/src/client/ui/widgets/cards/additional_info/mana_symbol_widget.h
@@ -0,0 +1,43 @@
+#ifndef MANA_SYMBOL_WIDGET_H
+#define MANA_SYMBOL_WIDGET_H
+
+#include
+#include
+
+class ManaSymbolWidget : public QLabel
+{
+
+ Q_OBJECT
+
+public:
+ ManaSymbolWidget(QWidget *parent, QString symbol, bool isActive = true, bool mayBeToggled = false);
+ void setColorActive(bool active);
+ void updateOpacity();
+ bool isColorActive() const;
+ QString getSymbol() const
+ {
+ return symbol;
+ };
+ QChar getSymbolChar() const
+ {
+ return symbol[0];
+ };
+
+ void loadManaIcon();
+
+public slots:
+ void resizeEvent(QResizeEvent *event) override;
+ void mousePressEvent(QMouseEvent *event) override;
+
+signals:
+ void colorToggled(QChar symbol, bool isActive);
+
+private:
+ QString symbol;
+ QPixmap manaIcon;
+ bool isActive;
+ bool mayBeToggled;
+ QGraphicsOpacityEffect *opacityEffect;
+};
+
+#endif // MANA_SYMBOL_WIDGET_H
diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_filter_widget.cpp b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_filter_widget.cpp
index d854e1588..d30d83aa7 100644
--- a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_filter_widget.cpp
+++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_filter_widget.cpp
@@ -1,89 +1,11 @@
#include "deck_preview_color_identity_filter_widget.h"
+#include "../../cards/additional_info/mana_symbol_widget.h"
#include "deck_preview_widget.h"
#include
#include
-DeckPreviewColorIdentityFilterCircleWidget::DeckPreviewColorIdentityFilterCircleWidget(QChar color, QWidget *parent)
- : QWidget(parent), colorChar(color), isActive(false), circleDiameter(30)
-{
- setFixedSize(circleDiameter, circleDiameter);
-}
-
-void DeckPreviewColorIdentityFilterCircleWidget::setColorActive(bool active)
-{
- if (isActive != active) {
- isActive = active;
- update();
- }
-}
-
-bool DeckPreviewColorIdentityFilterCircleWidget::isColorActive() const
-{
- return isActive;
-}
-
-QChar DeckPreviewColorIdentityFilterCircleWidget::getColorChar() const
-{
- return colorChar;
-}
-
-void DeckPreviewColorIdentityFilterCircleWidget::paintEvent(QPaintEvent *event)
-{
- Q_UNUSED(event);
-
- QPainter painter(this);
- painter.setRenderHint(QPainter::Antialiasing);
-
- QColor circleColor;
- switch (colorChar.unicode()) {
- case 'W':
- circleColor = Qt::white;
- break;
- case 'U':
- circleColor = QColor(0, 115, 230);
- break;
- case 'B':
- circleColor = QColor(50, 50, 50);
- break;
- case 'R':
- circleColor = QColor(230, 30, 30);
- break;
- case 'G':
- circleColor = QColor(30, 180, 30);
- break;
- default:
- circleColor = Qt::transparent;
- break;
- }
-
- if (!isActive) {
- circleColor.setAlpha(100); // Dim inactive circles
- }
-
- painter.setBrush(circleColor);
- painter.setPen(Qt::black);
- painter.drawEllipse(rect());
-
- if (isActive) {
- QFont font = painter.font();
- font.setBold(true);
- font.setPointSize(circleDiameter / 3);
- painter.setFont(font);
- painter.setPen(colorChar.unicode() == 'B' ? Qt::white : Qt::black);
- painter.drawText(rect(), Qt::AlignCenter, colorChar);
- }
-}
-
-void DeckPreviewColorIdentityFilterCircleWidget::mousePressEvent(QMouseEvent *event)
-{
- Q_UNUSED(event);
- isActive = !isActive;
- emit colorToggled(colorChar, isActive);
- update();
-}
-
DeckPreviewColorIdentityFilterWidget::DeckPreviewColorIdentityFilterWidget(VisualDeckStorageWidget *parent)
: QWidget(parent), layout(new QHBoxLayout(this))
{
@@ -93,7 +15,9 @@ DeckPreviewColorIdentityFilterWidget::DeckPreviewColorIdentityFilterWidget(Visua
QString fullColorIdentity = "WUBRG";
for (const QChar &color : fullColorIdentity) {
- auto *circle = new DeckPreviewColorIdentityFilterCircleWidget(color, this);
+ // auto *circle = new DeckPreviewColorIdentityFilterCircleWidget(color, this);
+ auto *circle = new ManaSymbolWidget(this, color, false, true);
+ circle->setMaximumWidth(25);
layout->addWidget(circle);
@@ -101,7 +25,7 @@ DeckPreviewColorIdentityFilterWidget::DeckPreviewColorIdentityFilterWidget(Visua
activeColors[color] = false;
// Connect the color toggled signal
- connect(circle, &DeckPreviewColorIdentityFilterCircleWidget::colorToggled, this,
+ connect(circle, &ManaSymbolWidget::colorToggled, this,
&DeckPreviewColorIdentityFilterWidget::handleColorToggled);
}
diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_filter_widget.h b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_filter_widget.h
index 3c9bdb70c..415d946cd 100644
--- a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_filter_widget.h
+++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_filter_widget.h
@@ -12,29 +12,6 @@
class DeckPreviewWidget;
class VisualDeckStorageWidget;
-class DeckPreviewColorIdentityFilterCircleWidget : public QWidget
-{
- Q_OBJECT
-
-public:
- explicit DeckPreviewColorIdentityFilterCircleWidget(QChar color, QWidget *parent = nullptr);
- void setColorActive(bool active);
- bool isColorActive() const;
- QChar getColorChar() const;
-
-protected:
- void paintEvent(QPaintEvent *event) override;
- void mousePressEvent(QMouseEvent *event) override;
-
-signals:
- void colorToggled(QChar color, bool active);
-
-private:
- QChar colorChar;
- bool isActive;
- int circleDiameter;
-};
-
class DeckPreviewColorIdentityFilterWidget : public QWidget
{
Q_OBJECT
diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_widget.cpp b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_widget.cpp
deleted file mode 100644
index 684cef329..000000000
--- a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_widget.cpp
+++ /dev/null
@@ -1,176 +0,0 @@
-#include "deck_preview_color_identity_widget.h"
-
-#include "../../../../../settings/cache_settings.h"
-
-#include
-#include
-
-DeckPreviewColorCircleWidget::DeckPreviewColorCircleWidget(QChar color, QWidget *parent)
- : QWidget(parent), colorChar(color), circleDiameter(0), isActive(false)
-{
-}
-
-void DeckPreviewColorCircleWidget::resizeEvent(QResizeEvent *event)
-{
- Q_UNUSED(event);
-
- // Get the parent of the DeckPreviewColorIdentityWidget
- QWidget *identityParent = parentWidget() ? parentWidget()->parentWidget() : nullptr;
- if (identityParent) {
- // Calculate the circle diameter as 15% of the parent's height
- int maxSize = identityParent->width() * 0.15;
- circleDiameter = maxSize;
-
- // Update the widget size based on the diameter
- updateGeometry(); // Request a resize based on sizeHint()
- }
-
- update(); // Trigger a repaint
-}
-
-QSize DeckPreviewColorCircleWidget::sizeHint() const
-{
- // Return the size we calculated based on the parent widget
- return QSize(circleDiameter, circleDiameter);
-}
-
-QSize DeckPreviewColorCircleWidget::minimumSizeHint() const
-{
- // Return the same value as sizeHint() for minimum size
- return QSize(circleDiameter, circleDiameter);
-}
-
-void DeckPreviewColorCircleWidget::paintEvent(QPaintEvent *event)
-{
- Q_UNUSED(event);
-
- QPainter painter(this);
- painter.setRenderHint(QPainter::Antialiasing);
-
- // Calculate the circle's bounding rectangle
- int x = (width() - circleDiameter) / 2;
- int y = (height() - circleDiameter) / 2;
- QRect circleRect(x, y, circleDiameter, circleDiameter);
-
- // Map color characters to their respective colors
- QColor circleColor;
- switch (colorChar.unicode()) {
- case 'W':
- circleColor = Qt::white;
- break;
- case 'U':
- circleColor = QColor(0, 115, 230);
- break; // Blue
- case 'B':
- circleColor = QColor(50, 50, 50);
- break; // Black
- case 'R':
- circleColor = QColor(230, 30, 30);
- break; // Red
- case 'G':
- circleColor = QColor(30, 180, 30);
- break; // Green
- default:
- circleColor = Qt::transparent;
- break; // Fallback
- }
-
- if (SettingsCache::instance().getVisualDeckStorageDrawUnusedColorIdentities() || isActive) {
- // Make the circle faint if it is not active
- if (!isActive) {
- circleColor.setAlpha(SettingsCache::instance().getVisualDeckStorageUnusedColorIdentitiesOpacity() / 100.0 *
- 255.0);
- }
-
- // Draw the circle
- painter.setBrush(circleColor);
- painter.setPen(Qt::black);
- painter.drawEllipse(circleRect);
- }
-
- // Draw the color character only if the circle is active
- if (isActive) {
- QFont font = painter.font();
- font.setBold(true);
- font.setPointSize(circleDiameter * 0.4); // Adjust font size relative to circle diameter
- painter.setFont(font);
- if (colorChar.unicode() == 'B') {
- painter.setPen(Qt::white);
- } else {
- painter.setPen(Qt::black);
- }
-
- // Center the text within the circle
- painter.drawText(circleRect, Qt::AlignCenter, colorChar);
- }
-}
-
-void DeckPreviewColorCircleWidget::setColorActive(bool active)
-{
- isActive = active;
- update(); // Redraw the circle with the new active state
-}
-
-QChar DeckPreviewColorCircleWidget::getColorChar() const
-{
- return colorChar;
-}
-
-DeckPreviewColorIdentityWidget::DeckPreviewColorIdentityWidget(QWidget *parent, const QString &colorIdentity)
- : QWidget(parent)
-{
- layout = new QHBoxLayout(this);
- layout->setSpacing(5);
- layout->setContentsMargins(0, 0, 0, 0);
- layout->setAlignment(Qt::AlignHCenter);
- setLayout(layout);
-
- setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
-
- // Define the full WUBRG set (White, Blue, Black, Red, Green)
- QString fullColorIdentity = "WUBRG";
-
- // Create and add a DeckPreviewColorCircleWidget for each color in WUBRG
- for (const QChar &color : fullColorIdentity) {
- auto *circle = new DeckPreviewColorCircleWidget(color, this);
- layout->addWidget(circle);
- }
-
- // Set any active colors from the input colorIdentity
- for (const QChar &color : colorIdentity) {
- for (DeckPreviewColorCircleWidget *circle : findChildren()) {
- if (circle->getColorChar() == color) {
- circle->setColorActive(true); // Mark the color as active
- }
- }
- }
-
- connect(&SettingsCache::instance(), &SettingsCache::visualDeckStorageDrawUnusedColorIdentitiesChanged, this,
- &DeckPreviewColorIdentityWidget::toggleUnusedVisibility);
- toggleUnusedVisibility(SettingsCache::instance().getVisualDeckStorageDrawUnusedColorIdentities());
-}
-
-void DeckPreviewColorIdentityWidget::toggleUnusedVisibility(bool _visible) const
-{
- if (_visible) {
- for (DeckPreviewColorCircleWidget *circle : findChildren()) {
- circle->setVisible(true);
- }
- } else {
- for (DeckPreviewColorCircleWidget *circle : findChildren()) {
- if (!circle->getIsActive()) {
- circle->setHidden(true);
- }
- }
- }
-}
-
-void DeckPreviewColorIdentityWidget::resizeEvent(QResizeEvent *event)
-{
- QWidget::resizeEvent(event);
-
- // Notify child widgets to update their sizes based on the new parent size
- for (auto *circle : findChildren()) {
- circle->updateGeometry(); // Request each circle to resize
- }
-}
diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_widget.h b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_widget.h
deleted file mode 100644
index bbbe2cd4e..000000000
--- a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_widget.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef DECK_PREVIEW_COLOR_IDENTITY_WIDGET_H
-#define DECK_PREVIEW_COLOR_IDENTITY_WIDGET_H
-
-#include
-#include
-#include
-#include
-
-class DeckPreviewColorCircleWidget : public QWidget
-{
- Q_OBJECT
-
-public:
- explicit DeckPreviewColorCircleWidget(QChar color, QWidget *parent);
-
- void setColorActive(bool active);
- QChar getColorChar() const;
- bool getIsActive() const
- {
- return isActive;
- }
-
-protected:
- void resizeEvent(QResizeEvent *event) override;
- void paintEvent(QPaintEvent *event) override;
- QSize sizeHint() const override;
- QSize minimumSizeHint() const override;
-
-private:
- QChar colorChar;
- int circleDiameter;
- bool isActive;
-};
-
-class DeckPreviewColorIdentityWidget : public QWidget
-{
- Q_OBJECT
-
-public:
- explicit DeckPreviewColorIdentityWidget(QWidget *parent, const QString &colorIdentity);
-
-public slots:
- void toggleUnusedVisibility(bool _visible) const;
-
-protected:
- void resizeEvent(QResizeEvent *event) override;
-
-private:
- QHBoxLayout *layout;
-};
-
-#endif // DECK_PREVIEW_COLOR_IDENTITY_WIDGET_H
diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp
index 655d4e94b..f15c0e6b7 100644
--- a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp
+++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp
@@ -2,6 +2,7 @@
#include "../../../../../game/cards/card_database_manager.h"
#include "../../../../../settings/cache_settings.h"
+#include "../../cards/additional_info/color_identity_widget.h"
#include "../../cards/deck_preview_card_picture_widget.h"
#include "deck_preview_deck_tags_display_widget.h"
@@ -77,7 +78,7 @@ void DeckPreviewWidget::initializeUi(const bool deckLoadSuccess)
refreshBannerCardText();
setFilePath(deckLoader->getLastFileName());
- colorIdentityWidget = new DeckPreviewColorIdentityWidget(this, getColorIdentity());
+ colorIdentityWidget = new ColorIdentityWidget(this, getColorIdentity());
deckTagsDisplayWidget = new DeckPreviewDeckTagsDisplayWidget(this, deckLoader);
bannerCardLabel = new QLabel();
diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h
index 07eff4d7e..f8aac59fa 100644
--- a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h
+++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h
@@ -2,9 +2,9 @@
#define DECK_PREVIEW_WIDGET_H
#include "../../../../../deck/deck_loader.h"
+#include "../../cards/additional_info/color_identity_widget.h"
#include "../../cards/deck_preview_card_picture_widget.h"
#include "../visual_deck_storage_widget.h"
-#include "deck_preview_color_identity_widget.h"
#include "deck_preview_deck_tags_display_widget.h"
#include
@@ -31,7 +31,7 @@ public:
QString filePath;
DeckLoader *deckLoader;
DeckPreviewCardPictureWidget *bannerCardDisplayWidget = nullptr;
- DeckPreviewColorIdentityWidget *colorIdentityWidget = nullptr;
+ ColorIdentityWidget *colorIdentityWidget = nullptr;
DeckPreviewDeckTagsDisplayWidget *deckTagsDisplayWidget = nullptr;
QLabel *bannerCardLabel = nullptr;
QComboBox *bannerCardComboBox = nullptr;