From 0f45dfa12a2ac2239aeee80c7f12c606cf4901f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Mon, 2 Nov 2026 21:48:20 +0100 Subject: [PATCH] [Card] Elide long tag lists in the card info and drop the Scryfall label from the tag filter tooltip --- .../widgets/cards/card_info_text_widget.cpp | 42 ++++++++++++++++++- .../widgets/cards/card_info_text_widget.h | 3 +- ...database_display_filter_toolbar_widget.cpp | 2 +- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/cockatrice/src/interface/widgets/cards/card_info_text_widget.cpp b/cockatrice/src/interface/widgets/cards/card_info_text_widget.cpp index 218d0e964..a94f01085 100644 --- a/cockatrice/src/interface/widgets/cards/card_info_text_widget.cpp +++ b/cockatrice/src/interface/widgets/cards/card_info_text_widget.cpp @@ -23,12 +23,25 @@ #include #include +namespace +{ +constexpr int TAGS_PREVIEW_LIMIT = 3; +const QString SHOW_ALL_TAGS_LINK = QStringLiteral("cockatrice://show-all-tags"); +} // namespace + CardInfoTextWidget::CardInfoTextWidget(QWidget *parent) : QFrame(parent) { propsLabel = new QLabel; propsLabel->setOpenExternalLinks(false); propsLabel->setWordWrap(true); - connect(propsLabel, SIGNAL(linkActivated(const QString &)), this, SIGNAL(linkActivated(const QString &))); + connect(propsLabel, &QLabel::linkActivated, this, [this](const QString &link) { + if (link == SHOW_ALL_TAGS_LINK) { + showAllTags = true; + setCard(currentCard); + return; + } + emit linkActivated(link); + }); textLabel = new QTextEdit(); textLabel->setReadOnly(true); @@ -75,6 +88,12 @@ void CardInfoTextWidget::setCard(const ExactCard &exactCard) return; } + // Expanding the tag list re-renders the same card, so only reset the + // collapsed state when a genuinely different card is shown. + if (exactCard != currentCard) { + showAllTags = false; + } + QString text = ""; text += QString("") .arg(tr("Name:"), CardLocalization::displayName(card).toHtmlEscaped()); @@ -94,6 +113,27 @@ void CardInfoTextWidget::setCard(const ExactCard &exactCard) continue; } QString keyText = Mtg::getNicePropertyName(key).toHtmlEscaped() + ":"; + + if (key == Mtg::Tags) { + const QStringList tags = card->getProperty(Mtg::Tags).split(" ", Qt::SkipEmptyParts); + + QString tagsText; + if (!showAllTags && tags.size() > TAGS_PREVIEW_LIMIT) { + const QStringList preview = tags.mid(0, TAGS_PREVIEW_LIMIT); + const int remaining = tags.size() - preview.size(); + // Join with non-breaking spaces so "… and N more" never wraps mid-phrase. + const QString moreText = + tr("and %n more", nullptr, remaining).toHtmlEscaped().split(" ").join(" "); + tagsText = preview.join(", ").toHtmlEscaped() + + QString(" … %2").arg(SHOW_ALL_TAGS_LINK, moreText); + } else { + tagsText = tags.join(", ").toHtmlEscaped(); + } + + text += QString("").arg(keyText, tagsText); + continue; + } + text += QString("").arg(keyText, card->getProperty(key).toHtmlEscaped()); } diff --git a/cockatrice/src/interface/widgets/cards/card_info_text_widget.h b/cockatrice/src/interface/widgets/cards/card_info_text_widget.h index 8223093fe..eae2fb8e3 100644 --- a/cockatrice/src/interface/widgets/cards/card_info_text_widget.h +++ b/cockatrice/src/interface/widgets/cards/card_info_text_widget.h @@ -26,7 +26,8 @@ private: QLabel *propsLabel; QScrollArea *propsScroll; QTextEdit *textLabel; - ExactCard currentCard; ///< Last card set, re-rendered when the card language changes. + ExactCard currentCard; ///< Last card set, re-rendered when the card language changes. + bool showAllTags = false; ///< Whether the potentially long tag list is fully expanded. void setTexts(const QString &propsText, const QString &textText); public: diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_toolbar_widget.cpp b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_toolbar_widget.cpp index 4249559fe..90f6baeb7 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_toolbar_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_toolbar_widget.cpp @@ -179,7 +179,7 @@ void VisualDatabaseDisplayFilterToolbarWidget::retranslateUi() quickFilterSubTypeWidget->setToolTip(tr("Filter by card sub-type")); quickFilterSetWidget->setToolTip(tr("Filter by set")); quickFilterFormatLegalityWidget->setToolTip(tr("Filter by format legality")); - quickFilterTagWidget->setToolTip(tr("Filter by Scryfall Tagger tag")); + quickFilterTagWidget->setToolTip(tr("Filter by card tag")); quickFilterSaveLoadWidget->setButtonText(tr("Save/Load")); quickFilterNameWidget->setButtonText(tr("Name"));
%1%2
%1%2
%1%2