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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
// SPDX-License-Identifier: GPL-3.0-only AND Apache-2.0
// 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.
*
* === Upstream License Block (Do Not Modify) ==============================
*
*
*
*
*
*
* Prism Launcher - Minecraft Launcher
* Copyright (C) 2022 Rachel Powers <508861+Ryex@users.noreply.github.com>
*
* 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 "Resource.hpp"
#include <QHash>
#include <QLocale>
#include <QMutex>
#include <QPixmapCache>
class Version;
class DataPack : public Resource
{
Q_OBJECT
public:
DataPack(QObject* parent = nullptr) : Resource(parent)
{}
DataPack(QFileInfo file_info) : Resource(file_info)
{}
/** Gets the numerical ID of the pack format. */
int packFormat() const
{
return m_pack_format;
}
/** Gets, respectively, the lower and upper versions supported by the set pack format. */
virtual std::pair<Version, Version> compatibleVersions() const;
/** Gets the description of the data pack.
* If a localized description exists for the current locale, returns that.
* Otherwise returns the default description.
*/
QString description() const
{
QString lang = QLocale::system().name().section('_', 0, 0);
if (m_localized_descriptions.contains(lang))
{
return m_localized_descriptions.value(lang);
}
return m_description;
}
/** Gets the raw (non-localized) description. */
QString rawDescription() const
{
return m_description;
}
/** Gets description for a specific language code. */
QString localizedDescription(const QString& langCode) const
{
return m_localized_descriptions.value(langCode, m_description);
}
/** Gets all available localized descriptions. */
QHash<QString, QString> allLocalizedDescriptions() const
{
return m_localized_descriptions;
}
/** Gets the image of the data pack, converted to a QPixmap for drawing, and scaled to size. */
QPixmap image(QSize size, Qt::AspectRatioMode mode = Qt::AspectRatioMode::IgnoreAspectRatio) const;
/** Thread-safe. */
void setPackFormat(int new_format_id);
/** Thread-safe. */
void setDescription(QString new_description);
/** Thread-safe. Sets a localized description for a specific language. */
void setLocalizedDescription(const QString& langCode, const QString& description);
/** Thread-safe. Sets all localized descriptions at once. */
void setLocalizedDescriptions(const QHash<QString, QString>& descriptions);
/** Thread-safe. */
void setImage(QImage new_image) const;
bool valid() const override;
[[nodiscard]] int compare(Resource const& other, SortType type) const override;
[[nodiscard]] bool applyFilter(QRegularExpression filter) const override;
protected:
mutable QMutex m_data_lock;
/* The 'version' of a data pack, as defined in the pack.mcmeta file.
* See https://minecraft.wiki/w/Data_pack#pack.mcmeta
*/
int m_pack_format = 0;
/** The data pack's description, as defined in the pack.mcmeta file.
*/
QString m_description;
/** Localized descriptions keyed by language code (e.g., "en", "de", "ja").
* Parsed from pack.mcmeta language files if available.
*/
QHash<QString, QString> m_localized_descriptions;
/** The data pack's image file cache key, for access in the QPixmapCache global instance.
*
* The 'was_ever_used' state simply identifies whether the key was never inserted on the cache (true),
* so as to tell whether a cache entry is inexistent or if it was just evicted from the cache.
*/
struct
{
QPixmapCache::Key key;
bool was_ever_used = false;
} mutable m_pack_image_cache_key;
};
|