Compare commits

..

2 commits

Author SHA1 Message Date
BruebachL
a1d8ce6165
[Accessibility] Bind card size sliders to Ctrl + Scroll (#7338)
Some checks are pending
CodeQL / Analyze (cpp) (push) Waiting to run
CodeQL / Analyze (actions) (push) Waiting to run
Build Desktop / Configure (push) Waiting to run
Build Desktop / Debian 13 (push) Blocked by required conditions
Build Desktop / Debian 12 (push) Blocked by required conditions
Build Desktop / Fedora 44 (push) Blocked by required conditions
Build Desktop / Fedora 43 (push) Blocked by required conditions
Build Desktop / Servatrice_Debian 12 (push) Blocked by required conditions
Build Desktop / Ubuntu 26.04 (push) Blocked by required conditions
Build Desktop / Ubuntu 24.04 (push) Blocked by required conditions
Build Desktop / Arch (push) Blocked by required conditions
Build Desktop / macOS 13 Intel (push) Blocked by required conditions
Build Desktop / macOS 14 (push) Blocked by required conditions
Build Desktop / macOS 15 (push) Blocked by required conditions
Build Desktop / macOS 26 Debug (push) Blocked by required conditions
Build Desktop / Windows 10 (push) Blocked by required conditions
Build Docker / Servatrice (arm) (push) Waiting to run
Build Docker / Servatrice (x86) (push) Waiting to run
Build Docker / Publish multi-platform Servatrice image (push) Blocked by required conditions
Ctrl+scroll over a card display now resizes the cards everywhere a card
size slider is shown, matching the standard way of resizing content.

CardSizeWidget learns to forward Ctrl+wheel events onto its slider via an
event filter that is installed on the display container and, when present,
on the scroll area's content widget so the resize intercepts the wheel
event before the view scrolls. The existing slider valueChanged wiring
then rescales the displayed cards.

Applied to the visual deck editor (per card group, covering flat and
overlapped layouts), visual database display, printing selector, sample
hand, visual and public deck storage, Archidekt previews and EDHRec card
displays.

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-09-23 21:03:34 +02:00
BruebachL
71ef36374d
[DeckEditor] Show card counts in Visual Deck Editor banners (#7339)
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-09-23 19:19:30 +02:00
21 changed files with 188 additions and 13 deletions

View file

@ -1,11 +1,13 @@
#include "card_group_display_widget.h" #include "card_group_display_widget.h"
#include "../../../../client/settings/cache_settings.h"
#include "../card_info_picture_with_text_overlay_widget.h" #include "../card_info_picture_with_text_overlay_widget.h"
#include <QResizeEvent> #include <QResizeEvent>
#include <libcockatrice/card/database/card_database_manager.h> #include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/models/deck_list/deck_list_model.h> #include <libcockatrice/models/deck_list/deck_list_model.h>
#include <libcockatrice/models/deck_list/deck_list_sort_filter_proxy_model.h> #include <libcockatrice/models/deck_list/deck_list_sort_filter_proxy_model.h>
#include <libcockatrice/settings/cards_display_settings.h>
CardGroupDisplayWidget::CardGroupDisplayWidget(QWidget *parent, CardGroupDisplayWidget::CardGroupDisplayWidget(QWidget *parent,
DeckListModel *_deckListModel, DeckListModel *_deckListModel,
@ -30,6 +32,7 @@ CardGroupDisplayWidget::CardGroupDisplayWidget(QWidget *parent,
layout->addWidget(banner); layout->addWidget(banner);
CardGroupDisplayWidget::updateCardDisplays(); CardGroupDisplayWidget::updateCardDisplays();
updateCardCount();
connect(deckListModel, &QAbstractItemModel::rowsInserted, this, &CardGroupDisplayWidget::onCardAddition); connect(deckListModel, &QAbstractItemModel::rowsInserted, this, &CardGroupDisplayWidget::onCardAddition);
if (selectionModel) { if (selectionModel) {
@ -38,6 +41,13 @@ CardGroupDisplayWidget::CardGroupDisplayWidget(QWidget *parent,
} }
connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &CardGroupDisplayWidget::onCardRemoval); connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &CardGroupDisplayWidget::onCardRemoval);
connect(deckListModel, &QAbstractItemModel::dataChanged, this, &CardGroupDisplayWidget::onDataChanged); connect(deckListModel, &QAbstractItemModel::dataChanged, this, &CardGroupDisplayWidget::onDataChanged);
connect(deckListModel, &QAbstractItemModel::rowsInserted, this, &CardGroupDisplayWidget::updateCardCount);
connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &CardGroupDisplayWidget::updateCardCount);
connect(deckListModel, &QAbstractItemModel::dataChanged, this, &CardGroupDisplayWidget::updateCardCount);
connect(&SettingsCache::instance().cardsDisplay(), &CardsDisplaySettings::visualDeckEditorShowCardCountsChanged,
this, &CardGroupDisplayWidget::updateCardCount);
cardSizeWidget->enableCtrlScrollResize(this);
} }
// Just here so it can get overwritten in subclasses. // Just here so it can get overwritten in subclasses.
@ -348,4 +358,22 @@ void CardGroupDisplayWidget::onActiveSortCriteriaChanged(QStringList _activeSort
clearAllDisplayWidgets(); clearAllDisplayWidgets();
updateCardDisplays(); updateCardDisplays();
} }
void CardGroupDisplayWidget::updateCardCount()
{
if (!banner || !deckListModel || !trackedIndex.isValid()) {
return;
}
QString text = cardGroupCategory;
if (SettingsCache::instance().cardsDisplay().getVisualDeckEditorShowCardCounts()) {
int total = 0;
for (int i = 0; i < deckListModel->rowCount(trackedIndex); ++i) {
total +=
deckListModel->index(i, DeckListModelColumns::CARD_AMOUNT, trackedIndex).data(Qt::EditRole).toInt();
}
text += QStringLiteral(" (%1)").arg(total);
}
banner->setText(text);
}

View file

@ -55,6 +55,7 @@ public slots:
virtual void onCardRemoval(const QModelIndex &parent, int first, int last); virtual void onCardRemoval(const QModelIndex &parent, int first, int last);
void onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles); void onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles);
void onActiveSortCriteriaChanged(QStringList activeSortCriteria); void onActiveSortCriteriaChanged(QStringList activeSortCriteria);
void updateCardCount();
void resizeEvent(QResizeEvent *event) override; void resizeEvent(QResizeEvent *event) override;
signals: signals:

View file

@ -3,6 +3,9 @@
#include "../printing_selector/printing_selector.h" #include "../printing_selector/printing_selector.h"
#include "../visual_deck_storage/visual_deck_storage_widget.h" #include "../visual_deck_storage/visual_deck_storage_widget.h"
#include <QScrollArea>
#include <QWheelEvent>
/** /**
* @class CardSizeWidget * @class CardSizeWidget
* @brief A widget for adjusting card sizes using a slider. * @brief A widget for adjusting card sizes using a slider.
@ -58,3 +61,39 @@ QSlider *CardSizeWidget::getSlider() const
{ {
return cardSizeSlider; return cardSizeSlider;
} }
void CardSizeWidget::enableCtrlScrollResize(QWidget *host)
{
host->installEventFilter(this);
const auto scrollAreas = host->findChildren<QScrollArea *>();
for (QScrollArea *scrollArea : scrollAreas) {
if (QWidget *content = scrollArea->widget()) {
content->installEventFilter(this);
}
}
}
bool CardSizeWidget::eventFilter(QObject *watched, QEvent *event)
{
if (event->type() == QEvent::Wheel && adjustSliderForWheel(static_cast<QWheelEvent *>(event))) {
return true;
}
return QWidget::eventFilter(watched, event);
}
bool CardSizeWidget::adjustSliderForWheel(QWheelEvent *event)
{
if (!(event->modifiers() & Qt::ControlModifier)) {
return false;
}
const int angleDelta = event->angleDelta().y();
if (angleDelta == 0) {
return false;
}
const int wheelSteps = angleDelta > 0 ? qMax(1, angleDelta / 120) : qMin(-1, angleDelta / 120);
cardSizeSlider->setValue(cardSizeSlider->value() + wheelSteps * CARD_SIZE_WHEEL_STEP);
return true;
}

View file

@ -17,6 +17,8 @@
#include <QTimer> #include <QTimer>
#include <QWidget> #include <QWidget>
class QWheelEvent;
class CardSizeWidget : public QWidget class CardSizeWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
@ -25,6 +27,18 @@ public:
explicit CardSizeWidget(QWidget *parent, FlowWidget *flowWidget = nullptr, int defaultValue = 100); explicit CardSizeWidget(QWidget *parent, FlowWidget *flowWidget = nullptr, int defaultValue = 100);
[[nodiscard]] QSlider *getSlider() const; [[nodiscard]] QSlider *getSlider() const;
/**
* @brief Resizes the cards when the user Ctrl + scrolls over @p host or any of its descendants.
*
* Installs this widget as an event filter on the given host widget. If the host contains a
* scroll area the filter is also installed on the scroll area's content widget, so the resize
* intercepts the wheel event before the scroll area would scroll the view.
*/
void enableCtrlScrollResize(QWidget *host);
protected:
bool eventFilter(QObject *watched, QEvent *event) override;
private slots: private slots:
void updateCardSizeSetting(int newValue); void updateCardSizeSetting(int newValue);
@ -44,6 +58,10 @@ private:
QSlider *cardSizeSlider; QSlider *cardSizeSlider;
QTimer debounceTimer; // Debounce timer QTimer debounceTimer; // Debounce timer
int pendingValue; // Stores the latest slider value int pendingValue; // Stores the latest slider value
bool adjustSliderForWheel(QWheelEvent *event);
static constexpr int CARD_SIZE_WHEEL_STEP = 10; ///< Slider step applied per Ctrl + scroll notch.
}; };
#endif // CARD_SIZE_WIDGET_H #endif // CARD_SIZE_WIDGET_H

View file

@ -1,8 +1,10 @@
#include "deck_card_zone_display_widget.h" #include "deck_card_zone_display_widget.h"
#include "../../../client/settings/cache_settings.h"
#include "card_group_display_widgets/flat_card_group_display_widget.h" #include "card_group_display_widgets/flat_card_group_display_widget.h"
#include "card_group_display_widgets/overlapped_card_group_display_widget.h" #include "card_group_display_widgets/overlapped_card_group_display_widget.h"
#include "libcockatrice/card/database/card_database_manager.h" #include "libcockatrice/card/database/card_database_manager.h"
#include "libcockatrice/settings/cards_display_settings.h"
#include <QResizeEvent> #include <QResizeEvent>
#include <algorithm> #include <algorithm>
@ -39,6 +41,7 @@ DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent,
banner->setBuddy(cardGroupContainer); banner->setBuddy(cardGroupContainer);
displayCards(); displayCards();
updateZoneCardCount();
connect(deckListModel, &QAbstractItemModel::rowsInserted, this, &DeckCardZoneDisplayWidget::onCategoryAddition); connect(deckListModel, &QAbstractItemModel::rowsInserted, this, &DeckCardZoneDisplayWidget::onCategoryAddition);
if (selectionModel) { if (selectionModel) {
@ -46,6 +49,11 @@ DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent,
&DeckCardZoneDisplayWidget::onSelectionChanged); &DeckCardZoneDisplayWidget::onSelectionChanged);
} }
connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &DeckCardZoneDisplayWidget::onCategoryRemoval); connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &DeckCardZoneDisplayWidget::onCategoryRemoval);
connect(deckListModel, &QAbstractItemModel::rowsInserted, this, &DeckCardZoneDisplayWidget::updateZoneCardCount);
connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &DeckCardZoneDisplayWidget::updateZoneCardCount);
connect(deckListModel, &QAbstractItemModel::dataChanged, this, &DeckCardZoneDisplayWidget::updateZoneCardCount);
connect(&SettingsCache::instance().cardsDisplay(), &CardsDisplaySettings::visualDeckEditorShowCardCountsChanged,
this, &DeckCardZoneDisplayWidget::updateZoneCardCount);
} }
// ===================================================================================================================== // =====================================================================================================================
@ -245,3 +253,21 @@ QList<QString> DeckCardZoneDisplayWidget::getGroupCriteriaValueList()
return groupCriteriaValues; return groupCriteriaValues;
} }
void DeckCardZoneDisplayWidget::updateZoneCardCount()
{
if (!banner || !deckListModel) {
return;
}
QString text = zoneName;
if (SettingsCache::instance().cardsDisplay().getVisualDeckEditorShowCardCounts()) {
int total = 0;
const auto cardNodes = deckListModel->getCardNodesForZone(zoneName);
for (const auto *node : cardNodes) {
total += node->getNumber();
}
text += QStringLiteral(" (%1)").arg(total);
}
banner->setText(text);
}

View file

@ -52,6 +52,7 @@ public slots:
QList<QString> getGroupCriteriaValueList(); QList<QString> getGroupCriteriaValueList();
void onCategoryAddition(const QModelIndex &parent, int first, int last); void onCategoryAddition(const QModelIndex &parent, int first, int last);
void onCategoryRemoval(const QModelIndex &parent, int first, int last); void onCategoryRemoval(const QModelIndex &parent, int first, int last);
void updateZoneCardCount();
signals: signals:
void cardClicked(QMouseEvent *event, const ExactCard &card, const QString &zoneName); void cardClicked(QMouseEvent *event, const ExactCard &card, const QString &zoneName);

View file

@ -58,6 +58,7 @@ PrintingSelector::PrintingSelector(QWidget *parent, AbstractTabDeckEditor *_deck
SettingsCache::instance().cardsDisplay().getPrintingSelectorCardSize()); SettingsCache::instance().cardsDisplay().getPrintingSelectorCardSize());
connect(cardSizeWidget, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance().cardsDisplay(), connect(cardSizeWidget, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance().cardsDisplay(),
&CardsDisplaySettings::setPrintingSelectorCardSize); &CardsDisplaySettings::setPrintingSelectorCardSize);
cardSizeWidget->enableCtrlScrollResize(flowWidget);
displayOptionsWidget->addSettingsWidget(sortToolBar); displayOptionsWidget->addSettingsWidget(sortToolBar);
displayOptionsWidget->addSettingsWidget(navigationCheckBox); displayOptionsWidget->addSettingsWidget(navigationCheckBox);

View file

@ -149,6 +149,11 @@ UserInterfaceSettingsPage::UserInterfaceSettingsPage()
connect(&openDeckInNewTabCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().deckEditor(), connect(&openDeckInNewTabCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().deckEditor(),
&DeckEditorSettings::setOpenDeckInNewTab); &DeckEditorSettings::setOpenDeckInNewTab);
visualDeckEditorShowCardCountsCheckBox.setChecked(
SettingsCache::instance().cardsDisplay().getVisualDeckEditorShowCardCounts());
connect(&visualDeckEditorShowCardCountsCheckBox, &QCheckBox::QT_STATE_CHANGED,
&SettingsCache::instance().cardsDisplay(), &CardsDisplaySettings::setVisualDeckEditorShowCardCounts);
visualDeckStorageInGameCheckBox.setChecked( visualDeckStorageInGameCheckBox.setChecked(
SettingsCache::instance().visualDeckStorage().getVisualDeckStorageInGame()); SettingsCache::instance().visualDeckStorage().getVisualDeckStorageInGame());
connect(&visualDeckStorageInGameCheckBox, &QCheckBox::QT_STATE_CHANGED, connect(&visualDeckStorageInGameCheckBox, &QCheckBox::QT_STATE_CHANGED,
@ -244,18 +249,19 @@ UserInterfaceSettingsPage::UserInterfaceSettingsPage()
auto *deckEditorGrid = new QGridLayout; auto *deckEditorGrid = new QGridLayout;
deckEditorGrid->addWidget(&openDeckInNewTabCheckBox, 0, 0); deckEditorGrid->addWidget(&openDeckInNewTabCheckBox, 0, 0);
deckEditorGrid->addWidget(&visualDeckStorageInGameCheckBox, 1, 0); deckEditorGrid->addWidget(&visualDeckEditorShowCardCountsCheckBox, 1, 0);
deckEditorGrid->addWidget(&visualDeckStorageSelectionAnimationCheckBox, 2, 0); deckEditorGrid->addWidget(&visualDeckStorageInGameCheckBox, 2, 0);
deckEditorGrid->addWidget(&visualDeckStoragePromptForConversionLabel, 3, 0); deckEditorGrid->addWidget(&visualDeckStorageSelectionAnimationCheckBox, 3, 0);
deckEditorGrid->addWidget(&visualDeckStoragePromptForConversionSelector, 3, 1); deckEditorGrid->addWidget(&visualDeckStoragePromptForConversionLabel, 4, 0);
deckEditorGrid->addWidget(&defaultDeckEditorTypeLabel, 4, 0); deckEditorGrid->addWidget(&visualDeckStoragePromptForConversionSelector, 4, 1);
deckEditorGrid->addWidget(&defaultDeckEditorTypeSelector, 4, 1); deckEditorGrid->addWidget(&defaultDeckEditorTypeLabel, 5, 0);
deckEditorGrid->addWidget(&vdeStartupTabLabel, 5, 0); deckEditorGrid->addWidget(&defaultDeckEditorTypeSelector, 5, 1);
deckEditorGrid->addWidget(&vdeStartupTabSelector, 5, 1); deckEditorGrid->addWidget(&vdeStartupTabLabel, 6, 0);
deckEditorGrid->addWidget(&commanderSpellbookIntegrationEnabledLabel, 6, 0); deckEditorGrid->addWidget(&vdeStartupTabSelector, 6, 1);
deckEditorGrid->addWidget(&commanderSpellbookIntegrationEnabledSelector, 6, 1); deckEditorGrid->addWidget(&commanderSpellbookIntegrationEnabledLabel, 7, 0);
deckEditorGrid->addWidget(labelWidget, 7, 0); deckEditorGrid->addWidget(&commanderSpellbookIntegrationEnabledSelector, 7, 1);
deckEditorGrid->addWidget(&commanderSpellbookIntegrationBracketNamingSelector, 7, 1); deckEditorGrid->addWidget(labelWidget, 8, 0);
deckEditorGrid->addWidget(&commanderSpellbookIntegrationBracketNamingSelector, 8, 1);
deckEditorGroupBox = new QGroupBox; deckEditorGroupBox = new QGroupBox;
deckEditorGroupBox->setLayout(deckEditorGrid); deckEditorGroupBox->setLayout(deckEditorGrid);
@ -367,6 +373,7 @@ void UserInterfaceSettingsPage::retranslateUi()
deckEditorGroupBox->setTitle(tr("Deck editor/storage settings")); deckEditorGroupBox->setTitle(tr("Deck editor/storage settings"));
openDeckInNewTabCheckBox.setText(tr("Open deck in new tab by default")); openDeckInNewTabCheckBox.setText(tr("Open deck in new tab by default"));
visualDeckEditorShowCardCountsCheckBox.setText(tr("Show card counts in Visual Deck Editor"));
visualDeckStorageInGameCheckBox.setText(tr("Use visual deck storage in game lobby")); visualDeckStorageInGameCheckBox.setText(tr("Use visual deck storage in game lobby"));
visualDeckStorageSelectionAnimationCheckBox.setText(tr("Use selection animation for Visual Deck Storage")); visualDeckStorageSelectionAnimationCheckBox.setText(tr("Use selection animation for Visual Deck Storage"));
visualDeckStoragePromptForConversionLabel.setText( visualDeckStoragePromptForConversionLabel.setText(

View file

@ -51,6 +51,7 @@ private:
QComboBox visualDeckStoragePromptForConversionSelector; QComboBox visualDeckStoragePromptForConversionSelector;
QCheckBox visualDeckStorageInGameCheckBox; QCheckBox visualDeckStorageInGameCheckBox;
QCheckBox visualDeckStorageSelectionAnimationCheckBox; QCheckBox visualDeckStorageSelectionAnimationCheckBox;
QCheckBox visualDeckEditorShowCardCountsCheckBox;
QLabel defaultDeckEditorTypeLabel; QLabel defaultDeckEditorTypeLabel;
QComboBox defaultDeckEditorTypeSelector; QComboBox defaultDeckEditorTypeSelector;
QLabel vdeStartupTabLabel; QLabel vdeStartupTabLabel;

View file

@ -15,6 +15,8 @@ ArchidektApiResponseDeckListingsDisplayWidget::ArchidektApiResponseDeckListingsD
flowWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded); flowWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded);
cardSizeSlider->enableCtrlScrollResize(flowWidget);
imageNetworkManager = new QNetworkAccessManager(this); imageNetworkManager = new QNetworkAccessManager(this);
imageNetworkManager->setTransferTimeout(); // Use Qt's default timeout imageNetworkManager->setTransferTimeout(); // Use Qt's default timeout
imageNetworkManager->setRedirectPolicy(QNetworkRequest::ManualRedirectPolicy); imageNetworkManager->setRedirectPolicy(QNetworkRequest::ManualRedirectPolicy);

View file

@ -54,6 +54,7 @@ EdhrecApiResponseCardDetailsDisplayWidget::EdhrecApiResponseCardDetailsDisplayWi
&CardInfoPictureWidget::setScaleFactor); &CardInfoPictureWidget::setScaleFactor);
connect(this, &EdhrecApiResponseCardDetailsDisplayWidget::requestUrl, parentTab, connect(this, &EdhrecApiResponseCardDetailsDisplayWidget::requestUrl, parentTab,
&TabEdhRecMain::actNavigatePage); &TabEdhRecMain::actNavigatePage);
parentTab->getCardSizeSlider()->enableCtrlScrollResize(this);
} }
} }

View file

@ -38,6 +38,7 @@ EdhrecCommanderResponseCommanderDetailsDisplayWidget::EdhrecCommanderResponseCom
connect(parentTab->getCardSizeSlider()->getSlider(), &QSlider::valueChanged, commanderPicture, connect(parentTab->getCardSizeSlider()->getSlider(), &QSlider::valueChanged, commanderPicture,
&CardInfoPictureWidget::setScaleFactor); &CardInfoPictureWidget::setScaleFactor);
commanderPicture->setScaleFactor(parentTab->getCardSizeSlider()->getSlider()->value()); commanderPicture->setScaleFactor(parentTab->getCardSizeSlider()->getSlider()->value());
parentTab->getCardSizeSlider()->enableCtrlScrollResize(this);
} }
commanderDetails.debugPrint(); commanderDetails.debugPrint();

View file

@ -2,6 +2,7 @@
#include "../../../client/settings/cache_settings.h" #include "../../../client/settings/cache_settings.h"
#include "../../deck_loader/deck_loader.h" #include "../../deck_loader/deck_loader.h"
#include "../cards/card_size_widget.h"
#include "../general/layout_containers/flow_widget.h" #include "../general/layout_containers/flow_widget.h"
#include "../visual_deck_storage/deck_preview/deck_preview_color_identity_filter_widget.h" #include "../visual_deck_storage/deck_preview/deck_preview_color_identity_filter_widget.h"
#include "../visual_deck_storage/deck_preview/public_deck_preview_widget.h" #include "../visual_deck_storage/deck_preview/public_deck_preview_widget.h"
@ -107,6 +108,7 @@ TabPublicDecks::TabPublicDecks(TabSupervisor *_tabSupervisor, AbstractClient *_c
&TabPublicDecks::updateCardSize); &TabPublicDecks::updateCardSize);
connect(quickSettingsWidget, &VisualDeckStorageQuickSettingsWidget::showTagFilterChanged, this, connect(quickSettingsWidget, &VisualDeckStorageQuickSettingsWidget::showTagFilterChanged, this,
&TabPublicDecks::updateTagsVisibility); &TabPublicDecks::updateTagsVisibility);
quickSettingsWidget->getCardSizeWidget()->enableCtrlScrollResize(flowWidget);
retranslateUi(); retranslateUi();
model->refresh(userName); model->refresh(userName);

View file

@ -69,6 +69,7 @@ VisualDatabaseDisplayWidget::VisualDatabaseDisplayWidget(QWidget *parent,
SettingsCache::instance().cardsDisplay().getVisualDatabaseDisplayCardSize()); SettingsCache::instance().cardsDisplay().getVisualDatabaseDisplayCardSize());
connect(cardSizeWidget, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance().cardsDisplay(), connect(cardSizeWidget, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance().cardsDisplay(),
&CardsDisplaySettings::setVisualDatabaseDisplayCardSize); &CardsDisplaySettings::setVisualDatabaseDisplayCardSize);
cardSizeWidget->enableCtrlScrollResize(flowWidget);
searchContainer = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAlwaysOff); searchContainer = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAlwaysOff);

View file

@ -48,6 +48,7 @@ VisualDeckEditorSampleHandWidget::VisualDeckEditorSampleHandWidget(QWidget *pare
upperLayout->addWidget(flowWidget); upperLayout->addWidget(flowWidget);
cardSizeWidget = new CardSizeWidget(this, flowWidget); cardSizeWidget = new CardSizeWidget(this, flowWidget);
cardSizeWidget->enableCtrlScrollResize(flowWidget);
upperLayout->addWidget(cardSizeWidget); upperLayout->addWidget(cardSizeWidget);
auto upperLayoutWidget = new QWidget(this); auto upperLayoutWidget = new QWidget(this);

View file

@ -1,6 +1,7 @@
#include "visual_deck_storage_folder_display_widget.h" #include "visual_deck_storage_folder_display_widget.h"
#include "../cards/card_info_picture_widget.h" #include "../cards/card_info_picture_widget.h"
#include "../cards/card_size_widget.h"
#include "../general/display/banner_widget.h" #include "../general/display/banner_widget.h"
#include "../general/layout_containers/flow_widget.h" #include "../general/layout_containers/flow_widget.h"
#include "deck_preview/deck_preview_widget.h" #include "deck_preview/deck_preview_widget.h"
@ -45,6 +46,8 @@ VisualDeckStorageFolderDisplayWidget::VisualDeckStorageFolderDisplayWidget(
flowWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAlwaysOff); flowWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAlwaysOff);
containerLayout->addWidget(flowWidget); containerLayout->addWidget(flowWidget);
visualDeckStorageWidget->settings()->getCardSizeWidget()->enableCtrlScrollResize(this);
auto *proxy = visualDeckStorageWidget->proxyModel(); auto *proxy = visualDeckStorageWidget->proxyModel();
// A burst of proxy changes (one dataChanged per finished deck load, plus the filter // A burst of proxy changes (one dataChanged per finished deck load, plus the filter
// invalidations) coalesces into a single reconcile, so a scan of many decks doesn't // invalidations) coalesces into a single reconcile, so a scan of many decks doesn't

View file

@ -70,6 +70,15 @@ public:
[[nodiscard]] TooltipType getDeckPreviewTooltip() const; [[nodiscard]] TooltipType getDeckPreviewTooltip() const;
[[nodiscard]] int getCardSize() const; [[nodiscard]] int getCardSize() const;
/**
* @return The card size widget, so card display hosts can resize the cards on
* Ctrl + scroll even though the slider itself lives inside this menu.
*/
[[nodiscard]] CardSizeWidget *getCardSizeWidget() const
{
return cardSizeWidget;
}
signals: signals:
void showFoldersChanged(bool enabled); void showFoldersChanged(bool enabled);
void drawUnusedColorIdentitiesChanged(bool enabled); void drawUnusedColorIdentitiesChanged(bool enabled);

View file

@ -25,6 +25,7 @@ public:
[[nodiscard]] virtual int getVisualDeckStorageCardSize() const = 0; [[nodiscard]] virtual int getVisualDeckStorageCardSize() const = 0;
[[nodiscard]] virtual int getVisualDatabaseDisplayCardSize() const = 0; [[nodiscard]] virtual int getVisualDatabaseDisplayCardSize() const = 0;
[[nodiscard]] virtual int getVisualDeckEditorCardSize() const = 0; [[nodiscard]] virtual int getVisualDeckEditorCardSize() const = 0;
[[nodiscard]] virtual bool getVisualDeckEditorShowCardCounts() const = 0;
[[nodiscard]] virtual int getEDHRecCardSize() const = 0; [[nodiscard]] virtual int getEDHRecCardSize() const = 0;
[[nodiscard]] virtual int getArchidektPreviewSize() const = 0; [[nodiscard]] virtual int getArchidektPreviewSize() const = 0;
[[nodiscard]] virtual int getSampleHandSize() const = 0; [[nodiscard]] virtual int getSampleHandSize() const = 0;

View file

@ -90,6 +90,11 @@ int CardsDisplaySettings::getVisualDeckEditorCardSize() const
return getValue("visualDeckEditor", "cards", "cardSize", 100).toInt(); return getValue("visualDeckEditor", "cards", "cardSize", 100).toInt();
} }
bool CardsDisplaySettings::getVisualDeckEditorShowCardCounts() const
{
return getValue("visualDeckEditorShowCardCounts", QString(), QString(), true).toBool();
}
int CardsDisplaySettings::getEDHRecCardSize() const int CardsDisplaySettings::getEDHRecCardSize() const
{ {
return getValue("edhrec", "cards", "cardSize", 100).toInt(); return getValue("edhrec", "cards", "cardSize", 100).toInt();
@ -217,6 +222,15 @@ void CardsDisplaySettings::setVisualDeckEditorCardSize(int _cardSize)
emit visualDeckEditorCardSizeChanged(); emit visualDeckEditorCardSizeChanged();
} }
void CardsDisplaySettings::setVisualDeckEditorShowCardCounts(bool _showCardCounts)
{
if (_showCardCounts == getVisualDeckEditorShowCardCounts()) {
return;
}
setValue(_showCardCounts, "visualDeckEditorShowCardCounts");
emit visualDeckEditorShowCardCountsChanged(_showCardCounts);
}
void CardsDisplaySettings::setEDHRecCardSize(int _edhrecCardSize) void CardsDisplaySettings::setEDHRecCardSize(int _edhrecCardSize)
{ {
setValue(_edhrecCardSize, "edhrec", "cards", "cardSize"); setValue(_edhrecCardSize, "edhrec", "cards", "cardSize");

View file

@ -29,6 +29,7 @@ public:
[[nodiscard]] int getVisualDeckStorageCardSize() const override; [[nodiscard]] int getVisualDeckStorageCardSize() const override;
[[nodiscard]] int getVisualDatabaseDisplayCardSize() const override; [[nodiscard]] int getVisualDatabaseDisplayCardSize() const override;
[[nodiscard]] int getVisualDeckEditorCardSize() const override; [[nodiscard]] int getVisualDeckEditorCardSize() const override;
[[nodiscard]] bool getVisualDeckEditorShowCardCounts() const override;
[[nodiscard]] int getEDHRecCardSize() const override; [[nodiscard]] int getEDHRecCardSize() const override;
[[nodiscard]] int getArchidektPreviewSize() const override; [[nodiscard]] int getArchidektPreviewSize() const override;
[[nodiscard]] int getSampleHandSize() const override; [[nodiscard]] int getSampleHandSize() const override;
@ -52,6 +53,7 @@ public:
void setVisualDeckStorageCardSize(int _cardSize); void setVisualDeckStorageCardSize(int _cardSize);
void setVisualDatabaseDisplayCardSize(int _cardSize); void setVisualDatabaseDisplayCardSize(int _cardSize);
void setVisualDeckEditorCardSize(int _cardSize); void setVisualDeckEditorCardSize(int _cardSize);
void setVisualDeckEditorShowCardCounts(bool _showCardCounts);
void setEDHRecCardSize(int _edhrecCardSize); void setEDHRecCardSize(int _edhrecCardSize);
void setArchidektPreviewCardSize(int _archidektPreviewCardSize); void setArchidektPreviewCardSize(int _archidektPreviewCardSize);
void setSampleHandSize(int _sampleHandSize); void setSampleHandSize(int _sampleHandSize);
@ -70,6 +72,7 @@ signals:
void visualDeckStorageCardSizeChanged(); void visualDeckStorageCardSizeChanged();
void visualDatabaseDisplayCardSizeChanged(); void visualDatabaseDisplayCardSizeChanged();
void visualDeckEditorCardSizeChanged(); void visualDeckEditorCardSizeChanged();
void visualDeckEditorShowCardCountsChanged(bool showCardCounts);
void edhRecCardSizeChanged(); void edhRecCardSizeChanged();
void archidektPreviewSizeChanged(); void archidektPreviewSizeChanged();
void sampleHandSizeChanged(int amount); void sampleHandSizeChanged(int amount);

View file

@ -570,6 +570,21 @@ TEST_F(SettingsDefaultsTest, CardsDisplay_VisualDeckEditorCardSize_Default)
ASSERT_EQ(s.getVisualDeckEditorCardSize(), 100); ASSERT_EQ(s.getVisualDeckEditorCardSize(), 100);
} }
TEST_F(SettingsDefaultsTest, CardsDisplay_VisualDeckEditorShowCardCounts_Default)
{
CardsDisplaySettings s(settingsPath, nullptr);
ASSERT_EQ(s.getVisualDeckEditorShowCardCounts(), true);
}
TEST_F(SettingsDefaultsTest, CardsDisplay_VisualDeckEditorShowCardCounts_SetAndGet)
{
CardsDisplaySettings s(settingsPath, nullptr);
s.setVisualDeckEditorShowCardCounts(false);
ASSERT_EQ(s.getVisualDeckEditorShowCardCounts(), false);
s.setVisualDeckEditorShowCardCounts(true);
ASSERT_EQ(s.getVisualDeckEditorShowCardCounts(), true);
}
TEST_F(SettingsDefaultsTest, CardsDisplay_EDHRecCardSize_Default) TEST_F(SettingsDefaultsTest, CardsDisplay_EDHRecCardSize_Default)
{ {
CardsDisplaySettings s(settingsPath, nullptr); CardsDisplaySettings s(settingsPath, nullptr);