Merge branch 'develop' into launcher-log-page

This commit is contained in:
Yihe Li
2025-06-06 21:36:03 +08:00
42 changed files with 332 additions and 120 deletions

View File

@@ -292,11 +292,8 @@ void ModrinthManagedPackPage::parseManagedPack()
ui->versionsComboBox->clear();
ui->versionsComboBox->blockSignals(false);
for (auto version : m_pack.versions) {
QString name = version.version;
if (!version.name.contains(version.version))
name = QString("%1 — %2").arg(version.name, version.version);
for (const auto& version : m_pack.versions) {
QString name = Modrinth::getVersionDisplayString(version);
// NOTE: the id from version isn't the same id in the modpack format spec...
// e.g. HexMC's 4.4.0 has versionId 4.0.0 in the modpack index..............
@@ -489,8 +486,8 @@ void FlameManagedPackPage::parseManagedPack()
ui->versionsComboBox->clear();
ui->versionsComboBox->blockSignals(false);
for (auto version : m_pack.versions) {
QString name = version.version;
for (const auto& version : m_pack.versions) {
QString name = Flame::getVersionDisplayString(version);
if (version.fileId == m_inst->getManagedPackVersionID().toInt())
name = tr("%1 (Current)").arg(name);

View File

@@ -1,3 +1,4 @@
#pragma once
#include <QFuture>
#include <QJsonDocument>
#include <QJsonObject>

View File

@@ -37,9 +37,9 @@ void McResolver::pingWithDomainSRV(QString domain, int port)
}
const auto& firstRecord = records.at(0);
QString domain = firstRecord.target();
int port = firstRecord.port();
pingWithDomainA(domain, port);
QString newDomain = firstRecord.target();
int newPort = firstRecord.port();
pingWithDomainA(newDomain, newPort);
});
lookup->lookup();

View File

@@ -68,7 +68,10 @@ bool FilterModel::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParen
return true;
}
QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
ATLauncher::IndexedPack pack = sourceModel()->data(index, Qt::UserRole).value<ATLauncher::IndexedPack>();
QVariant raw = sourceModel()->data(index, Qt::UserRole);
Q_ASSERT(raw.canConvert<ATLauncher::IndexedPack>());
auto pack = raw.value<ATLauncher::IndexedPack>();
if (searchTerm.startsWith("#"))
return QString::number(pack.id) == searchTerm.mid(1);
return pack.name.contains(searchTerm, Qt::CaseInsensitive);
@@ -76,8 +79,12 @@ bool FilterModel::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParen
bool FilterModel::lessThan(const QModelIndex& left, const QModelIndex& right) const
{
ATLauncher::IndexedPack leftPack = sourceModel()->data(left, Qt::UserRole).value<ATLauncher::IndexedPack>();
ATLauncher::IndexedPack rightPack = sourceModel()->data(right, Qt::UserRole).value<ATLauncher::IndexedPack>();
QVariant leftRaw = sourceModel()->data(left, Qt::UserRole);
Q_ASSERT(leftRaw.canConvert<ATLauncher::IndexedPack>());
auto leftPack = leftRaw.value<ATLauncher::IndexedPack>();
QVariant rightRaw = sourceModel()->data(right, Qt::UserRole);
Q_ASSERT(rightRaw.canConvert<ATLauncher::IndexedPack>());
auto rightPack = rightRaw.value<ATLauncher::IndexedPack>();
if (currentSorting == ByPopularity) {
return leftPack.position > rightPack.position;

View File

@@ -143,7 +143,9 @@ void AtlPage::onSelectionChanged(QModelIndex first, [[maybe_unused]] QModelIndex
return;
}
selected = filterModel->data(first, Qt::UserRole).value<ATLauncher::IndexedPack>();
QVariant raw = filterModel->data(first, Qt::UserRole);
Q_ASSERT(raw.canConvert<ATLauncher::IndexedPack>());
selected = raw.value<ATLauncher::IndexedPack>();
ui->packDescription->setHtml(StringUtils::htmlListPatch(selected.description.replace("\n", "<br>")));

View File

@@ -79,6 +79,7 @@ bool ListModel::setData(const QModelIndex& index, const QVariant& value, [[maybe
if (pos >= modpacks.size() || pos < 0 || !index.isValid())
return false;
Q_ASSERT(value.canConvert<Flame::IndexedPack>());
modpacks[pos] = value.value<Flame::IndexedPack>();
return true;

View File

@@ -166,7 +166,9 @@ void FlamePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelInde
return;
}
current = listModel->data(curr, Qt::UserRole).value<Flame::IndexedPack>();
QVariant raw = listModel->data(curr, Qt::UserRole);
Q_ASSERT(raw.canConvert<Flame::IndexedPack>());
current = raw.value<Flame::IndexedPack>();
if (!current.versionsLoaded || m_filterWidget->changed()) {
qDebug() << "Loading flame modpack versions";
@@ -206,13 +208,8 @@ void FlamePage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelInde
else
++it;
#endif
for (auto version : current.versions) {
auto release_type = version.version_type.isValid() ? QString(" [%1]").arg(version.version_type.toString()) : "";
auto mcVersion = !version.mcVersion.isEmpty() && !version.version.contains(version.mcVersion)
? QString(" for %1").arg(version.mcVersion)
: "";
ui->versionSelectionBox->addItem(QString("%1%2%3").arg(version.version, mcVersion, release_type),
QVariant(version.downloadUrl));
for (const auto& version : current.versions) {
ui->versionSelectionBox->addItem(Flame::getVersionDisplayString(version), QVariant(version.downloadUrl));
}
QVariant current_updated;

View File

@@ -103,13 +103,16 @@ void ImportFTBPage::suggestCurrent()
dialog->setSuggestedIconFromFile(FS::PathCombine(selected.path, "folder.jpg"), editedLogoName);
}
void ImportFTBPage::onPublicPackSelectionChanged(QModelIndex now, QModelIndex prev)
void ImportFTBPage::onPublicPackSelectionChanged(QModelIndex now, QModelIndex)
{
if (!now.isValid()) {
onPackSelectionChanged();
return;
}
Modpack selectedPack = currentModel->data(now, Qt::UserRole).value<Modpack>();
QVariant raw = currentModel->data(now, Qt::UserRole);
Q_ASSERT(raw.canConvert<Modpack>());
auto selectedPack = raw.value<Modpack>();
onPackSelectionChanged(&selectedPack);
}

View File

@@ -143,8 +143,12 @@ FilterModel::FilterModel(QObject* parent) : QSortFilterProxyModel(parent)
bool FilterModel::lessThan(const QModelIndex& left, const QModelIndex& right) const
{
Modpack leftPack = sourceModel()->data(left, Qt::UserRole).value<Modpack>();
Modpack rightPack = sourceModel()->data(right, Qt::UserRole).value<Modpack>();
QVariant leftRaw = sourceModel()->data(left, Qt::UserRole);
Q_ASSERT(leftRaw.canConvert<Modpack>());
auto leftPack = leftRaw.value<Modpack>();
QVariant rightRaw = sourceModel()->data(right, Qt::UserRole);
Q_ASSERT(rightRaw.canConvert<Modpack>());
auto rightPack = rightRaw.value<Modpack>();
if (m_currentSorting == Sorting::ByGameVersion) {
Version lv(leftPack.mcVersion);
@@ -166,7 +170,9 @@ bool FilterModel::filterAcceptsRow([[maybe_unused]] int sourceRow, [[maybe_unuse
return true;
}
QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
Modpack pack = sourceModel()->data(index, Qt::UserRole).value<Modpack>();
QVariant raw = sourceModel()->data(index, Qt::UserRole);
Q_ASSERT(raw.canConvert<Modpack>());
auto pack = raw.value<Modpack>();
return pack.name.contains(m_searchTerm, Qt::CaseInsensitive);
}

View File

@@ -61,8 +61,12 @@ FilterModel::FilterModel(QObject* parent) : QSortFilterProxyModel(parent)
bool FilterModel::lessThan(const QModelIndex& left, const QModelIndex& right) const
{
Modpack leftPack = sourceModel()->data(left, Qt::UserRole).value<Modpack>();
Modpack rightPack = sourceModel()->data(right, Qt::UserRole).value<Modpack>();
QVariant leftRaw = sourceModel()->data(left, Qt::UserRole);
Q_ASSERT(leftRaw.canConvert<Modpack>());
auto leftPack = leftRaw.value<Modpack>();
QVariant rightRaw = sourceModel()->data(right, Qt::UserRole);
Q_ASSERT(rightRaw.canConvert<Modpack>());
auto rightPack = rightRaw.value<Modpack>();
if (currentSorting == Sorting::ByGameVersion) {
Version lv(leftPack.mcVersion);
@@ -84,7 +88,9 @@ bool FilterModel::filterAcceptsRow([[maybe_unused]] int sourceRow, [[maybe_unuse
return true;
}
QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
Modpack pack = sourceModel()->data(index, Qt::UserRole).value<Modpack>();
QVariant raw = sourceModel()->data(index, Qt::UserRole);
Q_ASSERT(raw.canConvert<Modpack>());
auto pack = raw.value<Modpack>();
if (searchTerm.startsWith("#"))
return pack.packCode == searchTerm.mid(1);
return pack.name.contains(searchTerm, Qt::CaseInsensitive);

View File

@@ -233,7 +233,9 @@ void Page::onPublicPackSelectionChanged(QModelIndex now, [[maybe_unused]] QModel
onPackSelectionChanged();
return;
}
Modpack selectedPack = publicFilterModel->data(now, Qt::UserRole).value<Modpack>();
QVariant raw = publicFilterModel->data(now, Qt::UserRole);
Q_ASSERT(raw.canConvert<Modpack>());
auto selectedPack = raw.value<Modpack>();
onPackSelectionChanged(&selectedPack);
}
@@ -243,7 +245,9 @@ void Page::onThirdPartyPackSelectionChanged(QModelIndex now, [[maybe_unused]] QM
onPackSelectionChanged();
return;
}
Modpack selectedPack = thirdPartyFilterModel->data(now, Qt::UserRole).value<Modpack>();
QVariant raw = thirdPartyFilterModel->data(now, Qt::UserRole);
Q_ASSERT(raw.canConvert<Modpack>());
auto selectedPack = raw.value<Modpack>();
onPackSelectionChanged(&selectedPack);
}
@@ -253,7 +257,9 @@ void Page::onPrivatePackSelectionChanged(QModelIndex now, [[maybe_unused]] QMode
onPackSelectionChanged();
return;
}
Modpack selectedPack = privateFilterModel->data(now, Qt::UserRole).value<Modpack>();
QVariant raw = privateFilterModel->data(now, Qt::UserRole);
Q_ASSERT(raw.canConvert<Modpack>());
auto selectedPack = raw.value<Modpack>();
onPackSelectionChanged(&selectedPack);
}
@@ -328,7 +334,9 @@ void Page::onTabChanged(int tab)
currentList->selectionModel()->reset();
QModelIndex idx = currentList->currentIndex();
if (idx.isValid()) {
auto pack = currentModel->data(idx, Qt::UserRole).value<Modpack>();
QVariant raw = currentModel->data(idx, Qt::UserRole);
Q_ASSERT(raw.canConvert<Modpack>());
auto pack = raw.value<Modpack>();
onPackSelectionChanged(&pack);
} else {
onPackSelectionChanged();

View File

@@ -121,6 +121,7 @@ bool ModpackListModel::setData(const QModelIndex& index, const QVariant& value,
if (pos >= modpacks.size() || pos < 0 || !index.isValid())
return false;
Q_ASSERT(value.canConvert<Modrinth::Modpack>());
modpacks[pos] = value.value<Modrinth::Modpack>();
return true;
@@ -137,7 +138,7 @@ void ModpackListModel::performPaginatedSearch()
ResourceAPI::ProjectInfoCallbacks callbacks;
callbacks.on_fail = [this](QString reason) { searchRequestFailed(reason); };
callbacks.on_succeed = [this](auto& doc, auto& pack) { searchRequestForOneSucceeded(doc); };
callbacks.on_succeed = [this](auto& doc, auto&) { searchRequestForOneSucceeded(doc); };
callbacks.on_abort = [this] {
qCritical() << "Search task aborted by an unknown reason!";
searchRequestFailed("Aborted");
@@ -345,7 +346,7 @@ void ModpackListModel::searchRequestForOneSucceeded(QJsonDocument& doc)
endInsertRows();
}
void ModpackListModel::searchRequestFailed(QString reason)
void ModpackListModel::searchRequestFailed(QString)
{
auto failed_action = dynamic_cast<NetJob*>(jobPtr.get())->getFailedActions().at(0);
if (failed_action->replyStatusCode() == -1) {

View File

@@ -150,7 +150,9 @@ void ModrinthPage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelI
return;
}
current = m_model->data(curr, Qt::UserRole).value<Modrinth::Modpack>();
QVariant raw = m_model->data(curr, Qt::UserRole);
Q_ASSERT(raw.canConvert<Modrinth::Modpack>());
current = raw.value<Modrinth::Modpack>();
auto name = current.name;
if (!current.extraInfoLoaded) {
@@ -244,14 +246,8 @@ void ModrinthPage::onSelectionChanged(QModelIndex curr, [[maybe_unused]] QModelI
else
++it;
#endif
for (auto version : current.versions) {
auto release_type = version.version_type.isValid() ? QString(" [%1]").arg(version.version_type.toString()) : "";
auto mcVersion = !version.gameVersion.isEmpty() && !version.name.contains(version.gameVersion)
? QString(" for %1").arg(version.gameVersion)
: "";
auto versionStr = !version.name.contains(version.version) ? version.version : "";
ui->versionSelectionBox->addItem(QString("%1%2 — %3%4").arg(version.name, mcVersion, versionStr, release_type),
QVariant(version.id));
for (const auto& version : current.versions) {
ui->versionSelectionBox->addItem(Modrinth::getVersionDisplayString(version), QVariant(version.id));
}
QVariant current_updated;

View File

@@ -36,6 +36,7 @@
#pragma once
#include <QList>
#include <QMetaType>
#include <QString>
namespace Technic {

View File

@@ -135,7 +135,9 @@ void TechnicPage::onSelectionChanged(QModelIndex first, [[maybe_unused]] QModelI
return;
}
current = model->data(first, Qt::UserRole).value<Technic::Modpack>();
QVariant raw = model->data(first, Qt::UserRole);
Q_ASSERT(raw.canConvert<Technic::Modpack>());
current = raw.value<Technic::Modpack>();
suggestCurrent();
}