Merge pull request #28 from 02JanDal/feature_editor
Button for opening an editor for the custom.json file
This commit is contained in:
		
							
								
								
									
										18
									
								
								MultiMC.cpp
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								MultiMC.cpp
									
									
									
									
									
								
							| @@ -8,6 +8,7 @@ | |||||||
| #include <QLibraryInfo> | #include <QLibraryInfo> | ||||||
| #include <QMessageBox> | #include <QMessageBox> | ||||||
| #include <QStringList> | #include <QStringList> | ||||||
|  | #include <QDesktopServices> | ||||||
|  |  | ||||||
| #include "gui/dialogs/VersionSelectDialog.h" | #include "gui/dialogs/VersionSelectDialog.h" | ||||||
| #include "logic/lists/InstanceList.h" | #include "logic/lists/InstanceList.h" | ||||||
| @@ -382,6 +383,9 @@ void MultiMC::initGlobalSettings() | |||||||
| 	m_settings->registerSetting(new Setting("CentralModsDir", "mods")); | 	m_settings->registerSetting(new Setting("CentralModsDir", "mods")); | ||||||
| 	m_settings->registerSetting(new Setting("LWJGLDir", "lwjgl")); | 	m_settings->registerSetting(new Setting("LWJGLDir", "lwjgl")); | ||||||
|  |  | ||||||
|  | 	// Editors | ||||||
|  | 	m_settings->registerSetting(new Setting("JsonEditor", QString())); | ||||||
|  |  | ||||||
| 	// Console | 	// Console | ||||||
| 	m_settings->registerSetting(new Setting("ShowConsole", true)); | 	m_settings->registerSetting(new Setting("ShowConsole", true)); | ||||||
| 	m_settings->registerSetting(new Setting("AutoCloseConsole", true)); | 	m_settings->registerSetting(new Setting("AutoCloseConsole", true)); | ||||||
| @@ -550,4 +554,18 @@ QString MultiMC::getExitUpdatePath() const | |||||||
| 	return m_updateOnExitPath; | 	return m_updateOnExitPath; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | bool MultiMC::openJsonEditor(const QString &filename) | ||||||
|  | { | ||||||
|  | 	const QString file = QDir::current().absoluteFilePath(filename); | ||||||
|  | 	if (m_settings->get("JsonEditor").toString().isEmpty()) | ||||||
|  | 	{ | ||||||
|  | 		return QDesktopServices::openUrl(QUrl::fromLocalFile(file)); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		return QProcess::startDetached(m_settings->get("JsonEditor").toString(), | ||||||
|  | 									   QStringList() << file); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| #include "MultiMC.moc" | #include "MultiMC.moc" | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								MultiMC.h
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								MultiMC.h
									
									
									
									
									
								
							| @@ -6,7 +6,6 @@ | |||||||
| #include "logger/QsLog.h" | #include "logger/QsLog.h" | ||||||
| #include "logger/QsLogDest.h" | #include "logger/QsLogDest.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| class MinecraftVersionList; | class MinecraftVersionList; | ||||||
| class LWJGLVersionList; | class LWJGLVersionList; | ||||||
| class HttpMetaCache; | class HttpMetaCache; | ||||||
| @@ -101,12 +100,12 @@ public: | |||||||
| 	/*! | 	/*! | ||||||
| 	 * Installs update from the given update files directory. | 	 * Installs update from the given update files directory. | ||||||
| 	 */ | 	 */ | ||||||
| 	void installUpdates(const QString& updateFilesDir, bool restartOnFinish=false); | 	void installUpdates(const QString &updateFilesDir, bool restartOnFinish = false); | ||||||
|  |  | ||||||
| 	/*! | 	/*! | ||||||
| 	 * Sets MultiMC to install updates from the given directory when it exits. | 	 * Sets MultiMC to install updates from the given directory when it exits. | ||||||
| 	 */ | 	 */ | ||||||
| 	void setUpdateOnExit(const QString& updateFilesDir); | 	void setUpdateOnExit(const QString &updateFilesDir); | ||||||
|  |  | ||||||
| 	/*! | 	/*! | ||||||
| 	 * Gets the path to install updates from on exit. | 	 * Gets the path to install updates from on exit. | ||||||
| @@ -114,6 +113,12 @@ public: | |||||||
| 	 */ | 	 */ | ||||||
| 	QString getExitUpdatePath() const; | 	QString getExitUpdatePath() const; | ||||||
|  |  | ||||||
|  | 	/*! | ||||||
|  | 	 * Opens a json file using either a system default editor, or, if note empty, the editor | ||||||
|  | 	 * specified in the settings | ||||||
|  | 	 */ | ||||||
|  | 	bool openJsonEditor(const QString &filename); | ||||||
|  |  | ||||||
| private: | private: | ||||||
| 	void initLogger(); | 	void initLogger(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -97,6 +97,7 @@ void OneSixModEditDialog::updateVersionControls() | |||||||
| 	ui->revertBtn->setEnabled(customVersion); | 	ui->revertBtn->setEnabled(customVersion); | ||||||
| 	ui->forgeBtn->setEnabled(true); | 	ui->forgeBtn->setEnabled(true); | ||||||
| 	ui->liteloaderBtn->setEnabled(LiteLoaderInstaller(m_inst->intendedVersionId()).canApply()); | 	ui->liteloaderBtn->setEnabled(LiteLoaderInstaller(m_inst->intendedVersionId()).canApply()); | ||||||
|  | 	ui->customEditorBtn->setEnabled(customVersion); | ||||||
| } | } | ||||||
|  |  | ||||||
| void OneSixModEditDialog::disableVersionControls() | void OneSixModEditDialog::disableVersionControls() | ||||||
| @@ -105,6 +106,7 @@ void OneSixModEditDialog::disableVersionControls() | |||||||
| 	ui->revertBtn->setEnabled(false); | 	ui->revertBtn->setEnabled(false); | ||||||
| 	ui->forgeBtn->setEnabled(false); | 	ui->forgeBtn->setEnabled(false); | ||||||
| 	ui->liteloaderBtn->setEnabled(false); | 	ui->liteloaderBtn->setEnabled(false); | ||||||
|  | 	ui->customEditorBtn->setEnabled(false); | ||||||
| } | } | ||||||
|  |  | ||||||
| void OneSixModEditDialog::on_customizeBtn_clicked() | void OneSixModEditDialog::on_customizeBtn_clicked() | ||||||
| @@ -134,6 +136,17 @@ void OneSixModEditDialog::on_revertBtn_clicked() | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void OneSixModEditDialog::on_customEditorBtn_clicked() | ||||||
|  | { | ||||||
|  | 	if (m_inst->versionIsCustom()) | ||||||
|  | 	{ | ||||||
|  | 		if (!MMC->openJsonEditor(m_inst->instanceRoot() + "/custom.json")) | ||||||
|  | 		{ | ||||||
|  | 			QMessageBox::warning(this, tr("Error"), tr("Unable to open custom.json, check the settings")); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| void OneSixModEditDialog::on_forgeBtn_clicked() | void OneSixModEditDialog::on_forgeBtn_clicked() | ||||||
| { | { | ||||||
| 	VersionSelectDialog vselect(MMC->forgelist().get(), tr("Select Forge version"), this); | 	VersionSelectDialog vselect(MMC->forgelist().get(), tr("Select Forge version"), this); | ||||||
|   | |||||||
| @@ -47,6 +47,7 @@ slots: | |||||||
| 	void on_liteloaderBtn_clicked(); | 	void on_liteloaderBtn_clicked(); | ||||||
| 	void on_customizeBtn_clicked(); | 	void on_customizeBtn_clicked(); | ||||||
| 	void on_revertBtn_clicked(); | 	void on_revertBtn_clicked(); | ||||||
|  | 	void on_customEditorBtn_clicked(); | ||||||
| 	void updateVersionControls(); | 	void updateVersionControls(); | ||||||
| 	void disableVersionControls(); | 	void disableVersionControls(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -143,6 +143,20 @@ | |||||||
|            </property> |            </property> | ||||||
|           </widget> |           </widget> | ||||||
|          </item> |          </item> | ||||||
|  |          <item> | ||||||
|  |           <widget class="Line" name="line_2"> | ||||||
|  |            <property name="orientation"> | ||||||
|  |             <enum>Qt::Horizontal</enum> | ||||||
|  |            </property> | ||||||
|  |           </widget> | ||||||
|  |          </item> | ||||||
|  |          <item> | ||||||
|  |           <widget class="QPushButton" name="customEditorBtn"> | ||||||
|  |            <property name="text"> | ||||||
|  |             <string>Open custom.json</string> | ||||||
|  |            </property> | ||||||
|  |           </widget> | ||||||
|  |          </item> | ||||||
|          <item> |          <item> | ||||||
|           <spacer name="verticalSpacer_7"> |           <spacer name="verticalSpacer_7"> | ||||||
|            <property name="orientation"> |            <property name="orientation"> | ||||||
|   | |||||||
| @@ -40,6 +40,10 @@ SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent), ui(new Ui::Se | |||||||
| 	ui->sortingModeGroup->setId(ui->sortByNameBtn, Sort_Name); | 	ui->sortingModeGroup->setId(ui->sortByNameBtn, Sort_Name); | ||||||
| 	ui->sortingModeGroup->setId(ui->sortLastLaunchedBtn, Sort_LastLaunch); | 	ui->sortingModeGroup->setId(ui->sortLastLaunchedBtn, Sort_LastLaunch); | ||||||
|  |  | ||||||
|  | #if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0) | ||||||
|  | 	ui->jsonEditorTextBox->setClearButtonEnabled(true); | ||||||
|  | #endif | ||||||
|  |  | ||||||
| 	loadSettings(MMC->settings().get()); | 	loadSettings(MMC->settings().get()); | ||||||
| 	updateCheckboxStuff(); | 	updateCheckboxStuff(); | ||||||
| } | } | ||||||
| @@ -125,6 +129,36 @@ void SettingsDialog::on_lwjglDirBrowseBtn_clicked() | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void SettingsDialog::on_jsonEditorBrowseBtn_clicked() | ||||||
|  | { | ||||||
|  | 	QString raw_file = QFileDialog::getOpenFileName( | ||||||
|  | 		this, tr("JSON Editor"), | ||||||
|  | 		ui->jsonEditorTextBox->text().isEmpty() | ||||||
|  | 	#if defined(Q_OS_LINUX) | ||||||
|  | 				? QString("/usr/bin") | ||||||
|  | 	#else | ||||||
|  | 			? QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation).first() | ||||||
|  | 	#endif | ||||||
|  | 			: ui->jsonEditorTextBox->text()); | ||||||
|  | 	QString cooked_file = NormalizePath(raw_file); | ||||||
|  |  | ||||||
|  | 	if (cooked_file.isEmpty()) | ||||||
|  | 	{ | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// it has to exist and be an executable | ||||||
|  | 	if (QFileInfo(cooked_file).exists() && | ||||||
|  | 		QFileInfo(cooked_file).isExecutable()) | ||||||
|  | 	{ | ||||||
|  | 		ui->jsonEditorTextBox->setText(cooked_file); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		QMessageBox::warning(this, tr("Invalid"), tr("The file chosen does not seem to be an executable")); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| void SettingsDialog::on_maximizedCheckBox_clicked(bool checked) | void SettingsDialog::on_maximizedCheckBox_clicked(bool checked) | ||||||
| { | { | ||||||
| 	Q_UNUSED(checked); | 	Q_UNUSED(checked); | ||||||
| @@ -172,6 +206,18 @@ void SettingsDialog::applySettings(SettingsObject *s) | |||||||
| 	s->set("CentralModsDir", ui->modsDirTextBox->text()); | 	s->set("CentralModsDir", ui->modsDirTextBox->text()); | ||||||
| 	s->set("LWJGLDir", ui->lwjglDirTextBox->text()); | 	s->set("LWJGLDir", ui->lwjglDirTextBox->text()); | ||||||
|  |  | ||||||
|  | 	// Editors | ||||||
|  | 	QString jsonEditor = ui->jsonEditorTextBox->text(); | ||||||
|  | 	if (!jsonEditor.isEmpty() && (!QFileInfo(jsonEditor).exists() || !QFileInfo(jsonEditor).isExecutable())) | ||||||
|  | 	{ | ||||||
|  | 		QString found = QStandardPaths::findExecutable(jsonEditor); | ||||||
|  | 		if (!found.isEmpty()) | ||||||
|  | 		{ | ||||||
|  | 			jsonEditor = found; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	s->set("JsonEditor", jsonEditor); | ||||||
|  |  | ||||||
| 	// Console | 	// Console | ||||||
| 	s->set("ShowConsole", ui->showConsoleCheck->isChecked()); | 	s->set("ShowConsole", ui->showConsoleCheck->isChecked()); | ||||||
| 	s->set("AutoCloseConsole", ui->autoCloseConsoleCheck->isChecked()); | 	s->set("AutoCloseConsole", ui->autoCloseConsoleCheck->isChecked()); | ||||||
| @@ -226,6 +272,9 @@ void SettingsDialog::loadSettings(SettingsObject *s) | |||||||
| 	ui->modsDirTextBox->setText(s->get("CentralModsDir").toString()); | 	ui->modsDirTextBox->setText(s->get("CentralModsDir").toString()); | ||||||
| 	ui->lwjglDirTextBox->setText(s->get("LWJGLDir").toString()); | 	ui->lwjglDirTextBox->setText(s->get("LWJGLDir").toString()); | ||||||
|  |  | ||||||
|  | 	// Editors | ||||||
|  | 	ui->jsonEditorTextBox->setText(s->get("JsonEditor").toString()); | ||||||
|  |  | ||||||
| 	// Console | 	// Console | ||||||
| 	ui->showConsoleCheck->setChecked(s->get("ShowConsole").toBool()); | 	ui->showConsoleCheck->setChecked(s->get("ShowConsole").toBool()); | ||||||
| 	ui->autoCloseConsoleCheck->setChecked(s->get("AutoCloseConsole").toBool()); | 	ui->autoCloseConsoleCheck->setChecked(s->get("AutoCloseConsole").toBool()); | ||||||
|   | |||||||
| @@ -55,6 +55,8 @@ slots: | |||||||
|  |  | ||||||
| 	void on_lwjglDirBrowseBtn_clicked(); | 	void on_lwjglDirBrowseBtn_clicked(); | ||||||
|  |  | ||||||
|  | 	void on_jsonEditorBrowseBtn_clicked(); | ||||||
|  |  | ||||||
| 	void on_maximizedCheckBox_clicked(bool checked); | 	void on_maximizedCheckBox_clicked(bool checked); | ||||||
|  |  | ||||||
| 	void on_buttonBox_accepted(); | 	void on_buttonBox_accepted(); | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|     <x>0</x> |     <x>0</x> | ||||||
|     <y>0</y> |     <y>0</y> | ||||||
|     <width>526</width> |     <width>526</width> | ||||||
|     <height>599</height> |     <height>628</height> | ||||||
|    </rect> |    </rect> | ||||||
|   </property> |   </property> | ||||||
|   <property name="sizePolicy"> |   <property name="sizePolicy"> | ||||||
| @@ -39,7 +39,7 @@ | |||||||
|       <attribute name="title"> |       <attribute name="title"> | ||||||
|        <string>General</string> |        <string>General</string> | ||||||
|       </attribute> |       </attribute> | ||||||
|       <layout class="QVBoxLayout" name="generalTabLayout"> |       <layout class="QVBoxLayout" name="verticalLayout"> | ||||||
|        <item> |        <item> | ||||||
|         <widget class="QGroupBox" name="sortingModeBox"> |         <widget class="QGroupBox" name="sortingModeBox"> | ||||||
|          <property name="enabled"> |          <property name="enabled"> | ||||||
| @@ -236,6 +236,32 @@ | |||||||
|          </layout> |          </layout> | ||||||
|         </widget> |         </widget> | ||||||
|        </item> |        </item> | ||||||
|  |        <item> | ||||||
|  |         <widget class="QGroupBox" name="editorsBox"> | ||||||
|  |          <property name="title"> | ||||||
|  |           <string>External Editors (leave empty for system default)</string> | ||||||
|  |          </property> | ||||||
|  |          <layout class="QGridLayout" name="foldersBoxLayout_2"> | ||||||
|  |           <item row="0" column="1"> | ||||||
|  |            <widget class="QLineEdit" name="jsonEditorTextBox"/> | ||||||
|  |           </item> | ||||||
|  |           <item row="0" column="0"> | ||||||
|  |            <widget class="QLabel" name="labelJsonEditor"> | ||||||
|  |             <property name="text"> | ||||||
|  |              <string>JSON Editor:</string> | ||||||
|  |             </property> | ||||||
|  |            </widget> | ||||||
|  |           </item> | ||||||
|  |           <item row="0" column="2"> | ||||||
|  |            <widget class="QToolButton" name="jsonEditorBrowseBtn"> | ||||||
|  |             <property name="text"> | ||||||
|  |              <string>...</string> | ||||||
|  |             </property> | ||||||
|  |            </widget> | ||||||
|  |           </item> | ||||||
|  |          </layout> | ||||||
|  |         </widget> | ||||||
|  |        </item> | ||||||
|        <item> |        <item> | ||||||
|         <spacer name="generalTabSpacer"> |         <spacer name="generalTabSpacer"> | ||||||
|          <property name="orientation"> |          <property name="orientation"> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user