Fix and improve sorting, properly layout grouping and sorting.

This commit is contained in:
Lukas Brübach 2025-03-08 10:24:09 +01:00
parent c9f95e1df1
commit edd0199efb
6 changed files with 102 additions and 76 deletions

View file

@ -10,7 +10,7 @@ DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent,
DeckListModel *_deckListModel,
QString _zoneName,
QString _activeGroupCriteria,
QString _activeSortCriteria,
QStringList _activeSortCriteria,
int bannerOpacity,
int subBannerOpacity)
: QWidget(parent), deckListModel(_deckListModel), zoneName(_zoneName), activeGroupCriteria(_activeGroupCriteria),
@ -108,7 +108,7 @@ void DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged(QString _activeGrou
displayCards();
}
void DeckCardZoneDisplayWidget::onActiveSortCriteriaChanged(QString _activeSortCriteria)
void DeckCardZoneDisplayWidget::onActiveSortCriteriaChanged(QStringList _activeSortCriteria)
{
activeSortCriteria = _activeSortCriteria;
emit activeSortCriteriaChanged(activeSortCriteria);

View file

@ -19,7 +19,7 @@ public:
DeckListModel *deckListModel,
QString zoneName,
QString activeGroupCriteria,
QString activeSortCriteria,
QStringList activeSortCriteria,
int bannerOpacity,
int subBannerOpacity);
DeckListModel *deckListModel;
@ -34,17 +34,17 @@ public slots:
void addCardGroupIfItDoesNotExist();
void deleteCardGroupIfItDoesNotExist();
void onActiveGroupCriteriaChanged(QString activeGroupCriteria);
void onActiveSortCriteriaChanged(QString activeSortCriteria);
void onActiveSortCriteriaChanged(QStringList activeSortCriteria);
QList<QString> getGroupCriteriaValueList();
signals:
void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card, QString zoneName);
void cardHovered(CardInfoPtr card);
void activeSortCriteriaChanged(QString activeSortCriteria);
void activeSortCriteriaChanged(QStringList activeSortCriteria);
private:
QString activeGroupCriteria;
QString activeSortCriteria;
QStringList activeSortCriteria;
QVBoxLayout *layout;
BannerWidget *banner;
QWidget *cardGroupContainer;

View file

@ -12,7 +12,7 @@ OverlappedCardGroupDisplayWidget::OverlappedCardGroupDisplayWidget(QWidget *pare
QString _zoneName,
QString _cardGroupCategory,
QString _activeGroupCriteria,
QString _activeSortCriteria,
QStringList _activeSortCriteria,
int bannerOpacity)
: QWidget(parent), deckListModel(_deckListModel), zoneName(_zoneName), cardGroupCategory(_cardGroupCategory),
activeGroupCriteria(_activeGroupCriteria), activeSortCriteria(_activeSortCriteria)
@ -33,69 +33,70 @@ OverlappedCardGroupDisplayWidget::OverlappedCardGroupDisplayWidget(QWidget *pare
void OverlappedCardGroupDisplayWidget::updateCardDisplays()
{
// Retrieve and sort cards
QList<CardInfoPtr> cardsInZone = getCardsMatchingGroup(deckListModel->getCardsAsCardInfoPtrsForZone(zoneName));
// Show or hide widget
bool shouldBeVisible = !cardsInZone.isEmpty();
if (shouldBeVisible != isVisible()) {
setVisible(shouldBeVisible);
}
// Retrieve existing widgets
QList<CardInfoPictureWithTextOverlayWidget *> existingWidgets =
overlapWidget->findChildren<CardInfoPictureWithTextOverlayWidget *>();
QHash<QString, int> requiredCounts;
for (const CardInfoPtr &card : cardsInZone) {
requiredCounts[card->getName()]++;
}
QHash<QString, QList<CardInfoPictureWithTextOverlayWidget *>> widgetMap;
for (CardInfoPictureWithTextOverlayWidget *widget : existingWidgets) {
widgetMap[widget->getInfo()->getName()].append(widget);
}
// Remove excess widgets
for (auto it = widgetMap.begin(); it != widgetMap.end(); ++it) {
QString name = it.key();
QList<CardInfoPictureWithTextOverlayWidget *> &widgets = it.value();
int neededCount = requiredCounts.value(name, 0);
while (widgets.size() > neededCount) {
CardInfoPictureWithTextOverlayWidget *widgetToRemove = widgets.takeLast();
overlapWidget->layout()->removeWidget(widgetToRemove); // Remove from layout
delete widgetToRemove;
}
}
// Add missing widgets and reorder existing ones
QList<CardInfoPictureWithTextOverlayWidget *> sortedWidgets;
QSet<CardInfoPictureWithTextOverlayWidget *> usedWidgets;
// Ensure widgets are ordered to match the sorted cards
for (const CardInfoPtr &card : cardsInZone) {
QString name = card->getName();
CardInfoPictureWithTextOverlayWidget *widget = nullptr;
if (!widgetMap[name].isEmpty()) {
// Use existing widget
CardInfoPictureWithTextOverlayWidget *widget = widgetMap[name].takeFirst();
sortedWidgets.append(widget);
// Reuse an existing widget
widget = widgetMap[name].takeFirst();
} else {
// Create new widget if needed
auto *display = new CardInfoPictureWithTextOverlayWidget(overlapWidget, true);
display->setCard(card);
// Create a new widget if needed
widget = new CardInfoPictureWithTextOverlayWidget(overlapWidget, true);
widget->setCard(card);
connect(display, &CardInfoPictureWithTextOverlayWidget::imageClicked, this,
connect(widget, &CardInfoPictureWithTextOverlayWidget::imageClicked, this,
&OverlappedCardGroupDisplayWidget::onClick);
connect(display, &CardInfoPictureWithTextOverlayWidget::hoveredOnCard, this,
connect(widget, &CardInfoPictureWithTextOverlayWidget::hoveredOnCard, this,
&OverlappedCardGroupDisplayWidget::onHover);
sortedWidgets.append(display);
overlapWidget->addWidget(display);
overlapWidget->addWidget(widget);
}
// Store in sorted order
sortedWidgets.append(widget);
usedWidgets.insert(widget);
}
// Remove extra widgets
for (CardInfoPictureWithTextOverlayWidget *widget : existingWidgets) {
if (!usedWidgets.contains(widget)) {
overlapWidget->layout()->removeWidget(widget);
delete widget;
}
}
// **Reorder Widgets in Layout**
for (CardInfoPictureWithTextOverlayWidget *widget : sortedWidgets) {
overlapWidget->removeWidget(widget);
overlapWidget->addWidget(widget);
// **Reorder widgets in place**
for (int i = 0; i < sortedWidgets.size(); ++i) {
sortedWidgets[i]->setParent(nullptr); // Temporarily detach
}
for (int i = 0; i < sortedWidgets.size(); ++i) {
overlapWidget->addWidget(sortedWidgets[i]); // Reattach in correct order
}
// Ensure proper layering
for (CardInfoPictureWithTextOverlayWidget *widget : sortedWidgets) {
widget->raise();
}
@ -105,35 +106,29 @@ void OverlappedCardGroupDisplayWidget::updateCardDisplays()
QList<CardInfoPtr> OverlappedCardGroupDisplayWidget::getCardsMatchingGroup(QList<CardInfoPtr> cardsToSort)
{
cardsToSort = sortCardList(cardsToSort, activeSortCriteria, Qt::SortOrder::AscendingOrder);
QList<CardInfoPtr> activeList;
QStringList sortCriteria;
sortCriteria.append(activeSortCriteria);
sortCardList(cardsToSort, sortCriteria, Qt::SortOrder::AscendingOrder);
for (int i = 0; i < cardsToSort.size(); ++i) {
CardInfoPtr info = cardsToSort.at(i);
if (info) {
if (info->getProperty(activeGroupCriteria) == cardGroupCategory) {
activeList.append(info);
}
} else {
qDebug() << "Card not found in database!";
for (const CardInfoPtr &info : cardsToSort) {
if (info && info->getProperty(activeGroupCriteria) == cardGroupCategory) {
activeList.append(info);
}
}
return activeList;
}
void OverlappedCardGroupDisplayWidget::sortCardList(QList<CardInfoPtr> cardsToSort,
const QStringList properties,
Qt::SortOrder order = Qt::AscendingOrder)
QList<CardInfoPtr> OverlappedCardGroupDisplayWidget::sortCardList(QList<CardInfoPtr> cardsToSort,
const QStringList properties,
Qt::SortOrder order = Qt::AscendingOrder)
{
CardInfoComparator comparator(properties, order);
std::sort(cardsToSort.begin(), cardsToSort.end(), comparator);
return cardsToSort;
}
void OverlappedCardGroupDisplayWidget::onActiveSortCriteriaChanged(QString _activeSortCriteria)
void OverlappedCardGroupDisplayWidget::onActiveSortCriteriaChanged(QStringList _activeSortCriteria)
{
if (activeSortCriteria != _activeSortCriteria) {
activeSortCriteria = _activeSortCriteria;

View file

@ -21,7 +21,7 @@ public:
QString zoneName,
QString cardGroupCategory,
QString activeGroupCriteria,
QString activeSortCriteria,
QStringList activeSortCriteria,
int bannerOpacity);
QList<CardInfoPtr> getCardsMatchingGroup(QList<CardInfoPtr> cardsToSort);
@ -31,14 +31,14 @@ public:
QString zoneName;
QString cardGroupCategory;
QString activeGroupCriteria;
QString activeSortCriteria;
QStringList activeSortCriteria;
public slots:
void sortCardList(QList<CardInfoPtr> cardsToSort, QStringList properties, Qt::SortOrder order);
QList<CardInfoPtr> sortCardList(QList<CardInfoPtr> cardsToSort, QStringList properties, Qt::SortOrder order);
void onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card);
void onHover(CardInfoPtr card);
void updateCardDisplays();
void onActiveSortCriteriaChanged(QString activeSortCriteria);
void onActiveSortCriteriaChanged(QStringList activeSortCriteria);
signals:
void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card);

View file

@ -27,6 +27,11 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, DeckListModel *_
mainLayout = new QVBoxLayout();
this->setLayout(mainLayout);
groupAndSortContainer = new QWidget(this);
groupAndSortLayout = new QHBoxLayout(groupAndSortContainer);
groupAndSortLayout->setAlignment(Qt::AlignLeft);
groupAndSortContainer->setLayout(groupAndSortLayout);
groupByComboBox = new QComboBox();
QStringList groupProperties;
groupProperties << "maintype"
@ -34,21 +39,35 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, DeckListModel *_
<< "cmc"
<< "name";
groupByComboBox->addItems(groupProperties);
groupByComboBox->setMinimumWidth(300);
connect(groupByComboBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged), this,
&VisualDeckEditorWidget::actChangeActiveGroupCriteria);
actChangeActiveGroupCriteria();
sortByComboBox = new QComboBox();
QStringList sortProperties;
sortProperties << "name"
<< "cmc"
<< "colors"
<< "maintype";
sortByComboBox->addItems(sortProperties);
connect(sortByComboBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged), this,
sortCriteriaButton = new SettingsButtonWidget(this);
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);
// connect(sortByListWidget, &QListWidget::itemChanged, this, &VisualDeckEditorWidget::actChangeActiveSortCriteria);
actChangeActiveSortCriteria();
sortByListWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
sortCriteriaButton->addSettingsWidget(sortByListWidget);
groupAndSortLayout->addWidget(groupByComboBox);
groupAndSortLayout->addWidget(sortCriteriaButton);
scrollArea = new QScrollArea();
scrollArea->setWidgetResizable(true);
scrollArea->setMinimumSize(0, 0);
@ -67,8 +86,7 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, DeckListModel *_
overlapControlWidget = new OverlapControlWidget(80, 1, 1, Qt::Vertical, this);
mainLayout->addWidget(groupByComboBox);
mainLayout->addWidget(sortByComboBox);
mainLayout->addWidget(groupAndSortContainer);
mainLayout->addWidget(scrollArea);
mainLayout->addWidget(overlapControlWidget);
}
@ -139,8 +157,16 @@ void VisualDeckEditorWidget::actChangeActiveGroupCriteria()
void VisualDeckEditorWidget::actChangeActiveSortCriteria()
{
activeSortCriteria = sortByComboBox->currentText();
emit activeSortCriteriaChanged(activeSortCriteria);
qDebug() << "lol lmao, triggered";
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::decklistDataChanged(QModelIndex topLeft, QModelIndex bottomRight)

View file

@ -6,7 +6,9 @@
#include "../cards/card_info_picture_with_text_overlay_widget.h"
#include "../general/layout_containers/flow_widget.h"
#include "../general/layout_containers/overlap_control_widget.h"
#include "../quick_settings/settings_button_widget.h"
#include <QListWidget>
#include <QWidget>
#include <qscrollarea.h>
@ -29,7 +31,7 @@ public slots:
signals:
void activeCardChanged(CardInfoPtr activeCard);
void activeGroupCriteriaChanged(QString activeGroupCriteria);
void activeSortCriteriaChanged(QString activeSortCriteria);
void activeSortCriteriaChanged(QStringList activeSortCriteria);
void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *instance, QString zoneName);
protected slots:
@ -41,10 +43,13 @@ protected slots:
private:
DeckListModel *deckListModel;
QVBoxLayout *mainLayout;
QWidget *groupAndSortContainer;
QHBoxLayout *groupAndSortLayout;
QComboBox *groupByComboBox;
QString activeGroupCriteria = "maintype";
QComboBox *sortByComboBox;
QString activeSortCriteria = "name";
SettingsButtonWidget *sortCriteriaButton;
QListWidget *sortByListWidget;
QStringList activeSortCriteria = {"name", "cmc", "colors", "maintype"};
QScrollArea *scrollArea;
QWidget *zoneContainer;
QVBoxLayout *zoneContainerLayout;