Actually make widgets track their indices.

This commit is contained in:
Lukas Brübach 2025-05-18 16:06:57 +02:00
parent 59998b38c2
commit 8032e7fea1
13 changed files with 213 additions and 246 deletions

View file

@ -548,6 +548,14 @@ void FlowLayout::addItem(QLayoutItem *item)
} }
} }
void FlowLayout::insertWidgetAtIndex(QWidget *toInsert, int index)
{
addChildWidget(toInsert);
items.insert(qBound(0, index, std::max(0, static_cast<int>(items.size()))), new QWidgetItem(toInsert));
invalidate();
}
/** /**
* @brief Retrieves the count of items in the layout. * @brief Retrieves the count of items in the layout.
* @return The number of layout items. * @return The number of layout items.

View file

@ -15,6 +15,7 @@ public:
explicit FlowLayout(QWidget *parent = nullptr); explicit FlowLayout(QWidget *parent = nullptr);
FlowLayout(QWidget *parent, Qt::Orientation _flowDirection, int margin = 0, int hSpacing = 0, int vSpacing = 0); FlowLayout(QWidget *parent, Qt::Orientation _flowDirection, int margin = 0, int hSpacing = 0, int vSpacing = 0);
~FlowLayout() override; ~FlowLayout() override;
void insertWidgetAtIndex(QWidget *toInsert, int index);
QSize calculateMinimumSizeHorizontal() const; QSize calculateMinimumSizeHorizontal() const;
QSize calculateSizeHintVertical() const; QSize calculateSizeHintVertical() const;

View file

@ -9,13 +9,14 @@
CardGroupDisplayWidget::CardGroupDisplayWidget(QWidget *parent, CardGroupDisplayWidget::CardGroupDisplayWidget(QWidget *parent,
DeckListModel *_deckListModel, DeckListModel *_deckListModel,
QPersistentModelIndex _trackedIndex,
QString _zoneName, QString _zoneName,
QString _cardGroupCategory, QString _cardGroupCategory,
QString _activeGroupCriteria, QString _activeGroupCriteria,
QStringList _activeSortCriteria, QStringList _activeSortCriteria,
int bannerOpacity, int bannerOpacity,
CardSizeWidget *_cardSizeWidget) CardSizeWidget *_cardSizeWidget)
: QWidget(parent), deckListModel(_deckListModel), zoneName(_zoneName), cardGroupCategory(_cardGroupCategory), : QWidget(parent), deckListModel(_deckListModel), trackedIndex(_trackedIndex), zoneName(_zoneName), cardGroupCategory(_cardGroupCategory),
activeGroupCriteria(_activeGroupCriteria), activeSortCriteria(_activeSortCriteria), activeGroupCriteria(_activeGroupCriteria), activeSortCriteria(_activeSortCriteria),
cardSizeWidget(_cardSizeWidget) cardSizeWidget(_cardSizeWidget)
{ {
@ -27,41 +28,66 @@ CardGroupDisplayWidget::CardGroupDisplayWidget(QWidget *parent,
layout->addWidget(banner); layout->addWidget(banner);
CardGroupDisplayWidget::updateCardDisplays(); CardGroupDisplayWidget::updateCardDisplays();
connect(deckListModel, &QAbstractItemModel::rowsInserted, this, &CardGroupDisplayWidget::onCardAddition);
connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &CardGroupDisplayWidget::onCardRemoval);
}
QWidget* CardGroupDisplayWidget::constructWidgetForIndex(int rowIndex)
{
QPersistentModelIndex index = QPersistentModelIndex(deckListModel->index(rowIndex, 0, trackedIndex));
if (indexToWidgetMap.contains(index)) {
return indexToWidgetMap[index];
}
auto cardName = deckListModel->data(index.sibling(index.row(), 1), Qt::EditRole).toString();
auto cardProviderId = deckListModel->data(index.sibling(index.row(), 4), Qt::EditRole).toString();
qInfo() << cardName;
auto widget = new CardInfoPictureWithTextOverlayWidget(getLayoutParent(), true);
widget->setScaleFactor(cardSizeWidget->getSlider()->value());
widget->setCard(CardDatabaseManager::getInstance()->getCardByNameAndProviderId(cardName, cardProviderId));
connect(widget, &CardInfoPictureWithTextOverlayWidget::imageClicked, this, &CardGroupDisplayWidget::onClick);
connect(widget, &CardInfoPictureWithTextOverlayWidget::hoveredOnCard, this, &CardGroupDisplayWidget::onHover);
connect(cardSizeWidget->getSlider(), &QSlider::valueChanged, widget, &CardInfoPictureWidget::setScaleFactor);
indexToWidgetMap.insert(index, widget);
return widget;
} }
void CardGroupDisplayWidget::updateCardDisplays() void CardGroupDisplayWidget::updateCardDisplays()
{ {
qInfo() << "Constructing Card Display Widgets for Card Group Display widget";
qInfo() << deckListModel->data(trackedIndex.sibling(trackedIndex.row(), 1), Qt::EditRole).toString() << " has "
<< deckListModel->rowCount(trackedIndex.sibling(trackedIndex.row(), 0)) << " entries.";
for (int i = 0; i < deckListModel->rowCount(trackedIndex); ++i) {
addToLayout(constructWidgetForIndex(i));
}
} }
QList<CardInfoPtr> CardGroupDisplayWidget::getCardsMatchingGroup(QList<CardInfoPtr> cardsToSort) void CardGroupDisplayWidget::onCardAddition(const QModelIndex &parent, int first, int last)
{ {
cardsToSort = sortCardList(cardsToSort, activeSortCriteria, Qt::SortOrder::AscendingOrder); if (parent == trackedIndex) {
for (int i = first; i <= last; i++) {
QList<CardInfoPtr> activeList; insertIntoLayout(constructWidgetForIndex(i), i);
for (const CardInfoPtr &info : cardsToSort) {
if (info && info->getProperty(activeGroupCriteria) == cardGroupCategory) {
activeList.append(info);
} }
} }
return activeList;
} }
QList<CardInfoPtr> CardGroupDisplayWidget::sortCardList(QList<CardInfoPtr> cardsToSort, void CardGroupDisplayWidget::onCardRemoval(const QModelIndex &parent, int first, int last)
const QStringList properties,
Qt::SortOrder order = Qt::AscendingOrder)
{ {
CardInfoComparator comparator(properties, order); Q_UNUSED(parent);
std::sort(cardsToSort.begin(), cardsToSort.end(), comparator); Q_UNUSED(first);
Q_UNUSED(last);
return cardsToSort; if (parent == trackedIndex) {
} for (const QPersistentModelIndex &idx : indexToWidgetMap.keys()) {
if (!idx.isValid()) {
void CardGroupDisplayWidget::onActiveSortCriteriaChanged(QStringList _activeSortCriteria) removeFromLayout(indexToWidgetMap.value(idx));
{ indexToWidgetMap.value(idx)->deleteLater();
if (activeSortCriteria != _activeSortCriteria) { indexToWidgetMap.remove(idx);
activeSortCriteria = _activeSortCriteria; }
updateCardDisplays(); // Refresh display with new sorting }
} }
} }

View file

@ -18,6 +18,7 @@ class CardGroupDisplayWidget : public QWidget
public: public:
CardGroupDisplayWidget(QWidget *parent, CardGroupDisplayWidget(QWidget *parent,
DeckListModel *deckListModel, DeckListModel *deckListModel,
QPersistentModelIndex trackedIndex,
QString zoneName, QString zoneName,
QString cardGroupCategory, QString cardGroupCategory,
QString activeGroupCriteria, QString activeGroupCriteria,
@ -25,10 +26,9 @@ public:
int bannerOpacity, int bannerOpacity,
CardSizeWidget *cardSizeWidget); CardSizeWidget *cardSizeWidget);
QList<CardInfoPtr> getCardsMatchingGroup(QList<CardInfoPtr> cardsToSort);
void resizeEvent(QResizeEvent *event) override;
DeckListModel *deckListModel; DeckListModel *deckListModel;
QPersistentModelIndex trackedIndex;
QHash<QPersistentModelIndex, QWidget*> indexToWidgetMap;
QString zoneName; QString zoneName;
QString cardGroupCategory; QString cardGroupCategory;
QString activeGroupCriteria; QString activeGroupCriteria;
@ -36,11 +36,13 @@ public:
CardSizeWidget *cardSizeWidget; CardSizeWidget *cardSizeWidget;
public slots: public slots:
QList<CardInfoPtr> sortCardList(QList<CardInfoPtr> cardsToSort, QStringList properties, Qt::SortOrder order);
void onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card); void onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card);
void onHover(CardInfoPtr card); void onHover(CardInfoPtr card);
virtual QWidget* constructWidgetForIndex(int rowIndex);
virtual void updateCardDisplays(); virtual void updateCardDisplays();
void onActiveSortCriteriaChanged(QStringList activeSortCriteria); void onCardAddition(const QModelIndex &parent, int first, int last);
void onCardRemoval(const QModelIndex &parent, int first, int last);
void resizeEvent(QResizeEvent *event) override;
signals: signals:
void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card); void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card);
@ -49,5 +51,26 @@ signals:
protected: protected:
QVBoxLayout *layout; QVBoxLayout *layout;
BannerWidget *banner; BannerWidget *banner;
virtual QWidget* getLayoutParent()
{
return this;
}
virtual void addToLayout(QWidget* toAdd)
{
layout->addWidget(toAdd);
}
virtual void insertIntoLayout(QWidget *toInsert, int insertAt)
{
qInfo() << "Default card group insert";
layout->insertWidget(insertAt, toInsert);
}
virtual void removeFromLayout(QWidget* toRemove)
{
layout->removeWidget(toRemove);
}
}; };
#endif // CARD_GROUP_DISPLAY_WIDGET_H #endif // CARD_GROUP_DISPLAY_WIDGET_H

View file

@ -6,9 +6,11 @@
#include "../card_info_picture_with_text_overlay_widget.h" #include "../card_info_picture_with_text_overlay_widget.h"
#include <QResizeEvent> #include <QResizeEvent>
#include <utility>
FlatCardGroupDisplayWidget::FlatCardGroupDisplayWidget(QWidget *parent, FlatCardGroupDisplayWidget::FlatCardGroupDisplayWidget(QWidget *parent,
DeckListModel *_deckListModel, DeckListModel *_deckListModel,
QPersistentModelIndex _trackedIndex,
QString _zoneName, QString _zoneName,
QString _cardGroupCategory, QString _cardGroupCategory,
QString _activeGroupCriteria, QString _activeGroupCriteria,
@ -17,6 +19,7 @@ FlatCardGroupDisplayWidget::FlatCardGroupDisplayWidget(QWidget *parent,
CardSizeWidget *_cardSizeWidget) CardSizeWidget *_cardSizeWidget)
: CardGroupDisplayWidget(parent, : CardGroupDisplayWidget(parent,
_deckListModel, _deckListModel,
std::move(_trackedIndex),
_zoneName, _zoneName,
_cardGroupCategory, _cardGroupCategory,
_activeGroupCriteria, _activeGroupCriteria,
@ -29,78 +32,34 @@ FlatCardGroupDisplayWidget::FlatCardGroupDisplayWidget(QWidget *parent,
layout->addWidget(flowWidget); layout->addWidget(flowWidget);
FlatCardGroupDisplayWidget::updateCardDisplays(); FlatCardGroupDisplayWidget::updateCardDisplays();
connect(deckListModel, &DeckListModel::dataChanged, this, &FlatCardGroupDisplayWidget::updateCardDisplays); // connect(deckListModel, &DeckListModel::dataChanged, this, &FlatCardGroupDisplayWidget::updateCardDisplays);
} }
void FlatCardGroupDisplayWidget::updateCardDisplays() QWidget* FlatCardGroupDisplayWidget::constructWidgetForIndex(int row)
{ {
// Retrieve and sort cards QPersistentModelIndex index = QPersistentModelIndex(deckListModel->index(row, 0, trackedIndex));
QList<CardInfoPtr> cardsInZone = getCardsMatchingGroup(deckListModel->getCardsAsCardInfoPtrsForZone(zoneName));
// Show or hide widget if (indexToWidgetMap.contains(index)) {
bool shouldBeVisible = !cardsInZone.isEmpty(); return indexToWidgetMap[index];
if (shouldBeVisible != isVisible()) {
setVisible(shouldBeVisible);
} }
auto cardName = deckListModel->data(index.sibling(index.row(), 1), Qt::EditRole).toString();
auto cardProviderId = deckListModel->data(index.sibling(index.row(), 4), Qt::EditRole).toString();
qInfo() << cardName;
// Retrieve existing widgets auto widget = new CardInfoPictureWithTextOverlayWidget(flowWidget, true);
QList<CardInfoPictureWithTextOverlayWidget *> existingWidgets = widget->setScaleFactor(cardSizeWidget->getSlider()->value());
flowWidget->findChildren<CardInfoPictureWithTextOverlayWidget *>(); widget->setCard(CardDatabaseManager::getInstance()->getCardByNameAndProviderId(cardName, cardProviderId));
QHash<QString, QList<CardInfoPictureWithTextOverlayWidget *>> widgetMap; connect(widget, &CardInfoPictureWithTextOverlayWidget::imageClicked, this, &FlatCardGroupDisplayWidget::onClick);
for (CardInfoPictureWithTextOverlayWidget *widget : existingWidgets) { connect(widget, &CardInfoPictureWithTextOverlayWidget::hoveredOnCard, this, &FlatCardGroupDisplayWidget::onHover);
widgetMap[widget->getInfo()->getName()].append(widget); connect(cardSizeWidget->getSlider(), &QSlider::valueChanged, widget, &CardInfoPictureWidget::setScaleFactor);
}
QList<CardInfoPictureWithTextOverlayWidget *> sortedWidgets; indexToWidgetMap.insert(index, widget);
QSet<CardInfoPictureWithTextOverlayWidget *> usedWidgets; return widget;
// 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()) {
// Reuse an existing widget
widget = widgetMap[name].takeFirst();
} else {
// Create a new widget if needed
widget = new CardInfoPictureWithTextOverlayWidget(flowWidget, true);
widget->setScaleFactor(cardSizeWidget->getSlider()->value());
widget->setCard(card);
connect(widget, &CardInfoPictureWithTextOverlayWidget::imageClicked, this,
&FlatCardGroupDisplayWidget::onClick);
connect(widget, &CardInfoPictureWithTextOverlayWidget::hoveredOnCard, this,
&FlatCardGroupDisplayWidget::onHover);
connect(cardSizeWidget->getSlider(), &QSlider::valueChanged, widget,
&CardInfoPictureWidget::setScaleFactor);
flowWidget->addWidget(widget);
}
// Store in sorted order
sortedWidgets.append(widget);
usedWidgets.insert(widget);
}
// Remove extra widgets
for (CardInfoPictureWithTextOverlayWidget *widget : existingWidgets) {
if (!usedWidgets.contains(widget)) {
flowWidget->layout()->removeWidget(widget);
widget->deleteLater();
}
}
// **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) {
flowWidget->addWidget(sortedWidgets[i]); // Reattach in correct order
}
} }
void FlatCardGroupDisplayWidget::resizeEvent(QResizeEvent *event) void FlatCardGroupDisplayWidget::resizeEvent(QResizeEvent *event)
{ {
QWidget::resizeEvent(event); QWidget::resizeEvent(event);

View file

@ -11,6 +11,7 @@ class FlatCardGroupDisplayWidget : public CardGroupDisplayWidget
public: public:
FlatCardGroupDisplayWidget(QWidget *parent, FlatCardGroupDisplayWidget(QWidget *parent,
DeckListModel *deckListModel, DeckListModel *deckListModel,
QPersistentModelIndex trackedIndex,
QString zoneName, QString zoneName,
QString cardGroupCategory, QString cardGroupCategory,
QString activeGroupCriteria, QString activeGroupCriteria,
@ -18,13 +19,33 @@ public:
int bannerOpacity, int bannerOpacity,
CardSizeWidget *cardSizeWidget); CardSizeWidget *cardSizeWidget);
void resizeEvent(QResizeEvent *event) override;
public slots: public slots:
void updateCardDisplays() override; QWidget* constructWidgetForIndex(int row) override;
void resizeEvent(QResizeEvent *event) override;
private: private:
FlowWidget *flowWidget; FlowWidget *flowWidget;
QWidget* getLayoutParent() override
{
return flowWidget;
}
void addToLayout(QWidget* toAdd) override
{
flowWidget->addWidget(toAdd);
}
void insertIntoLayout(QWidget *toInsert, int insertAt) override
{
qInfo() << "Flat card group insertion at " << insertAt;
flowWidget->insertWidgetAtIndex(toInsert, insertAt);
}
void removeFromLayout(QWidget* toRemove) override
{
flowWidget->removeWidget(toRemove);
}
}; };
#endif // FLAT_CARD_GROUP_DISPLAY_WIDGET_H #endif // FLAT_CARD_GROUP_DISPLAY_WIDGET_H

View file

@ -9,6 +9,7 @@
OverlappedCardGroupDisplayWidget::OverlappedCardGroupDisplayWidget(QWidget *parent, OverlappedCardGroupDisplayWidget::OverlappedCardGroupDisplayWidget(QWidget *parent,
DeckListModel *_deckListModel, DeckListModel *_deckListModel,
QPersistentModelIndex _trackedIndex,
QString _zoneName, QString _zoneName,
QString _cardGroupCategory, QString _cardGroupCategory,
QString _activeGroupCriteria, QString _activeGroupCriteria,
@ -17,6 +18,7 @@ OverlappedCardGroupDisplayWidget::OverlappedCardGroupDisplayWidget(QWidget *pare
CardSizeWidget *_cardSizeWidget) CardSizeWidget *_cardSizeWidget)
: CardGroupDisplayWidget(parent, : CardGroupDisplayWidget(parent,
_deckListModel, _deckListModel,
_trackedIndex,
_zoneName, _zoneName,
_cardGroupCategory, _cardGroupCategory,
_activeGroupCriteria, _activeGroupCriteria,
@ -29,90 +31,11 @@ OverlappedCardGroupDisplayWidget::OverlappedCardGroupDisplayWidget(QWidget *pare
layout->addWidget(overlapWidget); layout->addWidget(overlapWidget);
OverlappedCardGroupDisplayWidget::updateCardDisplays(); OverlappedCardGroupDisplayWidget::updateCardDisplays();
connect(deckListModel, &DeckListModel::dataChanged, this, &OverlappedCardGroupDisplayWidget::updateCardDisplays);
connect(cardSizeWidget->getSlider(), &QSlider::valueChanged, this, connect(cardSizeWidget->getSlider(), &QSlider::valueChanged, this,
[this]() { overlapWidget->adjustMaxColumnsAndRows(); }); [this]() { overlapWidget->adjustMaxColumnsAndRows(); });
} }
void OverlappedCardGroupDisplayWidget::updateCardDisplays()
{
overlapWidget->setUpdatesEnabled(false);
// 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, QList<CardInfoPictureWithTextOverlayWidget *>> widgetMap;
for (CardInfoPictureWithTextOverlayWidget *widget : existingWidgets) {
widgetMap[widget->getInfo()->getName()].append(widget);
}
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()) {
// Reuse an existing widget
widget = widgetMap[name].takeFirst();
} else {
// Create a new widget if needed
widget = new CardInfoPictureWithTextOverlayWidget(overlapWidget, true);
widget->setScaleFactor(cardSizeWidget->getSlider()->value());
widget->setCard(card);
connect(widget, &CardInfoPictureWithTextOverlayWidget::imageClicked, this,
&OverlappedCardGroupDisplayWidget::onClick);
connect(widget, &CardInfoPictureWithTextOverlayWidget::hoveredOnCard, this,
&OverlappedCardGroupDisplayWidget::onHover);
connect(cardSizeWidget->getSlider(), &QSlider::valueChanged, widget,
&CardInfoPictureWidget::setScaleFactor);
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);
widget->deleteLater();
}
}
// **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();
}
overlapWidget->adjustMaxColumnsAndRows();
overlapWidget->setUpdatesEnabled(true);
overlapWidget->update();
}
void OverlappedCardGroupDisplayWidget::resizeEvent(QResizeEvent *event) void OverlappedCardGroupDisplayWidget::resizeEvent(QResizeEvent *event)
{ {
QWidget::resizeEvent(event); QWidget::resizeEvent(event);

View file

@ -11,6 +11,7 @@ class OverlappedCardGroupDisplayWidget : public CardGroupDisplayWidget
public: public:
OverlappedCardGroupDisplayWidget(QWidget *parent, OverlappedCardGroupDisplayWidget(QWidget *parent,
DeckListModel *deckListModel, DeckListModel *deckListModel,
QPersistentModelIndex trackedIndex,
QString zoneName, QString zoneName,
QString cardGroupCategory, QString cardGroupCategory,
QString activeGroupCriteria, QString activeGroupCriteria,
@ -20,11 +21,23 @@ public:
void resizeEvent(QResizeEvent *event) override; void resizeEvent(QResizeEvent *event) override;
public slots:
void updateCardDisplays() override;
private: private:
OverlapWidget *overlapWidget; OverlapWidget *overlapWidget;
QWidget* getLayoutParent() override
{
return overlapWidget;
}
void addToLayout(QWidget* toAdd) override
{
overlapWidget->addWidget(toAdd);
}
void removeFromLayout(QWidget* toRemove) override
{
overlapWidget->removeWidget(toRemove);
}
}; };
#endif // OVERLAPPED_CARD_GROUP_DISPLAY_WIDGET_H #endif // OVERLAPPED_CARD_GROUP_DISPLAY_WIDGET_H

View file

@ -35,8 +35,8 @@ DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent,
banner->setBuddy(cardGroupContainer); banner->setBuddy(cardGroupContainer);
displayCards(); displayCards();
//connect(deckListModel, &DeckListModel::dataChanged, this, &DeckCardZoneDisplayWidget::displayCards); // connect(deckListModel, &DeckListModel::dataChanged, this, &DeckCardZoneDisplayWidget::displayCards);
//connect(deckListModel, &DeckListModel::dataChanged, this, &DeckCardZoneDisplayWidget::decklistDataChanged); // connect(deckListModel, &DeckListModel::dataChanged, this, &DeckCardZoneDisplayWidget::decklistDataChanged);
connect(deckListModel, &QAbstractItemModel::rowsInserted, this, &DeckCardZoneDisplayWidget::onCategoryAddition); connect(deckListModel, &QAbstractItemModel::rowsInserted, this, &DeckCardZoneDisplayWidget::onCategoryAddition);
connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &DeckCardZoneDisplayWidget::onCategoryRemoval); connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &DeckCardZoneDisplayWidget::onCategoryRemoval);
} }
@ -44,35 +44,33 @@ DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent,
void DeckCardZoneDisplayWidget::onCategoryAddition(const QModelIndex &parent, int first, int last) void DeckCardZoneDisplayWidget::onCategoryAddition(const QModelIndex &parent, int first, int last)
{ {
if (parent == trackedIndex) { if (parent == trackedIndex) {
qInfo() << deckListModel->data(trackedIndex.sibling(trackedIndex.row(), 1), Qt::EditRole).toString() << " zone thinks it has a new category";
for (int i = first; i <= last; i++) { for (int i = first; i <= last; i++) {
QPersistentModelIndex index = QPersistentModelIndex(deckListModel->index(i, 1, trackedIndex)); QPersistentModelIndex index = QPersistentModelIndex(deckListModel->index(i, 0, trackedIndex));
if (indexToWidgetMap.contains(index)) { if (indexToWidgetMap.contains(index)) {
continue; continue;
} }
qInfo() << deckListModel->data(index, Qt::EditRole).toString(); auto categoryName = deckListModel->data(index.sibling(index.row(), 1), Qt::EditRole).toString();
qInfo() << categoryName;
if (displayType == "overlap") { if (displayType == "overlap") {
auto *display_widget = new OverlappedCardGroupDisplayWidget( auto *display_widget = new OverlappedCardGroupDisplayWidget(
cardGroupContainer, deckListModel, zoneName, deckListModel->data(index, Qt::EditRole).toString(), activeGroupCriteria, activeSortCriteria, cardGroupContainer, deckListModel, index, zoneName, categoryName,
subBannerOpacity, cardSizeWidget); activeGroupCriteria, activeSortCriteria, subBannerOpacity, cardSizeWidget);
connect(display_widget, SIGNAL(cardClicked(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)), this, connect(display_widget, SIGNAL(cardClicked(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)),
SLOT(onClick(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *))); this, 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,
&CardGroupDisplayWidget::onActiveSortCriteriaChanged);
cardGroupLayout->addWidget(display_widget); cardGroupLayout->addWidget(display_widget);
indexToWidgetMap.insert(index, display_widget); indexToWidgetMap.insert(index, display_widget);
} else if (displayType == "flat") { } else if (displayType == "flat") {
auto *display_widget = new FlatCardGroupDisplayWidget(cardGroupContainer, deckListModel, zoneName, auto *display_widget = new FlatCardGroupDisplayWidget(
deckListModel->data(index, Qt::EditRole).toString(), activeGroupCriteria, activeSortCriteria, cardGroupContainer, deckListModel, index, zoneName, categoryName,
subBannerOpacity, cardSizeWidget); activeGroupCriteria, activeSortCriteria, subBannerOpacity, cardSizeWidget);
connect(display_widget, SIGNAL(cardClicked(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)), this, connect(display_widget, SIGNAL(cardClicked(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)),
SLOT(onClick(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *))); this, 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,
&CardGroupDisplayWidget::onActiveSortCriteriaChanged);
cardGroupLayout->addWidget(display_widget); cardGroupLayout->addWidget(display_widget);
indexToWidgetMap.insert(index, display_widget); indexToWidgetMap.insert(index, display_widget);
} }
@ -115,6 +113,37 @@ void DeckCardZoneDisplayWidget::onHover(CardInfoPtr card)
void DeckCardZoneDisplayWidget::displayCards() void DeckCardZoneDisplayWidget::displayCards()
{ {
qInfo() << "Constructing Group Display Widgets for Zone Display widget";
qInfo() << deckListModel->data(trackedIndex.sibling(trackedIndex.row(), 1), Qt::EditRole).toString() << " has " << deckListModel->rowCount(trackedIndex.sibling(trackedIndex.row(), 0)) << " entries.";
for (int i = 0; i < deckListModel->rowCount(trackedIndex); ++i) {
QPersistentModelIndex index = QPersistentModelIndex(deckListModel->index(i, 0, trackedIndex));
if (indexToWidgetMap.contains(index)) {
continue;
}
auto categoryName = deckListModel->data(index.sibling(index.row(), 1), Qt::EditRole).toString();
qInfo() << categoryName;
if (displayType == "overlap") {
auto *display_widget = new OverlappedCardGroupDisplayWidget(
cardGroupContainer, deckListModel, index, zoneName, categoryName,
activeGroupCriteria, activeSortCriteria, subBannerOpacity, cardSizeWidget);
connect(display_widget, SIGNAL(cardClicked(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)), this,
SLOT(onClick(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)));
connect(display_widget, SIGNAL(cardHovered(CardInfoPtr)), this, SLOT(onHover(CardInfoPtr)));
cardGroupLayout->addWidget(display_widget);
indexToWidgetMap.insert(index, display_widget);
} else if (displayType == "flat") {
auto *display_widget = new FlatCardGroupDisplayWidget(
cardGroupContainer, deckListModel, index, zoneName, categoryName,
activeGroupCriteria, activeSortCriteria, subBannerOpacity, cardSizeWidget);
connect(display_widget, SIGNAL(cardClicked(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)), this,
SLOT(onClick(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)));
connect(display_widget, SIGNAL(cardHovered(CardInfoPtr)), this, SLOT(onHover(CardInfoPtr)));
cardGroupLayout->addWidget(display_widget);
indexToWidgetMap.insert(index, display_widget);
}
}
} }
void DeckCardZoneDisplayWidget::refreshDisplayType(const DisplayType &_displayType) void DeckCardZoneDisplayWidget::refreshDisplayType(const DisplayType &_displayType)
@ -130,6 +159,8 @@ void DeckCardZoneDisplayWidget::refreshDisplayType(const DisplayType &_displayTy
delete item; delete item;
} }
indexToWidgetMap.clear();
// We gotta wait for all the deleteLater's to finish so we fire after the next event cycle // We gotta wait for all the deleteLater's to finish so we fire after the next event cycle
auto timer = new QTimer(this); auto timer = new QTimer(this);
@ -138,51 +169,6 @@ void DeckCardZoneDisplayWidget::refreshDisplayType(const DisplayType &_displayTy
timer->start(); timer->start();
} }
void DeckCardZoneDisplayWidget::addCardGroupIfItDoesNotExist()
{
QList<CardGroupDisplayWidget *> cardGroupsDisplayWidgets =
cardGroupContainer->findChildren<CardGroupDisplayWidget *>();
QList<QString> cardGroups = getGroupCriteriaValueList();
for (QString cardGroup : cardGroups) {
bool found = false;
for (CardGroupDisplayWidget *cardGroupDisplayWidget : cardGroupsDisplayWidgets) {
if (cardGroupDisplayWidget->cardGroupCategory == cardGroup) {
found = true;
cardGroupDisplayWidget->updateCardDisplays();
break;
}
}
if (found) {
continue;
}
if (displayType == DisplayType::Overlap) {
auto *display_widget = new OverlappedCardGroupDisplayWidget(
cardGroupContainer, deckListModel, zoneName, cardGroup, activeGroupCriteria, activeSortCriteria,
subBannerOpacity, cardSizeWidget);
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,
&CardGroupDisplayWidget::onActiveSortCriteriaChanged);
cardGroupLayout->addWidget(display_widget);
} else if (displayType == DisplayType::Flat) {
auto *display_widget = new FlatCardGroupDisplayWidget(cardGroupContainer, deckListModel, zoneName,
cardGroup, activeGroupCriteria, activeSortCriteria,
subBannerOpacity, cardSizeWidget);
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,
&CardGroupDisplayWidget::onActiveSortCriteriaChanged);
cardGroupLayout->addWidget(display_widget);
}
}
}
void DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged(QString _activeGroupCriteria) void DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged(QString _activeGroupCriteria)
{ {
activeGroupCriteria = _activeGroupCriteria; activeGroupCriteria = _activeGroupCriteria;

View file

@ -38,7 +38,6 @@ public slots:
void onHover(CardInfoPtr card); void onHover(CardInfoPtr card);
void displayCards(); void displayCards();
void refreshDisplayType(const DisplayType &displayType); void refreshDisplayType(const DisplayType &displayType);
void addCardGroupIfItDoesNotExist();
void onActiveGroupCriteriaChanged(QString activeGroupCriteria); void onActiveGroupCriteriaChanged(QString activeGroupCriteria);
void onActiveSortCriteriaChanged(QStringList activeSortCriteria); void onActiveSortCriteriaChanged(QStringList activeSortCriteria);
QList<QString> getGroupCriteriaValueList(); QList<QString> getGroupCriteriaValueList();

View file

@ -88,6 +88,12 @@ void FlowWidget::addWidget(QWidget *widget_to_add) const
flowLayout->addWidget(widget_to_add); flowLayout->addWidget(widget_to_add);
} }
void FlowWidget::insertWidgetAtIndex(QWidget *toInsert, int index)
{
flowLayout->insertWidgetAtIndex(toInsert, index);
update();
}
void FlowWidget::removeWidget(QWidget *widgetToRemove) const void FlowWidget::removeWidget(QWidget *widgetToRemove) const
{ {
flowLayout->removeWidget(widgetToRemove); flowLayout->removeWidget(widgetToRemove);

View file

@ -20,6 +20,7 @@ public:
Qt::ScrollBarPolicy horizontalPolicy, Qt::ScrollBarPolicy horizontalPolicy,
Qt::ScrollBarPolicy verticalPolicy); Qt::ScrollBarPolicy verticalPolicy);
void addWidget(QWidget *widget_to_add) const; void addWidget(QWidget *widget_to_add) const;
void insertWidgetAtIndex(QWidget *toInsert, int index);
void removeWidget(QWidget *widgetToRemove) const; void removeWidget(QWidget *widgetToRemove) const;
void clearLayout(); void clearLayout();
[[nodiscard]] int count() const; [[nodiscard]] int count() const;

View file

@ -203,16 +203,16 @@ void VisualDeckEditorWidget::onCardAddition(const QModelIndex &parent, int first
{ {
if (parent == deckListModel->getRoot()) { if (parent == deckListModel->getRoot()) {
for (int i = first; i <= last; i++) { for (int i = first; i <= last; i++) {
QPersistentModelIndex index = QPersistentModelIndex(deckListModel->index(i, 1, deckListModel->getRoot())); QPersistentModelIndex index = QPersistentModelIndex(deckListModel->index(i, 0, deckListModel->getRoot()));
if (indexToWidgetMap.contains(index)) { if (indexToWidgetMap.contains(index)) {
continue; continue;
} }
qInfo() << deckListModel->data(index, Qt::EditRole).toString(); qInfo() << "Created zone for " << deckListModel->data(index.sibling(index.row(), 1), Qt::EditRole).toString();
DeckCardZoneDisplayWidget *zoneDisplayWidget = new DeckCardZoneDisplayWidget( DeckCardZoneDisplayWidget *zoneDisplayWidget = new DeckCardZoneDisplayWidget(
zoneContainer, deckListModel, index, deckListModel->data(index, Qt::EditRole).toString(), activeGroupCriteria, zoneContainer, deckListModel, index, deckListModel->data(index.sibling(index.row(), 1), Qt::EditRole).toString(), activeGroupCriteria,
activeSortCriteria, 20, 10, cardSizeWidget); activeSortCriteria, 20, 10, cardSizeWidget);
connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardHovered, this, &VisualDeckEditorWidget::onHover); connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardHovered, this, &VisualDeckEditorWidget::onHover);
connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardClicked, this, &VisualDeckEditorWidget::onCardClick); connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardClicked, this, &VisualDeckEditorWidget::onCardClick);
@ -222,6 +222,7 @@ void VisualDeckEditorWidget::onCardAddition(const QModelIndex &parent, int first
&DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged); &DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged);
connect(this, &VisualDeckEditorWidget::displayTypeChanged, zoneDisplayWidget, connect(this, &VisualDeckEditorWidget::displayTypeChanged, zoneDisplayWidget,
&DeckCardZoneDisplayWidget::refreshDisplayType); &DeckCardZoneDisplayWidget::refreshDisplayType);
zoneDisplayWidget->refreshDisplayType(currentDisplayType == DisplayType::Flat ? "flat" : "overlap");
zoneContainerLayout->addWidget(zoneDisplayWidget); zoneContainerLayout->addWidget(zoneDisplayWidget);
indexToWidgetMap.insert(index, zoneDisplayWidget); indexToWidgetMap.insert(index, zoneDisplayWidget);
@ -247,16 +248,16 @@ void VisualDeckEditorWidget::constructZoneWidgetsFromDeckListModel()
{ {
qInfo() << "Constructing zone widgets"; qInfo() << "Constructing zone widgets";
for (int i = 0; i < deckListModel->rowCount(deckListModel->parent(QModelIndex())); ++i) { for (int i = 0; i < deckListModel->rowCount(deckListModel->parent(QModelIndex())); ++i) {
QPersistentModelIndex index = QPersistentModelIndex(deckListModel->index(i, 1, deckListModel->getRoot())); QPersistentModelIndex index = QPersistentModelIndex(deckListModel->index(i, 0, deckListModel->getRoot()));
if (indexToWidgetMap.contains(index)) { if (indexToWidgetMap.contains(index)) {
continue; continue;
} }
qInfo() << deckListModel->data(index, Qt::EditRole).toString(); qInfo() << deckListModel->data(index.sibling(index.row(), 1), Qt::EditRole).toString();
DeckCardZoneDisplayWidget *zoneDisplayWidget = new DeckCardZoneDisplayWidget( DeckCardZoneDisplayWidget *zoneDisplayWidget = new DeckCardZoneDisplayWidget(
zoneContainer, deckListModel, index, deckListModel->data(index, Qt::EditRole).toString(), activeGroupCriteria, zoneContainer, deckListModel, index, deckListModel->data(index.sibling(index.row(), 1), Qt::EditRole).toString(), activeGroupCriteria,
activeSortCriteria, 20, 10, cardSizeWidget); activeSortCriteria, 20, 10, cardSizeWidget);
connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardHovered, this, &VisualDeckEditorWidget::onHover); connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardHovered, this, &VisualDeckEditorWidget::onHover);
connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardClicked, this, &VisualDeckEditorWidget::onCardClick); connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardClicked, this, &VisualDeckEditorWidget::onCardClick);