mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-07-16 07:22:16 -07:00
Implement separate comboBoxes for sorting and grouping.
This commit is contained in:
parent
f66961e488
commit
34287b0714
6 changed files with 121 additions and 41 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue