From 2fe639676b859572ecbd0b50118b549bd59f3ea9 Mon Sep 17 00:00:00 2001 From: BruebachL <44814898+BruebachL@users.noreply.github.com> Date: Sat, 19 Apr 2025 00:15:33 +0200 Subject: [PATCH] VDS performance fixes (#5848) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Block updates, don't validate cardInfo and use ItemModel instead of looped addItem. * Change to QVariant map directly. --------- Co-authored-by: Lukas BrĂ¼bach --- .../deck_preview/deck_preview_widget.cpp | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp index f3bebbb90..556968d2b 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include DeckPreviewWidget::DeckPreviewWidget(QWidget *_parent, @@ -27,6 +28,8 @@ DeckPreviewWidget::DeckPreviewWidget(QWidget *_parent, deckLoader = new DeckLoader(); deckLoader->setParent(this); connect(deckLoader, &DeckLoader::loadFinished, this, &DeckPreviewWidget::initializeUi); + /* TODO: We shouldn't update the tags on *every* deck load, since it's kinda expensive. We should instead count how + many deck loads have finished already and if we've loaded all decks and THEN load all the tags at once. */ connect(deckLoader, &DeckLoader::loadFinished, visualDeckStorageWidget->tagFilterWidget, &VisualDeckStorageTagFilterWidget::refreshTags); deckLoader->loadFromFileAsync(filePath, DeckLoader::getFormatFromName(filePath), false); @@ -194,6 +197,7 @@ void DeckPreviewWidget::updateBannerCardComboBox() // Block signals temporarily bool wasBlocked = bannerCardComboBox->blockSignals(true); + bannerCardComboBox->setUpdatesEnabled(false); // Clear the existing items in the combo box bannerCardComboBox->clear(); @@ -209,12 +213,7 @@ void DeckPreviewWidget::updateBannerCardComboBox() continue; for (int k = 0; k < currentCard->getNumber(); ++k) { - CardInfoPtr info = CardDatabaseManager::getInstance()->getCardByNameAndProviderId( - currentCard->getName(), currentCard->getCardProviderId()); - if (info) { - bannerCardSet.insert( - QPair(currentCard->getName(), currentCard->getCardProviderId())); - } + bannerCardSet.insert(QPair(currentCard->getName(), currentCard->getCardProviderId())); } } } @@ -226,14 +225,19 @@ void DeckPreviewWidget::updateBannerCardComboBox() return a.first.toLower() < b.first.toLower(); }); - for (const auto &pair : pairList) { - QVariantMap dataMap; - dataMap["name"] = pair.first; - dataMap["uuid"] = pair.second; + // This is *slightly* more performant than using addItem in a loop. - bannerCardComboBox->addItem(pair.first, dataMap); + QStandardItemModel *model = new QStandardItemModel(pairList.size(), 1, bannerCardComboBox); + + int row = 0; + for (const auto &pair : pairList) { + QStandardItem *item = new QStandardItem(pair.first); + item->setData(QVariant::fromValue(pair), Qt::UserRole); + model->setItem(row++, 0, item); } + bannerCardComboBox->setModel(model); + // Try to restore the previous selection by finding the currentText int restoredIndex = bannerCardComboBox->findText(currentText); if (restoredIndex != -1) { @@ -251,15 +255,16 @@ void DeckPreviewWidget::updateBannerCardComboBox() // Restore the previous signal blocking state bannerCardComboBox->blockSignals(wasBlocked); + bannerCardComboBox->setUpdatesEnabled(true); } void DeckPreviewWidget::setBannerCard(int /* changedIndex */) { - QVariantMap itemData = bannerCardComboBox->itemData(bannerCardComboBox->currentIndex()).toMap(); - deckLoader->setBannerCard(QPair(itemData["name"].toString(), itemData["uuid"].toString())); + QVariant itemData = bannerCardComboBox->itemData(bannerCardComboBox->currentIndex()); + deckLoader->setBannerCard(QPair(bannerCardComboBox->currentText(), itemData.toString())); deckLoader->saveToFile(filePath, DeckLoader::getFormatFromName(filePath)); bannerCardDisplayWidget->setCard(CardDatabaseManager::getInstance()->getCardByNameAndProviderId( - itemData["name"].toString(), itemData["uuid"].toString())); + bannerCardComboBox->currentText(), itemData.toString())); } void DeckPreviewWidget::imageClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance)