Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/core/managers/ModManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,10 @@ QString ModManager::getPaksPath() const {

bool ModManager::addMod(const QString &pakFilePath, const QString &modName,
const QString &nexusModId, const QString &nexusFileId,
const QString &nexusUrl,
const QString &author, const QString &description,
const QString &version, const QString &itchGameId,
const QString &itchUrl,
const QDateTime &uploadDate) {
QFileInfo fileInfo(pakFilePath);
if (!fileInfo.exists() || !fileInfo.isFile()) {
Expand Down Expand Up @@ -68,7 +70,9 @@ bool ModManager::addMod(const QString &pakFilePath, const QString &modName,

mod.nexusModId = nexusModId;
mod.nexusFileId = nexusFileId;
mod.nexusUrl = nexusUrl;
mod.itchGameId = itchGameId;
mod.itchUrl = itchUrl;
mod.author = author;
mod.description = description;
mod.version = version;
Expand Down Expand Up @@ -489,7 +493,9 @@ bool ModManager::updateModMetadata(const ModInfo &updatedMod) {
it->description = updatedMod.description;
it->nexusModId = updatedMod.nexusModId;
it->nexusFileId = updatedMod.nexusFileId;
it->nexusUrl = updatedMod.nexusUrl;
it->itchGameId = updatedMod.itchGameId;
it->itchUrl = updatedMod.itchUrl;
it->version = updatedMod.version;
it->author = updatedMod.author;
it->installDate = updatedMod.installDate;
Expand Down
2 changes: 2 additions & 0 deletions src/core/managers/ModManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@ class ModManager : public QObject {
// Mod management
bool addMod(const QString &pakFilePath, const QString &modName = QString(),
const QString &nexusModId = QString(), const QString &nexusFileId = QString(),
const QString &nexusUrl = QString(),
const QString &author = QString(), const QString &description = QString(),
const QString &version = QString(), const QString &itchGameId = QString(),
const QString &itchUrl = QString(),
const QDateTime &uploadDate = QDateTime());
bool removeMod(const QString &modId);
bool replaceMod(const QString &modId, const QString &newPakPath,
Expand Down
14 changes: 12 additions & 2 deletions src/core/managers/ProfileManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -813,7 +813,9 @@ bool ProfileManager::importProfile(const QString &filePath, QString &importedPro
updated.description = meta.description;
updated.nexusModId = meta.nexusModId;
updated.nexusFileId = meta.nexusFileId;
updated.nexusUrl = meta.nexusUrl;
updated.itchGameId = meta.itchGameId;
updated.itchUrl = meta.itchUrl;
updated.version = meta.version;
updated.author = meta.author;
updated.uploadDate = meta.uploadDate;
Expand All @@ -828,8 +830,10 @@ bool ProfileManager::importProfile(const QString &filePath, QString &importedPro
const QList<ModInfo> beforeMods = m_modManager->getMods();
if (!m_modManager->addMod(pakPath, QString(),
meta.nexusModId, meta.nexusFileId,
meta.nexusUrl,
meta.author, meta.description, meta.version,
meta.itchGameId, meta.uploadDate)) {
meta.itchGameId, meta.itchUrl,
meta.uploadDate)) {
return false;
}

Expand Down Expand Up @@ -859,7 +863,9 @@ bool ProfileManager::importProfile(const QString &filePath, QString &importedPro
updated.description = meta.description;
updated.nexusModId = meta.nexusModId;
updated.nexusFileId = meta.nexusFileId;
updated.nexusUrl = meta.nexusUrl;
updated.itchGameId = meta.itchGameId;
updated.itchUrl = meta.itchUrl;
updated.version = meta.version;
updated.author = meta.author;
updated.uploadDate = meta.uploadDate;
Expand All @@ -886,8 +892,10 @@ bool ProfileManager::importProfile(const QString &filePath, QString &importedPro
const QList<ModInfo> beforeMods = m_modManager->getMods();
if (!m_modManager->addMod(pakPath, candidateName,
meta.nexusModId, meta.nexusFileId,
meta.nexusUrl,
meta.author, meta.description, meta.version,
meta.itchGameId, meta.uploadDate)) {
meta.itchGameId, meta.itchUrl,
meta.uploadDate)) {
return false;
}

Expand Down Expand Up @@ -915,7 +923,9 @@ bool ProfileManager::importProfile(const QString &filePath, QString &importedPro
updated.description = meta.description;
updated.nexusModId = meta.nexusModId;
updated.nexusFileId = meta.nexusFileId;
updated.nexusUrl = meta.nexusUrl;
updated.itchGameId = meta.itchGameId;
updated.itchUrl = meta.itchUrl;
updated.version = meta.version;
updated.author = meta.author;
updated.uploadDate = meta.uploadDate;
Expand Down
12 changes: 12 additions & 0 deletions src/core/models/ModInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,15 @@ QJsonObject ModInfo::toJson() const {
if (!nexusFileId.isEmpty()) {
json["nexusFileId"] = nexusFileId;
}
if (!nexusUrl.isEmpty()) {
json["nexusUrl"] = nexusUrl;
}
if (!itchGameId.isEmpty()) {
json["itchGameId"] = itchGameId;
}
if (!itchUrl.isEmpty()) {
json["itchUrl"] = itchUrl;
}
if (!version.isEmpty()) {
json["version"] = version;
}
Expand Down Expand Up @@ -64,9 +70,15 @@ ModInfo ModInfo::fromJson(const QJsonObject &json) {
if (json.contains("nexusFileId")) {
mod.nexusFileId = json["nexusFileId"].toString();
}
if (json.contains("nexusUrl")) {
mod.nexusUrl = json["nexusUrl"].toString();
}
if (json.contains("itchGameId")) {
mod.itchGameId = json["itchGameId"].toString();
}
if (json.contains("itchUrl")) {
mod.itchUrl = json["itchUrl"].toString();
}
if (json.contains("version")) {
mod.version = json["version"].toString();
}
Expand Down
2 changes: 2 additions & 0 deletions src/core/models/ModInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ struct ModInfo {
int priority; // Load order (lower = loads first)
QString nexusModId; // Optional Nexus Mod ID
QString nexusFileId; // Optional Nexus File ID
QString nexusUrl; // Optional Nexus Mods URL
QString itchGameId; // Optional itch.io Game ID
QString itchUrl; // Optional itch.io URL
QString version; // Optional mod version
QString author; // Optional mod author
QString description; // Optional mod description
Expand Down
33 changes: 23 additions & 10 deletions src/modals/mod_manager/AddModModalContent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,10 @@ bool AddModModalContent::isArchiveFile(const QString &filePath) const {
}

void AddModModalContent::handleArchiveFile(const QString &archivePath, const QString &nexusModId, const QString &nexusFileId,
const QString &author, const QString &description, const QString &version, const QString &itchGameId, const QDateTime &uploadDate, bool isBatchProcessing) {
const QString &nexusUrl,
const QString &author, const QString &description, const QString &version,
const QString &itchGameId, const QString &itchUrl,
const QDateTime &uploadDate, bool isBatchProcessing) {
ArchiveExtractor extractor;
auto result = extractor.extractPakFiles(archivePath);

Expand All @@ -151,7 +154,8 @@ void AddModModalContent::handleArchiveFile(const QString &archivePath, const QSt
selectedPaks.append(result.pakFiles.first());

for (const QString &pakPath : selectedPaks) {
handlePakFile(pakPath, nexusModId, nexusFileId, author, description, version, itchGameId, QString(), uploadDate);
handlePakFile(pakPath, nexusModId, nexusFileId, nexusUrl, author, description, version, itchGameId,
itchUrl, QString(), uploadDate);
}

ArchiveExtractor::cleanupTempDir(result.tempDir);
Expand All @@ -166,7 +170,7 @@ void AddModModalContent::handleArchiveFile(const QString &archivePath, const QSt
}

auto *fileModal = new FileSelectionModalContent(fileNames, QFileInfo(archivePath).fileName(), true);
connect(fileModal, &FileSelectionModalContent::accepted, this, [this, result, fileModal, nexusModId, nexusFileId, author, description, version, itchGameId, uploadDate, isBatchProcessing]() {
connect(fileModal, &FileSelectionModalContent::accepted, this, [this, result, fileModal, nexusModId, nexusFileId, nexusUrl, author, description, version, itchGameId, itchUrl, uploadDate, isBatchProcessing]() {
QStringList selectedFileNames = fileModal->getSelectedFiles();
QStringList selectedPaks;

Expand All @@ -180,7 +184,8 @@ void AddModModalContent::handleArchiveFile(const QString &archivePath, const QSt
}

for (const QString &pakPath : selectedPaks) {
handlePakFile(pakPath, nexusModId, nexusFileId, author, description, version, itchGameId, QString(), uploadDate);
handlePakFile(pakPath, nexusModId, nexusFileId, nexusUrl, author, description, version, itchGameId,
itchUrl, QString(), uploadDate);
}

ArchiveExtractor::cleanupTempDir(result.tempDir);
Expand Down Expand Up @@ -212,7 +217,10 @@ void AddModModalContent::handleArchiveFile(const QString &archivePath, const QSt
}

void AddModModalContent::handlePakFile(const QString &pakPath, const QString &nexusModId, const QString &nexusFileId,
const QString &author, const QString &description, const QString &version, const QString &itchGameId, const QString &customModName, const QDateTime &uploadDate) {
const QString &nexusUrl,
const QString &author, const QString &description, const QString &version,
const QString &itchGameId, const QString &itchUrl,
const QString &customModName, const QDateTime &uploadDate) {
QString modName;
if (!customModName.isEmpty()) {
modName = customModName;
Expand All @@ -221,7 +229,8 @@ void AddModModalContent::handlePakFile(const QString &pakPath, const QString &ne
modName = fileInfo.baseName();
}

if (!m_modManager->addMod(pakPath, modName, nexusModId, nexusFileId, author, description, version, itchGameId, uploadDate)) {
if (!m_modManager->addMod(pakPath, modName, nexusModId, nexusFileId, nexusUrl, author, description, version,
itchGameId, itchUrl, uploadDate)) {
MessageModal::warning(m_modalManager, tr("Error"), tr("Failed to add mod: %1").arg(modName));
} else {
emit modAdded(modName);
Expand All @@ -246,6 +255,7 @@ void AddModModalContent::onFromNexusClicked() {
fileData.filePath = result.filePath;
fileData.nexusModId = result.modId;
fileData.nexusFileId = result.fileInfo.id;
fileData.nexusUrl = result.url;
fileData.author = result.author;
fileData.description = result.description;
fileData.version = result.fileInfo.version;
Expand Down Expand Up @@ -274,6 +284,7 @@ void AddModModalContent::onFromItchClicked() {
FileToProcess fileData;
fileData.filePath = result.filePath;
fileData.itchGameId = result.gameId;
fileData.itchUrl = result.url;
fileData.author = result.author;
fileData.description = result.gameTitle;

Expand Down Expand Up @@ -355,8 +366,9 @@ void AddModModalContent::processNextFile() {

if (isArchiveFile(filePath)) {
handleArchiveFile(filePath, fileData.nexusModId, fileData.nexusFileId,
fileData.author, fileData.description, fileData.version,
fileData.itchGameId, fileData.uploadDate, true);
fileData.nexusUrl, fileData.author, fileData.description, fileData.version,
fileData.itchGameId, fileData.itchUrl,
fileData.uploadDate, true);

if (filePath.contains("nexus_mod_") || filePath.contains("itch_game_")) {
QFile::remove(filePath);
Expand All @@ -367,8 +379,9 @@ void AddModModalContent::processNextFile() {
}
} else {
handlePakFile(filePath, fileData.nexusModId, fileData.nexusFileId,
fileData.author, fileData.description, fileData.version,
fileData.itchGameId, fileData.customModName, fileData.uploadDate);
fileData.nexusUrl, fileData.author, fileData.description, fileData.version,
fileData.itchGameId, fileData.itchUrl,
fileData.customModName, fileData.uploadDate);

if (filePath.contains("nexus_mod_") || filePath.contains("itch_game_")) {
QFile::remove(filePath);
Expand Down
10 changes: 8 additions & 2 deletions src/modals/mod_manager/AddModModalContent.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,22 +47,28 @@ private slots:
QString filePath;
QString nexusModId;
QString nexusFileId;
QString nexusUrl;
QString author;
QString description;
QString version;
QString itchGameId;
QString itchUrl;
QString customModName;
QDateTime uploadDate;
};

void setupUi();
void retranslateUi();
void handleArchiveFile(const QString &archivePath, const QString &nexusModId = QString(), const QString &nexusFileId = QString(),
const QString &nexusUrl = QString(),
const QString &author = QString(), const QString &description = QString(), const QString &version = QString(),
const QString &itchGameId = QString(), const QDateTime &uploadDate = QDateTime(), bool isBatchProcessing = false);
const QString &itchGameId = QString(), const QString &itchUrl = QString(),
const QDateTime &uploadDate = QDateTime(), bool isBatchProcessing = false);
void handlePakFile(const QString &pakPath, const QString &nexusModId = QString(), const QString &nexusFileId = QString(),
const QString &nexusUrl = QString(),
const QString &author = QString(), const QString &description = QString(), const QString &version = QString(),
const QString &itchGameId = QString(), const QString &customModName = QString(), const QDateTime &uploadDate = QDateTime());
const QString &itchGameId = QString(), const QString &itchUrl = QString(),
const QString &customModName = QString(), const QDateTime &uploadDate = QDateTime());
bool isArchiveFile(const QString &filePath) const;
void startProcessingFiles(const QList<FileToProcess> &files);

Expand Down
4 changes: 3 additions & 1 deletion src/modals/mod_manager/ItchDownloadModalContent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,8 @@ void ItchDownloadModalContent::onDownloadClicked() {
if (!result.isValid) {
errors.append(QString("%1: %2").arg(url, result.error));
} else {
m_pendingGames.append({result.creator, result.gameName});
QString canonicalUrl = QStringLiteral("https://%1.itch.io/%2").arg(result.creator, result.gameName);
m_pendingGames.append({result.creator, result.gameName, canonicalUrl});
}
}

Expand Down Expand Up @@ -489,6 +490,7 @@ void ItchDownloadModalContent::onDownloadFinished(const QString &savePath) {
m_results.append({
savePath,
m_currentGameId,
m_pendingGames[m_currentGameIndex].url,
m_gameTitle,
m_author,
m_pendingUploads[m_currentDownloadIndex]
Expand Down
2 changes: 2 additions & 0 deletions src/modals/mod_manager/ItchDownloadModalContent.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class QStackedWidget;
struct ItchDownloadResult {
QString filePath;
QString gameId;
QString url;
QString gameTitle;
QString author;
ItchUploadInfo uploadInfo;
Expand Down Expand Up @@ -63,6 +64,7 @@ private slots:
struct PendingGame {
QString creator;
QString gameName;
QString url;
};

void setupUi();
Expand Down
2 changes: 2 additions & 0 deletions src/modals/mod_manager/ItchRegistrationModalContent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ void ItchRegistrationModalContent::onFetchClicked() {
return;
}

m_url = QStringLiteral("https://%1.itch.io/%2").arg(result.creator, result.gameName);
m_pendingUrl = url;

if (!m_client->hasApiKey()) {
Expand All @@ -179,6 +180,7 @@ void ItchRegistrationModalContent::onAuthenticateClicked() {
m_authStatusLabel->setText(tr("API key saved. Fetching game information..."));

auto result = ItchUrlParser::parseUrl(m_pendingUrl);
m_url = QStringLiteral("https://%1.itch.io/%2").arg(result.creator, result.gameName);

QTimer::singleShot(500, this, [this, result]() {
m_client->getGameId(result.creator, result.gameName);
Expand Down
2 changes: 2 additions & 0 deletions src/modals/mod_manager/ItchRegistrationModalContent.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class ItchRegistrationModalContent : public BaseModalContent {
QList<ItchUploadInfo> getSelectedUploads() const { return m_selectedUploads; }
QString getGameId() const { return m_currentGameId; }
QString getAuthor() const { return m_author; }
QString getUrl() const { return m_url; }

private slots:
void onFetchClicked();
Expand Down Expand Up @@ -67,6 +68,7 @@ private slots:

QString m_currentGameId;
QString m_author;
QString m_url;
QString m_pendingUrl;

enum Page { InputPage, AuthPage };
Expand Down
13 changes: 13 additions & 0 deletions src/modals/mod_manager/ModMetadataModalContent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ ModMetadataModalContent::ModMetadataModalContent(const ModInfo &mod, QWidget *pa
, m_priority(mod.priority)
, m_enabled(mod.enabled)
, m_numberedFileName(mod.numberedFileName)
, m_itchUrl(mod.itchUrl)
{
setTitle(tr("Edit Mod Metadata"));
setupUi(mod);
Expand Down Expand Up @@ -58,11 +59,21 @@ void ModMetadataModalContent::setupUi(const ModInfo &mod) {
m_nexusFileIdEdit->setPlaceholderText(tr("e.g., 12345"));
formLayout->addRow(tr("Nexusmods File ID:"), m_nexusFileIdEdit);

m_nexusUrlEdit = new QLineEdit(mod.nexusUrl, scrollContent);
m_nexusUrlEdit->setMinimumHeight(32);
m_nexusUrlEdit->setPlaceholderText(tr("https://www.nexusmods.com/foxhole/mods/12345"));
formLayout->addRow(tr("Nexusmods URL:"), m_nexusUrlEdit);

m_itchGameIdEdit = new QLineEdit(mod.itchGameId, scrollContent);
m_itchGameIdEdit->setMinimumHeight(32);
m_itchGameIdEdit->setPlaceholderText(tr("e.g., 1276966"));
formLayout->addRow(tr("Itch.io Game ID:"), m_itchGameIdEdit);

m_itchUrlEdit = new QLineEdit(mod.itchUrl, scrollContent);
m_itchUrlEdit->setMinimumHeight(32);
m_itchUrlEdit->setPlaceholderText(tr("https://creator.itch.io/game-name"));
formLayout->addRow(tr("Itch.io URL:"), m_itchUrlEdit);

m_versionEdit = new QLineEdit(mod.version, scrollContent);
m_versionEdit->setMinimumHeight(32);
m_versionEdit->setPlaceholderText(tr("e.g., 1.0.0"));
Expand Down Expand Up @@ -106,7 +117,9 @@ ModInfo ModMetadataModalContent::getModInfo() const {
mod.description = m_descriptionEdit->toPlainText();
mod.nexusModId = m_nexusModIdEdit->text();
mod.nexusFileId = m_nexusFileIdEdit->text();
mod.nexusUrl = m_nexusUrlEdit ? m_nexusUrlEdit->text().trimmed() : mod.nexusUrl;
mod.itchGameId = m_itchGameIdEdit->text();
mod.itchUrl = m_itchUrlEdit ? m_itchUrlEdit->text().trimmed() : m_itchUrl;
mod.version = m_versionEdit->text();
mod.author = m_authorEdit->text();
mod.installDate = m_installDateEdit->dateTime();
Expand Down
3 changes: 3 additions & 0 deletions src/modals/mod_manager/ModMetadataModalContent.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ class ModMetadataModalContent : public BaseModalContent {
QTextEdit *m_descriptionEdit;
QLineEdit *m_nexusModIdEdit;
QLineEdit *m_nexusFileIdEdit;
QLineEdit *m_nexusUrlEdit;
QLineEdit *m_itchGameIdEdit;
QLineEdit *m_itchUrlEdit;
QLineEdit *m_versionEdit;
QLineEdit *m_authorEdit;
QDateTimeEdit *m_installDateEdit;
Expand All @@ -34,6 +36,7 @@ class ModMetadataModalContent : public BaseModalContent {
int m_priority;
bool m_enabled;
QString m_numberedFileName;
QString m_itchUrl;
};

#endif // MODMETADATAMODALCONTENT_H
Loading
Loading