NOISSUE use LoggedProcess to work around issues with QProcess on macOS

This commit is contained in:
Petr Mrázek 2016-11-03 01:10:16 +01:00
parent ac66af6c13
commit f0b71f989e
17 changed files with 62 additions and 25 deletions

View File

@ -27,7 +27,7 @@
#include "settings/INIFile.h"
#include "BaseVersionList.h"
#include "minecraft/auth/MojangAccount.h"
#include "launch/MessageLevel.h"
#include "MessageLevel.h"
#include "pathmatcher/IPathMatcher.h"
#include "multimc_logic_export.h"

View File

@ -16,6 +16,10 @@ set(CORE_SOURCES
InstanceImportTask.cpp
InstanceList.h
InstanceList.cpp
LoggedProcess.h
LoggedProcess.cpp
MessageLevel.cpp
MessageLevel.h
BaseInstanceProvider.h
FolderInstanceProvider.h
FolderInstanceProvider.cpp
@ -126,12 +130,8 @@ set(LAUNCH_SOURCES
launch/LaunchStep.h
launch/LaunchTask.cpp
launch/LaunchTask.h
launch/LoggedProcess.cpp
launch/LoggedProcess.h
launch/LogModel.cpp
launch/LogModel.h
launch/MessageLevel.cpp
launch/MessageLevel.h
)
# Old update system

View File

@ -17,12 +17,13 @@
#include <QProcess>
#include "MessageLevel.h"
#include "multimc_logic_export.h"
/*
* This is a basic process.
* It has line-based logging support and hides some of the nasty bits.
*/
class LoggedProcess : public QProcess
class MULTIMC_LOGIC_EXPORT LoggedProcess : public QProcess
{
Q_OBJECT
public:

View File

@ -16,7 +16,7 @@
#pragma once
#include <launch/LaunchStep.h>
#include <launch/LoggedProcess.h>
#include <LoggedProcess.h>
#include <java/JavaChecker.h>
class CheckJava: public LaunchStep

View File

@ -16,7 +16,7 @@
#pragma once
#include <launch/LaunchStep.h>
#include <launch/LoggedProcess.h>
#include <LoggedProcess.h>
class PostLaunchCommand: public LaunchStep
{

View File

@ -15,8 +15,8 @@
#pragma once
#include <launch/LaunchStep.h>
#include <launch/LoggedProcess.h>
#include "launch/LaunchStep.h"
#include "LoggedProcess.h"
class PreLaunchCommand: public LaunchStep
{

View File

@ -16,7 +16,7 @@
#pragma once
#include <launch/LaunchStep.h>
#include <launch/LoggedProcess.h>
#include <LoggedProcess.h>
#include <java/JavaChecker.h>
#include "multimc_logic_export.h"

View File

@ -17,7 +17,7 @@
#include <launch/LaunchStep.h>
#include <QObjectPtr.h>
#include <launch/LoggedProcess.h>
#include <LoggedProcess.h>
#include <java/JavaChecker.h>
// FIXME: stupid. should be defined by the instance type? or even completely abstracted away...

View File

@ -16,7 +16,7 @@
#pragma once
#include <launch/LaunchStep.h>
#include <launch/LoggedProcess.h>
#include <LoggedProcess.h>
#include <minecraft/auth/AuthSession.h>
// HACK: this is a workaround for MCL-3732 - 'server-resource-packs' folder is created.

View File

@ -16,7 +16,7 @@
#pragma once
#include <launch/LaunchStep.h>
#include <launch/LoggedProcess.h>
#include <LoggedProcess.h>
#include <minecraft/auth/AuthSession.h>
class DirectJavaLaunch: public LaunchStep

View File

@ -16,7 +16,7 @@
#pragma once
#include <launch/LaunchStep.h>
#include <launch/LoggedProcess.h>
#include <LoggedProcess.h>
#include <minecraft/auth/AuthSession.h>
class LauncherPartLaunch: public LaunchStep

View File

@ -1,7 +1,7 @@
#pragma once
#include <QtGui/QColor>
#include <rainbow.h>
#include <launch/MessageLevel.h>
#include <MessageLevel.h>
#include <QMap>
class ColorCache

View File

@ -29,6 +29,7 @@
#include "MultiMC.h"
#include <GuiUtil.h>
#include <QProcess>
#include <FileSystem.h>
WorldListPage::WorldListPage(BaseInstance *inst, std::shared_ptr<WorldList> worlds, QString id,
QString iconName, QString displayName, QString helpPage,
@ -149,7 +150,11 @@ void WorldListPage::on_copySeedBtn_clicked()
void WorldListPage::on_mcEditBtn_clicked()
{
if(m_mceditStarting)
return;
auto mcedit = MMC->mcedit();
const QString mceditPath = mcedit->path();
QModelIndex index = getSelectedWorld();
@ -167,15 +172,11 @@ void WorldListPage::on_mcEditBtn_clicked()
auto program = mcedit->getProgramPath();
if(program.size())
{
qint64 pid;
if(!QProcess::startDetached(program, QStringList() << fullPath, mceditPath, &pid))
{
QMessageBox::warning(
this->parentWidget(),
tr("MCEdit failed to start!"),
tr("MCEdit failed to start.\nIt may be necessary to reinstall it.")
);
}
m_mceditProcess.reset(new LoggedProcess());
m_mceditProcess->setDetachable(true);
connect(m_mceditProcess.get(), &LoggedProcess::stateChanged, this, &WorldListPage::mceditState);
m_mceditProcess->start(program, {fullPath});
m_mceditStarting = true;
}
else
{
@ -187,6 +188,37 @@ void WorldListPage::on_mcEditBtn_clicked()
}
}
void WorldListPage::mceditState(LoggedProcess::State state)
{
bool failed = false;
switch(state)
{
case LoggedProcess::NotRunning:
case LoggedProcess::Starting:
return;
case LoggedProcess::FailedToStart:
case LoggedProcess::Crashed:
case LoggedProcess::Aborted:
{
failed = true;
}
case LoggedProcess::Running:
case LoggedProcess::Finished:
{
m_mceditStarting = false;
break;
}
}
if(failed)
{
QMessageBox::warning(
this->parentWidget(),
tr("MCEdit failed to start!"),
tr("MCEdit failed to start.\nIt may be necessary to reinstall it.")
);
}
}
void WorldListPage::worldChanged(const QModelIndex &current, const QModelIndex &previous)
{
QModelIndex index = getSelectedWorld();

View File

@ -20,6 +20,7 @@
#include "minecraft/onesix/OneSixInstance.h"
#include "BasePage.h"
#include <MultiMC.h>
#include <LoggedProcess.h>
class WorldList;
namespace Ui
@ -73,6 +74,8 @@ private:
private:
Ui::WorldListPage *ui;
std::shared_ptr<WorldList> m_worlds;
unique_qobject_ptr<LoggedProcess> m_mceditProcess;
bool m_mceditStarting = false;
QString m_iconName;
QString m_id;
QString m_displayName;
@ -88,4 +91,5 @@ private slots:
void on_refreshBtn_clicked();
void on_viewFolderBtn_clicked();
void worldChanged(const QModelIndex &current, const QModelIndex &previous);
void mceditState(LoggedProcess::State state);
};