Implement separate comboBoxes for sorting and grouping.

This commit is contained in:
Lukas Brübach 2025-03-01 22:58:55 +01:00
parent f66961e488
commit 34287b0714
6 changed files with 121 additions and 41 deletions

View file

@ -9,11 +9,12 @@
DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent, DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent,
DeckListModel *_deckListModel, DeckListModel *_deckListModel,
QString _zoneName, QString _zoneName,
QString _activeGroupCriteria,
QString _activeSortCriteria, QString _activeSortCriteria,
int bannerOpacity, int bannerOpacity,
int subBannerOpacity) int subBannerOpacity)
: QWidget(parent), deckListModel(_deckListModel), zoneName(_zoneName), activeSortCriteria(_activeSortCriteria), : QWidget(parent), deckListModel(_deckListModel), zoneName(_zoneName), activeGroupCriteria(_activeGroupCriteria),
bannerOpacity(bannerOpacity), subBannerOpacity(subBannerOpacity) activeSortCriteria(_activeSortCriteria), bannerOpacity(bannerOpacity), subBannerOpacity(subBannerOpacity)
{ {
layout = new QVBoxLayout(this); layout = new QVBoxLayout(this);
setLayout(layout); setLayout(layout);
@ -61,7 +62,7 @@ void DeckCardZoneDisplayWidget::addCardGroupIfItDoesNotExist()
QList<OverlappedCardGroupDisplayWidget *> cardGroupsDisplayWidgets = QList<OverlappedCardGroupDisplayWidget *> cardGroupsDisplayWidgets =
cardGroupContainer->findChildren<OverlappedCardGroupDisplayWidget *>(); cardGroupContainer->findChildren<OverlappedCardGroupDisplayWidget *>();
QList<QString> cardGroups = getSortCriteriaValueList(); QList<QString> cardGroups = getGroupCriteriaValueList();
for (QString cardGroup : cardGroups) { for (QString cardGroup : cardGroups) {
bool found = false; bool found = false;
@ -72,11 +73,13 @@ void DeckCardZoneDisplayWidget::addCardGroupIfItDoesNotExist()
} }
if (!found) { if (!found) {
OverlappedCardGroupDisplayWidget *display_widget = new OverlappedCardGroupDisplayWidget( OverlappedCardGroupDisplayWidget *display_widget = new OverlappedCardGroupDisplayWidget(cardGroupContainer, deckListModel, zoneName, cardGroup,
this, deckListModel, zoneName, cardGroup, activeSortCriteria, subBannerOpacity); activeGroupCriteria, activeSortCriteria, subBannerOpacity);
connect(display_widget, SIGNAL(cardClicked(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)), this, connect(display_widget, SIGNAL(cardClicked(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)), this,
SLOT(onClick(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *))); SLOT(onClick(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)));
connect(display_widget, SIGNAL(cardHovered(CardInfoPtr)), this, SLOT(onHover(CardInfoPtr))); connect(display_widget, SIGNAL(cardHovered(CardInfoPtr)), this, SLOT(onHover(CardInfoPtr)));
connect(this, &DeckCardZoneDisplayWidget::activeSortCriteriaChanged, display_widget,
&OverlappedCardGroupDisplayWidget::onActiveSortCriteriaChanged);
cardGroupLayout->addWidget(display_widget); cardGroupLayout->addWidget(display_widget);
} }
} }
@ -85,37 +88,59 @@ void DeckCardZoneDisplayWidget::addCardGroupIfItDoesNotExist()
void DeckCardZoneDisplayWidget::deleteCardGroupIfItDoesNotExist() void DeckCardZoneDisplayWidget::deleteCardGroupIfItDoesNotExist()
{ {
QList<OverlappedCardGroupDisplayWidget *> cardGroupsDisplayWidgets = QList<OverlappedCardGroupDisplayWidget *> cardGroupsDisplayWidgets =
cardGroupLayout->findChildren<OverlappedCardGroupDisplayWidget *>(); cardGroupContainer->findChildren<OverlappedCardGroupDisplayWidget *>();
QList<QString> validGroups = getGroupCriteriaValueList();
qDebug() << "DeckCardZoneDisplayWidget: Checking for obsolete card groups.";
qDebug() << "Valid groups (should remain):" << validGroups;
for (OverlappedCardGroupDisplayWidget *cardGroupDisplayWidget : cardGroupsDisplayWidgets) { for (OverlappedCardGroupDisplayWidget *cardGroupDisplayWidget : cardGroupsDisplayWidgets) {
bool found = false; qDebug() << "Checking group:" << cardGroupDisplayWidget->cardGroupCategory;
for (QString cardGroup : getSortCriteriaValueList()) {
if (cardGroupDisplayWidget->cardGroupCategory == cardGroup) { if (!validGroups.contains(cardGroupDisplayWidget->cardGroupCategory)) {
found = true; qDebug() << "Deleting group:" << cardGroupDisplayWidget->cardGroupCategory;
cardGroupLayout->removeWidget(cardGroupDisplayWidget);
cardGroupDisplayWidget->deleteLater(); // Properly delete the widget after the event loop cycles
} else {
qDebug() << "Keeping group:" << cardGroupDisplayWidget->cardGroupCategory;
} }
} }
if (!found) { qDebug() << "Finished checking for obsolete card groups.";
cardGroupLayout->removeWidget(cardGroupDisplayWidget); }
}
} void DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged(QString _activeGroupCriteria)
{
activeGroupCriteria = _activeGroupCriteria;
qDebug() << "DeckCardZoneDisplayWidget says: We group by " << activeGroupCriteria << " and display cards";
displayCards();
} }
void DeckCardZoneDisplayWidget::onActiveSortCriteriaChanged(QString _activeSortCriteria) void DeckCardZoneDisplayWidget::onActiveSortCriteriaChanged(QString _activeSortCriteria)
{ {
activeSortCriteria = _activeSortCriteria; activeSortCriteria = _activeSortCriteria;
qDebug() << "DeckCardZoneDisplayWidget says: we sort by" << activeSortCriteria << " and emit a signal";
emit activeSortCriteriaChanged(activeSortCriteria);
} }
QList<QString> DeckCardZoneDisplayWidget::getSortCriteriaValueList() QList<QString> DeckCardZoneDisplayWidget::getGroupCriteriaValueList()
{ {
QList<QString> sortCriteriaValues; QList<QString> groupCriteriaValues;
QList<CardInfoPtr> *cardsInZone = deckListModel->getCardsAsCardInfoPtrsForZone(zoneName); QList<CardInfoPtr> *cardsInZone = deckListModel->getCardsAsCardInfoPtrsForZone(zoneName);
for (CardInfoPtr cardInZone : *cardsInZone) { for (CardInfoPtr cardInZone : *cardsInZone) {
sortCriteriaValues.append(cardInZone->getProperty(activeSortCriteria)); groupCriteriaValues.append(cardInZone->getProperty(activeGroupCriteria));
} }
sortCriteriaValues.removeDuplicates(); groupCriteriaValues.removeDuplicates();
sortCriteriaValues.sort(); groupCriteriaValues.sort();
return sortCriteriaValues;
qDebug() << "These are the group by criteria values";
for (QString groupCriteria : groupCriteriaValues) {
qDebug() << groupCriteria;
}
return groupCriteriaValues;
} }

View file

@ -18,6 +18,7 @@ public:
DeckCardZoneDisplayWidget(QWidget *parent, DeckCardZoneDisplayWidget(QWidget *parent,
DeckListModel *deckListModel, DeckListModel *deckListModel,
QString zoneName, QString zoneName,
QString activeGroupCriteria,
QString activeSortCriteria, QString activeSortCriteria,
int bannerOpacity, int bannerOpacity,
int subBannerOpacity); int subBannerOpacity);
@ -32,14 +33,17 @@ public slots:
void displayCards(); void displayCards();
void addCardGroupIfItDoesNotExist(); void addCardGroupIfItDoesNotExist();
void deleteCardGroupIfItDoesNotExist(); void deleteCardGroupIfItDoesNotExist();
void onActiveGroupCriteriaChanged(QString activeGroupCriteria);
void onActiveSortCriteriaChanged(QString activeSortCriteria); void onActiveSortCriteriaChanged(QString activeSortCriteria);
QList<QString> getSortCriteriaValueList(); QList<QString> getGroupCriteriaValueList();
signals: signals:
void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card, QString zoneName); void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card, QString zoneName);
void cardHovered(CardInfoPtr card); void cardHovered(CardInfoPtr card);
void activeSortCriteriaChanged(QString activeSortCriteria);
private: private:
QString activeGroupCriteria;
QString activeSortCriteria; QString activeSortCriteria;
QVBoxLayout *layout; QVBoxLayout *layout;
BannerWidget *banner; BannerWidget *banner;

View file

@ -11,10 +11,11 @@ OverlappedCardGroupDisplayWidget::OverlappedCardGroupDisplayWidget(QWidget *pare
DeckListModel *_deckListModel, DeckListModel *_deckListModel,
QString _zoneName, QString _zoneName,
QString _cardGroupCategory, QString _cardGroupCategory,
QString _activeGroupCriteria,
QString _activeSortCriteria, QString _activeSortCriteria,
int bannerOpacity) int bannerOpacity)
: QWidget(parent), deckListModel(_deckListModel), zoneName(_zoneName), cardGroupCategory(_cardGroupCategory), : QWidget(parent), deckListModel(_deckListModel), zoneName(_zoneName), cardGroupCategory(_cardGroupCategory),
activeSortCriteria(_activeSortCriteria) activeGroupCriteria(_activeGroupCriteria), activeSortCriteria(_activeSortCriteria)
{ {
layout = new QVBoxLayout(this); layout = new QVBoxLayout(this);
setLayout(layout); setLayout(layout);
@ -52,6 +53,7 @@ void OverlappedCardGroupDisplayWidget::updateCardDisplays()
widgetMap[widget->getInfo()->getName()].append(widget); widgetMap[widget->getInfo()->getName()].append(widget);
} }
// Remove excess widgets
for (auto it = widgetMap.begin(); it != widgetMap.end(); ++it) { for (auto it = widgetMap.begin(); it != widgetMap.end(); ++it) {
QString name = it.key(); QString name = it.key();
QList<CardInfoPictureWithTextOverlayWidget *> &widgets = it.value(); QList<CardInfoPictureWithTextOverlayWidget *> &widgets = it.value();
@ -59,34 +61,45 @@ void OverlappedCardGroupDisplayWidget::updateCardDisplays()
int neededCount = requiredCounts.value(name, 0); int neededCount = requiredCounts.value(name, 0);
while (widgets.size() > neededCount) { while (widgets.size() > neededCount) {
CardInfoPictureWithTextOverlayWidget *widgetToRemove = widgets.takeLast(); CardInfoPictureWithTextOverlayWidget *widgetToRemove = widgets.takeLast();
overlapWidget->removeWidget(widgetToRemove); overlapWidget->layout()->removeWidget(widgetToRemove); // Remove from layout
delete widgetToRemove; delete widgetToRemove;
} }
} }
for (auto it = requiredCounts.begin(); it != requiredCounts.end(); ++it) { // Add missing widgets and reorder existing ones
QString name = it.key(); QList<CardInfoPictureWithTextOverlayWidget *> sortedWidgets;
int missingCount = it.value() - widgetMap[name].size(); for (const CardInfoPtr &card : cardsInZone) {
QString name = card->getName();
for (int i = 0; i < missingCount; ++i) { if (!widgetMap[name].isEmpty()) {
// Use existing widget
CardInfoPictureWithTextOverlayWidget *widget = widgetMap[name].takeFirst();
sortedWidgets.append(widget);
} else {
// Create new widget if needed
auto *display = new CardInfoPictureWithTextOverlayWidget(overlapWidget, true); auto *display = new CardInfoPictureWithTextOverlayWidget(overlapWidget, true);
display->setCard(card);
auto cardIt = std::find_if(cardsInZone.begin(), cardsInZone.end(),
[&](const CardInfoPtr &c) { return c->getName() == name; });
if (cardIt != cardsInZone.end()) {
display->setCard(*cardIt);
}
connect(display, &CardInfoPictureWithTextOverlayWidget::imageClicked, this, connect(display, &CardInfoPictureWithTextOverlayWidget::imageClicked, this,
&OverlappedCardGroupDisplayWidget::onClick); &OverlappedCardGroupDisplayWidget::onClick);
connect(display, &CardInfoPictureWithTextOverlayWidget::hoveredOnCard, this, connect(display, &CardInfoPictureWithTextOverlayWidget::hoveredOnCard, this,
&OverlappedCardGroupDisplayWidget::onHover); &OverlappedCardGroupDisplayWidget::onHover);
sortedWidgets.append(display);
overlapWidget->addWidget(display); overlapWidget->addWidget(display);
} }
} }
// **Reorder Widgets in Layout**
for (CardInfoPictureWithTextOverlayWidget *widget : sortedWidgets) {
overlapWidget->removeWidget(widget);
overlapWidget->addWidget(widget);
}
for (CardInfoPictureWithTextOverlayWidget *widget : sortedWidgets) {
widget->raise();
}
overlapWidget->adjustMaxColumnsAndRows(); overlapWidget->adjustMaxColumnsAndRows();
} }
@ -101,7 +114,7 @@ QList<CardInfoPtr> OverlappedCardGroupDisplayWidget::getCardsMatchingGroup(QList
for (int i = 0; i < cardsToSort->size(); ++i) { for (int i = 0; i < cardsToSort->size(); ++i) {
CardInfoPtr info = cardsToSort->at(i); CardInfoPtr info = cardsToSort->at(i);
if (info) { if (info) {
if (info->getProperty(activeSortCriteria) == cardGroupCategory) { if (info->getProperty(activeGroupCriteria) == cardGroupCategory) {
activeList.append(info); activeList.append(info);
} }
} else { } else {
@ -120,6 +133,15 @@ void OverlappedCardGroupDisplayWidget::sortCardList(QList<CardInfoPtr> *cardsToS
std::sort(cardsToSort->begin(), cardsToSort->end(), comparator); std::sort(cardsToSort->begin(), cardsToSort->end(), comparator);
} }
void OverlappedCardGroupDisplayWidget::onActiveSortCriteriaChanged(QString _activeSortCriteria)
{
if (activeSortCriteria != _activeSortCriteria) {
activeSortCriteria = _activeSortCriteria;
qDebug() << "OverlappedCardGroupDisplayWidget changed the sort criteria to " << activeSortCriteria;
updateCardDisplays(); // Refresh display with new sorting
}
}
void OverlappedCardGroupDisplayWidget::onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card) void OverlappedCardGroupDisplayWidget::onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card)
{ {
emit cardClicked(event, card); emit cardClicked(event, card);

View file

@ -20,6 +20,7 @@ public:
DeckListModel *deckListModel, DeckListModel *deckListModel,
QString zoneName, QString zoneName,
QString cardGroupCategory, QString cardGroupCategory,
QString activeGroupCriteria,
QString activeSortCriteria, QString activeSortCriteria,
int bannerOpacity); int bannerOpacity);
@ -29,6 +30,7 @@ public:
DeckListModel *deckListModel; DeckListModel *deckListModel;
QString zoneName; QString zoneName;
QString cardGroupCategory; QString cardGroupCategory;
QString activeGroupCriteria;
QString activeSortCriteria; QString activeSortCriteria;
public slots: public slots:
@ -36,6 +38,7 @@ public slots:
void onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card); void onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card);
void onHover(CardInfoPtr card); void onHover(CardInfoPtr card);
void updateCardDisplays(); void updateCardDisplays();
void onActiveSortCriteriaChanged(QString activeSortCriteria);
signals: signals:
void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card); void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card);

View file

@ -27,12 +27,23 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, DeckListModel *_
mainLayout = new QVBoxLayout(); mainLayout = new QVBoxLayout();
this->setLayout(mainLayout); this->setLayout(mainLayout);
sortByComboBox = new QComboBox(); groupByComboBox = new QComboBox();
QStringList sortProperties; QStringList groupProperties;
sortProperties << "maintype" groupProperties << "maintype"
<< "colors" << "colors"
<< "cmc" << "cmc"
<< "name"; << "name";
groupByComboBox->addItems(groupProperties);
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); sortByComboBox->addItems(sortProperties);
connect(sortByComboBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged), this, connect(sortByComboBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged), this,
&VisualDeckEditorWidget::actChangeActiveSortCriteria); &VisualDeckEditorWidget::actChangeActiveSortCriteria);
@ -56,6 +67,7 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, DeckListModel *_
overlapControlWidget = new OverlapControlWidget(80, 1, 1, Qt::Vertical, this); overlapControlWidget = new OverlapControlWidget(80, 1, 1, Qt::Vertical, this);
mainLayout->addWidget(groupByComboBox);
mainLayout->addWidget(sortByComboBox); mainLayout->addWidget(sortByComboBox);
mainLayout->addWidget(scrollArea); mainLayout->addWidget(scrollArea);
mainLayout->addWidget(overlapControlWidget); mainLayout->addWidget(overlapControlWidget);
@ -80,13 +92,15 @@ void VisualDeckEditorWidget::addZoneIfDoesNotExist()
} }
if (!found) { if (!found) {
DeckCardZoneDisplayWidget *zoneDisplayWidget = DeckCardZoneDisplayWidget *zoneDisplayWidget = new DeckCardZoneDisplayWidget(
new DeckCardZoneDisplayWidget(zoneContainer, deckListModel, zone, activeSortCriteria, 20, 10); zoneContainer, deckListModel, zone, activeGroupCriteria, activeSortCriteria, 20, 10);
connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardHovered, this, &VisualDeckEditorWidget::onHover); connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardHovered, this, &VisualDeckEditorWidget::onHover);
connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardClicked, this, connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardClicked, this,
&VisualDeckEditorWidget::onCardClick); &VisualDeckEditorWidget::onCardClick);
connect(this, &VisualDeckEditorWidget::activeSortCriteriaChanged, zoneDisplayWidget, connect(this, &VisualDeckEditorWidget::activeSortCriteriaChanged, zoneDisplayWidget,
&DeckCardZoneDisplayWidget::onActiveSortCriteriaChanged); &DeckCardZoneDisplayWidget::onActiveSortCriteriaChanged);
connect(this, &VisualDeckEditorWidget::activeGroupCriteriaChanged, zoneDisplayWidget,
&DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged);
zoneContainerLayout->addWidget(zoneDisplayWidget); zoneContainerLayout->addWidget(zoneDisplayWidget);
} }
} }
@ -117,9 +131,17 @@ void VisualDeckEditorWidget::resizeEvent(QResizeEvent *event)
zoneContainer->setMaximumWidth(scrollArea->viewport()->width()); zoneContainer->setMaximumWidth(scrollArea->viewport()->width());
} }
void VisualDeckEditorWidget::actChangeActiveGroupCriteria()
{
activeGroupCriteria = groupByComboBox->currentText();
qDebug() << "VDE says we group by " << activeGroupCriteria;
emit activeGroupCriteriaChanged(activeGroupCriteria);
}
void VisualDeckEditorWidget::actChangeActiveSortCriteria() void VisualDeckEditorWidget::actChangeActiveSortCriteria()
{ {
activeSortCriteria = sortByComboBox->currentText(); activeSortCriteria = sortByComboBox->currentText();
qDebug() << "VDE says we sort by " << activeSortCriteria;
emit activeSortCriteriaChanged(activeSortCriteria); emit activeSortCriteriaChanged(activeSortCriteria);
} }

View file

@ -28,19 +28,23 @@ public slots:
signals: signals:
void activeCardChanged(CardInfoPtr activeCard); void activeCardChanged(CardInfoPtr activeCard);
void activeGroupCriteriaChanged(QString activeGroupCriteria);
void activeSortCriteriaChanged(QString activeSortCriteria); void activeSortCriteriaChanged(QString activeSortCriteria);
void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *instance, QString zoneName); void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *instance, QString zoneName);
protected slots: protected slots:
void onHover(CardInfoPtr hoveredCard); void onHover(CardInfoPtr hoveredCard);
void onCardClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *instance, QString zoneName); void onCardClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *instance, QString zoneName);
void actChangeActiveGroupCriteria();
void actChangeActiveSortCriteria(); void actChangeActiveSortCriteria();
private: private:
DeckListModel *deckListModel; DeckListModel *deckListModel;
QVBoxLayout *mainLayout; QVBoxLayout *mainLayout;
QComboBox *groupByComboBox;
QString activeGroupCriteria = "maintype";
QComboBox *sortByComboBox; QComboBox *sortByComboBox;
QString activeSortCriteria = "maintype"; QString activeSortCriteria = "name";
QScrollArea *scrollArea; QScrollArea *scrollArea;
QWidget *zoneContainer; QWidget *zoneContainer;
QVBoxLayout *zoneContainerLayout; QVBoxLayout *zoneContainerLayout;