diff --git a/cockatrice/resources/config/qtlogging.ini b/cockatrice/resources/config/qtlogging.ini index 2cd3d871a..02a107345 100644 --- a/cockatrice/resources/config/qtlogging.ini +++ b/cockatrice/resources/config/qtlogging.ini @@ -5,14 +5,14 @@ # Uncomment a rule to disable logging for that category, # or set .debug = true for that category to see debug level logs -# main = false -# qt_translator = false -# window_main.* = false -# release_channel = false -# spoiler_background_updater = false -# theme_manager = false -# sound_engine = false -# tapped_out_interface = false +main = false +qt_translator = false +window_main = false +release_channel = false +spoiler_background_updater = false +theme_manager = false +sound_engine = false +tapped_out_interface = false # tab_game = false # tab_message = false @@ -38,17 +38,17 @@ # user_info_connection = false -# picture_loader = false -# picture_loader.worker = false -# picture_loader.card_back_cache_fail = false -# picture_loader.picture_to_load = false +picture_loader = false +picture_loader.worker = false +picture_loader.card_back_cache_fail = false +picture_loader.picture_to_load = false # deck_loader = false -# card_database = false -# card_database.loading = false -# card_database.loading.success_or_failure = false -# cockatrice_xml.* = false -# cockatrice_xml.xml_3_parser = false -# cockatrice_xml.xml_4_parser = false +card_database = false +card_database.loading = false +card_database.loading.success_or_failure = true +cockatrice_xml.* = false +cockatrice_xml.xml_3_parser = false +cockatrice_xml.xml_4_parser = false # card_info = false # card_list = false diff --git a/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual.cpp b/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual.cpp index 68f1eee17..7e3ce3c5b 100644 --- a/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual.cpp +++ b/cockatrice/src/client/tabs/visual_deck_editor/tab_deck_editor_visual.cpp @@ -81,7 +81,7 @@ void TabDeckEditorVisual::createCentralFrame() void TabDeckEditorVisual::onDeckChanged() { AbstractTabDeckEditor::onDeckModified(); - tabContainer->visualDeckView->decklistDataChanged(QModelIndex(), QModelIndex()); + tabContainer->visualDeckView->constructZoneWidgetsFromDeckListModel(); tabContainer->deckAnalytics->refreshDisplays(deckDockWidget->deckModel); tabContainer->sampleHandWidget->setDeckModel(deckDockWidget->deckModel); } 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 f1885e11f..c92b521c9 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,6 +9,7 @@ DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent, DeckListModel *_deckListModel, + QPersistentModelIndex _trackedIndex, QString _zoneName, QString _activeGroupCriteria, QStringList _activeSortCriteria, @@ -16,7 +17,7 @@ DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent, int bannerOpacity, int subBannerOpacity, CardSizeWidget *_cardSizeWidget) - : QWidget(parent), deckListModel(_deckListModel), zoneName(_zoneName), activeGroupCriteria(_activeGroupCriteria), + : QWidget(parent), deckListModel(_deckListModel), trackedIndex(_trackedIndex), zoneName(_zoneName), activeGroupCriteria(_activeGroupCriteria), activeSortCriteria(_activeSortCriteria), displayType(_displayType), bannerOpacity(bannerOpacity), subBannerOpacity(subBannerOpacity), cardSizeWidget(_cardSizeWidget) { @@ -34,8 +35,65 @@ DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent, banner->setBuddy(cardGroupContainer); displayCards(); - connect(deckListModel, &DeckListModel::dataChanged, this, &DeckCardZoneDisplayWidget::displayCards); + //connect(deckListModel, &DeckListModel::dataChanged, this, &DeckCardZoneDisplayWidget::displayCards); + //connect(deckListModel, &DeckListModel::dataChanged, this, &DeckCardZoneDisplayWidget::decklistDataChanged); + connect(deckListModel, &QAbstractItemModel::rowsInserted, this, &DeckCardZoneDisplayWidget::onCategoryAddition); + connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &DeckCardZoneDisplayWidget::onCategoryRemoval); } + +void DeckCardZoneDisplayWidget::onCategoryAddition(const QModelIndex &parent, int first, int last) +{ + if (parent == trackedIndex) { + for (int i = first; i <= last; i++) { + QPersistentModelIndex index = QPersistentModelIndex(deckListModel->index(i, 1, trackedIndex)); + + if (indexToWidgetMap.contains(index)) { + continue; + } + + qInfo() << deckListModel->data(index, Qt::EditRole).toString(); + + if (displayType == "overlap") { + auto *display_widget = new OverlappedCardGroupDisplayWidget( + cardGroupContainer, deckListModel, zoneName, deckListModel->data(index, Qt::EditRole).toString(), 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); + indexToWidgetMap.insert(index, display_widget); + } else if (displayType == "flat") { + auto *display_widget = new FlatCardGroupDisplayWidget(cardGroupContainer, deckListModel, zoneName, + deckListModel->data(index, Qt::EditRole).toString(), 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); + indexToWidgetMap.insert(index, display_widget); + } + } + } +} + +void DeckCardZoneDisplayWidget::onCategoryRemoval(const QModelIndex &parent, int first, int last) +{ + Q_UNUSED(parent); + Q_UNUSED(first); + Q_UNUSED(last); + for (const QPersistentModelIndex &idx : indexToWidgetMap.keys()) { + if (!idx.isValid()) { + cardGroupLayout->removeWidget(indexToWidgetMap.value(idx)); + indexToWidgetMap.value(idx)->deleteLater(); + indexToWidgetMap.remove(idx); + } + } +} + void DeckCardZoneDisplayWidget::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); @@ -57,8 +115,6 @@ void DeckCardZoneDisplayWidget::onHover(CardInfoPtr card) void DeckCardZoneDisplayWidget::displayCards() { - addCardGroupIfItDoesNotExist(); - deleteCardGroupIfItDoesNotExist(); } void DeckCardZoneDisplayWidget::refreshDisplayType(const DisplayType &_displayType) @@ -127,21 +183,6 @@ void DeckCardZoneDisplayWidget::addCardGroupIfItDoesNotExist() } } -void DeckCardZoneDisplayWidget::deleteCardGroupIfItDoesNotExist() -{ - QList cardGroupsDisplayWidgets = - cardGroupContainer->findChildren(); - - QList validGroups = getGroupCriteriaValueList(); - - for (CardGroupDisplayWidget *cardGroupDisplayWidget : cardGroupsDisplayWidgets) { - if (!validGroups.contains(cardGroupDisplayWidget->cardGroupCategory)) { - cardGroupLayout->removeWidget(cardGroupDisplayWidget); - cardGroupDisplayWidget->deleteLater(); // Properly delete the widget after the event loop cycles - } - } -} - void DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged(QString _activeGroupCriteria) { activeGroupCriteria = _activeGroupCriteria; 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 861896abf..e1abd4931 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 @@ -19,6 +19,7 @@ class DeckCardZoneDisplayWidget : public QWidget public: DeckCardZoneDisplayWidget(QWidget *parent, DeckListModel *deckListModel, + QPersistentModelIndex trackedIndex, QString zoneName, QString activeGroupCriteria, QStringList activeSortCriteria, @@ -27,6 +28,7 @@ public: int subBannerOpacity, CardSizeWidget *_cardSizeWidget); DeckListModel *deckListModel; + QPersistentModelIndex trackedIndex; QString zoneName; void addCardsToOverlapWidget(); void resizeEvent(QResizeEvent *event) override; @@ -37,10 +39,11 @@ public slots: void displayCards(); void refreshDisplayType(const DisplayType &displayType); void addCardGroupIfItDoesNotExist(); - void deleteCardGroupIfItDoesNotExist(); void onActiveGroupCriteriaChanged(QString activeGroupCriteria); void onActiveSortCriteriaChanged(QStringList activeSortCriteria); QList getGroupCriteriaValueList(); + void onCategoryAddition(const QModelIndex &parent, int first, int last); + void onCategoryRemoval(const QModelIndex &parent, int first, int last); signals: void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card, QString zoneName); @@ -59,6 +62,7 @@ private: QWidget *cardGroupContainer; QVBoxLayout *cardGroupLayout; OverlapWidget *overlapWidget; + QHash indexToWidgetMap; }; #endif // DECK_CARD_ZONE_DISPLAY_WIDGET_H 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 f659fac39..cf1c49b70 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 @@ -26,8 +26,6 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, DeckListModel *_deckListModel) : QWidget(parent), deckListModel(_deckListModel) { - connect(deckListModel, &DeckListModel::dataChanged, this, &VisualDeckEditorWidget::decklistDataChanged); - // The Main Widget and Main Layout, which contain a single Widget: The Scroll Area setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); mainLayout = new QVBoxLayout(this); @@ -175,14 +173,17 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, DeckListModel *_ scrollArea->addScrollBarWidget(zoneContainer, Qt::AlignHCenter); scrollArea->setWidget(zoneContainer); - updateZoneWidgets(); - cardSizeWidget = new CardSizeWidget(this); mainLayout->addWidget(groupAndSortContainer); mainLayout->addWidget(scrollArea); mainLayout->addWidget(cardSizeWidget); + connect(deckListModel, &DeckListModel::dataChanged, this, &VisualDeckEditorWidget::decklistDataChanged); + connect(deckListModel, &QAbstractItemModel::rowsInserted, this, &VisualDeckEditorWidget::onCardAddition); + connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &VisualDeckEditorWidget::onCardRemoval); + constructZoneWidgetsFromDeckListModel(); + retranslateUi(); } @@ -198,10 +199,81 @@ void VisualDeckEditorWidget::retranslateUi() tr("Change how cards are displayed within zones (i.e. overlapped or fully visible.)")); } +void VisualDeckEditorWidget::onCardAddition(const QModelIndex &parent, int first, int last) +{ + if (parent == deckListModel->getRoot()) { + for (int i = first; i <= last; i++) { + QPersistentModelIndex index = QPersistentModelIndex(deckListModel->index(i, 1, deckListModel->getRoot())); + + if (indexToWidgetMap.contains(index)) { + continue; + } + + qInfo() << deckListModel->data(index, Qt::EditRole).toString(); + + DeckCardZoneDisplayWidget *zoneDisplayWidget = new DeckCardZoneDisplayWidget( + zoneContainer, deckListModel, index, deckListModel->data(index, Qt::EditRole).toString(), activeGroupCriteria, + activeSortCriteria, 20, 10, cardSizeWidget); + 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); + connect(this, &VisualDeckEditorWidget::displayTypeChanged, zoneDisplayWidget, + &DeckCardZoneDisplayWidget::refreshDisplayType); + zoneContainerLayout->addWidget(zoneDisplayWidget); + + indexToWidgetMap.insert(index, zoneDisplayWidget); + } + } +} + +void VisualDeckEditorWidget::onCardRemoval(const QModelIndex &parent, int first, int last) +{ + Q_UNUSED(parent); + Q_UNUSED(first); + Q_UNUSED(last); + for (const QPersistentModelIndex &idx : indexToWidgetMap.keys()) { + if (!idx.isValid()) { + zoneContainerLayout->removeWidget(indexToWidgetMap.value(idx)); + indexToWidgetMap.value(idx)->deleteLater(); + indexToWidgetMap.remove(idx); + } + } +} + +void VisualDeckEditorWidget::constructZoneWidgetsFromDeckListModel() +{ + qInfo() << "Constructing zone widgets"; + for (int i = 0; i < deckListModel->rowCount(deckListModel->parent(QModelIndex())); ++i) { + QPersistentModelIndex index = QPersistentModelIndex(deckListModel->index(i, 1, deckListModel->getRoot())); + + if (indexToWidgetMap.contains(index)) { + continue; + } + + qInfo() << deckListModel->data(index, Qt::EditRole).toString(); + + DeckCardZoneDisplayWidget *zoneDisplayWidget = new DeckCardZoneDisplayWidget( + zoneContainer, deckListModel, index, deckListModel->data(index, Qt::EditRole).toString(), activeGroupCriteria, + activeSortCriteria, 20, 10, cardSizeWidget); + 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); + connect(this, &VisualDeckEditorWidget::displayTypeChanged, zoneDisplayWidget, + &DeckCardZoneDisplayWidget::refreshDisplayType); + zoneContainerLayout->addWidget(zoneDisplayWidget); + + indexToWidgetMap.insert(index, zoneDisplayWidget); + } +} + void VisualDeckEditorWidget::updateZoneWidgets() { - addZoneIfDoesNotExist(); - deleteZoneIfDoesNotExist(); } void VisualDeckEditorWidget::updateDisplayType() @@ -221,57 +293,6 @@ void VisualDeckEditorWidget::updateDisplayType() emit displayTypeChanged(currentDisplayType); } -void VisualDeckEditorWidget::addZoneIfDoesNotExist() -{ - QList cardZoneDisplayWidgets = - zoneContainer->findChildren(); - for (const QString &zone : *deckListModel->getZones()) { - bool found = false; - for (DeckCardZoneDisplayWidget *displayWidget : cardZoneDisplayWidgets) { - if (displayWidget->zoneName == zone) { - found = true; - displayWidget->displayCards(); - break; - } - } - - if (found) { - continue; - } - DeckCardZoneDisplayWidget *zoneDisplayWidget = - new DeckCardZoneDisplayWidget(zoneContainer, deckListModel, zone, activeGroupCriteria, activeSortCriteria, - currentDisplayType, 20, 10, cardSizeWidget); - 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); - connect(this, &VisualDeckEditorWidget::displayTypeChanged, zoneDisplayWidget, - &DeckCardZoneDisplayWidget::refreshDisplayType); - zoneContainerLayout->addWidget(zoneDisplayWidget); - } -} - -void VisualDeckEditorWidget::deleteZoneIfDoesNotExist() -{ - QList cardZoneDisplayWidgets = - zoneContainer->findChildren(); - for (DeckCardZoneDisplayWidget *displayWidget : cardZoneDisplayWidgets) { - bool found = false; - for (const QString &zone : *deckListModel->getZones()) { - if (displayWidget->zoneName == zone) { - found = true; - break; - } - } - - if (!found) { - zoneContainerLayout->removeWidget(displayWidget); - } - } -} - void VisualDeckEditorWidget::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); 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 41f8bbbbe..b8f195baa 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 @@ -41,8 +41,9 @@ public slots: void decklistDataChanged(QModelIndex topLeft, QModelIndex bottomRight); void updateZoneWidgets(); void updateDisplayType(); - void addZoneIfDoesNotExist(); - void deleteZoneIfDoesNotExist(); + void onCardAddition(const QModelIndex &parent, int first, int last); + void onCardRemoval(const QModelIndex &parent, int first, int last); + void constructZoneWidgetsFromDeckListModel(); signals: void activeCardChanged(CardInfoPtr activeCard); @@ -83,6 +84,7 @@ private: QVBoxLayout *zoneContainerLayout; // OverlapControlWidget *overlapControlWidget; QWidget *container; + QHash indexToWidgetMap; }; #endif // VISUAL_DECK_EDITOR_H diff --git a/cockatrice/src/deck/deck_list_model.cpp b/cockatrice/src/deck/deck_list_model.cpp index 746a1d9e9..eeb7c49da 100644 --- a/cockatrice/src/deck/deck_list_model.cpp +++ b/cockatrice/src/deck/deck_list_model.cpp @@ -312,7 +312,7 @@ bool DeckListModel::removeRows(int row, int count, const QModelIndex &parent) } else { emitRecursiveUpdates(parent); } - emit dataChanged(parent, parent); + return true; } diff --git a/cockatrice/src/deck/deck_list_model.h b/cockatrice/src/deck/deck_list_model.h index 81ae06508..3bca6f3df 100644 --- a/cockatrice/src/deck/deck_list_model.h +++ b/cockatrice/src/deck/deck_list_model.h @@ -92,6 +92,10 @@ signals: public: explicit DeckListModel(QObject *parent = nullptr); ~DeckListModel() override; + QModelIndex getRoot() const + { + return nodeToIndex(root); + }; QString getSortCriteriaForCard(CardInfoPtr info); int rowCount(const QModelIndex &parent) const override; int columnCount(const QModelIndex & /*parent*/ = QModelIndex()) const override;