Allow TabArchidekt to use VDE group/sort/display buttons

This commit is contained in:
Brübach, Lukas 2025-11-29 20:41:14 +01:00
parent b4d33597c2
commit 16350799bf
8 changed files with 253 additions and 136 deletions

View file

@ -205,6 +205,7 @@ set(cockatrice_SOURCES
src/interface/widgets/visual_database_display/visual_database_display_sub_type_filter_widget.cpp src/interface/widgets/visual_database_display/visual_database_display_sub_type_filter_widget.cpp
src/interface/widgets/visual_database_display/visual_database_display_widget.cpp src/interface/widgets/visual_database_display/visual_database_display_widget.cpp
src/interface/widgets/visual_database_display/visual_database_filter_display_widget.cpp src/interface/widgets/visual_database_display/visual_database_filter_display_widget.cpp
src/interface/widgets/visual_deck_editor/visual_deck_display_options_widget.cpp
src/interface/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp src/interface/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp
src/interface/widgets/visual_deck_editor/visual_deck_editor_widget.cpp src/interface/widgets/visual_deck_editor/visual_deck_editor_widget.cpp
src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_filter_widget.cpp src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_filter_widget.cpp

View file

@ -4,6 +4,7 @@
#include "../../../../cards/card_info_picture_with_text_overlay_widget.h" #include "../../../../cards/card_info_picture_with_text_overlay_widget.h"
#include "../../../../cards/card_size_widget.h" #include "../../../../cards/card_size_widget.h"
#include "../../../../cards/deck_card_zone_display_widget.h" #include "../../../../cards/deck_card_zone_display_widget.h"
#include "../../../../visual_deck_editor/visual_deck_display_options_widget.h"
#include "../api_response/deck/archidekt_api_response_deck.h" #include "../api_response/deck/archidekt_api_response_deck.h"
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
@ -23,6 +24,12 @@ ArchidektApiResponseDeckDisplayWidget::ArchidektApiResponseDeckDisplayWidget(QWi
connect(openInEditorButton, &QPushButton::clicked, this, connect(openInEditorButton, &QPushButton::clicked, this,
&ArchidektApiResponseDeckDisplayWidget::actOpenInDeckEditor); &ArchidektApiResponseDeckDisplayWidget::actOpenInDeckEditor);
displayOptionsWidget = new VisualDeckDisplayOptionsWidget(this);
layout->addWidget(displayOptionsWidget);
connect(displayOptionsWidget, &VisualDeckDisplayOptionsWidget::groupCriteriaChanged, this,
&ArchidektApiResponseDeckDisplayWidget::onGroupCriteriaChange);
scrollArea = new QScrollArea(this); scrollArea = new QScrollArea(this);
scrollArea->setWidgetResizable(true); scrollArea->setWidgetResizable(true);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
@ -73,6 +80,12 @@ void ArchidektApiResponseDeckDisplayWidget::retranslateUi()
openInEditorButton->setText(tr("Open Deck in Deck Editor")); openInEditorButton->setText(tr("Open Deck in Deck Editor"));
} }
void ArchidektApiResponseDeckDisplayWidget::onGroupCriteriaChange(const QString &activeGroupCriteria)
{
model->setActiveGroupCriteria(DeckListModelGroupCriteria::fromString(activeGroupCriteria));
model->sort(1, Qt::AscendingOrder);
}
void ArchidektApiResponseDeckDisplayWidget::actOpenInDeckEditor() void ArchidektApiResponseDeckDisplayWidget::actOpenInDeckEditor()
{ {
auto loader = new DeckLoader(this); auto loader = new DeckLoader(this);
@ -122,13 +135,13 @@ void ArchidektApiResponseDeckDisplayWidget::constructZoneWidgetsFromDeckListMode
new DeckCardZoneDisplayWidget(zoneContainer, model, nullptr, persistent, new DeckCardZoneDisplayWidget(zoneContainer, model, nullptr, persistent,
model->data(persistent.sibling(persistent.row(), 1), Qt::EditRole).toString(), model->data(persistent.sibling(persistent.row(), 1), Qt::EditRole).toString(),
"maintype", {"name"}, DisplayType::Overlap, 20, 10, cardSizeSlider); "maintype", {"name"}, DisplayType::Overlap, 20, 10, cardSizeSlider);
/*
connect(this, &VisualDeckEditorWidget::activeSortCriteriaChanged, zoneDisplayWidget, connect(displayOptionsWidget, &VisualDeckDisplayOptionsWidget::sortCriteriaChanged, zoneDisplayWidget,
&DeckCardZoneDisplayWidget::onActiveSortCriteriaChanged); &DeckCardZoneDisplayWidget::onActiveSortCriteriaChanged);
connect(this, &VisualDeckEditorWidget::activeGroupCriteriaChanged, zoneDisplayWidget, connect(displayOptionsWidget, &VisualDeckDisplayOptionsWidget::groupCriteriaChanged, zoneDisplayWidget,
&DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged); &DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged);
connect(this, &VisualDeckEditorWidget::displayTypeChanged, zoneDisplayWidget, connect(displayOptionsWidget, &VisualDeckDisplayOptionsWidget::displayTypeChanged, zoneDisplayWidget,
&DeckCardZoneDisplayWidget::refreshDisplayType);*/ &DeckCardZoneDisplayWidget::refreshDisplayType);
zoneContainerLayout->addWidget(zoneDisplayWidget); zoneContainerLayout->addWidget(zoneDisplayWidget);
indexToWidgetMap.insert(persistent, zoneDisplayWidget); indexToWidgetMap.insert(persistent, zoneDisplayWidget);

View file

@ -4,6 +4,7 @@
#include "../../../../../deck_loader/deck_loader.h" #include "../../../../../deck_loader/deck_loader.h"
#include "../../../../cards/card_size_widget.h" #include "../../../../cards/card_size_widget.h"
#include "../../../../general/layout_containers/flow_widget.h" #include "../../../../general/layout_containers/flow_widget.h"
#include "../../../../visual_deck_editor/visual_deck_display_options_widget.h"
#include "../api_response/deck/archidekt_api_response_deck.h" #include "../api_response/deck/archidekt_api_response_deck.h"
#include "deck_list_model.h" #include "deck_list_model.h"
@ -30,13 +31,16 @@ public:
void clearAllDisplayWidgets(); void clearAllDisplayWidgets();
void decklistModelReset(); void decklistModelReset();
void constructZoneWidgetsFromDeckListModel(); void constructZoneWidgetsFromDeckListModel();
void resizeEvent(QResizeEvent *event) override;
private slots:
void onGroupCriteriaChange(const QString &activeGroupCriteria);
private: private:
ArchidektApiResponseDeck response; ArchidektApiResponseDeck response;
CardSizeWidget *cardSizeSlider; CardSizeWidget *cardSizeSlider;
QVBoxLayout *layout; QVBoxLayout *layout;
QPushButton *openInEditorButton; QPushButton *openInEditorButton;
VisualDeckDisplayOptionsWidget *displayOptionsWidget;
QScrollArea *scrollArea; QScrollArea *scrollArea;
QWidget *zoneContainer; QWidget *zoneContainer;
QVBoxLayout *zoneContainerLayout; QVBoxLayout *zoneContainerLayout;
@ -44,6 +48,9 @@ private:
QHash<QPersistentModelIndex, QWidget *> indexToWidgetMap; QHash<QPersistentModelIndex, QWidget *> indexToWidgetMap;
QVBoxLayout *containerLayout; QVBoxLayout *containerLayout;
DeckListModel *model; DeckListModel *model;
protected slots:
void resizeEvent(QResizeEvent *event) override;
}; };
#endif // COCKATRICE_ARCHIDEKT_API_RESPONSE_DECK_DISPLAY_WIDGET_H #endif // COCKATRICE_ARCHIDEKT_API_RESPONSE_DECK_DISPLAY_WIDGET_H

View file

@ -0,0 +1,124 @@
#include "visual_deck_display_options_widget.h"
#include "../tabs/visual_deck_editor/tab_deck_editor_visual.h"
VisualDeckDisplayOptionsWidget::VisualDeckDisplayOptionsWidget(QWidget *parent)
{
groupAndSortLayout = new QHBoxLayout(this);
groupAndSortLayout->setAlignment(Qt::AlignLeft);
this->setLayout(groupAndSortLayout);
groupByLabel = new QLabel(this);
groupByComboBox = new QComboBox(this);
if (auto visualDeckEditorWidget = qobject_cast<VisualDeckEditorWidget *>(parent)) {
if (auto tabWidget = qobject_cast<TabDeckEditorVisualTabWidget *>(visualDeckEditorWidget)) {
// Inside a central widget QWidget container inside TabDeckEditorVisual
if (auto tab = qobject_cast<TabDeckEditorVisual *>(tabWidget->parent()->parent())) {
auto originalBox = tab->getDeckDockWidget()->getGroupByComboBox();
groupByComboBox->setModel(originalBox->model());
groupByComboBox->setModelColumn(originalBox->modelColumn());
// Original -> clone
connect(originalBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
[this](int index) { groupByComboBox->setCurrentIndex(index); });
// Clone -> original
connect(groupByComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
[originalBox](int index) { originalBox->setCurrentIndex(index); });
}
}
} else {
groupByComboBox->addItem(
tr(qPrintable(DeckListModelGroupCriteria::toString(DeckListModelGroupCriteria::MAIN_TYPE))),
DeckListModelGroupCriteria::MAIN_TYPE);
groupByComboBox->addItem(
tr(qPrintable(DeckListModelGroupCriteria::toString(DeckListModelGroupCriteria::MANA_COST))),
DeckListModelGroupCriteria::MANA_COST);
groupByComboBox->addItem(
tr(qPrintable(DeckListModelGroupCriteria::toString(DeckListModelGroupCriteria::COLOR))),
DeckListModelGroupCriteria::COLOR);
groupByComboBox->setMinimumWidth(300);
connect(groupByComboBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged), this,
&VisualDeckDisplayOptionsWidget::groupCriteriaChanged);
emit groupCriteriaChanged(groupByComboBox->currentText());
}
sortByLabel = new QLabel(this);
sortCriteriaButton = new SettingsButtonWidget(this);
sortLabel = new QLabel(sortCriteriaButton);
sortLabel->setWordWrap(true);
QStringList sortProperties = {"colors", "cmc", "name", "maintype"};
sortByListWidget = new QListWidget();
sortByListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
sortByListWidget->setDragDropMode(QAbstractItemView::InternalMove);
sortByListWidget->setDefaultDropAction(Qt::MoveAction);
for (const QString &property : sortProperties) {
QListWidgetItem *item = new QListWidgetItem(property, sortByListWidget);
item->setFlags(item->flags() | Qt::ItemIsDragEnabled | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
}
connect(sortByListWidget->model(), &QAbstractItemModel::rowsMoved, this,
&VisualDeckDisplayOptionsWidget::onSortCriteriaChange);
onSortCriteriaChange();
sortByListWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
sortCriteriaButton->addSettingsWidget(sortLabel);
sortCriteriaButton->addSettingsWidget(sortByListWidget);
displayTypeButton = new QPushButton(this);
connect(displayTypeButton, &QPushButton::clicked, this, &VisualDeckDisplayOptionsWidget::updateDisplayType);
groupAndSortLayout->addWidget(groupByLabel);
groupAndSortLayout->addWidget(groupByComboBox);
groupAndSortLayout->addWidget(sortByLabel);
groupAndSortLayout->addWidget(sortCriteriaButton);
groupAndSortLayout->addWidget(displayTypeButton);
retranslateUi();
}
void VisualDeckDisplayOptionsWidget::retranslateUi()
{
groupByLabel->setText(tr("Group by:"));
groupByComboBox->setToolTip(tr("Change how cards are divided into categories/groups."));
sortByLabel->setText(tr("Sort by:"));
sortLabel->setText(tr("Click and drag to change the sort order within the groups"));
sortCriteriaButton->setToolTip(tr("Configure how cards are sorted within their groups"));
displayTypeButton->setText(tr("Toggle Layout: Overlap"));
displayTypeButton->setToolTip(
tr("Change how cards are displayed within zones (i.e. overlapped or fully visible.)"));
}
void VisualDeckDisplayOptionsWidget::onSortCriteriaChange()
{
QStringList selectedCriteria;
for (int i = 0; i < sortByListWidget->count(); ++i) {
QListWidgetItem *item = sortByListWidget->item(i);
selectedCriteria.append(item->text()); // Collect user-defined sort order
}
emit sortCriteriaChanged(selectedCriteria);
}
void VisualDeckDisplayOptionsWidget::updateDisplayType()
{
// Toggle the display type
currentDisplayType = (currentDisplayType == DisplayType::Overlap) ? DisplayType::Flat : DisplayType::Overlap;
// Update UI and emit signal
switch (currentDisplayType) {
case DisplayType::Flat:
displayTypeButton->setText(tr("Toggle Layout: Flat"));
break;
case DisplayType::Overlap:
displayTypeButton->setText(tr("Toggle Layout: Overlap"));
break;
}
emit displayTypeChanged(currentDisplayType);
}

View file

@ -0,0 +1,55 @@
#ifndef COCKATRICE_VISUAL_DECK_DISPLAY_OPTIONS_WIDGET_H
#define COCKATRICE_VISUAL_DECK_DISPLAY_OPTIONS_WIDGET_H
#include "visual_deck_editor_widget.h"
#include <QPushButton>
#include <QWidget>
class VisualDeckDisplayOptionsWidget : public QWidget
{
Q_OBJECT
signals:
void displayTypeChanged(const DisplayType &displayType);
void groupCriteriaChanged(const QString &activeGroupCriteria);
void sortCriteriaChanged(const QStringList &activeSortCriteria);
public slots:
void retranslateUi();
public:
explicit VisualDeckDisplayOptionsWidget(QWidget *parent);
DisplayType getDisplayType() const
{
return currentDisplayType;
}
QString getActiveGroupCriteria() const
{
return activeGroupCriteria;
}
QStringList getActiveSortCriteria() const
{
return activeSortCriteria;
}
private slots:
void onSortCriteriaChange();
void updateDisplayType();
private:
QHBoxLayout *groupAndSortLayout;
DisplayType currentDisplayType = DisplayType::Overlap;
QPushButton *displayTypeButton;
QLabel *groupByLabel;
QComboBox *groupByComboBox;
QString activeGroupCriteria = "maintype";
SettingsButtonWidget *sortCriteriaButton;
QLabel *sortByLabel;
QLabel *sortLabel;
QListWidget *sortByListWidget;
QStringList activeSortCriteria = {"name", "cmc", "colors", "maintype"};
};
#endif // COCKATRICE_VISUAL_DECK_DISPLAY_OPTIONS_WIDGET_H

View file

@ -9,6 +9,7 @@
#include "../general/layout_containers/flow_widget.h" #include "../general/layout_containers/flow_widget.h"
#include "../tabs/visual_deck_editor/tab_deck_editor_visual.h" #include "../tabs/visual_deck_editor/tab_deck_editor_visual.h"
#include "../tabs/visual_deck_editor/tab_deck_editor_visual_tab_widget.h" #include "../tabs/visual_deck_editor/tab_deck_editor_visual_tab_widget.h"
#include "visual_deck_display_options_widget.h"
#include <QCheckBox> #include <QCheckBox>
#include <QCompleter> #include <QCompleter>
@ -109,75 +110,22 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent,
} }
}); });
groupAndSortContainer = new QWidget(this); displayOptionsAndSearch = new QWidget(this);
groupAndSortLayout = new QHBoxLayout(groupAndSortContainer); displayOptionsAndSearchLayout = new QHBoxLayout(displayOptionsAndSearch);
groupAndSortLayout->setAlignment(Qt::AlignLeft); displayOptionsAndSearchLayout->setAlignment(Qt::AlignLeft);
groupAndSortContainer->setLayout(groupAndSortLayout); displayOptionsAndSearch->setLayout(displayOptionsAndSearchLayout);
groupByLabel = new QLabel(groupAndSortContainer); displayOptionsWidget = new VisualDeckDisplayOptionsWidget(this);
connect(displayOptionsWidget, &VisualDeckDisplayOptionsWidget::displayTypeChanged, this,
&VisualDeckEditorWidget::displayTypeChanged);
connect(displayOptionsWidget, &VisualDeckDisplayOptionsWidget::groupCriteriaChanged, this,
&VisualDeckEditorWidget::activeGroupCriteriaChanged);
connect(displayOptionsWidget, &VisualDeckDisplayOptionsWidget::sortCriteriaChanged, this,
&VisualDeckEditorWidget::activeSortCriteriaChanged);
groupByComboBox = new QComboBox(this); displayOptionsAndSearchLayout->addWidget(displayOptionsWidget);
if (auto tabWidget = qobject_cast<TabDeckEditorVisualTabWidget *>(parent)) { displayOptionsAndSearchLayout->addWidget(searchBar);
// Inside a central widget QWidget container inside TabDeckEditorVisual displayOptionsAndSearchLayout->addWidget(searchPushButton);
if (auto tab = qobject_cast<TabDeckEditorVisual *>(tabWidget->parent()->parent())) {
auto originalBox = tab->getDeckDockWidget()->getGroupByComboBox();
groupByComboBox->setModel(originalBox->model());
groupByComboBox->setModelColumn(originalBox->modelColumn());
// Original -> clone
connect(originalBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
[this](int index) { groupByComboBox->setCurrentIndex(index); });
// Clone -> original
connect(groupByComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
[originalBox](int index) { originalBox->setCurrentIndex(index); });
}
} else {
QStringList groupProperties = {"maintype", "colors", "cmc", "name"};
groupByComboBox->addItems(groupProperties);
groupByComboBox->setMinimumWidth(300);
connect(groupByComboBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged), this,
&VisualDeckEditorWidget::actChangeActiveGroupCriteria);
actChangeActiveGroupCriteria();
}
sortByLabel = new QLabel(groupAndSortContainer);
sortCriteriaButton = new SettingsButtonWidget(this);
sortLabel = new QLabel(sortCriteriaButton);
sortLabel->setWordWrap(true);
QStringList sortProperties = {"colors", "cmc", "name", "maintype"};
sortByListWidget = new QListWidget();
sortByListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
sortByListWidget->setDragDropMode(QAbstractItemView::InternalMove);
sortByListWidget->setDefaultDropAction(Qt::MoveAction);
for (const QString &property : sortProperties) {
QListWidgetItem *item = new QListWidgetItem(property, sortByListWidget);
item->setFlags(item->flags() | Qt::ItemIsDragEnabled | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
}
connect(sortByListWidget->model(), &QAbstractItemModel::rowsMoved, this,
&VisualDeckEditorWidget::actChangeActiveSortCriteria);
actChangeActiveSortCriteria();
sortByListWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
sortCriteriaButton->addSettingsWidget(sortLabel);
sortCriteriaButton->addSettingsWidget(sortByListWidget);
displayTypeButton = new QPushButton(this);
connect(displayTypeButton, &QPushButton::clicked, this, &VisualDeckEditorWidget::updateDisplayType);
groupAndSortLayout->addWidget(groupByLabel);
groupAndSortLayout->addWidget(groupByComboBox);
groupAndSortLayout->addWidget(sortByLabel);
groupAndSortLayout->addWidget(sortCriteriaButton);
groupAndSortLayout->addWidget(displayTypeButton);
groupAndSortLayout->addWidget(searchBar);
groupAndSortLayout->addWidget(searchPushButton);
scrollArea = new QScrollArea(this); scrollArea = new QScrollArea(this);
scrollArea->setWidgetResizable(true); scrollArea->setWidgetResizable(true);
@ -197,7 +145,7 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent,
connect(cardSizeWidget, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance(), connect(cardSizeWidget, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance(),
&SettingsCache::setVisualDeckEditorCardSize); &SettingsCache::setVisualDeckEditorCardSize);
mainLayout->addWidget(groupAndSortContainer); mainLayout->addWidget(displayOptionsAndSearch);
mainLayout->addWidget(scrollArea); mainLayout->addWidget(scrollArea);
mainLayout->addWidget(cardSizeWidget); mainLayout->addWidget(cardSizeWidget);
@ -218,17 +166,9 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent,
void VisualDeckEditorWidget::retranslateUi() void VisualDeckEditorWidget::retranslateUi()
{ {
searchBar->setPlaceholderText(tr("Type a card name here for suggestions from the database...")); searchBar->setPlaceholderText(tr("Type a card name here for suggestions from the database..."));
groupByLabel->setText(tr("Group by:"));
groupByComboBox->setToolTip(tr("Change how cards are divided into categories/groups."));
sortByLabel->setText(tr("Sort by:"));
sortLabel->setText(tr("Click and drag to change the sort order within the groups"));
searchPushButton->setText(tr("Quick search and add card")); searchPushButton->setText(tr("Quick search and add card"));
searchPushButton->setToolTip(tr("Search for closest match in the database (with auto-suggestions) and add " searchPushButton->setToolTip(tr("Search for closest match in the database (with auto-suggestions) and add "
"preferred printing to the deck on pressing enter")); "preferred printing to the deck on pressing enter"));
sortCriteriaButton->setToolTip(tr("Configure how cards are sorted within their groups"));
displayTypeButton->setText(tr("Toggle Layout: Overlap"));
displayTypeButton->setToolTip(
tr("Change how cards are displayed within zones (i.e. overlapped or fully visible.)"));
} }
void VisualDeckEditorWidget::setSelectionModel(QItemSelectionModel *model) void VisualDeckEditorWidget::setSelectionModel(QItemSelectionModel *model)
@ -326,8 +266,9 @@ void VisualDeckEditorWidget::constructZoneWidgetForIndex(QPersistentModelIndex p
{ {
DeckCardZoneDisplayWidget *zoneDisplayWidget = new DeckCardZoneDisplayWidget( DeckCardZoneDisplayWidget *zoneDisplayWidget = new DeckCardZoneDisplayWidget(
zoneContainer, deckListModel, selectionModel, persistent, zoneContainer, deckListModel, selectionModel, persistent,
deckListModel->data(persistent.sibling(persistent.row(), 1), Qt::EditRole).toString(), activeGroupCriteria, deckListModel->data(persistent.sibling(persistent.row(), 1), Qt::EditRole).toString(),
activeSortCriteria, currentDisplayType, 20, 10, cardSizeWidget); displayOptionsWidget->getActiveGroupCriteria(), displayOptionsWidget->getActiveSortCriteria(),
displayOptionsWidget->getDisplayType(), 20, 10, cardSizeWidget);
connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardHovered, this, &VisualDeckEditorWidget::onHover); connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardHovered, this, &VisualDeckEditorWidget::onHover);
connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardClicked, this, &VisualDeckEditorWidget::onCardClick); connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardClicked, this, &VisualDeckEditorWidget::onCardClick);
connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::requestCleanup, this, connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::requestCleanup, this,
@ -338,7 +279,7 @@ void VisualDeckEditorWidget::constructZoneWidgetForIndex(QPersistentModelIndex p
&DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged); &DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged);
connect(this, &VisualDeckEditorWidget::displayTypeChanged, zoneDisplayWidget, connect(this, &VisualDeckEditorWidget::displayTypeChanged, zoneDisplayWidget,
&DeckCardZoneDisplayWidget::refreshDisplayType); &DeckCardZoneDisplayWidget::refreshDisplayType);
zoneDisplayWidget->refreshDisplayType(currentDisplayType); zoneDisplayWidget->refreshDisplayType(displayOptionsWidget->getDisplayType());
zoneContainerLayout->addWidget(zoneDisplayWidget); zoneContainerLayout->addWidget(zoneDisplayWidget);
indexToWidgetMap.insert(persistent, zoneDisplayWidget); indexToWidgetMap.insert(persistent, zoneDisplayWidget);
@ -370,48 +311,12 @@ void VisualDeckEditorWidget::updateZoneWidgets()
{ {
} }
void VisualDeckEditorWidget::updateDisplayType()
{
// Toggle the display type
currentDisplayType = (currentDisplayType == DisplayType::Overlap) ? DisplayType::Flat : DisplayType::Overlap;
// Update UI and emit signal
switch (currentDisplayType) {
case DisplayType::Flat:
displayTypeButton->setText(tr("Toggle Layout: Flat"));
break;
case DisplayType::Overlap:
displayTypeButton->setText(tr("Toggle Layout: Overlap"));
break;
}
emit displayTypeChanged(currentDisplayType);
}
void VisualDeckEditorWidget::resizeEvent(QResizeEvent *event) void VisualDeckEditorWidget::resizeEvent(QResizeEvent *event)
{ {
QWidget::resizeEvent(event); QWidget::resizeEvent(event);
zoneContainer->setMaximumWidth(scrollArea->viewport()->width()); zoneContainer->setMaximumWidth(scrollArea->viewport()->width());
} }
void VisualDeckEditorWidget::actChangeActiveGroupCriteria()
{
activeGroupCriteria = groupByComboBox->currentText();
emit activeGroupCriteriaChanged(activeGroupCriteria);
}
void VisualDeckEditorWidget::actChangeActiveSortCriteria()
{
QStringList selectedCriteria;
for (int i = 0; i < sortByListWidget->count(); ++i) {
QListWidgetItem *item = sortByListWidget->item(i);
selectedCriteria.append(item->text()); // Collect user-defined sort order
}
activeSortCriteria = selectedCriteria;
emit activeSortCriteriaChanged(selectedCriteria);
}
void VisualDeckEditorWidget::decklistModelReset() void VisualDeckEditorWidget::decklistModelReset()
{ {
clearAllDisplayWidgets(); clearAllDisplayWidgets();

View file

@ -23,6 +23,7 @@
#include <libcockatrice/models/deck_list/deck_list_model.h> #include <libcockatrice/models/deck_list/deck_list_model.h>
#include <qscrollarea.h> #include <qscrollarea.h>
class VisualDeckDisplayOptionsWidget;
class DeckCardZoneDisplayWidget; class DeckCardZoneDisplayWidget;
enum class DisplayType enum class DisplayType
{ {
@ -55,7 +56,6 @@ public:
public slots: public slots:
void decklistDataChanged(QModelIndex topLeft, QModelIndex bottomRight); void decklistDataChanged(QModelIndex topLeft, QModelIndex bottomRight);
void updateZoneWidgets(); void updateZoneWidgets();
void updateDisplayType();
void cleanupInvalidZones(DeckCardZoneDisplayWidget *displayWidget); void cleanupInvalidZones(DeckCardZoneDisplayWidget *displayWidget);
void onCardAddition(const QModelIndex &parent, int first, int last); void onCardAddition(const QModelIndex &parent, int first, int last);
void onCardRemoval(const QModelIndex &parent, int first, int last); void onCardRemoval(const QModelIndex &parent, int first, int last);
@ -73,8 +73,6 @@ signals:
protected slots: protected slots:
void onHover(const ExactCard &hoveredCard); void onHover(const ExactCard &hoveredCard);
void onCardClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *instance, QString zoneName); void onCardClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *instance, QString zoneName);
void actChangeActiveGroupCriteria();
void actChangeActiveSortCriteria();
void decklistModelReset(); void decklistModelReset();
private: private:
@ -85,19 +83,10 @@ private:
CardDatabaseDisplayModel *cardDatabaseDisplayModel; CardDatabaseDisplayModel *cardDatabaseDisplayModel;
CardCompleterProxyModel *proxyModel; CardCompleterProxyModel *proxyModel;
QCompleter *completer; QCompleter *completer;
QWidget *displayOptionsAndSearch;
QHBoxLayout *displayOptionsAndSearchLayout;
VisualDeckDisplayOptionsWidget *displayOptionsWidget;
QPushButton *searchPushButton; QPushButton *searchPushButton;
DisplayType currentDisplayType = DisplayType::Overlap;
QPushButton *displayTypeButton;
QWidget *groupAndSortContainer;
QHBoxLayout *groupAndSortLayout;
QLabel *groupByLabel;
QComboBox *groupByComboBox;
QString activeGroupCriteria = "maintype";
SettingsButtonWidget *sortCriteriaButton;
QLabel *sortByLabel;
QLabel *sortLabel;
QListWidget *sortByListWidget;
QStringList activeSortCriteria = {"name", "cmc", "colors", "maintype"};
QScrollArea *scrollArea; QScrollArea *scrollArea;
QWidget *zoneContainer; QWidget *zoneContainer;
QVBoxLayout *zoneContainerLayout; QVBoxLayout *zoneContainerLayout;

View file

@ -74,6 +74,29 @@ enum Type
MANA_COST, /**< Group cards by their total mana cost. */ MANA_COST, /**< Group cards by their total mana cost. */
COLOR /**< Group cards by their color identity. */ COLOR /**< Group cards by their color identity. */
}; };
static inline QString toString(Type t)
{
switch (t) {
case MAIN_TYPE:
return "Main Type";
case MANA_COST:
return "Mana Cost";
case COLOR:
return "Colors";
}
return {};
}
static inline Type fromString(const QString &s)
{
if (s == "Main Type")
return MAIN_TYPE;
if (s == "Mana Cost")
return MANA_COST;
if (s == "Colors")
return COLOR;
return MAIN_TYPE; // default
}
} // namespace DeckListModelGroupCriteria } // namespace DeckListModelGroupCriteria
/** /**