From 497e4f1be06af7a15e90de9fd54bed9a7c02551a Mon Sep 17 00:00:00 2001 From: BruebachL <44814898+BruebachL@users.noreply.github.com> Date: Tue, 14 Jan 2025 04:02:33 +0100 Subject: [PATCH] Add loadFromFileAsync to deckLoader and connect VisualDeckStorageWidget to it. (#5456) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add loadFromFileAsync to deckLoader and connect VisualDeckStorageWidget to it. * Address comments. * Lint. * Unlint something. --------- Co-authored-by: Lukas BrĂ¼bach --- .../deck_preview_color_identity_widget.cpp | 2 +- .../deck_preview_color_identity_widget.h | 4 +- .../deck_preview/deck_preview_widget.cpp | 24 ++++++--- .../deck_preview/deck_preview_widget.h | 1 + cockatrice/src/deck/deck_loader.cpp | 53 +++++++++++++++++-- cockatrice/src/deck/deck_loader.h | 8 ++- 6 files changed, 77 insertions(+), 15 deletions(-) diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_widget.cpp b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_widget.cpp index 2121f2a88..c28f1bb4a 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_widget.cpp +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_widget.cpp @@ -116,7 +116,7 @@ QChar DeckPreviewColorCircleWidget::getColorChar() const return colorChar; } -DeckPreviewColorIdentityWidget::DeckPreviewColorIdentityWidget(const QString &colorIdentity, QWidget *parent) +DeckPreviewColorIdentityWidget::DeckPreviewColorIdentityWidget(QWidget *parent, const QString &colorIdentity) : QWidget(parent) { QHBoxLayout *layout = new QHBoxLayout(this); diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_widget.h b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_widget.h index 0dd40df10..3044793e6 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_widget.h +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_widget.h @@ -11,7 +11,7 @@ class DeckPreviewColorCircleWidget : public QWidget Q_OBJECT public: - explicit DeckPreviewColorCircleWidget(QChar color, QWidget *parent = nullptr); + explicit DeckPreviewColorCircleWidget(QChar color, QWidget *parent); void setColorActive(bool active); QChar getColorChar() const; @@ -33,7 +33,7 @@ class DeckPreviewColorIdentityWidget : public QWidget Q_OBJECT public: - explicit DeckPreviewColorIdentityWidget(const QString &colorIdentity, QWidget *parent = nullptr); + explicit DeckPreviewColorIdentityWidget(QWidget *parent, const QString &colorIdentity); protected: void resizeEvent(QResizeEvent *event) override; 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 ab371bd32..18bc771d1 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 @@ -16,12 +16,8 @@ DeckPreviewWidget::DeckPreviewWidget(VisualDeckStorageWidget *_parent, const QSt setLayout(layout); deckLoader = new DeckLoader(); - deckLoader->loadFromFile(filePath, DeckLoader::CockatriceFormat); - - auto bannerCard = deckLoader->getBannerCard().first.isEmpty() - ? CardInfoPtr() - : CardDatabaseManager::getInstance()->getCardByNameAndProviderId( - deckLoader->getBannerCard().first, deckLoader->getBannerCard().second); + connect(deckLoader, &DeckLoader::loadFinished, this, &DeckPreviewWidget::initializeUi); + deckLoader->loadFromFileAsync(filePath, DeckLoader::CockatriceFormat, false); bannerCardDisplayWidget = new DeckPreviewCardPictureWidget(this); @@ -30,16 +26,28 @@ DeckPreviewWidget::DeckPreviewWidget(VisualDeckStorageWidget *_parent, const QSt connect(bannerCardDisplayWidget, &DeckPreviewCardPictureWidget::imageDoubleClicked, this, &DeckPreviewWidget::imageDoubleClickedEvent); + layout->addWidget(bannerCardDisplayWidget); +} + +void DeckPreviewWidget::initializeUi(const bool deckLoadSuccess) +{ + if (!deckLoadSuccess) { + return; + } + auto bannerCard = deckLoader->getBannerCard().first.isEmpty() + ? CardInfoPtr() + : CardDatabaseManager::getInstance()->getCardByNameAndProviderId( + deckLoader->getBannerCard().first, deckLoader->getBannerCard().second); + bannerCardDisplayWidget->setCard(bannerCard); bannerCardDisplayWidget->setOverlayText( deckLoader->getName().isEmpty() ? QFileInfo(deckLoader->getLastFileName()).fileName() : deckLoader->getName()); bannerCardDisplayWidget->setFontSize(24); setFilePath(deckLoader->getLastFileName()); - colorIdentityWidget = new DeckPreviewColorIdentityWidget(getColorIdentity()); + colorIdentityWidget = new DeckPreviewColorIdentityWidget(this, getColorIdentity()); deckTagsDisplayWidget = new DeckPreviewDeckTagsDisplayWidget(this, deckLoader); - layout->addWidget(bannerCardDisplayWidget); layout->addWidget(colorIdentityWidget); layout->addWidget(deckTagsDisplayWidget); } 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 8c9be2c8b..689c94b18 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,7 @@ public slots: void setFilePath(const QString &filePath); void imageClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance); void imageDoubleClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance); + void initializeUi(bool deckLoadSuccess); }; #endif // DECK_PREVIEW_WIDGET_H diff --git a/cockatrice/src/deck/deck_loader.cpp b/cockatrice/src/deck/deck_loader.cpp index cc08180bd..155f8c038 100644 --- a/cockatrice/src/deck/deck_loader.cpp +++ b/cockatrice/src/deck/deck_loader.cpp @@ -8,11 +8,10 @@ #include #include #include +#include #include #include -#include - -Q_LOGGING_CATEGORY(DeckLoaderLog, "deck_loader") +#include const QStringList DeckLoader::fileNameFilters = QStringList() << QObject::tr("Common deck formats (*.cod *.dec *.dek *.txt *.mwDeck)") @@ -80,6 +79,54 @@ bool DeckLoader::loadFromFile(const QString &fileName, FileFormat fmt, bool user return result; } +bool DeckLoader::loadFromFileAsync(const QString &fileName, FileFormat fmt, bool userRequest) +{ + auto *watcher = new QFutureWatcher(this); + + connect(watcher, &QFutureWatcher::finished, this, [this, watcher, fileName, fmt, userRequest]() { + const bool result = watcher->result(); + watcher->deleteLater(); + + if (result) { + lastFileName = fileName; + lastFileFormat = fmt; + if (userRequest) { + updateLastLoadedTimestamp(fileName, fmt); + } + emit deckLoaded(); + } + + emit loadFinished(result); + }); + + QFuture future = QtConcurrent::run([=, this]() { + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + return false; + } + + switch (fmt) { + case PlainTextFormat: + return loadFromFile_Plain(&file); + case CockatriceFormat: { + bool result = false; + result = loadFromFile_Native(&file); + if (!result) { + file.seek(0); + return loadFromFile_Plain(&file); + } + return result; + } + default: + return false; + break; + } + }); + + watcher->setFuture(future); + return true; // Return immediately to indicate the async task was started +} + bool DeckLoader::loadFromRemote(const QString &nativeString, int remoteDeckId) { bool result = loadFromString_Native(nativeString); diff --git a/cockatrice/src/deck/deck_loader.h b/cockatrice/src/deck/deck_loader.h index 741e5fe30..6d2631d33 100644 --- a/cockatrice/src/deck/deck_loader.h +++ b/cockatrice/src/deck/deck_loader.h @@ -3,11 +3,16 @@ #include "decklist.h" -class DeckLoader : public DeckList +#include + +inline Q_LOGGING_CATEGORY(DeckLoaderLog, "deck_loader") + + class DeckLoader : public DeckList { Q_OBJECT signals: void deckLoaded(); + void loadFinished(bool success); public: enum FileFormat @@ -43,6 +48,7 @@ public: static FileFormat getFormatFromName(const QString &fileName); bool loadFromFile(const QString &fileName, FileFormat fmt, bool userRequest = false); + bool loadFromFileAsync(const QString &fileName, FileFormat fmt, bool userRequest); bool loadFromRemote(const QString &nativeString, int remoteDeckId); bool saveToFile(const QString &fileName, FileFormat fmt); bool updateLastLoadedTimestamp(const QString &fileName, FileFormat fmt);