summaryrefslogtreecommitdiff
path: root/archived/projt-launcher/launcher/meta/VersionList.hpp
blob: febee1b4d9c1ee625117d3989a38e7bdf17473ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// SPDX-License-Identifier: GPL-3.0-only
// SPDX-FileCopyrightText: 2026 Project Tick
// SPDX-FileContributor: Project Tick Team
/*
 *  ProjT Launcher - Minecraft Launcher
 *  Copyright (C) 2026 Project Tick
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, version 3.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, write to the Free Software Foundation,
 *  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */

#pragma once

#include <QHash>
#include <QJsonObject>
#include <QStringList>
#include <memory>

#include "BaseEntity.hpp"
#include "BaseVersionList.h"
#include "Version.hpp"

namespace projt::meta
{

	/**
	 * @brief Collection of MetaVersion entries for a single component.
	 */
	class MetaVersionList : public BaseVersionList, public MetaEntity
	{
		Q_OBJECT
		Q_PROPERTY(QString uid READ uid CONSTANT)
		Q_PROPERTY(QString displayName READ displayName NOTIFY displayNameChanged)

	  public:
		using Ptr = std::shared_ptr<MetaVersionList>;

		explicit MetaVersionList(const QString& componentUid, QObject* parent = nullptr);
		~MetaVersionList() override = default;

		enum Roles
		{
			ComponentUidRole = Qt::UserRole + 200,
			TimestampRole,
			DependencyRole,
			VersionPtrRole
		};

		// BaseVersionList interface
		bool isLoaded() override;
		Task::Ptr getLoadTask() override;
		const BaseVersion::Ptr at(int i) const override;
		int count() const override;
		void sortVersions() override;
		BaseVersion::Ptr getRecommended() const override;
		QVariant data(const QModelIndex& index, int role) const override;
		RoleList providesRoles() const override;
		QHash<int, QByteArray> roleNames() const override;

		// MetaEntity interface
		QString cacheFilePath() const override;
		void loadFromJson(const QJsonObject& json) override;

		// Identity
		QString uid() const
		{
			return m_uid;
		}
		QString displayName() const
		{
			return m_displayName.isEmpty() ? m_uid : m_displayName;
		}

		// Version access
		MetaVersion::Ptr getMetaVersion(const QString& versionId);
		MetaVersion::Ptr getOrCreateVersion(const QString& versionId);
		bool containsVersion(const QString& versionId) const;
		QList<MetaVersion::Ptr> allVersions() const
		{
			return m_entries;
		}

		// Filtered lookups
		MetaVersion::Ptr stableForParent(const QString& parentUid, const QString& parentVersion);
		MetaVersion::Ptr latestForParent(const QString& parentUid, const QString& parentVersion);

		// External stable versions
		void addExternalStableVersions(const QStringList& versions);
		void clearExternalStableVersions();

		// Blocking load
		void waitUntilReady();

		// Configuration
		void setAvailableRoles(RoleList roles);

	  public: // For parsers
		void setDisplayName(const QString& name);
		void setVersionEntries(const QList<MetaVersion::Ptr>& entries);
		void mergeWith(const MetaVersionList::Ptr& other);
		void updateFromIndex(const MetaVersionList::Ptr& other);

	  signals:
		void displayNameChanged(const QString& name);

	  protected slots:
		void updateListData(QList<BaseVersion::Ptr>) override
		{}

	  private:
		void registerVersion(int row, const MetaVersion::Ptr& version);
		static const MetaVersion::Ptr& selectBetterVersion(const MetaVersion::Ptr& a, const MetaVersion::Ptr& b);

		QString m_uid;
		QString m_displayName;

		QList<MetaVersion::Ptr> m_entries;
		QHash<QString, MetaVersion::Ptr> m_versionIndex;
		QStringList m_externalStableVersions;

		MetaVersion::Ptr m_stableVersion;
		RoleList m_activeRoles;
	};

} // namespace projt::meta

Q_DECLARE_METATYPE(projt::meta::MetaVersionList::Ptr)