[VDS] Make DeckPreviewWidget initializeUi lazy

This commit is contained in:
RickyRister 2025-04-21 22:31:56 -07:00
parent bcaa6c6b8a
commit b51c884cc6
2 changed files with 52 additions and 6 deletions

View file

@ -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(

View file

@ -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