version tracking and auto installing

This commit is contained in:
2026-08-24 21:09:52 +03:00
parent 671fbe169d
commit 5bc59f8018
10 changed files with 1937 additions and 24 deletions
+49 -1
View File
@@ -13,6 +13,8 @@
struct AuthResult;
class AuthService;
class GameLauncher;
class VersionManifestService;
class VersionInstaller;
class LauncherBackend : public QObject
{
@@ -25,6 +27,20 @@ class LauncherBackend : public QObject
Q_PROPERTY(bool gameRunning READ gameRunning NOTIFY gameRunningChanged)
Q_PROPERTY(bool busy READ busy NOTIFY busyChanged)
// Объединённый список для выпадающего меню версий: установленные, разделитель,
// затем весь каталог Mojang.
Q_PROPERTY(QVariantList versionCatalog READ versionCatalog NOTIFY versionCatalogChanged)
Q_PROPERTY(bool catalogLoading READ catalogLoading NOTIFY catalogLoadingChanged)
// Одного сигнала на все свойства загрузки достаточно: установщик уже
// ограничивает частоту, а QML всё равно перечитывает их разом.
Q_PROPERTY(bool downloading READ downloading NOTIFY downloadChanged)
Q_PROPERTY(double downloadProgress READ downloadProgress NOTIFY downloadChanged)
Q_PROPERTY(QString downloadVersion READ downloadVersion NOTIFY downloadChanged)
Q_PROPERTY(QString downloadStatus READ downloadStatus NOTIFY downloadChanged)
Q_PROPERTY(qint64 downloadBytesDone READ downloadBytesDone NOTIFY downloadChanged)
Q_PROPERTY(qint64 downloadBytesTotal READ downloadBytesTotal NOTIFY downloadChanged)
public:
explicit LauncherBackend(QObject *parent = nullptr);
~LauncherBackend() override;
@@ -33,7 +49,18 @@ public:
QStringList versionNames() const;
QStringList installedVersions() const;
bool gameRunning() const;
bool busy() const { return m_busy; }
// Пока идёт загрузка версии, лаунчер тоже занят: кнопка запуска гаснет.
bool busy() const;
QVariantList versionCatalog() const;
bool catalogLoading() const;
bool downloading() const;
double downloadProgress() const;
QString downloadVersion() const;
QString downloadStatus() const;
qint64 downloadBytesDone() const;
qint64 downloadBytesTotal() const;
Q_INVOKABLE void addProfile(const QString &name,
const QString &login,
@@ -66,6 +93,12 @@ public:
// Проверка без запуска — для подсказки в интерфейсе.
Q_INVOKABLE QStringList checkInstallation(int versionIndex) const;
// Вызывается при открытии выпадающего списка версий: свежий кэш — без сети.
Q_INVOKABLE void refreshVersionCatalog(bool force = false);
Q_INVOKABLE bool isVersionInstalled(const QString &versionId) const;
Q_INVOKABLE void installVersion(const QString &versionId);
Q_INVOKABLE void cancelDownload();
Q_INVOKABLE QVariantMap settings() const;
Q_INVOKABLE void updateSettings(const QVariantMap &values);
Q_INVOKABLE QStringList detectedJava() const;
@@ -80,6 +113,9 @@ signals:
void settingsChanged();
void gameRunningChanged();
void busyChanged();
void versionCatalogChanged();
void catalogLoadingChanged();
void downloadChanged();
void launchProgress(const QString &message);
void launched(const QString &profileName, const QString &versionName, const QString &serverUrl);
@@ -121,6 +157,11 @@ private:
QString gameDir() const;
QString versionIdOf(const Version &version) const;
void invalidateCatalog();
void rebuildCatalog() const;
// Версия выбрана, но её нет в .minecraft — ставим в фоне.
void maybeInstall(const QString &versionId);
void setBusy(bool busy);
void failLaunch(const QString &message);
void beginAuthentication();
@@ -137,6 +178,13 @@ private:
AuthService *m_auth;
GameLauncher *m_launcher;
VersionManifestService *m_manifest;
VersionInstaller *m_installer;
// Каталог версий пересобирается только по изменениям: QML читает свойство
// помногу раз за кадр, пока открыт список.
mutable QVariantList m_catalog;
mutable bool m_catalogDirty = true;
bool m_busy = false;