diff --git a/CMakeLists.txt b/CMakeLists.txt index 3fa89d5b5..66e18484f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -104,7 +104,6 @@ data/appsettings.cpp data/inifile.cpp data/instancebase.cpp data/instancemodel.cpp -data/settingsbase.cpp data/stdinstance.cpp gui/mainwindow.cpp @@ -126,9 +125,9 @@ data/appsettings.h data/inifile.h data/instancebase.h data/instancemodel.h -data/settingsbase.h data/stdinstance.h +util/apputils.h util/pathutils.h multimc_pragma.h diff --git a/MultiMC.pro b/MultiMC.pro index 4da6e82f1..3f4805298 100644 --- a/MultiMC.pro +++ b/MultiMC.pro @@ -21,8 +21,7 @@ SOURCES += main.cpp\ data/inifile.cpp \ gui/settingsdialog.cpp \ gui/modeditwindow.cpp \ - data/appsettings.cpp \ - data/settingsbase.cpp + util/appsettings.cpp HEADERS += gui/mainwindow.h \ data/instancebase.h \ @@ -32,10 +31,8 @@ HEADERS += gui/mainwindow.h \ data/inifile.h \ gui/settingsdialog.h \ gui/modeditwindow.h \ - data/appsettings.h \ - data/settingsbase.h \ - util/settingsmacros.h \ - util/settingsmacrosundef.h + util/apputils.h \ + util/appsettings.h FORMS += gui/mainwindow.ui \ gui/settingsdialog.ui \ diff --git a/data/appsettings.cpp b/data/appsettings.cpp index 525def6e3..1d9c4312a 100644 --- a/data/appsettings.cpp +++ b/data/appsettings.cpp @@ -15,8 +15,26 @@ #include "appsettings.h" -AppSettings::AppSettings(QString fileName) : - SettingsBase(fileName) +AppSettings* settings; + +SettingsBase::SettingsBase(QObject *parent) : + QObject(parent) { } + +AppSettings::AppSettings(QObject *parent) : + SettingsBase(parent) +{ + +} + +QVariant AppSettings::getValue(const QString& name, QVariant defVal) const +{ + return config.value(name, defVal); +} + +void AppSettings::setValue(const QString& name, QVariant val) +{ + config.setValue(name, val); +} diff --git a/data/appsettings.h b/data/appsettings.h index f8c7ff733..eff22b11f 100644 --- a/data/appsettings.h +++ b/data/appsettings.h @@ -16,12 +16,97 @@ #ifndef APPSETTINGS_H #define APPSETTINGS_H -#include "settingsbase.h" +#include +#include +#include + +#include "util/apputils.h" +#include "util/osutils.h" + +#if WINDOWS +#define JPATHKEY "JavaPathWindows" +#elif OSX +#define JPATHKEY "JavaPathOSX" +#else +#define JPATHKEY "JavaPathLinux" +#endif + +#define DEFINE_SETTING_ADVANCED(funcName, name, valType, defVal) \ + virtual valType get ## funcName() const { return getValue(name, defVal).value(); } \ + virtual void set ## funcName(valType value) { setValue(name, value); } + +#define DEFINE_SETTING(name, valType, defVal) \ + DEFINE_SETTING_ADVANCED(name, STR_VAL(name), valType, defVal) + +#define DEFINE_OVERRIDE_SETTING(overrideName) \ + + +class SettingsBase : public QObject +{ + Q_OBJECT +public: + explicit SettingsBase(QObject *parent = 0); + + // Updates + DEFINE_SETTING(UseDevBuilds, bool, false) + DEFINE_SETTING(AutoUpdate, bool, true) + + // Folders + DEFINE_SETTING(InstanceDir, QString, "instances") + DEFINE_SETTING(CentralModsDir, QString, "mods") + DEFINE_SETTING(LWJGLDir, QString, "lwjgl") + + // Console + DEFINE_SETTING(ShowConsole, bool, true) + DEFINE_SETTING(AutoCloseConsole, bool, true) + + // Console Colors + DEFINE_SETTING(SysMessageColor, QColor, QColor(Qt::blue)) + DEFINE_SETTING(StdOutColor, QColor, QColor(Qt::black)) + DEFINE_SETTING(StdErrColor, QColor, QColor(Qt::red)) + + // Window Size + DEFINE_SETTING(LaunchCompatMode, bool, false) + DEFINE_SETTING(LaunchMaximized, bool, false) + DEFINE_SETTING(MinecraftWinWidth, int, 854) + DEFINE_SETTING(MinecraftWinHeight, int, 480) + + // Auto login + DEFINE_SETTING(AutoLogin, bool, false) + + // Memory + DEFINE_SETTING(MinMemAlloc, int, 512) + DEFINE_SETTING(MaxMemAlloc, int, 1024) + + // Java Settings + DEFINE_SETTING_ADVANCED(JavaPath, JPATHKEY, QString, "java") + DEFINE_SETTING(JvmArgs, QString, "") + + // Custom Commands + DEFINE_SETTING(PreLaunchCommand, QString, "") + DEFINE_SETTING(PostExitCommand, QString, "") + +protected: + virtual QVariant getValue(const QString& name, QVariant defVal = QVariant()) const = 0; + virtual void setValue(const QString& name, QVariant val) = 0; +}; class AppSettings : public SettingsBase { + Q_OBJECT public: - AppSettings(QString fileName); + explicit AppSettings(QObject *parent = 0); + +protected: + virtual QVariant getValue(const QString &name, QVariant defVal = QVariant()) const; + virtual void setValue(const QString& name, QVariant val); + + QSettings config; }; +#undef DEFINE_SETTING_ADVANCED +#undef DEFINE_SETTING + +extern AppSettings* settings; + #endif // APPSETTINGS_H diff --git a/data/settingsbase.h b/data/settingsbase.h deleted file mode 100644 index 71f0e30de..000000000 --- a/data/settingsbase.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef SETTINGSBASE_H -#define SETTINGSBASE_H - -#include - -#include "settingsmacros.h" - -class SettingsBase : public QSettings -{ -public: - SettingsBase(QString fileName); - - -}; - -#include "settingsmacrosundef.h" - -#endif // SETTINGSBASE_H diff --git a/data/stdinstance.cpp b/data/stdinstance.cpp index 1324b510f..4618f5ca8 100644 --- a/data/stdinstance.cpp +++ b/data/stdinstance.cpp @@ -15,8 +15,8 @@ #include "stdinstance.h" -StdInstance::StdInstance(QString rootDir) : - InstanceBase(rootDir) +StdInstance::StdInstance(QString rootDir, QObject* parent) : + InstanceBase(rootDir, parent) { } diff --git a/data/stdinstance.h b/data/stdinstance.h index 59b1c8ab3..79b87601f 100644 --- a/data/stdinstance.h +++ b/data/stdinstance.h @@ -22,7 +22,7 @@ class StdInstance : public InstanceBase { public: - explicit StdInstance(QString rootDir); + explicit StdInstance(QString rootDir, QObject *parent = 0); }; #endif // STDINSTANCE_H diff --git a/gui/settingsdialog.cpp b/gui/settingsdialog.cpp index 465693400..ab4d18ee9 100644 --- a/gui/settingsdialog.cpp +++ b/gui/settingsdialog.cpp @@ -16,13 +16,19 @@ #include "settingsdialog.h" #include "ui_settingsdialog.h" +#include "data/appsettings.h" + #include +#include SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent), ui(new Ui::SettingsDialog) { ui->setupUi(this); + + loadSettings(settings); + updateCheckboxStuff(); } SettingsDialog::~SettingsDialog() @@ -32,10 +38,10 @@ SettingsDialog::~SettingsDialog() void SettingsDialog::updateCheckboxStuff() { - ui->minMemSpinBox->setEnabled(!(ui->compatModeCheckBox->isChecked() || - ui->maximizedCheckBox->isChecked())); - ui->maxMemSpinBox->setEnabled(!(ui->compatModeCheckBox->isChecked() || - ui->maximizedCheckBox->isChecked())); + ui->windowWidthSpinBox->setEnabled(!(ui->compatModeCheckBox->isChecked() || + ui->maximizedCheckBox->isChecked())); + ui->windowHeightSpinBox->setEnabled(!(ui->compatModeCheckBox->isChecked() || + ui->maximizedCheckBox->isChecked())); ui->maximizedCheckBox->setEnabled(!ui->compatModeCheckBox->isChecked()); } @@ -75,3 +81,101 @@ void SettingsDialog::on_maximizedCheckBox_clicked(bool checked) Q_UNUSED(checked); updateCheckboxStuff(); } + +void SettingsDialog::on_buttonBox_accepted() +{ + applySettings(settings); +} + +void SettingsDialog::applySettings(SettingsBase *s) +{ + // Special cases + + // Warn about dev builds. + if (!ui->devBuildsCheckBox->isChecked()) + { + s->setUseDevBuilds(false); + } + else if (!s->getUseDevBuilds()) + { + int response = QMessageBox::question(this, "Development builds", + "Development builds contain experimental features " + "and may be unstable. Are you sure you want to enable them?"); + if (response == QMessageBox::Yes) + { + s->setUseDevBuilds(true); + } + } + + + // Updates + s->setAutoUpdate(ui->autoUpdateCheckBox->isChecked()); + + // Folders + // TODO: Offer to move instances to new instance folder. + s->setInstanceDir(ui->instDirTextBox->text()); + s->setCentralModsDir(ui->modsDirTextBox->text()); + s->setLWJGLDir(ui->lwjglDirTextBox->text()); + + // Console + s->setShowConsole(ui->showConsoleCheck->isChecked()); + s->setAutoCloseConsole(ui->autoCloseConsoleCheck->isChecked()); + + // Window Size + s->setLaunchCompatMode(ui->compatModeCheckBox->isChecked()); + s->setLaunchMaximized(ui->maximizedCheckBox->isChecked()); + s->setMinecraftWinWidth(ui->windowWidthSpinBox->value()); + s->setMinecraftWinHeight(ui->windowHeightSpinBox->value()); + + // Auto Login + s->setAutoLogin(ui->autoLoginCheckBox->isChecked()); + + // Memory + s->setMinMemAlloc(ui->minMemSpinBox->value()); + s->setMaxMemAlloc(ui->maxMemSpinBox->value()); + + // Java Settings + s->setJavaPath(ui->javaPathTextBox->text()); + s->setJvmArgs(ui->jvmArgsTextBox->text()); + + // Custom Commands + s->setPreLaunchCommand(ui->preLaunchCmdTextBox->text()); + s->setPostExitCommand(ui->postExitCmdTextBox->text()); +} + +void SettingsDialog::loadSettings(SettingsBase *s) +{ + // Updates + ui->autoUpdateCheckBox->setChecked(s->getAutoUpdate()); + ui->devBuildsCheckBox->setChecked(s->getUseDevBuilds()); + + // Folders + ui->instDirTextBox->setText(s->getInstanceDir()); + ui->modsDirTextBox->setText(s->getCentralModsDir()); + ui->lwjglDirTextBox->setText(s->getLWJGLDir()); + + // Console + ui->showConsoleCheck->setChecked(s->getShowConsole()); + ui->autoCloseConsoleCheck->setChecked(s->getAutoCloseConsole()); + + // Window Size + ui->compatModeCheckBox->setChecked(s->getLaunchCompatMode()); + ui->maximizedCheckBox->setChecked(s->getLaunchMaximized()); + ui->windowWidthSpinBox->setValue(s->getMinecraftWinWidth()); + ui->windowHeightSpinBox->setValue(s->getMinecraftWinHeight()); + + // Auto Login + ui->autoLoginCheckBox->setChecked(s->getAutoLogin()); + + // Memory + ui->minMemSpinBox->setValue(s->getMinMemAlloc()); + ui->maxMemSpinBox->setValue(s->getMaxMemAlloc()); + + // Java Settings + ui->javaPathTextBox->setText(s->getJavaPath()); + ui->jvmArgsTextBox->setText(s->getJvmArgs()); + + // Custom Commands + ui->preLaunchCmdTextBox->setText(s->getPreLaunchCommand()); + ui->postExitCmdTextBox->setText(s->getPostExitCommand()); +} diff --git a/gui/settingsdialog.h b/gui/settingsdialog.h index 3e9d9e0f1..e223237f5 100644 --- a/gui/settingsdialog.h +++ b/gui/settingsdialog.h @@ -18,6 +18,8 @@ #include +class SettingsBase; + namespace Ui { class SettingsDialog; } @@ -32,6 +34,9 @@ public: void updateCheckboxStuff(); + void applySettings(SettingsBase* s); + void loadSettings(SettingsBase* s); + private slots: void on_instDirBrowseBtn_clicked(); @@ -43,6 +48,8 @@ private slots: void on_maximizedCheckBox_clicked(bool checked); + void on_buttonBox_accepted(); + private: Ui::SettingsDialog *ui; }; diff --git a/gui/settingsdialog.ui b/gui/settingsdialog.ui index 315686ca5..d30f56bbb 100644 --- a/gui/settingsdialog.ui +++ b/gui/settingsdialog.ui @@ -158,88 +158,6 @@ - - - Console - - - - - - Console Settings - - - - - - Show console while the game is running? - - - - - - - Automatically close console when the game quits? - - - - - - - - - - Instance Console Colors - - - - - - System message color: - - - - - - - - - - Output message color: - - - - - - - - - - Error message color: - - - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - Minecraft @@ -315,10 +233,33 @@ + + + + Console Settings + + + + + + Show console while the game is running? + + + + + + + Automatically close console when the game quits? + + + + + + - Login automatically when an instance launches? + Login automatically when an instance icon is double clicked? diff --git a/main.cpp b/main.cpp index 0d429c8dd..019a88531 100644 --- a/main.cpp +++ b/main.cpp @@ -1,3 +1,4 @@ + /* Copyright 2013 MultiMC Contributors * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,10 +17,16 @@ #include "gui/mainwindow.h" #include +#include "data/appsettings.h" + int main(int argc, char *argv[]) { QApplication app(argc, argv); + app.setOrganizationName("Forkk"); + app.setApplicationName("MultiMC 5"); + + settings = new AppSettings(&app); MainWindow mainWin; mainWin.show(); diff --git a/data/settingsbase.cpp b/util/apputils.h similarity index 83% rename from data/settingsbase.cpp rename to util/apputils.h index 66195603e..a64adc506 100644 --- a/data/settingsbase.cpp +++ b/util/apputils.h @@ -13,10 +13,9 @@ * limitations under the License. */ -#include "settingsbase.h" +#ifndef APPUTILS_H +#define APPUTILS_H -SettingsBase::SettingsBase(QString fileName) : - QSettings(fileName, QSettings::IniFormat) -{ - -} +#define STR_VAL(val) # val + +#endif // APPUTILS_H diff --git a/util/settingsmacrosundef.h b/util/osutils.h similarity index 74% rename from util/settingsmacrosundef.h rename to util/osutils.h index 85b13bacb..263f1f6df 100644 --- a/util/settingsmacrosundef.h +++ b/util/osutils.h @@ -13,14 +13,15 @@ * limitations under the License. */ -#ifndef SETTINGSMACROSUNDEF_H -#define SETTINGSMACROSUNDEF_H +#ifndef OSUTILS_H +#define OSUTILS_H -#undef DEFINE_SETTING -#undef DEFINE_SETTING_STR -#undef DEFINE_SETTING_BOOL -#undef DEFINE_SETTING_INT +#if defined _WIN32 | defined _WIN64 +#define WINDOWS 1 +#elif __APPLE__ & __MACH__ +#define OSX 1 +#elif __linux__ +#define LINUX 1 +#endif -#undef STR_VAL - -#endif // SETTINGSMACROSUNDEF_H +#endif // OSUTILS_H diff --git a/util/settingsmacros.h b/util/settingsmacros.h deleted file mode 100644 index 94e521558..000000000 --- a/util/settingsmacros.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef SETTINGSMACROS_H -#define SETTINGSMACROS_H - -#define STR_VAL(val) # val - -#define DEFINE_SETTING(funcName, name, defVal, typeName, toFunc) \ - virtual typeName Get ## funcName() const { return value(name). ## toFunc(); } \ - virtual void Set ## funcName(typeName value) { setValue(name, value); } \ - virtual void Reset ## funcName() { - -#define DEFINE_SETTING_STR(name, defVal) \ - DEFINE_SETTING(name, STR_VAL(name), defVal, QString, toString) - -#define DEFINE_SETTING_BOOL(name, defVal) \ - DEFINE_SETTING(name, STR_VAL(name), defVal, bool, toBool) - -#define DEFINE_SETTING_INT(name, defVal) \ - DEFINE_SETTING(name, STR_VAL(name), defVal, int, toInt) - -#endif // SETTINGSMACROS_H