copy found mods to instance (FTB and Flame)

Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
This commit is contained in:
Rachel Powers 2022-10-25 10:59:37 -07:00
parent 1598d65824
commit 13c7efa058
9 changed files with 137 additions and 19 deletions

View File

@ -163,6 +163,28 @@ bool ensureFolderPathExists(QString foldernamepath)
return success; return success;
} }
bool copyFile(QString &src, QString &dst) {
using copy_opts = fs::copy_options;
std::error_code err;
fs::copy_options opt = copy_opts::none;
// The default behavior is to follow symlinks
opt |= copy_opts::copy_symlinks;
ensureFilePathExists(dst);
fs::copy(toStdString(src), toStdString(dst), opt, err);
if (err) {
qWarning() << "Failed to copy files:" << QString::fromStdString(err.message());
qDebug() << "Source file:" << src;
qDebug() << "Destination file:" << dst;
}
return err.value() == 0;
}
bool copy::operator()(const QString& offset) bool copy::operator()(const QString& offset)
{ {
using copy_opts = fs::copy_options; using copy_opts = fs::copy_options;

View File

@ -75,6 +75,8 @@ bool ensureFilePathExists(QString filenamepath);
*/ */
bool ensureFolderPathExists(QString filenamepath); bool ensureFolderPathExists(QString filenamepath);
bool copyFile(QString &src, QString &dst);
class copy { class copy {
public: public:
copy(const QString& src, const QString& dst) copy(const QString& src, const QString& dst)

View File

@ -399,6 +399,7 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop)
message_dialog->setModal(true); message_dialog->setModal(true);
if (message_dialog->exec()) { if (message_dialog->exec()) {
copyBlockedMods(blocked_mods);
setupDownloadJob(loop); setupDownloadJob(loop);
} else { } else {
m_mod_id_resolver.reset(); m_mod_id_resolver.reset();
@ -410,6 +411,36 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop)
} }
} }
void FlameCreationTask::copyBlockedMods(QList<BlockedMod> blocked_mods) {
setStatus(tr("Copying Blocked Mods..."));
setAbortable(false);
int i = 0;
int total = blocked_mods.length();
setProgress(i, total);
for (auto mod = blocked_mods.begin(); mod != blocked_mods.end(); mod++, i++) {
if (!mod->matched) {
qDebug() << mod->name << "was not matched to a local file, skipping copy";
continue;
}
auto dest_path = FS::PathCombine(m_stagingPath, "minecraft", "mods", mod->name);
setStatus(tr("Copying Blocked Mods (%1 out of %2 are done)").arg(QString::number(i), QString::number(total)));
qDebug() << "Will try to copy" << mod->localPath << "to" << dest_path;
if (!FS::copyFile(mod->localPath, dest_path)) {
qDebug() << "Copy of" << mod->localPath << "to" << dest_path << "Failed";
}
setProgress(i+1, total);
}
setAbortable(true);
}
void FlameCreationTask::setupDownloadJob(QEventLoop& loop) void FlameCreationTask::setupDownloadJob(QEventLoop& loop)
{ {
m_files_job = new NetJob(tr("Mod download"), APPLICATION->network()); m_files_job = new NetJob(tr("Mod download"), APPLICATION->network());
@ -455,7 +486,9 @@ void FlameCreationTask::setupDownloadJob(QEventLoop& loop)
m_files_job.reset(); m_files_job.reset();
setError(reason); setError(reason);
}); });
connect(m_files_job.get(), &NetJob::progress, [&](qint64 current, qint64 total) { setProgress(current, total); }); connect(m_files_job.get(), &NetJob::progress, [&](qint64 current, qint64 total) {
setProgress(current, total);
});
connect(m_files_job.get(), &NetJob::finished, &loop, &QEventLoop::quit); connect(m_files_job.get(), &NetJob::finished, &loop, &QEventLoop::quit);
setStatus(tr("Downloading mods...")); setStatus(tr("Downloading mods..."));

View File

@ -10,6 +10,8 @@
#include "net/NetJob.h" #include "net/NetJob.h"
#include "ui/dialogs/BlockedModsDialog.h"
class FlameCreationTask final : public InstanceCreationTask { class FlameCreationTask final : public InstanceCreationTask {
Q_OBJECT Q_OBJECT
@ -29,6 +31,7 @@ class FlameCreationTask final : public InstanceCreationTask {
private slots: private slots:
void idResolverSucceeded(QEventLoop&); void idResolverSucceeded(QEventLoop&);
void setupDownloadJob(QEventLoop&); void setupDownloadJob(QEventLoop&);
void copyBlockedMods(QList<BlockedMod> blocked_mods);
private: private:
QWidget* m_parent = nullptr; QWidget* m_parent = nullptr;

View File

@ -176,7 +176,6 @@ void PackInstallTask::resolveMods()
void PackInstallTask::onResolveModsSucceeded() void PackInstallTask::onResolveModsSucceeded()
{ {
QList<BlockedMod> blocked_mods;
auto anyBlocked = false; auto anyBlocked = false;
Flame::Manifest results = m_mod_id_resolver_task->getResults(); Flame::Manifest results = m_mod_id_resolver_task->getResults();
@ -201,7 +200,7 @@ void PackInstallTask::onResolveModsSucceeded()
blocked_mod.matched = false; blocked_mod.matched = false;
blocked_mod.localPath = ""; blocked_mod.localPath = "";
blocked_mods.append(blocked_mod); m_blocked_mods.append(blocked_mod);
anyBlocked = true; anyBlocked = true;
} else { } else {
@ -217,12 +216,16 @@ void PackInstallTask::onResolveModsSucceeded()
auto message_dialog = new BlockedModsDialog(m_parent, tr("Blocked files found"), auto message_dialog = new BlockedModsDialog(m_parent, tr("Blocked files found"),
tr("The following files are not available for download in third party launchers.<br/>" tr("The following files are not available for download in third party launchers.<br/>"
"You will need to manually download them and add them to the instance."), "You will need to manually download them and add them to the instance."),
blocked_mods); m_blocked_mods);
if (message_dialog->exec() == QDialog::Accepted) if (message_dialog->exec() == QDialog::Accepted) {
qDebug() << "Post dialog mods list: " << m_blocked_mods;
createInstance(); createInstance();
else }
else {
abort(); abort();
}
} else { } else {
createInstance(); createInstance();
} }
@ -326,6 +329,9 @@ void PackInstallTask::downloadPack()
void PackInstallTask::onModDownloadSucceeded() void PackInstallTask::onModDownloadSucceeded()
{ {
m_net_job.reset(); m_net_job.reset();
if (m_blocked_mods.length() > 0) {
copyBlockedMods();
}
emitSucceeded(); emitSucceeded();
} }
@ -349,4 +355,34 @@ void PackInstallTask::onModDownloadFailed(QString reason)
emitFailed(reason); emitFailed(reason);
} }
void PackInstallTask::copyBlockedMods() {
setStatus(tr("Copying Blocked Mods..."));
setAbortable(false);
int i = 0;
int total = m_blocked_mods.length();
setProgress(i, total);
for (auto mod = m_blocked_mods.begin(); mod != m_blocked_mods.end(); mod++, i++) {
if (!mod->matched) {
qDebug() << mod->name << "was not matched to a local file, skipping copy";
continue;
}
auto dest_path = FS::PathCombine(m_stagingPath, ".minecraft", "mods", mod->name);
setStatus(tr("Copying Blocked Mods (%1 out of %2 are done)").arg(QString::number(i), QString::number(total)));
qDebug() << "Will try to copy" << mod->localPath << "to" << dest_path;
if (!FS::copyFile(mod->localPath, dest_path)) {
qDebug() << "Copy of" << mod->localPath << "to" << dest_path << "Failed";
}
setProgress(i+1, total);
}
setAbortable(true);
}
} // namespace ModpacksCH } // namespace ModpacksCH

View File

@ -43,6 +43,7 @@
#include "QObjectPtr.h" #include "QObjectPtr.h"
#include "modplatform/flame/FileResolvingTask.h" #include "modplatform/flame/FileResolvingTask.h"
#include "net/NetJob.h" #include "net/NetJob.h"
#include "ui/dialogs/BlockedModsDialog.h"
#include <QWidget> #include <QWidget>
@ -76,6 +77,7 @@ private:
void resolveMods(); void resolveMods();
void createInstance(); void createInstance();
void downloadPack(); void downloadPack();
void copyBlockedMods();
private: private:
NetJob::Ptr m_net_job = nullptr; NetJob::Ptr m_net_job = nullptr;
@ -90,6 +92,7 @@ private:
Version m_version; Version m_version;
QMap<QString, QString> m_files_to_copy; QMap<QString, QString> m_files_to_copy;
QList<BlockedMod> m_blocked_mods;
//FIXME: nuke //FIXME: nuke
QWidget* m_parent; QWidget* m_parent;

View File

@ -31,6 +31,7 @@ BlockedModsDialog::BlockedModsDialog(QWidget *parent, const QString &title, cons
this->setWindowTitle(title); this->setWindowTitle(title);
ui->label->setText(text); ui->label->setText(text);
ui->labelModsFound->setText("Please download the missing mods.");
update(); update();
} }
@ -60,6 +61,12 @@ void BlockedModsDialog::update() {
} }
ui->textBrowser->setText(text); ui->textBrowser->setText(text);
if (allModsMatched()) {
ui->labelModsFound->setText("All mods found ✔");
} else {
ui->labelModsFound->setText("Please download the missing mods.");
}
} }
void BlockedModsDialog::directoryChanged(QString path) { void BlockedModsDialog::directoryChanged(QString path) {

View File

@ -51,3 +51,4 @@ private:
bool allModsMatched(); bool allModsMatched();
}; };
QDebug operator<<(QDebug debug, const BlockedMod &m);

View File

@ -13,8 +13,8 @@
<property name="windowTitle"> <property name="windowTitle">
<string notr="true">BlockedModsDialog</string> <string notr="true">BlockedModsDialog</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item row="0" column="0"> <item>
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string notr="true"/> <string notr="true"/>
@ -24,17 +24,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QTextBrowser" name="textBrowser"> <widget class="QTextBrowser" name="textBrowser">
<property name="acceptRichText"> <property name="acceptRichText">
<bool>true</bool> <bool>true</bool>
@ -44,6 +34,27 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<layout class="QHBoxLayout" name="bottomBoxH">
<item>
<widget class="QLabel" name="labelModsFound">
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>