aboutsummaryrefslogtreecommitdiff
path: root/launcher/ui/pages/modplatform/TexturePackModel.cpp
diff options
context:
space:
mode:
authorflow <flowlnlnln@gmail.com>2023-01-29 18:07:49 -0300
committerflow <flowlnlnln@gmail.com>2023-02-05 17:02:56 -0300
commitada5e88eb933a41691121316c78cd2e564965fa0 (patch)
tree05cbf24f0e42e2a673ac8fafcd04de434b9d1b0d /launcher/ui/pages/modplatform/TexturePackModel.cpp
parentb724607e31d102c50cb42225b4a31f2932b2eb61 (diff)
downloadPrismLauncher-ada5e88eb933a41691121316c78cd2e564965fa0.tar.gz
PrismLauncher-ada5e88eb933a41691121316c78cd2e564965fa0.tar.bz2
PrismLauncher-ada5e88eb933a41691121316c78cd2e564965fa0.zip
feat(RD): add texture pack downloader
This extends the resource pack downloader, with the custom behavior of filtering the versions that shows up, to those <= 1.6. As always, Flame is funky and requires a bit more workarounds than average. This will also get a nice improvement when the Version parsing and comparison PR gets merged! :D Signed-off-by: flow <flowlnlnln@gmail.com>
Diffstat (limited to 'launcher/ui/pages/modplatform/TexturePackModel.cpp')
-rw-r--r--launcher/ui/pages/modplatform/TexturePackModel.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/launcher/ui/pages/modplatform/TexturePackModel.cpp b/launcher/ui/pages/modplatform/TexturePackModel.cpp
new file mode 100644
index 00000000..076a200d
--- /dev/null
+++ b/launcher/ui/pages/modplatform/TexturePackModel.cpp
@@ -0,0 +1,80 @@
+#include "TexturePackModel.h"
+
+#include "Application.h"
+
+#include "meta/Index.h"
+#include "meta/Version.h"
+
+static std::list<Version> s_availableVersions = {};
+
+namespace ResourceDownload {
+TexturePackResourceModel::TexturePackResourceModel(BaseInstance const& inst, ResourceAPI* api)
+ : ResourcePackResourceModel(inst, api), m_version_list(APPLICATION->metadataIndex()->get("net.minecraft"))
+{
+ if (!m_version_list->isLoaded()) {
+ qDebug() << "Loading version list...";
+ auto task = m_version_list->getLoadTask();
+ if (!task->isRunning())
+ task->start();
+ }
+}
+
+void waitOnVersionListLoad(Meta::VersionList::Ptr version_list)
+{
+ QEventLoop load_version_list_loop;
+
+ QTimer time_limit_for_list_load;
+ time_limit_for_list_load.setTimerType(Qt::TimerType::CoarseTimer);
+ time_limit_for_list_load.setSingleShot(true);
+ time_limit_for_list_load.callOnTimeout(&load_version_list_loop, &QEventLoop::quit);
+ time_limit_for_list_load.start(4000);
+
+ auto task = version_list->getLoadTask();
+ QObject::connect(task.get(), &Task::finished, &load_version_list_loop, &QEventLoop::quit);
+
+ load_version_list_loop.exec();
+ if (time_limit_for_list_load.isActive())
+ time_limit_for_list_load.stop();
+}
+
+ResourceAPI::SearchArgs TexturePackResourceModel::createSearchArguments()
+{
+ if (s_availableVersions.empty())
+ waitOnVersionListLoad(m_version_list);
+
+ auto args = ResourcePackResourceModel::createSearchArguments();
+
+ if (!m_version_list->isLoaded()) {
+ qCritical() << "The version list could not be loaded. Falling back to showing all entries.";
+ return args;
+ }
+
+ if (s_availableVersions.empty()) {
+ for (auto&& version : m_version_list->versions()) {
+ // FIXME: This duplicates the logic in meta for the 'texturepacks' trait. However, we don't have access to that
+ // information from the index file alone. Also, downloading every version's file isn't a very good idea.
+ if (auto ver = version->toComparableVersion(); ver <= maximumTexturePackVersion())
+ s_availableVersions.push_back(ver);
+ }
+ }
+
+ Q_ASSERT(!s_availableVersions.empty());
+
+ args.versions = s_availableVersions;
+
+ return args;
+}
+
+ResourceAPI::VersionSearchArgs TexturePackResourceModel::createVersionsArguments(QModelIndex& entry)
+{
+ auto args = ResourcePackResourceModel::createVersionsArguments(entry);
+ if (!m_version_list->isLoaded()) {
+ qCritical() << "The version list could not be loaded. Falling back to showing all entries.";
+ return args;
+ }
+
+ args.mcVersions = s_availableVersions;
+ return args;
+}
+
+} // namespace ResourceDownload