From 34287b071499bec9782cf9bd1e1cb0759cb90b54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Sat, 1 Mar 2025 22:58:55 +0100 Subject: [PATCH] Implement separate comboBoxes for sorting and grouping. --- .../cards/deck_card_zone_display_widget.cpp | 65 +++++++++++++------ .../cards/deck_card_zone_display_widget.h | 6 +- .../overlapped_card_group_display_widget.cpp | 50 ++++++++++---- .../overlapped_card_group_display_widget.h | 3 + .../visual_deck_editor_widget.cpp | 32 +++++++-- .../visual_deck_editor_widget.h | 6 +- 6 files changed, 121 insertions(+), 41 deletions(-) diff --git a/cockatrice/src/client/ui/widgets/cards/deck_card_zone_display_widget.cpp b/cockatrice/src/client/ui/widgets/cards/deck_card_zone_display_widget.cpp index a45b21741..d0cf8094f 100644 --- a/cockatrice/src/client/ui/widgets/cards/deck_card_zone_display_widget.cpp +++ b/cockatrice/src/client/ui/widgets/cards/deck_card_zone_display_widget.cpp @@ -9,11 +9,12 @@ DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent, DeckListModel *_deckListModel, QString _zoneName, + QString _activeGroupCriteria, QString _activeSortCriteria, int bannerOpacity, int subBannerOpacity) - : QWidget(parent), deckListModel(_deckListModel), zoneName(_zoneName), activeSortCriteria(_activeSortCriteria), - bannerOpacity(bannerOpacity), subBannerOpacity(subBannerOpacity) + : QWidget(parent), deckListModel(_deckListModel), zoneName(_zoneName), activeGroupCriteria(_activeGroupCriteria), + activeSortCriteria(_activeSortCriteria), bannerOpacity(bannerOpacity), subBannerOpacity(subBannerOpacity) { layout = new QVBoxLayout(this); setLayout(layout); @@ -61,7 +62,7 @@ void DeckCardZoneDisplayWidget::addCardGroupIfItDoesNotExist() QList cardGroupsDisplayWidgets = cardGroupContainer->findChildren(); - QList cardGroups = getSortCriteriaValueList(); + QList cardGroups = getGroupCriteriaValueList(); for (QString cardGroup : cardGroups) { bool found = false; @@ -72,11 +73,13 @@ void DeckCardZoneDisplayWidget::addCardGroupIfItDoesNotExist() } if (!found) { - OverlappedCardGroupDisplayWidget *display_widget = new OverlappedCardGroupDisplayWidget( - this, deckListModel, zoneName, cardGroup, activeSortCriteria, subBannerOpacity); + OverlappedCardGroupDisplayWidget *display_widget = new OverlappedCardGroupDisplayWidget(cardGroupContainer, deckListModel, zoneName, cardGroup, + activeGroupCriteria, activeSortCriteria, subBannerOpacity); connect(display_widget, SIGNAL(cardClicked(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)), this, SLOT(onClick(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *))); connect(display_widget, SIGNAL(cardHovered(CardInfoPtr)), this, SLOT(onHover(CardInfoPtr))); + connect(this, &DeckCardZoneDisplayWidget::activeSortCriteriaChanged, display_widget, + &OverlappedCardGroupDisplayWidget::onActiveSortCriteriaChanged); cardGroupLayout->addWidget(display_widget); } } @@ -85,37 +88,59 @@ void DeckCardZoneDisplayWidget::addCardGroupIfItDoesNotExist() void DeckCardZoneDisplayWidget::deleteCardGroupIfItDoesNotExist() { QList cardGroupsDisplayWidgets = - cardGroupLayout->findChildren(); - for (OverlappedCardGroupDisplayWidget *cardGroupDisplayWidget : cardGroupsDisplayWidgets) { - bool found = false; - for (QString cardGroup : getSortCriteriaValueList()) { - if (cardGroupDisplayWidget->cardGroupCategory == cardGroup) { - found = true; - } - } + cardGroupContainer->findChildren(); - if (!found) { + QList validGroups = getGroupCriteriaValueList(); + + qDebug() << "DeckCardZoneDisplayWidget: Checking for obsolete card groups."; + qDebug() << "Valid groups (should remain):" << validGroups; + + for (OverlappedCardGroupDisplayWidget *cardGroupDisplayWidget : cardGroupsDisplayWidgets) { + qDebug() << "Checking group:" << cardGroupDisplayWidget->cardGroupCategory; + + if (!validGroups.contains(cardGroupDisplayWidget->cardGroupCategory)) { + 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; } } + + qDebug() << "Finished checking for obsolete card groups."; +} + +void DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged(QString _activeGroupCriteria) +{ + activeGroupCriteria = _activeGroupCriteria; + qDebug() << "DeckCardZoneDisplayWidget says: We group by " << activeGroupCriteria << " and display cards"; + displayCards(); } void DeckCardZoneDisplayWidget::onActiveSortCriteriaChanged(QString _activeSortCriteria) { activeSortCriteria = _activeSortCriteria; + qDebug() << "DeckCardZoneDisplayWidget says: we sort by" << activeSortCriteria << " and emit a signal"; + emit activeSortCriteriaChanged(activeSortCriteria); } -QList DeckCardZoneDisplayWidget::getSortCriteriaValueList() +QList DeckCardZoneDisplayWidget::getGroupCriteriaValueList() { - QList sortCriteriaValues; + QList groupCriteriaValues; QList *cardsInZone = deckListModel->getCardsAsCardInfoPtrsForZone(zoneName); for (CardInfoPtr cardInZone : *cardsInZone) { - sortCriteriaValues.append(cardInZone->getProperty(activeSortCriteria)); + groupCriteriaValues.append(cardInZone->getProperty(activeGroupCriteria)); } - sortCriteriaValues.removeDuplicates(); - sortCriteriaValues.sort(); - return sortCriteriaValues; + groupCriteriaValues.removeDuplicates(); + groupCriteriaValues.sort(); + + qDebug() << "These are the group by criteria values"; + for (QString groupCriteria : groupCriteriaValues) { + qDebug() << groupCriteria; + } + + return groupCriteriaValues; } diff --git a/cockatrice/src/client/ui/widgets/cards/deck_card_zone_display_widget.h b/cockatrice/src/client/ui/widgets/cards/deck_card_zone_display_widget.h index 09fe79df6..7810a21a8 100644 --- a/cockatrice/src/client/ui/widgets/cards/deck_card_zone_display_widget.h +++ b/cockatrice/src/client/ui/widgets/cards/deck_card_zone_display_widget.h @@ -18,6 +18,7 @@ public: DeckCardZoneDisplayWidget(QWidget *parent, DeckListModel *deckListModel, QString zoneName, + QString activeGroupCriteria, QString activeSortCriteria, int bannerOpacity, int subBannerOpacity); @@ -32,14 +33,17 @@ public slots: void displayCards(); void addCardGroupIfItDoesNotExist(); void deleteCardGroupIfItDoesNotExist(); + void onActiveGroupCriteriaChanged(QString activeGroupCriteria); void onActiveSortCriteriaChanged(QString activeSortCriteria); - QList getSortCriteriaValueList(); + QList getGroupCriteriaValueList(); signals: void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card, QString zoneName); void cardHovered(CardInfoPtr card); + void activeSortCriteriaChanged(QString activeSortCriteria); private: + QString activeGroupCriteria; QString activeSortCriteria; QVBoxLayout *layout; BannerWidget *banner; diff --git a/cockatrice/src/client/ui/widgets/cards/overlapped_card_group_display_widget.cpp b/cockatrice/src/client/ui/widgets/cards/overlapped_card_group_display_widget.cpp index 0b9b1cce1..96814659e 100644 --- a/cockatrice/src/client/ui/widgets/cards/overlapped_card_group_display_widget.cpp +++ b/cockatrice/src/client/ui/widgets/cards/overlapped_card_group_display_widget.cpp @@ -11,10 +11,11 @@ OverlappedCardGroupDisplayWidget::OverlappedCardGroupDisplayWidget(QWidget *pare DeckListModel *_deckListModel, QString _zoneName, QString _cardGroupCategory, + QString _activeGroupCriteria, QString _activeSortCriteria, int bannerOpacity) : QWidget(parent), deckListModel(_deckListModel), zoneName(_zoneName), cardGroupCategory(_cardGroupCategory), - activeSortCriteria(_activeSortCriteria) + activeGroupCriteria(_activeGroupCriteria), activeSortCriteria(_activeSortCriteria) { layout = new QVBoxLayout(this); setLayout(layout); @@ -52,6 +53,7 @@ void OverlappedCardGroupDisplayWidget::updateCardDisplays() widgetMap[widget->getInfo()->getName()].append(widget); } + // Remove excess widgets for (auto it = widgetMap.begin(); it != widgetMap.end(); ++it) { QString name = it.key(); QList &widgets = it.value(); @@ -59,34 +61,45 @@ void OverlappedCardGroupDisplayWidget::updateCardDisplays() int neededCount = requiredCounts.value(name, 0); while (widgets.size() > neededCount) { CardInfoPictureWithTextOverlayWidget *widgetToRemove = widgets.takeLast(); - overlapWidget->removeWidget(widgetToRemove); + overlapWidget->layout()->removeWidget(widgetToRemove); // Remove from layout delete widgetToRemove; } } - for (auto it = requiredCounts.begin(); it != requiredCounts.end(); ++it) { - QString name = it.key(); - int missingCount = it.value() - widgetMap[name].size(); + // Add missing widgets and reorder existing ones + QList sortedWidgets; + 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 cardIt = std::find_if(cardsInZone.begin(), cardsInZone.end(), - [&](const CardInfoPtr &c) { return c->getName() == name; }); - - if (cardIt != cardsInZone.end()) { - display->setCard(*cardIt); - } + display->setCard(card); connect(display, &CardInfoPictureWithTextOverlayWidget::imageClicked, this, &OverlappedCardGroupDisplayWidget::onClick); connect(display, &CardInfoPictureWithTextOverlayWidget::hoveredOnCard, this, &OverlappedCardGroupDisplayWidget::onHover); + sortedWidgets.append(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(); } @@ -101,7 +114,7 @@ QList OverlappedCardGroupDisplayWidget::getCardsMatchingGroup(QList for (int i = 0; i < cardsToSort->size(); ++i) { CardInfoPtr info = cardsToSort->at(i); if (info) { - if (info->getProperty(activeSortCriteria) == cardGroupCategory) { + if (info->getProperty(activeGroupCriteria) == cardGroupCategory) { activeList.append(info); } } else { @@ -120,6 +133,15 @@ void OverlappedCardGroupDisplayWidget::sortCardList(QList *cardsToS 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) { emit cardClicked(event, card); diff --git a/cockatrice/src/client/ui/widgets/cards/overlapped_card_group_display_widget.h b/cockatrice/src/client/ui/widgets/cards/overlapped_card_group_display_widget.h index 959ab856c..196625424 100644 --- a/cockatrice/src/client/ui/widgets/cards/overlapped_card_group_display_widget.h +++ b/cockatrice/src/client/ui/widgets/cards/overlapped_card_group_display_widget.h @@ -20,6 +20,7 @@ public: DeckListModel *deckListModel, QString zoneName, QString cardGroupCategory, + QString activeGroupCriteria, QString activeSortCriteria, int bannerOpacity); @@ -29,6 +30,7 @@ public: DeckListModel *deckListModel; QString zoneName; QString cardGroupCategory; + QString activeGroupCriteria; QString activeSortCriteria; public slots: @@ -36,6 +38,7 @@ public slots: void onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card); void onHover(CardInfoPtr card); void updateCardDisplays(); + void onActiveSortCriteriaChanged(QString activeSortCriteria); signals: void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card); diff --git a/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.cpp b/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.cpp index 24ffd936c..45b78f3ea 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.cpp +++ b/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.cpp @@ -27,12 +27,23 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, DeckListModel *_ mainLayout = new QVBoxLayout(); this->setLayout(mainLayout); + groupByComboBox = new QComboBox(); + QStringList groupProperties; + groupProperties << "maintype" + << "colors" + << "cmc" + << "name"; + groupByComboBox->addItems(groupProperties); + connect(groupByComboBox, QOverload::of(&QComboBox::currentTextChanged), this, + &VisualDeckEditorWidget::actChangeActiveGroupCriteria); + actChangeActiveGroupCriteria(); + sortByComboBox = new QComboBox(); QStringList sortProperties; - sortProperties << "maintype" - << "colors" + sortProperties << "name" << "cmc" - << "name"; + << "colors" + << "maintype"; sortByComboBox->addItems(sortProperties); connect(sortByComboBox, QOverload::of(&QComboBox::currentTextChanged), this, &VisualDeckEditorWidget::actChangeActiveSortCriteria); @@ -56,6 +67,7 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, DeckListModel *_ overlapControlWidget = new OverlapControlWidget(80, 1, 1, Qt::Vertical, this); + mainLayout->addWidget(groupByComboBox); mainLayout->addWidget(sortByComboBox); mainLayout->addWidget(scrollArea); mainLayout->addWidget(overlapControlWidget); @@ -80,13 +92,15 @@ void VisualDeckEditorWidget::addZoneIfDoesNotExist() } if (!found) { - DeckCardZoneDisplayWidget *zoneDisplayWidget = - new DeckCardZoneDisplayWidget(zoneContainer, deckListModel, zone, activeSortCriteria, 20, 10); + DeckCardZoneDisplayWidget *zoneDisplayWidget = new DeckCardZoneDisplayWidget( + zoneContainer, deckListModel, zone, activeGroupCriteria, activeSortCriteria, 20, 10); connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardHovered, this, &VisualDeckEditorWidget::onHover); connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardClicked, this, &VisualDeckEditorWidget::onCardClick); connect(this, &VisualDeckEditorWidget::activeSortCriteriaChanged, zoneDisplayWidget, &DeckCardZoneDisplayWidget::onActiveSortCriteriaChanged); + connect(this, &VisualDeckEditorWidget::activeGroupCriteriaChanged, zoneDisplayWidget, + &DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged); zoneContainerLayout->addWidget(zoneDisplayWidget); } } @@ -117,9 +131,17 @@ void VisualDeckEditorWidget::resizeEvent(QResizeEvent *event) zoneContainer->setMaximumWidth(scrollArea->viewport()->width()); } +void VisualDeckEditorWidget::actChangeActiveGroupCriteria() +{ + activeGroupCriteria = groupByComboBox->currentText(); + qDebug() << "VDE says we group by " << activeGroupCriteria; + emit activeGroupCriteriaChanged(activeGroupCriteria); +} + void VisualDeckEditorWidget::actChangeActiveSortCriteria() { activeSortCriteria = sortByComboBox->currentText(); + qDebug() << "VDE says we sort by " << activeSortCriteria; emit activeSortCriteriaChanged(activeSortCriteria); } diff --git a/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.h b/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.h index 08c473340..0a57b28b2 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.h +++ b/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.h @@ -28,19 +28,23 @@ public slots: signals: void activeCardChanged(CardInfoPtr activeCard); + void activeGroupCriteriaChanged(QString activeGroupCriteria); void activeSortCriteriaChanged(QString activeSortCriteria); void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *instance, QString zoneName); protected slots: void onHover(CardInfoPtr hoveredCard); void onCardClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *instance, QString zoneName); + void actChangeActiveGroupCriteria(); void actChangeActiveSortCriteria(); private: DeckListModel *deckListModel; QVBoxLayout *mainLayout; + QComboBox *groupByComboBox; + QString activeGroupCriteria = "maintype"; QComboBox *sortByComboBox; - QString activeSortCriteria = "maintype"; + QString activeSortCriteria = "name"; QScrollArea *scrollArea; QWidget *zoneContainer; QVBoxLayout *zoneContainerLayout;