[DeckSync] Pass the sync summary through the signal and tidy the manager API

- Emit SyncSummary from syncFinished() instead of four positional ints, and
  build it from a single currentSummary() helper, so the counts cannot drift
  between the status message and the signal.
- Use a designated initializer for LocalFile, like the other records.
- Drop setClient() and setColorIdentityProvider(): both fields are already
  constructor parameters and the setters had no callers. setProfile() and
  setDeckPath() stay, since the tab re-reads them before every run.
- Fix the include paths in tab_deck_storage.h and the narrowing conversion of
  the tree item id, so the branch builds again.
This commit is contained in:
Lukas Brübach 2026-11-01 12:41:00 +01:00
parent f9cbeb2f21
commit 4fd03576e5
4 changed files with 31 additions and 33 deletions

View file

@ -47,11 +47,6 @@ DeckSyncManager::DeckSyncManager(AbstractClient *_client, ColorIdentityProvider
{
}
void DeckSyncManager::setClient(AbstractClient *_client)
{
client = _client;
}
void DeckSyncManager::setProfile(const DeckSyncProfile &_profile)
{
profile = _profile;
@ -62,11 +57,6 @@ void DeckSyncManager::setDeckPath(const QString &path)
deckPath = path;
}
void DeckSyncManager::setColorIdentityProvider(ColorIdentityProvider provider)
{
colorIdentityProvider = std::move(provider);
}
bool DeckSyncManager::isSyncing() const
{
return syncing;
@ -78,12 +68,12 @@ void DeckSyncManager::syncNow()
return;
}
if (client == nullptr || !profile.isValid() || deckPath.isEmpty()) {
emit syncFinished(0, 0, 0, 0, tr("Not connected to a server."));
emit syncFinished(SyncSummary{}, tr("Not connected to a server."));
return;
}
QDir deckDir(deckPath);
if (!deckDir.exists()) {
emit syncFinished(0, 0, 0, 0, tr("Deck folder not found."));
emit syncFinished(SyncSummary{}, tr("Deck folder not found."));
return;
}
@ -120,11 +110,9 @@ void DeckSyncManager::syncNow()
++skippedCount;
continue;
}
LocalFile file;
file.absolutePath = absolutePath;
file.hash = loaded->deckList.getDeckHash();
file.modified = QFileInfo(absolutePath).lastModified();
localFiles.insert(relativePath, file);
localFiles.insert(relativePath, LocalFile{.absolutePath = absolutePath,
.hash = loaded->deckList.getDeckHash(),
.modified = QFileInfo(absolutePath).lastModified()});
}
Command_DeckList cmd;
@ -151,7 +139,7 @@ void DeckSyncManager::collectServerFiles(const ServerInfo_DeckStorage_Folder &fo
const QString path = prefix.isEmpty() ? name : prefix + "/" + name;
const ServerInfo_DeckStorage_File &file = item.file();
ServerFile entry{
.id = item.id(),
.id = static_cast<int>(item.id()),
.guid = QString::fromStdString(file.guid()),
.hash = QString::fromStdString(file.hash()),
.lastModifiedSecs = file.has_last_modified() ? static_cast<qint64>(file.last_modified()) : 0,
@ -543,16 +531,27 @@ void DeckSyncManager::onDownloadFinished(const Response &response,
void DeckSyncManager::failSync(const QString &error)
{
syncing = false;
emit syncFinished(uploadedCount, downloadedCount, unchangedCount, skippedCount, error);
emit syncFinished(currentSummary(), error);
}
void DeckSyncManager::finishSync()
{
syncing = false;
const SyncSummary summary = currentSummary();
emit statusMessage(tr("Sync complete: %1 uploaded, %2 downloaded, %3 unchanged, %4 skipped.")
.arg(uploadedCount)
.arg(downloadedCount)
.arg(unchangedCount)
.arg(skippedCount));
emit syncFinished(uploadedCount, downloadedCount, unchangedCount, skippedCount, QString());
.arg(summary.uploaded)
.arg(summary.downloaded)
.arg(summary.unchanged)
.arg(summary.skipped));
emit syncFinished(summary, QString());
}
DeckSyncManager::SyncSummary DeckSyncManager::currentSummary() const
{
return SyncSummary{
.uploaded = uploadedCount,
.downloaded = downloadedCount,
.unchanged = unchangedCount,
.skipped = skippedCount,
};
}

View file

@ -44,7 +44,7 @@ public:
/** @brief Computes the color identity string uploaded alongside a deck. May be empty. */
using ColorIdentityProvider = std::function<QString(const DeckList &)>;
/** @brief Outcome counts for a finished sync run; mirrors syncFinished() parameters. */
/** @brief Outcome counts for a finished sync run, carried by syncFinished(). */
struct SyncSummary
{
int uploaded = 0;
@ -56,10 +56,8 @@ public:
explicit DeckSyncManager(QObject *parent = nullptr);
DeckSyncManager(AbstractClient *client, ColorIdentityProvider provider, QObject *parent = nullptr);
void setClient(AbstractClient *_client);
void setProfile(const DeckSyncProfile &_profile);
void setDeckPath(const QString &path);
void setColorIdentityProvider(ColorIdentityProvider provider);
[[nodiscard]] bool isSyncing() const;
public slots:
@ -68,7 +66,7 @@ public slots:
signals:
void syncStarted();
void statusMessage(const QString &message);
void syncFinished(int uploaded, int downloaded, int unchanged, int skipped, const QString &error);
void syncFinished(const SyncSummary &summary, const QString &error);
private slots:
void onListFinished(const Response &response, const CommandContainer &commandContainer);
@ -111,6 +109,7 @@ private:
void failSync(const QString &error);
void finishSync();
[[nodiscard]] SyncSummary currentSummary() const;
void collectServerFiles(const ServerInfo_DeckStorage_Folder &folder,
const QString &prefix,
QMap<QString, ServerFile> &files,

View file

@ -565,7 +565,7 @@ void TabDeckStorage::onSyncStatusMessage(const QString &message)
renderSyncStatus();
}
void TabDeckStorage::onSyncFinished(int uploaded, int downloaded, int unchanged, int skipped, const QString &error)
void TabDeckStorage::onSyncFinished(const SyncSummary &summary, const QString &error)
{
aSyncNow->setEnabled(remoteEnabled);
if (!error.isEmpty()) {
@ -574,7 +574,7 @@ void TabDeckStorage::onSyncFinished(int uploaded, int downloaded, int unchanged,
} else {
syncStatusType = SyncStatusType::Finished;
syncStatusDetail.clear();
lastSyncSummary = {uploaded, downloaded, unchanged, skipped};
lastSyncSummary = summary;
}
renderSyncStatus();
if (error.isEmpty()) {

View file

@ -8,8 +8,8 @@
#ifndef TAB_DECK_STORAGE_H
#define TAB_DECK_STORAGE_H
#include "../deck_sync/deck_sync_manager.h"
#include "../interface/widgets/server/remote/remote_decklist_tree_widget.h"
#include "../../deck_sync/deck_sync_manager.h"
#include "../server/remote/remote_decklist_tree_widget.h"
#include "tab.h"
#include <QList>
@ -129,7 +129,7 @@ private slots:
void actSyncNow();
void onSyncStatusMessage(const QString &message);
void onSyncFinished(int uploaded, int downloaded, int unchanged, int skipped, const QString &error);
void onSyncFinished(const SyncSummary &summary, const QString &error);
public:
TabDeckStorage(TabSupervisor *_tabSupervisor, AbstractClient *_client, const ServerInfo_User *currentUserInfo);