mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-07-09 17:44:01 -07:00
Allow TabArchidekt to use VDE group/sort/display buttons
This commit is contained in:
parent
b4d33597c2
commit
16350799bf
8 changed files with 253 additions and 136 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue