Implemented settings dialog.

This commit is contained in:
Andrew 2013-01-28 15:35:09 -06:00
parent 8926b24226
commit a25bedd770
14 changed files with 275 additions and 185 deletions

View File

@ -104,7 +104,6 @@ data/appsettings.cpp
data/inifile.cpp data/inifile.cpp
data/instancebase.cpp data/instancebase.cpp
data/instancemodel.cpp data/instancemodel.cpp
data/settingsbase.cpp
data/stdinstance.cpp data/stdinstance.cpp
gui/mainwindow.cpp gui/mainwindow.cpp
@ -126,9 +125,9 @@ data/appsettings.h
data/inifile.h data/inifile.h
data/instancebase.h data/instancebase.h
data/instancemodel.h data/instancemodel.h
data/settingsbase.h
data/stdinstance.h data/stdinstance.h
util/apputils.h
util/pathutils.h util/pathutils.h
multimc_pragma.h multimc_pragma.h

View File

@ -21,8 +21,7 @@ SOURCES += main.cpp\
data/inifile.cpp \ data/inifile.cpp \
gui/settingsdialog.cpp \ gui/settingsdialog.cpp \
gui/modeditwindow.cpp \ gui/modeditwindow.cpp \
data/appsettings.cpp \ util/appsettings.cpp
data/settingsbase.cpp
HEADERS += gui/mainwindow.h \ HEADERS += gui/mainwindow.h \
data/instancebase.h \ data/instancebase.h \
@ -32,10 +31,8 @@ HEADERS += gui/mainwindow.h \
data/inifile.h \ data/inifile.h \
gui/settingsdialog.h \ gui/settingsdialog.h \
gui/modeditwindow.h \ gui/modeditwindow.h \
data/appsettings.h \ util/apputils.h \
data/settingsbase.h \ util/appsettings.h
util/settingsmacros.h \
util/settingsmacrosundef.h
FORMS += gui/mainwindow.ui \ FORMS += gui/mainwindow.ui \
gui/settingsdialog.ui \ gui/settingsdialog.ui \

View File

@ -15,8 +15,26 @@
#include "appsettings.h" #include "appsettings.h"
AppSettings::AppSettings(QString fileName) : AppSettings* settings;
SettingsBase(fileName)
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);
}

View File

@ -16,12 +16,97 @@
#ifndef APPSETTINGS_H #ifndef APPSETTINGS_H
#define APPSETTINGS_H #define APPSETTINGS_H
#include "settingsbase.h" #include <QObject>
#include <QSettings>
#include <QColor>
#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<valType>(); } \
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 class AppSettings : public SettingsBase
{ {
Q_OBJECT
public: 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 #endif // APPSETTINGS_H

View File

@ -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 <QSettings>
#include "settingsmacros.h"
class SettingsBase : public QSettings
{
public:
SettingsBase(QString fileName);
};
#include "settingsmacrosundef.h"
#endif // SETTINGSBASE_H

View File

@ -15,8 +15,8 @@
#include "stdinstance.h" #include "stdinstance.h"
StdInstance::StdInstance(QString rootDir) : StdInstance::StdInstance(QString rootDir, QObject* parent) :
InstanceBase(rootDir) InstanceBase(rootDir, parent)
{ {
} }

View File

@ -22,7 +22,7 @@
class StdInstance : public InstanceBase class StdInstance : public InstanceBase
{ {
public: public:
explicit StdInstance(QString rootDir); explicit StdInstance(QString rootDir, QObject *parent = 0);
}; };
#endif // STDINSTANCE_H #endif // STDINSTANCE_H

View File

@ -16,13 +16,19 @@
#include "settingsdialog.h" #include "settingsdialog.h"
#include "ui_settingsdialog.h" #include "ui_settingsdialog.h"
#include "data/appsettings.h"
#include <QFileDialog> #include <QFileDialog>
#include <QMessageBox>
SettingsDialog::SettingsDialog(QWidget *parent) : SettingsDialog::SettingsDialog(QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::SettingsDialog) ui(new Ui::SettingsDialog)
{ {
ui->setupUi(this); ui->setupUi(this);
loadSettings(settings);
updateCheckboxStuff();
} }
SettingsDialog::~SettingsDialog() SettingsDialog::~SettingsDialog()
@ -32,9 +38,9 @@ SettingsDialog::~SettingsDialog()
void SettingsDialog::updateCheckboxStuff() void SettingsDialog::updateCheckboxStuff()
{ {
ui->minMemSpinBox->setEnabled(!(ui->compatModeCheckBox->isChecked() || ui->windowWidthSpinBox->setEnabled(!(ui->compatModeCheckBox->isChecked() ||
ui->maximizedCheckBox->isChecked())); ui->maximizedCheckBox->isChecked()));
ui->maxMemSpinBox->setEnabled(!(ui->compatModeCheckBox->isChecked() || ui->windowHeightSpinBox->setEnabled(!(ui->compatModeCheckBox->isChecked() ||
ui->maximizedCheckBox->isChecked())); ui->maximizedCheckBox->isChecked()));
ui->maximizedCheckBox->setEnabled(!ui->compatModeCheckBox->isChecked()); ui->maximizedCheckBox->setEnabled(!ui->compatModeCheckBox->isChecked());
@ -75,3 +81,101 @@ void SettingsDialog::on_maximizedCheckBox_clicked(bool checked)
Q_UNUSED(checked); Q_UNUSED(checked);
updateCheckboxStuff(); 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());
}

View File

@ -18,6 +18,8 @@
#include <QDialog> #include <QDialog>
class SettingsBase;
namespace Ui { namespace Ui {
class SettingsDialog; class SettingsDialog;
} }
@ -32,6 +34,9 @@ public:
void updateCheckboxStuff(); void updateCheckboxStuff();
void applySettings(SettingsBase* s);
void loadSettings(SettingsBase* s);
private slots: private slots:
void on_instDirBrowseBtn_clicked(); void on_instDirBrowseBtn_clicked();
@ -43,6 +48,8 @@ private slots:
void on_maximizedCheckBox_clicked(bool checked); void on_maximizedCheckBox_clicked(bool checked);
void on_buttonBox_accepted();
private: private:
Ui::SettingsDialog *ui; Ui::SettingsDialog *ui;
}; };

View File

@ -158,88 +158,6 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="consoleTab">
<attribute name="title">
<string>Console</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="consoleSettingsBox">
<property name="title">
<string>Console Settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QCheckBox" name="showConsoleCheck">
<property name="text">
<string>Show console while the game is running?</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="autoCloseConsoleCheck">
<property name="text">
<string>Automatically close console when the game quits?</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="consoleColorsBox">
<property name="title">
<string>Instance Console Colors</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="labelSysMessageColor">
<property name="text">
<string>System message color:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="sysMsgColorTextBox"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelOutputMsgColor">
<property name="text">
<string>Output message color:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="outMsgColorTextBox"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="labelErrorMessageColor">
<property name="text">
<string>Error message color:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="errMsgColorTextBox"/>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="consoleVerticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="minecraftTab"> <widget class="QWidget" name="minecraftTab">
<attribute name="title"> <attribute name="title">
<string>Minecraft</string> <string>Minecraft</string>
@ -315,10 +233,33 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item>
<widget class="QGroupBox" name="consoleSettingsBox">
<property name="title">
<string>Console Settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QCheckBox" name="showConsoleCheck">
<property name="text">
<string>Show console while the game is running?</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="autoCloseConsoleCheck">
<property name="text">
<string>Automatically close console when the game quits?</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item> <item>
<widget class="QCheckBox" name="autoLoginCheckBox"> <widget class="QCheckBox" name="autoLoginCheckBox">
<property name="text"> <property name="text">
<string>Login automatically when an instance launches?</string> <string>Login automatically when an instance icon is double clicked?</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -1,3 +1,4 @@
/* Copyright 2013 MultiMC Contributors /* Copyright 2013 MultiMC Contributors
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
@ -16,10 +17,16 @@
#include "gui/mainwindow.h" #include "gui/mainwindow.h"
#include <QApplication> #include <QApplication>
#include "data/appsettings.h"
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QApplication app(argc, argv); QApplication app(argc, argv);
app.setOrganizationName("Forkk");
app.setApplicationName("MultiMC 5");
settings = new AppSettings(&app);
MainWindow mainWin; MainWindow mainWin;
mainWin.show(); mainWin.show();

View File

@ -13,10 +13,9 @@
* limitations under the License. * limitations under the License.
*/ */
#include "settingsbase.h" #ifndef APPUTILS_H
#define APPUTILS_H
SettingsBase::SettingsBase(QString fileName) : #define STR_VAL(val) # val
QSettings(fileName, QSettings::IniFormat)
{
} #endif // APPUTILS_H

View File

@ -13,14 +13,15 @@
* limitations under the License. * limitations under the License.
*/ */
#ifndef SETTINGSMACROSUNDEF_H #ifndef OSUTILS_H
#define SETTINGSMACROSUNDEF_H #define OSUTILS_H
#undef DEFINE_SETTING #if defined _WIN32 | defined _WIN64
#undef DEFINE_SETTING_STR #define WINDOWS 1
#undef DEFINE_SETTING_BOOL #elif __APPLE__ & __MACH__
#undef DEFINE_SETTING_INT #define OSX 1
#elif __linux__
#define LINUX 1
#endif
#undef STR_VAL #endif // OSUTILS_H
#endif // SETTINGSMACROSUNDEF_H

View File

@ -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