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,
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<OverlappedCardGroupDisplayWidget *> cardGroupsDisplayWidgets =
cardGroupContainer->findChildren<OverlappedCardGroupDisplayWidget *>();
QList<QString> cardGroups = getSortCriteriaValueList();
QList<QString> 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<OverlappedCardGroupDisplayWidget *> cardGroupsDisplayWidgets =
cardGroupLayout->findChildren<OverlappedCardGroupDisplayWidget *>();
for (OverlappedCardGroupDisplayWidget *cardGroupDisplayWidget : cardGroupsDisplayWidgets) {
bool found = false;
for (QString cardGroup : getSortCriteriaValueList()) {
if (cardGroupDisplayWidget->cardGroupCategory == cardGroup) {
found = true;
}
}
cardGroupContainer->findChildren<OverlappedCardGroupDisplayWidget *>();
if (!found) {
QList<QString> 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<QString> DeckCardZoneDisplayWidget::getSortCriteriaValueList()
QList<QString> DeckCardZoneDisplayWidget::getGroupCriteriaValueList()
{
QList<QString> sortCriteriaValues;
QList<QString> groupCriteriaValues;
QList<CardInfoPtr> *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;
}

View file

@ -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<QString> getSortCriteriaValueList();
QList<QString> 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;

View file

@ -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<CardInfoPictureWithTextOverlayWidget *> &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<CardInfoPictureWithTextOverlayWidget *> 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<CardInfoPtr> 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<CardInfoPtr> *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);

View file

@ -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);

View file

@ -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<const QString &>::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<const QString &>::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);
}

View file

@ -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;