copy found mods to instance (FTB and Flame)
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
This commit is contained in:
		@@ -163,6 +163,28 @@ bool ensureFolderPathExists(QString foldernamepath)
 | 
			
		||||
    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)
 | 
			
		||||
{
 | 
			
		||||
    using copy_opts = fs::copy_options;
 | 
			
		||||
 
 | 
			
		||||
@@ -75,6 +75,8 @@ bool ensureFilePathExists(QString filenamepath);
 | 
			
		||||
 */
 | 
			
		||||
bool ensureFolderPathExists(QString filenamepath);
 | 
			
		||||
 | 
			
		||||
bool copyFile(QString &src, QString &dst);
 | 
			
		||||
 | 
			
		||||
class copy {
 | 
			
		||||
   public:
 | 
			
		||||
    copy(const QString& src, const QString& dst)
 | 
			
		||||
 
 | 
			
		||||
@@ -399,6 +399,7 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop)
 | 
			
		||||
        message_dialog->setModal(true);
 | 
			
		||||
 | 
			
		||||
        if (message_dialog->exec()) {
 | 
			
		||||
            copyBlockedMods(blocked_mods);
 | 
			
		||||
            setupDownloadJob(loop);
 | 
			
		||||
        } else {
 | 
			
		||||
            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)
 | 
			
		||||
{
 | 
			
		||||
    m_files_job = new NetJob(tr("Mod download"), APPLICATION->network());
 | 
			
		||||
@@ -455,7 +486,9 @@ void FlameCreationTask::setupDownloadJob(QEventLoop& loop)
 | 
			
		||||
        m_files_job.reset();
 | 
			
		||||
        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);
 | 
			
		||||
 | 
			
		||||
    setStatus(tr("Downloading mods..."));
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,8 @@
 | 
			
		||||
 | 
			
		||||
#include "net/NetJob.h"
 | 
			
		||||
 | 
			
		||||
#include "ui/dialogs/BlockedModsDialog.h"
 | 
			
		||||
 | 
			
		||||
class FlameCreationTask final : public InstanceCreationTask {
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
 | 
			
		||||
@@ -29,6 +31,7 @@ class FlameCreationTask final : public InstanceCreationTask {
 | 
			
		||||
   private slots:
 | 
			
		||||
    void idResolverSucceeded(QEventLoop&);
 | 
			
		||||
    void setupDownloadJob(QEventLoop&);
 | 
			
		||||
    void copyBlockedMods(QList<BlockedMod> blocked_mods);
 | 
			
		||||
 | 
			
		||||
   private:
 | 
			
		||||
    QWidget* m_parent = nullptr;
 | 
			
		||||
 
 | 
			
		||||
@@ -176,7 +176,6 @@ void PackInstallTask::resolveMods()
 | 
			
		||||
 | 
			
		||||
void PackInstallTask::onResolveModsSucceeded()
 | 
			
		||||
{
 | 
			
		||||
    QList<BlockedMod> blocked_mods;
 | 
			
		||||
    auto anyBlocked = false;
 | 
			
		||||
 | 
			
		||||
    Flame::Manifest results = m_mod_id_resolver_task->getResults();
 | 
			
		||||
@@ -201,7 +200,7 @@ void PackInstallTask::onResolveModsSucceeded()
 | 
			
		||||
            blocked_mod.matched = false;
 | 
			
		||||
            blocked_mod.localPath = "";
 | 
			
		||||
 | 
			
		||||
            blocked_mods.append(blocked_mod);
 | 
			
		||||
            m_blocked_mods.append(blocked_mod);
 | 
			
		||||
 | 
			
		||||
            anyBlocked = true;
 | 
			
		||||
        } else {
 | 
			
		||||
@@ -217,12 +216,16 @@ void PackInstallTask::onResolveModsSucceeded()
 | 
			
		||||
        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/>"
 | 
			
		||||
                                                      "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();
 | 
			
		||||
        else
 | 
			
		||||
        }  
 | 
			
		||||
        else {
 | 
			
		||||
            abort();
 | 
			
		||||
        }
 | 
			
		||||
            
 | 
			
		||||
    } else {
 | 
			
		||||
        createInstance();
 | 
			
		||||
    }
 | 
			
		||||
@@ -326,6 +329,9 @@ void PackInstallTask::downloadPack()
 | 
			
		||||
void PackInstallTask::onModDownloadSucceeded()
 | 
			
		||||
{
 | 
			
		||||
    m_net_job.reset();
 | 
			
		||||
    if (m_blocked_mods.length() > 0) {
 | 
			
		||||
        copyBlockedMods();
 | 
			
		||||
    }
 | 
			
		||||
    emitSucceeded();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -349,4 +355,34 @@ void PackInstallTask::onModDownloadFailed(QString 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
 | 
			
		||||
 
 | 
			
		||||
@@ -43,6 +43,7 @@
 | 
			
		||||
#include "QObjectPtr.h"
 | 
			
		||||
#include "modplatform/flame/FileResolvingTask.h"
 | 
			
		||||
#include "net/NetJob.h"
 | 
			
		||||
#include "ui/dialogs/BlockedModsDialog.h"
 | 
			
		||||
 | 
			
		||||
#include <QWidget>
 | 
			
		||||
 | 
			
		||||
@@ -76,6 +77,7 @@ private:
 | 
			
		||||
    void resolveMods();
 | 
			
		||||
    void createInstance();
 | 
			
		||||
    void downloadPack();
 | 
			
		||||
    void copyBlockedMods();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    NetJob::Ptr m_net_job = nullptr;
 | 
			
		||||
@@ -90,6 +92,7 @@ private:
 | 
			
		||||
    Version m_version;
 | 
			
		||||
 | 
			
		||||
    QMap<QString, QString> m_files_to_copy;
 | 
			
		||||
    QList<BlockedMod> m_blocked_mods;
 | 
			
		||||
 | 
			
		||||
    //FIXME: nuke
 | 
			
		||||
    QWidget* m_parent;
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,7 @@ BlockedModsDialog::BlockedModsDialog(QWidget *parent, const QString &title, cons
 | 
			
		||||
 | 
			
		||||
    this->setWindowTitle(title);
 | 
			
		||||
    ui->label->setText(text);
 | 
			
		||||
    ui->labelModsFound->setText("Please download the missing mods.");
 | 
			
		||||
    update();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -60,6 +61,12 @@ void BlockedModsDialog::update() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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) {
 | 
			
		||||
 
 | 
			
		||||
@@ -51,3 +51,4 @@ private:
 | 
			
		||||
    bool allModsMatched();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
QDebug operator<<(QDebug debug, const BlockedMod &m);
 | 
			
		||||
@@ -13,8 +13,8 @@
 | 
			
		||||
  <property name="windowTitle">
 | 
			
		||||
   <string notr="true">BlockedModsDialog</string>
 | 
			
		||||
  </property>
 | 
			
		||||
  <layout class="QGridLayout" name="gridLayout">
 | 
			
		||||
   <item row="0" column="0">
 | 
			
		||||
  <layout class="QVBoxLayout" name="verticalLayout">
 | 
			
		||||
   <item>
 | 
			
		||||
    <widget class="QLabel" name="label">
 | 
			
		||||
     <property name="text">
 | 
			
		||||
      <string notr="true"/>
 | 
			
		||||
@@ -24,17 +24,7 @@
 | 
			
		||||
     </property>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item row="2" column="0">
 | 
			
		||||
    <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">
 | 
			
		||||
   <item>
 | 
			
		||||
    <widget class="QTextBrowser" name="textBrowser">
 | 
			
		||||
     <property name="acceptRichText">
 | 
			
		||||
      <bool>true</bool>
 | 
			
		||||
@@ -44,6 +34,27 @@
 | 
			
		||||
     </property>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </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>
 | 
			
		||||
 </widget>
 | 
			
		||||
 <resources/>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user