copy found mods to instance (FTB and Flame)
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
This commit is contained in:
parent
1598d65824
commit
13c7efa058
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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..."));
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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) {
|
||||||
|
@ -51,3 +51,4 @@ private:
|
|||||||
bool allModsMatched();
|
bool allModsMatched();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
QDebug operator<<(QDebug debug, const BlockedMod &m);
|
@ -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/>
|
||||||
|
Loading…
Reference in New Issue
Block a user