Use the new mana symbols. (#5687)

* Use the new mana symbols.

* Fixup some thangs.

* Lint.

---------

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
This commit is contained in:
BruebachL 2025-03-05 01:53:42 +01:00 committed by GitHub
parent 85a50ce9d5
commit 8fc1b22889
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 330 additions and 337 deletions

View file

@ -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 <QMouseEvent>
#include <QPainter>
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,15 +15,16 @@ DeckPreviewColorIdentityFilterWidget::DeckPreviewColorIdentityFilterWidget(Visua
QString fullColorIdentity = "WUBRG";
for (const QChar &color : fullColorIdentity) {
auto *circle = new DeckPreviewColorIdentityFilterCircleWidget(color, this);
auto *manaSymbol = new ManaSymbolWidget(this, color, false, true);
manaSymbol->setMaximumWidth(25);
layout->addWidget(circle);
layout->addWidget(manaSymbol);
// Initialize the activeColors map
activeColors[color] = false;
// Connect the color toggled signal
connect(circle, &DeckPreviewColorIdentityFilterCircleWidget::colorToggled, this,
connect(manaSymbol, &ManaSymbolWidget::colorToggled, this,
&DeckPreviewColorIdentityFilterWidget::handleColorToggled);
}

View file

@ -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

View file

@ -1,176 +0,0 @@
#include "deck_preview_color_identity_widget.h"
#include "../../../../../settings/cache_settings.h"
#include <QPainter>
#include <QResizeEvent>
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<DeckPreviewColorCircleWidget *>()) {
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<DeckPreviewColorCircleWidget *>()) {
circle->setVisible(true);
}
} else {
for (DeckPreviewColorCircleWidget *circle : findChildren<DeckPreviewColorCircleWidget *>()) {
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<DeckPreviewColorCircleWidget *>()) {
circle->updateGeometry(); // Request each circle to resize
}
}

View file

@ -1,52 +0,0 @@
#ifndef DECK_PREVIEW_COLOR_IDENTITY_WIDGET_H
#define DECK_PREVIEW_COLOR_IDENTITY_WIDGET_H
#include <QChar>
#include <QHBoxLayout>
#include <QSize>
#include <QWidget>
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

View file

@ -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();

View file

@ -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 <QComboBox>
@ -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;