Files
BiLauncher/buildswitcher.h
T

101 lines
3.0 KiB
C++
Raw Normal View History

#pragma once
#include <QJsonObject>
#include <QObject>
#include <QString>
#include <QStringList>
class QThread;
class BuildArchiveWorker;
class BuildSwitcher : public QObject
{
Q_OBJECT
public:
explicit BuildSwitcher(QObject *parent = nullptr);
~BuildSwitcher() override;
bool isRunning() const { return m_state != Idle; }
QString stage() const { return m_stage; }
QString status() const { return m_status; }
2026-09-29 09:38:12 +03:00
double fraction() const;
static QStringList sharedTopLevel();
void switchTo(int fromBuildId,
const QString &fromName,
int toBuildId,
const QString &toName,
const QString &gameDir);
2026-08-31 00:59:14 +03:00
void applyPack(int buildId,
const QString &buildName,
const QString &packZipPath,
const QStringList &removeRelative,
const QJsonObject &note,
const QString &gameDir);
QStringList lastPackEntries() const { return m_lastPackEntries; }
QJsonObject lastPackNote() const { return m_lastPackNote; }
void cancel();
2026-08-27 16:44:42 +03:00
bool forgetBuild(int buildId);
bool hasArchive(int buildId) const { return !archivePathOf(buildId).isEmpty(); }
QString interruptedSwitchWarning() const;
void resumeInterrupted(const QString &gameDir);
signals:
void progressChanged();
void finished(int toBuildId);
void failed(int toBuildId, const QString &message, bool gameDirIntact);
private:
2026-08-31 00:59:14 +03:00
enum State { Idle, Archiving, Clearing, Restoring, Applying };
void requestArchive(const QString &gameDir, const QString &tempZip, const QStringList &exclude);
void requestClear(const QString &gameDir, const QStringList &keep);
void requestRestore(const QString &zipPath, const QString &gameDir);
2026-08-31 00:59:14 +03:00
void requestApplyPack(const QString &zipPath,
const QString &gameDir,
const QStringList &remove);
void onWorkerFinished(bool ok, const QString &error);
void onWorkerProgress(int done, int total, const QString &currentPath);
void commitArchive();
2026-08-31 00:59:14 +03:00
void beginApplying();
void finishApplying();
void resumeApplying(const QJsonObject &index, const QString &gameDir);
void beginClearing();
void beginRestoring();
void finish();
void fail(const QString &message, bool gameDirIntact);
QString buildDir(int buildId) const;
QString archivePathOf(int buildId) const;
void setStage(const QString &stage);
QJsonObject readIndex() const;
void writeIndex(const QJsonObject &index) const;
void sweepTempArchives() const;
QThread *m_thread;
BuildArchiveWorker *m_worker;
State m_state = Idle;
QString m_stage;
QString m_status;
int m_done = 0;
int m_total = 0;
int m_fromId = -1;
int m_toId = -1;
QString m_fromName;
QString m_toName;
QString m_gameDir;
QString m_tempZip;
2026-08-31 00:59:14 +03:00
QString m_packPath;
QStringList m_packRemove;
QJsonObject m_packNote;
QStringList m_lastPackEntries;
QJsonObject m_lastPackNote;
};