From 5c021f0aada2adcc3f112f233ddb5292fc27b4de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Sun, 14 Jun 2026 08:45:47 +0200 Subject: [PATCH] Convert queue to while loop. Took 19 seconds --- .../server/user/user_card_art_provider.cpp | 103 +++++++++--------- 1 file changed, 53 insertions(+), 50 deletions(-) diff --git a/cockatrice/src/interface/widgets/server/user/user_card_art_provider.cpp b/cockatrice/src/interface/widgets/server/user/user_card_art_provider.cpp index 5683c5ef1..70a56375e 100644 --- a/cockatrice/src/interface/widgets/server/user/user_card_art_provider.cpp +++ b/cockatrice/src/interface/widgets/server/user/user_card_art_provider.cpp @@ -79,65 +79,68 @@ void UserCardArtProvider::processQueue() return; } - if (queue.isEmpty()) { - return; - } + while (!queue.isEmpty()) { + const QString key = queue.dequeue(); - const QString key = queue.dequeue(); - - const QStringList parts = key.split(u'|'); - if (parts.size() != 2) { - pending.remove(key); - processQueue(); - return; - } - - const QString userName = parts.at(0); - const QString cardName = parts.at(1); - - ExactCard card = CardDatabaseManager::query()->getCard({cardName}); - - if (!card) { - pending.remove(key); - processQueue(); - return; - } - - QPixmap fullRes; - CardPictureLoader::getPixmap(fullRes, card, QSize(745, 1040)); - - // If already available, store immediately - if (!fullRes.isNull()) { - insertIntoCache(key, cropCardArt(fullRes)); - pending.remove(key); - - emit cardArtUpdated(userName); - processQueue(); - return; - } - - // Otherwise wait for async load - QPointer self(this); - - connect(card.getCardPtr().data(), &CardInfo::pixmapUpdated, this, [self, key, userName, card]() mutable { - if (!self) { - return; + const QStringList parts = key.split(u'|'); + if (parts.size() != 2) { + pending.remove(key); + continue; } - disconnect(card.getCardPtr().data(), &CardInfo::pixmapUpdated, self, nullptr); + const QString userName = parts.at(0); + const QString cardName = parts.at(1); + + ExactCard card = CardDatabaseManager::query()->getCard({cardName}); + + if (!card) { + pending.remove(key); + continue; + } QPixmap fullRes; CardPictureLoader::getPixmap(fullRes, card, QSize(745, 1040)); + // Synchronous hit (already loaded/on disk) if (!fullRes.isNull()) { - self->insertIntoCache(key, self->cropCardArt(fullRes)); - } else { - self->insertIntoCache(key, QPixmap()); + insertIntoCache(key, cropCardArt(fullRes)); + pending.remove(key); + + emit cardArtUpdated(userName); + continue; } - self->pending.remove(key); + // Async load required. + QPointer self(this); - emit self->cardArtUpdated(userName); - self->processQueue(); - }); + auto conn = std::make_shared(); + + *conn = connect(card.getCardPtr().data(), &CardInfo::pixmapUpdated, this, + [self, key, userName, card, conn]() mutable { + if (!self) { + return; + } + + QObject::disconnect(*conn); + + QPixmap fullRes; + CardPictureLoader::getPixmap(fullRes, card, QSize(745, 1040)); + + if (!fullRes.isNull()) { + self->insertIntoCache(key, self->cropCardArt(fullRes)); + } else { + self->insertIntoCache(key, QPixmap()); + } + + self->pending.remove(key); + + emit self->cardArtUpdated(userName); + + // Resume processing remaining queued items. + self->processQueue(); + }); + + // Stop here. We'll continue when the async load finishes. + return; + } } \ No newline at end of file