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 556968d2b..17f824cfb 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 @@ -20,14 +20,14 @@ DeckPreviewWidget::DeckPreviewWidget(QWidget *_parent, VisualDeckStorageWidget *_visualDeckStorageWidget, const QString &_filePath) : QWidget(_parent), visualDeckStorageWidget(_visualDeckStorageWidget), filePath(_filePath), - colorIdentityWidget(nullptr), deckTagsDisplayWidget(nullptr) + checkInitializeUiTimer(QTimer(this)) { layout = new QVBoxLayout(this); setLayout(layout); deckLoader = new DeckLoader(); deckLoader->setParent(this); - connect(deckLoader, &DeckLoader::loadFinished, this, &DeckPreviewWidget::initializeUi); + connect(deckLoader, &DeckLoader::loadFinished, this, &DeckPreviewWidget::onDeckLoadFinished); /* 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, @@ -48,6 +48,10 @@ DeckPreviewWidget::DeckPreviewWidget(QWidget *_parent, &DeckPreviewWidget::updateBannerCardComboBoxVisibility); layout->addWidget(bannerCardDisplayWidget); + + checkInitializeUiTimer.setInterval(10); + connect(&checkInitializeUiTimer, &QTimer::timeout, this, &DeckPreviewWidget::tryInitializeUi); + checkInitializeUiTimer.start(); } void DeckPreviewWidget::retranslateUi() @@ -67,11 +71,46 @@ void DeckPreviewWidget::resizeEvent(QResizeEvent *event) } } -void DeckPreviewWidget::initializeUi(const bool deckLoadSuccess) +void DeckPreviewWidget::onDeckLoadFinished() { - if (!deckLoadSuccess) { + deckLoaded = true; + tryInitializeUi(); +} + +/** + * Attempts to initialize the child widgets. + * No-ops if the child widgets aren't ready to be created yet or have already been created. + * + * DeckPreviewWidget delays the creation of its child widgets until it is on screen. + * This significantly improves the performance of the VDS. + */ +void DeckPreviewWidget::tryInitializeUi() +{ + // stop if child widgets are already created from initializeUi + if (colorIdentityWidget) { return; } + + // stop if deck isn't loaded yet + if (!deckLoaded) { + return; + } + + // stop if this widget is offscreen + if (this->visibleRegion().isNull()) { + return; + } + + initializeUi(); +} + +/** + * Initializes the child widgets of the DeckPreviewWidget. + */ +void DeckPreviewWidget::initializeUi() +{ + checkInitializeUiTimer.stop(); + auto bannerCard = deckLoader->getBannerCard().first.isEmpty() ? CardInfoPtr() : CardDatabaseManager::getInstance()->getCardByNameAndProviderId( diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h index a9df635e5..66b9eb875 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h @@ -35,6 +35,8 @@ public: DeckPreviewDeckTagsDisplayWidget *deckTagsDisplayWidget = nullptr; QLabel *bannerCardLabel = nullptr; QComboBox *bannerCardComboBox = nullptr; + QTimer checkInitializeUiTimer; + bool deckLoaded = false; bool filteredBySearch = false; bool filteredByColor = false; bool filteredByTags = false; @@ -51,20 +53,25 @@ public slots: void setBannerCard(int); void imageClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance); void imageDoubleClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance); - void initializeUi(bool deckLoadSuccess); void updateVisibility(); void updateBannerCardComboBoxVisibility(bool visible); void updateTagsVisibility(bool visible); - void resizeEvent(QResizeEvent *event) override; private: QMenu *createRightClickMenu(); void addSetBannerCardMenu(QMenu *menu); private slots: + void onDeckLoadFinished(); + void tryInitializeUi(); + void initializeUi(); + void actRenameDeck(); void actRenameFile(); void actDeleteFile(); + +protected slots: + void resizeEvent(QResizeEvent *event) override; }; class NoScrollFilter : public QObject