From 3b422b54aa13be4eb59c80b1f7bb2a514aac583f Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 18 Jan 2013 12:15:59 -0600 Subject: [PATCH 01/18] Re-added settings files to project. --- MultiMC.pro | 10 ++++++++-- MultiMC.pro.user | 2 +- {data => util}/settingsmacros.h | 0 {data => util}/settingsmacrosundef.h | 0 4 files changed, 9 insertions(+), 3 deletions(-) rename {data => util}/settingsmacros.h (100%) rename {data => util}/settingsmacrosundef.h (100%) diff --git a/MultiMC.pro b/MultiMC.pro index 0ca6daee6..4da6e82f1 100644 --- a/MultiMC.pro +++ b/MultiMC.pro @@ -20,7 +20,9 @@ SOURCES += main.cpp\ data/stdinstance.cpp \ data/inifile.cpp \ gui/settingsdialog.cpp \ - gui/modeditwindow.cpp + gui/modeditwindow.cpp \ + data/appsettings.cpp \ + data/settingsbase.cpp HEADERS += gui/mainwindow.h \ data/instancebase.h \ @@ -29,7 +31,11 @@ HEADERS += gui/mainwindow.h \ data/stdinstance.h \ data/inifile.h \ gui/settingsdialog.h \ - gui/modeditwindow.h + gui/modeditwindow.h \ + data/appsettings.h \ + data/settingsbase.h \ + util/settingsmacros.h \ + util/settingsmacrosundef.h FORMS += gui/mainwindow.ui \ gui/settingsdialog.ui \ diff --git a/MultiMC.pro.user b/MultiMC.pro.user index 21852a101..55968de63 100644 --- a/MultiMC.pro.user +++ b/MultiMC.pro.user @@ -1,6 +1,6 @@ - + ProjectExplorer.Project.ActiveTarget diff --git a/data/settingsmacros.h b/util/settingsmacros.h similarity index 100% rename from data/settingsmacros.h rename to util/settingsmacros.h diff --git a/data/settingsmacrosundef.h b/util/settingsmacrosundef.h similarity index 100% rename from data/settingsmacrosundef.h rename to util/settingsmacrosundef.h From 8926b2422628a288fb6a04417f90e0a9739b82d1 Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 25 Jan 2013 13:29:45 -0600 Subject: [PATCH 02/18] Add .user files to gitignore and remove deleted files from CMakeLists. --- .gitignore | 3 + CMakeLists.txt | 2 - MultiMC.pro.user | 239 ----------------------------------------------- 3 files changed, 3 insertions(+), 241 deletions(-) delete mode 100644 MultiMC.pro.user diff --git a/.gitignore b/.gitignore index 529735dbe..3221c2d8f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ Thumbs.db .kdev4 MultiMC5.kdev4 +MultiMC.pro.user +CMakeLists.txt.user +.user build resources/CMakeFiles resources/MultiMCLauncher.jar diff --git a/CMakeLists.txt b/CMakeLists.txt index 05513f2c2..3fa89d5b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -127,8 +127,6 @@ data/inifile.h data/instancebase.h data/instancemodel.h data/settingsbase.h -data/settingsmacros.h -data/settingsmacrosundef.h data/stdinstance.h util/pathutils.h diff --git a/MultiMC.pro.user b/MultiMC.pro.user deleted file mode 100644 index 55968de63..000000000 --- a/MultiMC.pro.user +++ /dev/null @@ -1,239 +0,0 @@ - - - - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - true - 1 - true - 2 - true - 1 - 8 - true - 1 - true - false - false - true - - - - ProjectExplorer.Project.PluginSettings - - - - ProjectExplorer.Project.Target.0 - - Desktop Qt 5.0.0 MSVC2010 32bit (SDK) - Desktop Qt 5.0.0 MSVC2010 32bit (SDK) - qt.500.win32_msvc2010.essentials_kit - 0 - 0 - 0 - - - - true - qmake - - QtProjectManager.QMakeBuildStep - false - true - - false - - - true - Make - - Qt4ProjectManager.MakeStep - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Debug - - Qt4ProjectManager.Qt4BuildConfiguration - 2 - C:/Users/Andrew/Projects/MultiMC5/MultiMC-build-Desktop_Qt_5_0_0_MSVC2010_32bit_SDK-Debug - true - - - - - true - qmake - - QtProjectManager.QMakeBuildStep - false - true - - false - - - true - Make - - Qt4ProjectManager.MakeStep - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release - - Qt4ProjectManager.Qt4BuildConfiguration - 0 - C:/Users/Andrew/Projects/MultiMC5/MultiMC-build-Desktop_Qt_5_0_0_MSVC2010_32bit_SDK-Release - true - - 2 - - - 0 - Deploy - - ProjectExplorer.BuildSteps.Deploy - - 1 - Deploy locally - - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - - false - false - false - false - true - 0.01 - 10 - true - 25 - - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - MultiMC - - Qt4ProjectManager.Qt4RunConfiguration:C:/Users/Andrew/Projects/MultiMC5/MultiMC/MultiMC.pro - 2 - - MultiMC.pro - false - false - - - 3768 - true - false - false - true - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - ProjectExplorer.Project.Updater.EnvironmentId - {d833f846-3a8b-4e2a-9d77-5f93cddd0a0f} - - - ProjectExplorer.Project.Updater.FileVersion - 12 - - From a25bedd7706b14cdae91556e4a577e410745f29a Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 28 Jan 2013 15:35:09 -0600 Subject: [PATCH 03/18] Implemented settings dialog. --- CMakeLists.txt | 3 +- MultiMC.pro | 9 +- data/appsettings.cpp | 22 ++++- data/appsettings.h | 89 ++++++++++++++++- data/settingsbase.h | 33 ------- data/stdinstance.cpp | 4 +- data/stdinstance.h | 2 +- gui/settingsdialog.cpp | 112 +++++++++++++++++++++- gui/settingsdialog.h | 7 ++ gui/settingsdialog.ui | 107 +++++---------------- main.cpp | 7 ++ data/settingsbase.cpp => util/apputils.h | 11 +-- util/{settingsmacrosundef.h => osutils.h} | 19 ++-- util/settingsmacros.h | 35 ------- 14 files changed, 275 insertions(+), 185 deletions(-) delete mode 100644 data/settingsbase.h rename data/settingsbase.cpp => util/apputils.h (83%) rename util/{settingsmacrosundef.h => osutils.h} (74%) delete mode 100644 util/settingsmacros.h 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 From 3a0367a79c53c59e670ee50927247885fe4807cb Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 28 Jan 2013 18:01:20 -0600 Subject: [PATCH 04/18] Resized main window and added version info. --- CMakeLists.txt | 14 ++++++++------ data/version.cpp | 38 ++++++++++++++++++++++++++++++++++++++ data/version.h | 38 ++++++++++++++++++++++++++++++++++++++ gui/mainwindow.cpp | 6 +++++- gui/mainwindow.ui | 4 ++-- 5 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 data/version.cpp create mode 100644 data/version.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 66e18484f..1859c71b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 2.8.9) -project(multimc5) +project(MultiMC5) set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -105,6 +105,7 @@ data/inifile.cpp data/instancebase.cpp data/instancemodel.cpp data/stdinstance.cpp +data/version.cpp gui/mainwindow.cpp gui/modeditwindow.cpp @@ -126,6 +127,7 @@ data/inifile.h data/instancebase.h data/instancemodel.h data/stdinstance.h +data/version.h util/apputils.h util/pathutils.h @@ -152,8 +154,8 @@ SET_SOURCE_FILES_PROPERTIES(resources/MultiMCLauncher.jar GENERATED) QT5_WRAP_UI(MULTIMC_UI ${MULTIMC5_UIS}) QT5_ADD_RESOURCES(MULTIMC_QRC multimc.qrc) -add_executable(multimc5 ${MULTIMC_SOURCES} ${MULTIMC_HEADERS} ${MULTIMC_UI} ${MULTIMC_QRC}) -qt5_use_modules(multimc5 Widgets) -target_link_libraries(multimc5 quazip patchlib) -add_dependencies(multimc5 MultiMCLauncher) -install(TARGETS multimc5 RUNTIME DESTINATION bin) +add_executable(MultiMC ${MULTIMC_SOURCES} ${MULTIMC_HEADERS} ${MULTIMC_UI} ${MULTIMC_QRC}) +qt5_use_modules(MultiMC Widgets) +target_link_libraries(MultiMC quazip patchlib) +add_dependencies(MultiMC MultiMCLauncher) +install(TARGETS MultiMC RUNTIME DESTINATION bin) diff --git a/data/version.cpp b/data/version.cpp new file mode 100644 index 000000000..905402fd0 --- /dev/null +++ b/data/version.cpp @@ -0,0 +1,38 @@ +/* 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. + */ + +#include "version.h" + +#include "config.h" + +Version Version::current = Version(VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION, VERSION_BUILD); + +Version::Version(int major, int minor, int revision, int build, QObject *parent) : + QObject(parent) +{ + this->major = major; + this->minor = minor; + this->revision = revision; + this->build = build; +} + +QString Version::toString() const +{ + return QString("%1.%2.%3.%4").arg( + QString::number(major), + QString::number(minor), + QString::number(revision), + QString::number(build)); +} diff --git a/data/version.h b/data/version.h new file mode 100644 index 000000000..37c0fd68d --- /dev/null +++ b/data/version.h @@ -0,0 +1,38 @@ +/* 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 VERSION_H +#define VERSION_H + +#include + +class Version : public QObject +{ + Q_OBJECT +public: + explicit Version(int major = 0, int minor = 0, int revision = 0, + int build = 0, QObject *parent = 0); + + QString toString() const; + + int major; + int minor; + int revision; + int build; + + static Version current; +}; + +#endif // VERSION_H diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 87a1dcc01..eedaddb8d 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -19,13 +19,17 @@ #include #include -#include "../gui/settingsdialog.h" +#include "gui/settingsdialog.h" +#include "data/version.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); + + setWindowTitle(QString("MultiMC %1").arg(Version::current.toString())); + instList.initialLoad("instances"); ui->instanceView->setModel(&instList); } diff --git a/gui/mainwindow.ui b/gui/mainwindow.ui index ccc7e777f..6640657ad 100644 --- a/gui/mainwindow.ui +++ b/gui/mainwindow.ui @@ -6,8 +6,8 @@ 0 0 - 739 - 657 + 854 + 480 From 7ac25bf2dae0c4435732265d26924140893914ff Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 29 Jan 2013 00:26:24 -0600 Subject: [PATCH 05/18] Implemented the view folder buttons on the main window. --- CMakeLists.txt | 2 ++ gui/mainwindow.cpp | 6 ++++-- util/osutils.cpp | 25 +++++++++++++++++++++++++ util/osutils.h | 5 +++++ 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 util/osutils.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1859c71b8..218d7f13a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -112,6 +112,7 @@ gui/modeditwindow.cpp gui/settingsdialog.cpp util/pathutils.cpp +util/osutils.cpp java/javautils.cpp java/annotations.cpp @@ -131,6 +132,7 @@ data/version.h util/apputils.h util/pathutils.h +util/osutils.h multimc_pragma.h diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index eedaddb8d..e2a3abfb6 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -19,7 +19,9 @@ #include #include +#include "util/osutils.h" #include "gui/settingsdialog.h" +#include "data/appsettings.h" #include "data/version.h" MainWindow::MainWindow(QWidget *parent) : @@ -46,7 +48,7 @@ void MainWindow::on_actionAddInstance_triggered() void MainWindow::on_actionViewInstanceFolder_triggered() { - + openInDefaultProgram(settings->getInstanceDir()); } void MainWindow::on_actionRefresh_triggered() @@ -56,7 +58,7 @@ void MainWindow::on_actionRefresh_triggered() void MainWindow::on_actionViewCentralModsFolder_triggered() { - + openInDefaultProgram(settings->getCentralModsDir()); } void MainWindow::on_actionCheckUpdate_triggered() diff --git a/util/osutils.cpp b/util/osutils.cpp new file mode 100644 index 000000000..6b0955185 --- /dev/null +++ b/util/osutils.cpp @@ -0,0 +1,25 @@ +/* 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. + */ + +#include "osutils.h" + +#include +#include +#include + +void openInDefaultProgram(QString filename) +{ + QDesktopServices::openUrl("file:///" + QFileInfo(filename).absolutePath()); +} diff --git a/util/osutils.h b/util/osutils.h index 263f1f6df..f779ea2df 100644 --- a/util/osutils.h +++ b/util/osutils.h @@ -16,6 +16,8 @@ #ifndef OSUTILS_H #define OSUTILS_H +#include + #if defined _WIN32 | defined _WIN64 #define WINDOWS 1 #elif __APPLE__ & __MACH__ @@ -24,4 +26,7 @@ #define LINUX 1 #endif +// Opens the given file in the default application. +void openInDefaultProgram(QString filename); + #endif // OSUTILS_H From dcc21b7e649f79fa0cac75507ba9a314735744d9 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 29 Jan 2013 13:01:04 -0600 Subject: [PATCH 06/18] Changed group list loading to use Qt JSON instead of boost. --- data/instancemodel.cpp | 132 +++++++++++++++++++++++++++++------------ 1 file changed, 93 insertions(+), 39 deletions(-) diff --git a/data/instancemodel.cpp b/data/instancemodel.cpp index 239be5c50..4fbcebc2f 100644 --- a/data/instancemodel.cpp +++ b/data/instancemodel.cpp @@ -16,15 +16,18 @@ #include "instancemodel.h" #include + #include +#include #include -#include "stdinstance.h" +#include -#include "../util/pathutils.h" - -#include -#include +#include +#include +#include +#include "data/stdinstance.h" +#include "util/pathutils.h" #define GROUP_FILE_FORMAT_VERSION 1 @@ -65,47 +68,98 @@ void InstanceModel::initialLoad(QString dir) // temporary map from instance ID to group name QMap groupMap; - using namespace boost::property_tree; - ptree pt; - - try + if (QFileInfo(groupFile).exists()) { - read_json(groupFile.toStdString(), pt); - - if (pt.get_optional("formatVersion") != GROUP_FILE_FORMAT_VERSION) + QFile groupFile(groupFile); + + if (!groupFile.open(QIODevice::ReadOnly)) { - // TODO: Discard old formats. + // An error occurred. Ignore it. + qDebug("Failed to read instance group file."); + goto groupParseFail; } - - BOOST_FOREACH(const ptree::value_type& vp, pt.get_child("groups")) + + QTextStream in(&groupFile); + QString jsonStr = in.readAll(); + groupFile.close(); + + QJsonParseError error; + QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonStr.toUtf8(), &error); + + if (error.error != QJsonParseError::NoError) { - ptree gPt = vp.second; - QString groupName = QString::fromUtf8(vp.first.c_str()); - - InstanceGroup *group = new InstanceGroup(groupName, this); - groups.push_back(group); - - if (gPt.get_child_optional("hidden")) - group->setHidden(gPt.get("hidden")); - - QVector groupInstances; - BOOST_FOREACH(const ptree::value_type& v, gPt.get_child("instances")) + qWarning(QString("Failed to parse instance group file: %1 at offset %2"). + arg(error.errorString(), QString::number(error.offset)).toUtf8()); + goto groupParseFail; + } + + if (!jsonDoc.isObject()) + { + qWarning("Invalid group file. Root entry should be an object."); + goto groupParseFail; + } + + QJsonObject rootObj = jsonDoc.object(); + + // Make sure the format version matches. + if (rootObj.value("formatVersion").toVariant().toInt() == GROUP_FILE_FORMAT_VERSION) + { + // Get the group list. + if (!rootObj.value("groups").isObject()) { - QString key = QString::fromUtf8(v.second.data().c_str()); - groupMap[key] = groupName; + qWarning("Invalid group list JSON: 'groups' should be an object."); + goto groupParseFail; + } + + // Iterate through the list. + QJsonObject groupList = rootObj.value("groups").toObject(); + + for (QJsonObject::iterator iter = groupList.begin(); + iter != groupList.end(); iter++) + { + QString groupName = iter.key(); + + // If not an object, complain and skip to the next one. + if (!iter.value().isObject()) + { + qWarning(QString("Group '%1' in the group list should " + "be an object.").arg(groupName).toUtf8()); + continue; + } + + QJsonObject groupObj = iter.value().toObject(); + + // Create the group object. + InstanceGroup *group = new InstanceGroup(groupName, this); + groups.push_back(group); + + // If 'hidden' isn't a bool value, just assume it's false. + if (groupObj.value("hidden").isBool() && groupObj.value("hidden").toBool()) + { + group->setHidden(groupObj.value("hidden").toBool()); + } + + if (!groupObj.value("instances").isArray()) + { + qWarning(QString("Group '%1' in the group list is invalid. " + "It should contain an array " + "called 'instances'.").arg(groupName).toUtf8()); + continue; + } + + // Iterate through the list of instances in the group. + QJsonArray instancesArray = groupObj.value("instances").toArray(); + + for (QJsonArray::iterator iter2 = instancesArray.begin(); + iter2 != instancesArray.end(); iter2++) + { + groupMap[(*iter2).toString()] = groupName; + } } } } - catch (json_parser_error e) - { - qDebug("Failed to read group list. JSON parser error."); -// wxLogError(_(), -// e.line(), wxStr(e.message()).c_str()); - } - catch (ptree_error e) - { - qDebug("Failed to read group list. Unknown ptree error."); - } + +groupParseFail: qDebug("Loading instances"); QDir instDir(dir); @@ -400,4 +454,4 @@ QVariant InstanceGroup::data ( int role ) const default: return QVariant(); } -} \ No newline at end of file +} From 90764f97d94a52517d735ed96d26bb52a2d75de1 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 29 Jan 2013 23:52:37 -0600 Subject: [PATCH 07/18] Add instance toolbar. --- data/appsettings.h | 7 +++ gui/mainwindow.cpp | 18 ++++++ gui/mainwindow.h | 4 ++ gui/mainwindow.ui | 151 ++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 178 insertions(+), 2 deletions(-) diff --git a/data/appsettings.h b/data/appsettings.h index eff22b11f..a9068bfdf 100644 --- a/data/appsettings.h +++ b/data/appsettings.h @@ -19,6 +19,7 @@ #include #include #include +#include #include "util/apputils.h" #include "util/osutils.h" @@ -60,6 +61,10 @@ public: DEFINE_SETTING(ShowConsole, bool, true) DEFINE_SETTING(AutoCloseConsole, bool, true) + // Toolbar settings + DEFINE_SETTING(InstanceToolbarVisible, bool, true) + DEFINE_SETTING(InstanceToolbarPosition, QPoint, QPoint()) + // Console Colors DEFINE_SETTING(SysMessageColor, QColor, QColor(Qt::blue)) DEFINE_SETTING(StdOutColor, QColor, QColor(Qt::black)) @@ -97,6 +102,8 @@ class AppSettings : public SettingsBase public: explicit AppSettings(QObject *parent = 0); + QSettings& getConfig() { return config; } + protected: virtual QVariant getValue(const QString &name, QVariant defVal = QVariant()) const; virtual void setValue(const QString& name, QVariant val); diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index e2a3abfb6..e257f5aef 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -32,6 +32,9 @@ MainWindow::MainWindow(QWidget *parent) : setWindowTitle(QString("MultiMC %1").arg(Version::current.toString())); + restoreGeometry(settings->getConfig().value("MainWindowGeometry", saveGeometry()).toByteArray()); + restoreState(settings->getConfig().value("MainWindowState", saveState()).toByteArray()); + instList.initialLoad("instances"); ui->instanceView->setModel(&instList); } @@ -86,3 +89,18 @@ void MainWindow::on_actionAbout_triggered() { } + +void MainWindow::on_mainToolBar_visibilityChanged(bool) +{ + // Don't allow hiding the main toolbar. + // This is the only way I could find to prevent it... :/ + ui->mainToolBar->setVisible(true); +} + +void MainWindow::closeEvent(QCloseEvent *event) +{ + // Save the window state and geometry. + settings->getConfig().setValue("MainWindowGeometry", saveGeometry()); + settings->getConfig().setValue("MainWindowState", saveState()); + QMainWindow::closeEvent(event); +} diff --git a/gui/mainwindow.h b/gui/mainwindow.h index 772455317..91efd4970 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -33,6 +33,8 @@ public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); + void closeEvent(QCloseEvent *event); + private slots: void on_actionAbout_triggered(); @@ -52,6 +54,8 @@ private slots: void on_actionNews_triggered(); + void on_mainToolBar_visibilityChanged(bool); + private: Ui::MainWindow *ui; diff --git a/gui/mainwindow.ui b/gui/mainwindow.ui index 6640657ad..3e832276d 100644 --- a/gui/mainwindow.ui +++ b/gui/mainwindow.ui @@ -6,8 +6,8 @@ 0 0 - 854 - 480 + 600 + 400 @@ -39,6 +39,9 @@ + + Main Toolbar + false @@ -64,6 +67,38 @@ + + + Instance Toolbar + + + false + + + RightToolBarArea + + + false + + + + + + + + + + + + + + + + + + + + @@ -178,6 +213,118 @@ QAction::AboutRole + + + Play + + + Launch the selected instance. + + + + + Rename + + + Rename the selected instance. + + + + + Change Group + + + Change the selected instance's group. + + + + + Change Icon + + + Change the selected instance's icon. + + + + + Edit Notes + + + Edit the notes for the selected instance. + + + + + Settings + + + Change settings for the selected instance. + + + + + Make Shortcut + + + Make a shortcut on the desktop for the selected instance. + + + + + Manage Saves + + + Manage saves for the selected instance. + + + + + Edit Mods + + + Edit the mods for the selected instance. + + + + + Change Version + + + Change the selected instance's Minecraft version. + + + + + Change LWJGL + + + Change the version of LWJGL for the selected instance to use. + + + + + Rebuild Jar + + + Re-installs the mods for the selected instance. + + + + + View Folder + + + Opens the selected instance's root folder in a file browser. + + + + + Delete + + + Deletes the selected instance. + + From de2632af0dcd7e6a1c3c763c9f7cf38c67ead441 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 31 Jan 2013 14:31:16 -0600 Subject: [PATCH 08/18] Added instance context menu and status tips. --- gui/mainwindow.cpp | 12 +++++++ gui/mainwindow.h | 2 ++ gui/mainwindow.ui | 81 +++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 91 insertions(+), 4 deletions(-) diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index e257f5aef..dc8f77fed 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -16,6 +16,8 @@ #include "mainwindow.h" #include "ui_mainwindow.h" +#include + #include #include @@ -104,3 +106,13 @@ void MainWindow::closeEvent(QCloseEvent *event) settings->getConfig().setValue("MainWindowState", saveState()); QMainWindow::closeEvent(event); } + +void MainWindow::on_instanceView_customContextMenuRequested(const QPoint &pos) +{ + QMenu *instContextMenu = new QMenu("Instance", this); + + // Add the actions from the toolbar to the context menu. + instContextMenu->addActions(ui->instanceToolBar->actions()); + + instContextMenu->exec(ui->instanceView->mapToGlobal(pos)); +} diff --git a/gui/mainwindow.h b/gui/mainwindow.h index 91efd4970..ce06a085d 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -56,6 +56,8 @@ private slots: void on_mainToolBar_visibilityChanged(bool); + void on_instanceView_customContextMenuRequested(const QPoint &pos); + private: Ui::MainWindow *ui; diff --git a/gui/mainwindow.ui b/gui/mainwindow.ui index 3e832276d..bc58f7f87 100644 --- a/gui/mainwindow.ui +++ b/gui/mainwindow.ui @@ -34,7 +34,11 @@ 0 - + + + Qt::CustomContextMenu + + @@ -110,6 +114,9 @@ Add a new instance. + + Add a new instance. + @@ -122,6 +129,9 @@ Open the instance folder in a file browser. + + Open the instance folder in a file browser. + @@ -134,6 +144,9 @@ Reload the instance list. + + Reload the instance list. + @@ -146,6 +159,9 @@ Open the central mods folder in a file browser. + + Open the central mods folder in a file browser. + @@ -158,6 +174,9 @@ Check for new updates for MultiMC + + Check for new updates for MultiMC + @@ -170,6 +189,9 @@ Change settings. + + Change settings. + QAction::PreferencesRole @@ -185,6 +207,9 @@ Open the bug tracker to report a bug with MultiMC. + + Open the bug tracker to report a bug with MultiMC. + @@ -197,6 +222,9 @@ Open the MultiMC dev blog to read news about MultiMC. + + Open the MultiMC dev blog to read news about MultiMC. + @@ -209,6 +237,9 @@ View information about MultiMC. + + About MultiMC + QAction::AboutRole @@ -220,6 +251,9 @@ Launch the selected instance. + + Launch the selected instance. + @@ -228,6 +262,9 @@ Rename the selected instance. + + Rename the selected instance. + @@ -236,6 +273,9 @@ Change the selected instance's group. + + Change the selected instance's group. + @@ -244,6 +284,9 @@ Change the selected instance's icon. + + Change the selected instance's icon. + @@ -252,6 +295,9 @@ Edit the notes for the selected instance. + + Edit the notes for the selected instance. + @@ -260,6 +306,9 @@ Change settings for the selected instance. + + Change settings for the selected instance. + @@ -268,6 +317,9 @@ Make a shortcut on the desktop for the selected instance. + + Make a shortcut on the desktop for the selected instance. + @@ -276,6 +328,9 @@ Manage saves for the selected instance. + + Manage saves for the selected instance. + @@ -284,6 +339,9 @@ Edit the mods for the selected instance. + + Edit the mods for the selected instance. + @@ -292,6 +350,9 @@ Change the selected instance's Minecraft version. + + Change the selected instance's Minecraft version. + @@ -300,13 +361,19 @@ Change the version of LWJGL for the selected instance to use. + + Change the version of LWJGL for the selected instance to use. + Rebuild Jar - Re-installs the mods for the selected instance. + Reinstall the mods for the selected instance. + + + Reinstall the mods for the selected instance. @@ -314,7 +381,10 @@ View Folder - Opens the selected instance's root folder in a file browser. + Open the selected instance's root folder in a file browser. + + + Open the selected instance's root folder in a file browser. @@ -322,7 +392,10 @@ Delete - Deletes the selected instance. + Delete the selected instance. + + + Delete the selected instance. From 076fb8a65e2774b092798ec15c647e2d9423e6a5 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 31 Jan 2013 14:32:04 -0600 Subject: [PATCH 09/18] Got rid of boost. --- CMakeLists.txt | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 218d7f13a..20675e0d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,16 +24,6 @@ include_directories(${Qt5Widgets_INCLUDE_DIRS}) # find ZLIB for quazip find_package(ZLIB REQUIRED) -# Find boost. -set(Boost_USE_STATIC_LIBS ON) -MESSAGE(STATUS "** Finding Boost...") -find_package(Boost 1.46.0 REQUIRED) -MESSAGE(STATUS "** Boost Include: ${Boost_INCLUDE_DIR}") -MESSAGE(STATUS "** Boost Libraries: ${Boost_LIBRARY_DIRS}") - -# Include boost. -include_directories("${Boost_INCLUDE_DIRS}") - # Add quazip add_subdirectory(quazip) From 2d05e901964d3d6a5cf4806298653655d8b2d2ee Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 31 Jan 2013 16:46:31 -0600 Subject: [PATCH 10/18] Fix naming issue in instance model class. --- data/instancemodel.cpp | 6 +++--- data/instancemodel.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/instancemodel.cpp b/data/instancemodel.cpp index 4fbcebc2f..fbdb82126 100644 --- a/data/instancemodel.cpp +++ b/data/instancemodel.cpp @@ -61,16 +61,16 @@ void InstanceGroup::addInstance ( InstanceBase* inst ) void InstanceModel::initialLoad(QString dir) { - groupFile = dir + "/instgroups.json"; + groupFileName = dir + "/instgroups.json"; implicitGroup = new InstanceGroup("Ungrouped", this); groups.append(implicitGroup); // temporary map from instance ID to group name QMap groupMap; - if (QFileInfo(groupFile).exists()) + if (QFileInfo(groupFileName).exists()) { - QFile groupFile(groupFile); + QFile groupFile(groupFileName); if (!groupFile.open(QIODevice::ReadOnly)) { diff --git a/data/instancemodel.h b/data/instancemodel.h index 7b6cb8c69..4bd348310 100644 --- a/data/instancemodel.h +++ b/data/instancemodel.h @@ -129,7 +129,7 @@ signals: public slots: private: - QString groupFile; + QString groupFileName; QVector groups; InstanceGroup * implicitGroup; }; From ffe49e9c1a54daad2007e2456e75180d5f59f59f Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 31 Jan 2013 16:54:06 -0600 Subject: [PATCH 11/18] Add copy constructor for version class. --- data/version.cpp | 10 +++++++++- data/version.h | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/data/version.cpp b/data/version.cpp index 905402fd0..eec50e13a 100644 --- a/data/version.cpp +++ b/data/version.cpp @@ -17,7 +17,7 @@ #include "config.h" -Version Version::current = Version(VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION, VERSION_BUILD); +Version Version::current(VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION, VERSION_BUILD); Version::Version(int major, int minor, int revision, int build, QObject *parent) : QObject(parent) @@ -28,6 +28,14 @@ Version::Version(int major, int minor, int revision, int build, QObject *parent) this->build = build; } +Version::Version(const Version& ver) +{ + this->major = ver.major; + this->minor = ver.minor; + this->revision = ver.revision; + this->build = ver.build; +} + QString Version::toString() const { return QString("%1.%2.%3.%4").arg( diff --git a/data/version.h b/data/version.h index 37c0fd68d..321b1680d 100644 --- a/data/version.h +++ b/data/version.h @@ -25,6 +25,8 @@ public: explicit Version(int major = 0, int minor = 0, int revision = 0, int build = 0, QObject *parent = 0); + Version(const Version& ver); + QString toString() const; int major; From a96e1853de4c2769a6c3092212bec4276630b719 Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 1 Feb 2013 12:22:22 -0600 Subject: [PATCH 12/18] Implement news and report bug buttons. --- gui/mainwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index dc8f77fed..3a5e3d863 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -79,12 +79,12 @@ void MainWindow::on_actionSettings_triggered() void MainWindow::on_actionReportBug_triggered() { - + QDesktopServices::openUrl(QUrl("http://bugs.forkk.net/")); } void MainWindow::on_actionNews_triggered() { - + QDesktopServices::openUrl(QUrl("http://news.forkk.net/")); } void MainWindow::on_actionAbout_triggered() From 3c8a12aded03e6e3f4a0c50cbb7a7ef4e57fab07 Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 1 Feb 2013 13:07:36 -0600 Subject: [PATCH 13/18] Added new instance dialog. --- CMakeLists.txt | 3 + gui/mainwindow.cpp | 7 +- gui/newinstancedialog.cpp | 33 ++++++++ gui/newinstancedialog.h | 37 +++++++++ gui/newinstancedialog.ui | 166 ++++++++++++++++++++++++++++++++++++++ multimc.qrc | 61 +++++++------- 6 files changed, 276 insertions(+), 31 deletions(-) create mode 100644 gui/newinstancedialog.cpp create mode 100644 gui/newinstancedialog.h create mode 100644 gui/newinstancedialog.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index 20675e0d5..0f5bd8eda 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,6 +100,7 @@ data/version.cpp gui/mainwindow.cpp gui/modeditwindow.cpp gui/settingsdialog.cpp +gui/newinstancedialog.cpp util/pathutils.cpp util/osutils.cpp @@ -112,6 +113,7 @@ SET(MULTIMC_HEADERS gui/mainwindow.h gui/modeditwindow.h gui/settingsdialog.h +gui/newinstancedialog.h data/appsettings.h data/inifile.h @@ -139,6 +141,7 @@ SET(MULTIMC5_UIS gui/mainwindow.ui gui/modeditwindow.ui gui/settingsdialog.ui +gui/newinstancedialog.ui ) SET_SOURCE_FILES_PROPERTIES(resources/MultiMCLauncher.jar GENERATED) diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 3a5e3d863..1ff633b2f 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -17,12 +17,16 @@ #include "ui_mainwindow.h" #include +#include #include #include #include "util/osutils.h" + #include "gui/settingsdialog.h" +#include "gui/newinstancedialog.h" + #include "data/appsettings.h" #include "data/version.h" @@ -48,7 +52,8 @@ MainWindow::~MainWindow() void MainWindow::on_actionAddInstance_triggered() { - + NewInstanceDialog *newInstDlg = new NewInstanceDialog(this); + newInstDlg->exec(); } void MainWindow::on_actionViewInstanceFolder_triggered() diff --git a/gui/newinstancedialog.cpp b/gui/newinstancedialog.cpp new file mode 100644 index 000000000..400b42d80 --- /dev/null +++ b/gui/newinstancedialog.cpp @@ -0,0 +1,33 @@ +/* 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. + */ + +#include "newinstancedialog.h" +#include "ui_newinstancedialog.h" + +#include + +NewInstanceDialog::NewInstanceDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::NewInstanceDialog) +{ + ui->setupUi(this); + resize(minimumSizeHint()); + layout()->setSizeConstraint(QLayout::SetFixedSize); +} + +NewInstanceDialog::~NewInstanceDialog() +{ + delete ui; +} diff --git a/gui/newinstancedialog.h b/gui/newinstancedialog.h new file mode 100644 index 000000000..263136f12 --- /dev/null +++ b/gui/newinstancedialog.h @@ -0,0 +1,37 @@ +/* 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 NEWINSTANCEDIALOG_H +#define NEWINSTANCEDIALOG_H + +#include + +namespace Ui { +class NewInstanceDialog; +} + +class NewInstanceDialog : public QDialog +{ + Q_OBJECT + +public: + explicit NewInstanceDialog(QWidget *parent = 0); + ~NewInstanceDialog(); + +private: + Ui::NewInstanceDialog *ui; +}; + +#endif // NEWINSTANCEDIALOG_H diff --git a/gui/newinstancedialog.ui b/gui/newinstancedialog.ui new file mode 100644 index 000000000..865f63016 --- /dev/null +++ b/gui/newinstancedialog.ui @@ -0,0 +1,166 @@ + + + NewInstanceDialog + + + Qt::ApplicationModal + + + + 0 + 0 + 220 + 230 + + + + New Instance + + + + :/icons/toolbar/new:/icons/toolbar/new + + + true + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + :/icons/instances/infinity:/icons/instances/infinity + + + + 80 + 80 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Name + + + + + + + Qt::Horizontal + + + + + + + + + Version: + + + + + + + true + + + + + + + ... + + + + + + + + + Qt::Horizontal + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + NewInstanceDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + NewInstanceDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/multimc.qrc b/multimc.qrc index a3c465488..d0171fa30 100644 --- a/multimc.qrc +++ b/multimc.qrc @@ -1,32 +1,33 @@ - - resources/icons/toolbar/about.png - resources/icons/toolbar/bug.svg - resources/icons/toolbar/centralmods.png - resources/icons/toolbar/checkupdate.png - resources/icons/toolbar/help.png - resources/icons/toolbar/new.png - resources/icons/toolbar/news.svg - resources/icons/toolbar/refresh.png - resources/icons/toolbar/settings.png - resources/icons/toolbar/viewfolder.png - - - resources/icons/instances/clucker.svg - resources/icons/instances/creeper.svg - resources/icons/instances/enderpearl.svg - resources/icons/instances/ftb-glow.svg - resources/icons/instances/ftb-logo.svg - resources/icons/instances/gear.svg - resources/icons/instances/herobrine.svg - resources/icons/instances/magitech.svg - resources/icons/instances/meat.svg - resources/icons/instances/netherstar.svg - resources/icons/instances/skeleton.svg - resources/icons/instances/squarecreeper.svg - resources/icons/instances/steve.svg - - - resources/MultiMCLauncher.jar - + + resources/icons/toolbar/about.png + resources/icons/toolbar/bug.svg + resources/icons/toolbar/centralmods.png + resources/icons/toolbar/checkupdate.png + resources/icons/toolbar/help.png + resources/icons/toolbar/new.png + resources/icons/toolbar/news.svg + resources/icons/toolbar/refresh.png + resources/icons/toolbar/settings.png + resources/icons/toolbar/viewfolder.png + + + resources/icons/instances/clucker.svg + resources/icons/instances/creeper.svg + resources/icons/instances/enderpearl.svg + resources/icons/instances/ftb-glow.svg + resources/icons/instances/ftb-logo.svg + resources/icons/instances/gear.svg + resources/icons/instances/herobrine.svg + resources/icons/instances/magitech.svg + resources/icons/instances/meat.svg + resources/icons/instances/netherstar.svg + resources/icons/instances/skeleton.svg + resources/icons/instances/squarecreeper.svg + resources/icons/instances/steve.svg + resources/icons/multimc.svg + + + resources/MultiMCLauncher.jar + From 74c5a582b146e62f34b9933530d7cf2c96c026df Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 4 Feb 2013 10:31:21 -0600 Subject: [PATCH 14/18] Added MultiMC_LINK_ADDITIONAL_LIBS option to CMakeLists. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0f5bd8eda..570900f74 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -151,6 +151,6 @@ QT5_ADD_RESOURCES(MULTIMC_QRC multimc.qrc) add_executable(MultiMC ${MULTIMC_SOURCES} ${MULTIMC_HEADERS} ${MULTIMC_UI} ${MULTIMC_QRC}) qt5_use_modules(MultiMC Widgets) -target_link_libraries(MultiMC quazip patchlib) +target_link_libraries(MultiMC quazip patchlib ${MultiMC_LINK_ADDITIONAL_LIBS}) add_dependencies(MultiMC MultiMCLauncher) install(TARGETS MultiMC RUNTIME DESTINATION bin) From 2f619e40436175b4fb30c449e43305039d87348a Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 5 Feb 2013 12:09:20 -0600 Subject: [PATCH 15/18] Added install target for Windows. --- CMakeLists.txt | 52 +++++++++++++++++++++++++++++++++++++++++-- dependencies.cmake.in | 25 +++++++++++++++++++++ 2 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 dependencies.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 570900f74..cb9e6faa8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 2.8.9) -project(MultiMC5) +project(MultiMC) set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -144,6 +144,11 @@ gui/settingsdialog.ui gui/newinstancedialog.ui ) +IF(WIN32) +SET(MultiMC_LINK_ADDITIONAL_LIBS ${MultiMC_LINK_ADDITIONAL_LIBS} +Ws2_32) +ENDIF() + SET_SOURCE_FILES_PROPERTIES(resources/MultiMCLauncher.jar GENERATED) QT5_WRAP_UI(MULTIMC_UI ${MULTIMC5_UIS}) @@ -153,4 +158,47 @@ add_executable(MultiMC ${MULTIMC_SOURCES} ${MULTIMC_HEADERS} ${MULTIMC_UI} ${MUL qt5_use_modules(MultiMC Widgets) target_link_libraries(MultiMC quazip patchlib ${MultiMC_LINK_ADDITIONAL_LIBS}) add_dependencies(MultiMC MultiMCLauncher) -install(TARGETS MultiMC RUNTIME DESTINATION bin) +install(TARGETS MultiMC RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}) + +IF(WIN32) +IF(CMAKE_BUILD_TYPE STREQUAL "Debug") +SET(D "d") +ELSE() +SET(D "") +ENDIF() + +install(FILES "${Qt5_DIR}/plugins/platforms/qwindows${D}.dll" DESTINATION platforms) +install(FILES "${Qt5_DIR}/plugins/platforms/qminimal${D}.dll" DESTINATION platforms) +install(FILES "${Qt5_DIR}/bin/libEGL${D}.dll" DESTINATION ${CMAKE_INSTALL_PREFIX}) + +install(FILES "${Qt5_DIR}/plugins/imageformats/qsvg${D}.dll" DESTINATION imageformats) +install(FILES "${Qt5_DIR}/plugins/imageformats/qico${D}.dll" DESTINATION imageformats) +install(FILES "${Qt5_DIR}/plugins/imageformats/qgif${D}.dll" DESTINATION imageformats) +install(FILES "${Qt5_DIR}/plugins/imageformats/qjpeg${D}.dll" DESTINATION imageformats) + +ELSEIF(UNIX) +ENDIF() + + +GET_TARGET_PROPERTY(BINARY_LOCATION MultiMC LOCATION) +CONFIGURE_FILE( + "${CMAKE_CURRENT_SOURCE_DIR}/dependencies.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/dependencies.cmake" + @ONLY + ) +INSTALL(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/dependencies.cmake") + + +# Package with CPack +IF(UNIX) + if(APPLE) + SET(CPACK_GENERATOR "ZIP") + else() + SET(CPACK_GENERATOR "TGZ") + endif() +ELSEIF(WIN32) + SET(CPACK_GENERATOR "ZIP") +ENDIF() +set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0) +set(CPACK_PACKAGE_FILE_NAME "MultiMC") +INCLUDE(CPack) diff --git a/dependencies.cmake.in b/dependencies.cmake.in new file mode 100644 index 000000000..1790b97bb --- /dev/null +++ b/dependencies.cmake.in @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 2.8.9) + +message(STATUS "Running install script...") + +SET(Qt5_DIR @Qt5_DIR@) + +INCLUDE(GetPrerequisites) +GET_PREREQUISITES(@BINARY_LOCATION@ MULTIMC_PREREQS 1 1 "" "") + +message(STATUS "Prerequisites: ${MULTIMC_PREREQS}") + +FOREACH(PREREQ ${MULTIMC_PREREQS}) + GET_FILENAME_COMPONENT(PREREQ_NAME "${PREREQ}" NAME) + GET_FILENAME_COMPONENT(_PREREQ_ACTUAL "${PREREQ}" REALPATH) + SET(PREREQ_ACTUAL "${Qt5_DIR}/bin/${PREREQ}") + + message(STATUS "Adding install prerequisite: ${PREREQ_NAME}") + + FILE(INSTALL + DESTINATION "${CMAKE_INSTALL_PREFIX}" + TYPE PROGRAM + RENAME "${PREREQ_NAME}" + FILES "${PREREQ_ACTUAL}" + ) +ENDFOREACH() From f8ea8d9e3bb949d7c4ea39c47ca6091f61dc1cfc Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 5 Feb 2013 13:40:43 -0600 Subject: [PATCH 16/18] Added base class for tasks. --- CMakeLists.txt | 4 ++++ tasks/task.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ tasks/task.h | 53 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+) create mode 100644 tasks/task.cpp create mode 100644 tasks/task.h diff --git a/CMakeLists.txt b/CMakeLists.txt index cb9e6faa8..932f70e19 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -107,6 +107,8 @@ util/osutils.cpp java/javautils.cpp java/annotations.cpp + +tasks/task.cpp ) SET(MULTIMC_HEADERS @@ -135,6 +137,8 @@ java/endian.h java/errors.h java/javautils.h java/membuffer.h + +tasks/task.h ) SET(MULTIMC5_UIS diff --git a/tasks/task.cpp b/tasks/task.cpp new file mode 100644 index 000000000..8d65b415c --- /dev/null +++ b/tasks/task.cpp @@ -0,0 +1,56 @@ +/* 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. + */ + +#include "task.h" + +Task::Task(QObject *parent) : + QThread(parent) +{ + +} + +QString Task::getStatus() const +{ + return status; +} + +void Task::setStatus(const QString &status) +{ + this->status = status; + statusChanged(status); +} + +int Task::getProgress() const +{ + return progress; +} + +void Task::setProgress(int progress) +{ + this->progress = progress; + progressChanged(progress); +} + +void Task::startTask() +{ + start(); +} + +void Task::run() +{ + taskStarted(this); + executeTask(); + taskEnded(this); +} diff --git a/tasks/task.h b/tasks/task.h new file mode 100644 index 000000000..714889c8e --- /dev/null +++ b/tasks/task.h @@ -0,0 +1,53 @@ +/* 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 TASK_H +#define TASK_H + +#include +#include +#include + +class Task : public QThread +{ + Q_OBJECT +public: + explicit Task(QObject *parent = 0); + + // Starts the task. + void startTask(); + + QString getStatus() const; + int getProgress() const; + +signals: + void taskStarted(Task* task); + void taskEnded(Task* task); + + void statusChanged(const QString& status); + void progressChanged(int progress); + +protected: + void setStatus(const QString& status); + void setProgress(int progress); + + virtual void run(); + virtual void executeTask() = 0; + + QString status; + int progress; +}; + +#endif // TASK_H From a416c58a93dd9d108f4c4fa968b9431e30834c5c Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 5 Feb 2013 16:34:20 -0600 Subject: [PATCH 17/18] Started working on task system and login system. --- CMakeLists.txt | 12 ++++ data/loginresponse.cpp | 49 ++++++++++++++ data/loginresponse.h | 39 +++++++++++ data/userinfo.cpp | 49 ++++++++++++++ data/userinfo.h | 39 +++++++++++ gui/logindialog.cpp | 51 ++++++++++++++ gui/logindialog.h | 40 +++++++++++ gui/logindialog.ui | 146 +++++++++++++++++++++++++++++++++++++++++ gui/mainwindow.cpp | 32 +++++++++ gui/mainwindow.h | 11 +++- gui/taskdialog.cpp | 109 ++++++++++++++++++++++++++++++ gui/taskdialog.h | 63 ++++++++++++++++++ gui/taskdialog.ui | 53 +++++++++++++++ tasks/logintask.cpp | 44 +++++++++++++ tasks/logintask.h | 40 +++++++++++ tasks/task.cpp | 8 +-- tasks/task.h | 7 +- 17 files changed, 784 insertions(+), 8 deletions(-) create mode 100644 data/loginresponse.cpp create mode 100644 data/loginresponse.h create mode 100644 data/userinfo.cpp create mode 100644 data/userinfo.h create mode 100644 gui/logindialog.cpp create mode 100644 gui/logindialog.h create mode 100644 gui/logindialog.ui create mode 100644 gui/taskdialog.cpp create mode 100644 gui/taskdialog.h create mode 100644 gui/taskdialog.ui create mode 100644 tasks/logintask.cpp create mode 100644 tasks/logintask.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 932f70e19..b466924cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -96,11 +96,15 @@ data/instancebase.cpp data/instancemodel.cpp data/stdinstance.cpp data/version.cpp +data/userinfo.cpp +data/loginresponse.cpp gui/mainwindow.cpp gui/modeditwindow.cpp gui/settingsdialog.cpp gui/newinstancedialog.cpp +gui/logindialog.cpp +gui/taskdialog.cpp util/pathutils.cpp util/osutils.cpp @@ -109,6 +113,7 @@ java/javautils.cpp java/annotations.cpp tasks/task.cpp +tasks/logintask.cpp ) SET(MULTIMC_HEADERS @@ -116,6 +121,8 @@ gui/mainwindow.h gui/modeditwindow.h gui/settingsdialog.h gui/newinstancedialog.h +gui/logindialog.h +gui/taskdialog.h data/appsettings.h data/inifile.h @@ -123,6 +130,8 @@ data/instancebase.h data/instancemodel.h data/stdinstance.h data/version.h +data/userinfo.h +data/loginresponse.h util/apputils.h util/pathutils.h @@ -139,6 +148,7 @@ java/javautils.h java/membuffer.h tasks/task.h +tasks/logintask.h ) SET(MULTIMC5_UIS @@ -146,6 +156,8 @@ gui/mainwindow.ui gui/modeditwindow.ui gui/settingsdialog.ui gui/newinstancedialog.ui +gui/logindialog.ui +gui/taskdialog.ui ) IF(WIN32) diff --git a/data/loginresponse.cpp b/data/loginresponse.cpp new file mode 100644 index 000000000..a36471144 --- /dev/null +++ b/data/loginresponse.cpp @@ -0,0 +1,49 @@ +/* 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. + */ + +#include "loginresponse.h" + +LoginResponse::LoginResponse(const QString& username, const QString& sessionID, QObject *parent) : + QObject(parent) +{ + this->username = username; + this->sessionID = sessionID; +} + +LoginResponse::LoginResponse(const LoginResponse &other) +{ + this->username = other.username; + this->sessionID = other.sessionID; +} + +QString LoginResponse::getUsername() const +{ + return username; +} + +void LoginResponse::setUsername(const QString& username) +{ + this->username = username; +} + +QString LoginResponse::getSessionID() const +{ + return sessionID; +} + +void LoginResponse::setSessionID(const QString& sessionID) +{ + this->sessionID = sessionID; +} diff --git a/data/loginresponse.h b/data/loginresponse.h new file mode 100644 index 000000000..e780750fa --- /dev/null +++ b/data/loginresponse.h @@ -0,0 +1,39 @@ +/* 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 LOGINRESPONSE_H +#define LOGINRESPONSE_H + +#include + +class LoginResponse : public QObject +{ + Q_OBJECT +public: + explicit LoginResponse(const QString &username, const QString &sessionID, QObject *parent = 0); + LoginResponse(const LoginResponse& other); + + QString getUsername() const; + void setUsername(const QString& username); + + QString getSessionID() const; + void setSessionID(const QString& sessionID); + +private: + QString username; + QString sessionID; +}; + +#endif // LOGINRESPONSE_H diff --git a/data/userinfo.cpp b/data/userinfo.cpp new file mode 100644 index 000000000..907f93a27 --- /dev/null +++ b/data/userinfo.cpp @@ -0,0 +1,49 @@ +/* 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. + */ + +#include "userinfo.h" + +UserInfo::UserInfo(const QString &username, const QString &password, QObject *parent) : + QObject(parent) +{ + this->username = username; + this->password = password; +} + +UserInfo::UserInfo(const UserInfo &other) +{ + this->username = other.username; + this->password = other.password; +} + +QString UserInfo::getUsername() const +{ + return username; +} + +void UserInfo::setUsername(const QString &username) +{ + this->username = username; +} + +QString UserInfo::getPassword() const +{ + return password; +} + +void UserInfo::setPassword(const QString &password) +{ + this->password = password; +} diff --git a/data/userinfo.h b/data/userinfo.h new file mode 100644 index 000000000..ccfc741e1 --- /dev/null +++ b/data/userinfo.h @@ -0,0 +1,39 @@ +/* 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 USERINFO_H +#define USERINFO_H + +#include + +class UserInfo : public QObject +{ + Q_OBJECT +public: + explicit UserInfo(const QString& username, const QString& password, QObject *parent = 0); + explicit UserInfo(const UserInfo& other); + + QString getUsername() const; + void setUsername(const QString& username); + + QString getPassword() const; + void setPassword(const QString& password); + +protected: + QString username; + QString password; +}; + +#endif // USERINFO_H diff --git a/gui/logindialog.cpp b/gui/logindialog.cpp new file mode 100644 index 000000000..426757a9a --- /dev/null +++ b/gui/logindialog.cpp @@ -0,0 +1,51 @@ +/* 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. + */ + +#include "logindialog.h" +#include "ui_logindialog.h" + +LoginDialog::LoginDialog(QWidget *parent, const QString& loginErrMsg) : + QDialog(parent), + ui(new Ui::LoginDialog) +{ + ui->setupUi(this); + + if (loginErrMsg.isEmpty()) + ui->loginErrorLabel->setVisible(false); + else + { + ui->loginErrorLabel->setVisible(true); + ui->loginErrorLabel->setText(QString("%1"). + arg(loginErrMsg)); + } + + resize(minimumSizeHint()); + layout()->setSizeConstraint(QLayout::SetFixedSize); +} + +LoginDialog::~LoginDialog() +{ + delete ui; +} + +QString LoginDialog::getUsername() const +{ + return ui->usernameTextBox->text(); +} + +QString LoginDialog::getPassword() const +{ + return ui->passwordTextBox->text(); +} diff --git a/gui/logindialog.h b/gui/logindialog.h new file mode 100644 index 000000000..1b70dcd50 --- /dev/null +++ b/gui/logindialog.h @@ -0,0 +1,40 @@ +/* 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 LOGINDIALOG_H +#define LOGINDIALOG_H + +#include + +namespace Ui { +class LoginDialog; +} + +class LoginDialog : public QDialog +{ + Q_OBJECT + +public: + explicit LoginDialog(QWidget *parent = 0, const QString& loginErrMsg = ""); + ~LoginDialog(); + + QString getUsername() const; + QString getPassword() const; + +private: + Ui::LoginDialog *ui; +}; + +#endif // LOGINDIALOG_H diff --git a/gui/logindialog.ui b/gui/logindialog.ui new file mode 100644 index 000000000..ce41d2f52 --- /dev/null +++ b/gui/logindialog.ui @@ -0,0 +1,146 @@ + + + LoginDialog + + + + 0 + 0 + 365 + 145 + + + + Login + + + + + + <span style=" color:#ff0000;">Error</span> + + + + + + + + + Username: + + + + + + + Username + + + + + + + Password: + + + + + + + QLineEdit::Password + + + Password + + + + + + + + + + + &Force Update + + + true + + + + + + + + 1 + 0 + + + + &Remember Username? + + + + + + + + 1 + 0 + + + + R&emember Password? + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + loginButtonBox + accepted() + LoginDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + loginButtonBox + rejected() + LoginDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 1ff633b2f..c2f0c3903 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -26,10 +26,14 @@ #include "gui/settingsdialog.h" #include "gui/newinstancedialog.h" +#include "gui/logindialog.h" +#include "gui/taskdialog.h" #include "data/appsettings.h" #include "data/version.h" +#include "tasks/logintask.h" + MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) @@ -121,3 +125,31 @@ void MainWindow::on_instanceView_customContextMenuRequested(const QPoint &pos) instContextMenu->exec(ui->instanceView->mapToGlobal(pos)); } + + +void MainWindow::on_actionLaunchInstance_triggered() +{ + doLogin(); +} + +void MainWindow::doLogin(const QString &errorMsg) +{ + LoginDialog* loginDlg = new LoginDialog(this, errorMsg); + if (loginDlg->exec()) + { + UserInfo uInfo(loginDlg->getUsername(), loginDlg->getPassword()); + + TaskDialog* tDialog = new TaskDialog(this); + LoginTask* loginTask = new LoginTask(uInfo, tDialog); + connect(loginTask, SIGNAL(loginComplete(LoginResponse)), + SLOT(onLoginComplete(LoginResponse))); + connect(loginTask, SIGNAL(loginFailed(QString)), + SLOT(doLogin(QString))); + tDialog->exec(loginTask); + } +} + +void MainWindow::onLoginComplete(LoginResponse response) +{ + +} diff --git a/gui/mainwindow.h b/gui/mainwindow.h index ce06a085d..28ca341ae 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -18,7 +18,8 @@ #include -#include "../data/instancemodel.h" +#include "data/instancemodel.h" +#include "data/loginresponse.h" namespace Ui { @@ -58,6 +59,14 @@ private slots: void on_instanceView_customContextMenuRequested(const QPoint &pos); + void on_actionLaunchInstance_triggered(); + + + void doLogin(const QString& errorMsg = ""); + + + void onLoginComplete(LoginResponse response); + private: Ui::MainWindow *ui; diff --git a/gui/taskdialog.cpp b/gui/taskdialog.cpp new file mode 100644 index 000000000..a8738fe3d --- /dev/null +++ b/gui/taskdialog.cpp @@ -0,0 +1,109 @@ +/* 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. + */ + +#include "taskdialog.h" +#include "ui_taskdialog.h" + +#include + +#include "tasks/task.h" + +TaskDialog::TaskDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::TaskDialog) +{ + ui->setupUi(this); + updateSize(); + + changeProgress(0); +} + +TaskDialog::~TaskDialog() +{ + delete ui; +} + +void TaskDialog::updateSize() +{ + resize(QSize(480, minimumSizeHint().height())); +} + +void TaskDialog::exec(Task *task) +{ + this->task = task; + + // Connect signals. + connect(task, SIGNAL(taskStarted(Task*)), + this, SLOT(onTaskStarted(Task*))); + connect(task, SIGNAL(taskEnded(Task*)), + this, SLOT(onTaskEnded(Task*))); + connect(task, SIGNAL(statusChanged(const QString&)), + this, SLOT(changeStatus(const QString&))); + connect(task, SIGNAL(progressChanged(int)), + this, SLOT(changeProgress(int))); + + task->startTask(); + QDialog::exec(); +} + +Task* TaskDialog::getTask() +{ + return task; +} + +void TaskDialog::onTaskStarted(Task*) +{ + +} + +void TaskDialog::onTaskEnded(Task*) +{ + close(); +} + +void TaskDialog::changeStatus(const QString &status) +{ + ui->statusLabel->setText(status); + updateSize(); +} + +void TaskDialog::changeProgress(int progress) +{ + if (progress < 0) + progress = 0; + else if (progress > 100) + progress = 100; + + ui->taskProgressBar->setValue(progress); +} + +void TaskDialog::keyPressEvent(QKeyEvent* e) +{ + if (e->key() == Qt::Key_Escape) + return; + QDialog::keyPressEvent(e); +} + +void TaskDialog::closeEvent(QCloseEvent* e) +{ + if (task && task->isRunning()) + { + e->ignore(); + } + else + { + QDialog::closeEvent(e); + } +} diff --git a/gui/taskdialog.h b/gui/taskdialog.h new file mode 100644 index 000000000..faf3ed90c --- /dev/null +++ b/gui/taskdialog.h @@ -0,0 +1,63 @@ +/* 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 TASKDIALOG_H +#define TASKDIALOG_H + +#include + +class Task; + +namespace Ui { +class TaskDialog; +} + +class TaskDialog : public QDialog +{ + Q_OBJECT + +public: + explicit TaskDialog(QWidget *parent = 0); + ~TaskDialog(); + + void updateSize(); + + void exec(Task* task); + + Task* getTask(); + +public slots: + void onTaskStarted(Task*); + void onTaskEnded(Task*); + + void changeStatus(const QString& status); + void changeProgress(int progress); + + void test() { qDebug("Lol"); } + +signals: + + +protected: + virtual void keyPressEvent(QKeyEvent* e); + virtual void closeEvent(QCloseEvent* e); + +private: + Ui::TaskDialog *ui; + + Task* task; +}; + +#endif // TASKDIALOG_H diff --git a/gui/taskdialog.ui b/gui/taskdialog.ui new file mode 100644 index 000000000..1cdf79785 --- /dev/null +++ b/gui/taskdialog.ui @@ -0,0 +1,53 @@ + + + TaskDialog + + + + 0 + 0 + 400 + 58 + + + + + 400 + 0 + + + + + 600 + 16777215 + + + + Please wait... + + + + + + Task Status... + + + true + + + + + + + 24 + + + false + + + + + + + + diff --git a/tasks/logintask.cpp b/tasks/logintask.cpp new file mode 100644 index 000000000..211e1c17a --- /dev/null +++ b/tasks/logintask.cpp @@ -0,0 +1,44 @@ +/* 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. + */ + +#include "logintask.h" + +LoginTask::LoginTask(const UserInfo &uInfo, QObject *parent) : + Task(parent), uInfo(uInfo) +{ + +} + +void LoginTask::executeTask() +{ + setStatus("Logging in..."); + + // TODO: PLACEHOLDER + for (int p = 0; p < 100; p++) + { + msleep(25); + setProgress(p); + } + + if (uInfo.getUsername() == "test") + { + LoginResponse response("test", "Fake Session ID"); + emit loginComplete(response); + } + else + { + emit loginFailed("Testing"); + } +} diff --git a/tasks/logintask.h b/tasks/logintask.h new file mode 100644 index 000000000..93aab9b3b --- /dev/null +++ b/tasks/logintask.h @@ -0,0 +1,40 @@ +/* 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 LOGINTASK_H +#define LOGINTASK_H + +#include "task.h" + +#include "data/userinfo.h" +#include "data/loginresponse.h" + +class LoginTask : public Task +{ + Q_OBJECT +public: + explicit LoginTask(const UserInfo& uInfo, QObject *parent = 0); + +signals: + void loginComplete(const LoginResponse& loginResponse); + void loginFailed(const QString& errorMsg); + +protected: + void executeTask(); + + UserInfo uInfo; +}; + +#endif // LOGINTASK_H diff --git a/tasks/task.cpp b/tasks/task.cpp index 8d65b415c..d581a1dde 100644 --- a/tasks/task.cpp +++ b/tasks/task.cpp @@ -29,7 +29,7 @@ QString Task::getStatus() const void Task::setStatus(const QString &status) { this->status = status; - statusChanged(status); + emit statusChanged(status); } int Task::getProgress() const @@ -40,7 +40,7 @@ int Task::getProgress() const void Task::setProgress(int progress) { this->progress = progress; - progressChanged(progress); + emit progressChanged(progress); } void Task::startTask() @@ -50,7 +50,7 @@ void Task::startTask() void Task::run() { - taskStarted(this); + emit taskStarted(this); executeTask(); - taskEnded(this); + emit taskEnded(this); } diff --git a/tasks/task.h b/tasks/task.h index 714889c8e..0124d8cfb 100644 --- a/tasks/task.h +++ b/tasks/task.h @@ -32,6 +32,10 @@ public: QString getStatus() const; int getProgress() const; +public slots: + void setStatus(const QString& status); + void setProgress(int progress); + signals: void taskStarted(Task* task); void taskEnded(Task* task); @@ -40,9 +44,6 @@ signals: void progressChanged(int progress); protected: - void setStatus(const QString& status); - void setProgress(int progress); - virtual void run(); virtual void executeTask() = 0; From e475f5d51251ae57da0480bbadc9cb32a8bc72b2 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 5 Feb 2013 19:22:19 -0600 Subject: [PATCH 18/18] Implemented login system. --- CMakeLists.txt | 3 +- data/loginresponse.cpp | 26 +++++++++-- data/loginresponse.h | 10 +++- gui/mainwindow.cpp | 8 ++-- main.cpp | 4 ++ tasks/logintask.cpp | 103 +++++++++++++++++++++++++++++++++++------ tasks/logintask.h | 10 +++- 7 files changed, 142 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b466924cf..984bbd056 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,7 @@ include_directories(hacks) #### Find the required Qt parts #### find_package(Qt5Widgets) +find_package(Qt5Network) #find_package(Qt5Declarative) include_directories(${Qt5Widgets_INCLUDE_DIRS}) @@ -171,7 +172,7 @@ QT5_WRAP_UI(MULTIMC_UI ${MULTIMC5_UIS}) QT5_ADD_RESOURCES(MULTIMC_QRC multimc.qrc) add_executable(MultiMC ${MULTIMC_SOURCES} ${MULTIMC_HEADERS} ${MULTIMC_UI} ${MULTIMC_QRC}) -qt5_use_modules(MultiMC Widgets) +qt5_use_modules(MultiMC Widgets Network) target_link_libraries(MultiMC quazip patchlib ${MultiMC_LINK_ADDITIONAL_LIBS}) add_dependencies(MultiMC MultiMCLauncher) install(TARGETS MultiMC RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}) diff --git a/data/loginresponse.cpp b/data/loginresponse.cpp index a36471144..44bc80eb8 100644 --- a/data/loginresponse.cpp +++ b/data/loginresponse.cpp @@ -15,17 +15,27 @@ #include "loginresponse.h" -LoginResponse::LoginResponse(const QString& username, const QString& sessionID, QObject *parent) : +LoginResponse::LoginResponse(const QString& username, const QString& sessionID, + qint64 latestVersion, QObject *parent) : QObject(parent) { this->username = username; this->sessionID = sessionID; + this->latestVersion = latestVersion; +} + +LoginResponse::LoginResponse() +{ + this->username = ""; + this->sessionID = ""; + this->latestVersion = 0; } LoginResponse::LoginResponse(const LoginResponse &other) { - this->username = other.username; - this->sessionID = other.sessionID; + this->username = other.getUsername(); + this->sessionID = other.getSessionID(); + this->latestVersion = other.getLatestVersion(); } QString LoginResponse::getUsername() const @@ -47,3 +57,13 @@ void LoginResponse::setSessionID(const QString& sessionID) { this->sessionID = sessionID; } + +qint64 LoginResponse::getLatestVersion() const +{ + return latestVersion; +} + +void LoginResponse::setLatestVersion(qint64 v) +{ + this->latestVersion = v; +} diff --git a/data/loginresponse.h b/data/loginresponse.h index e780750fa..bcb77d560 100644 --- a/data/loginresponse.h +++ b/data/loginresponse.h @@ -22,7 +22,9 @@ class LoginResponse : public QObject { Q_OBJECT public: - explicit LoginResponse(const QString &username, const QString &sessionID, QObject *parent = 0); + explicit LoginResponse(const QString &username, const QString &sessionID, + qint64 latestVersion, QObject *parent = 0); + LoginResponse(); LoginResponse(const LoginResponse& other); QString getUsername() const; @@ -31,9 +33,15 @@ public: QString getSessionID() const; void setSessionID(const QString& sessionID); + qint64 getLatestVersion() const; + void setLatestVersion(qint64 v); + private: QString username; QString sessionID; + qint64 latestVersion; }; +Q_DECLARE_METATYPE(LoginResponse) + #endif // LOGINRESPONSE_H diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index c2f0c3903..bc0840a07 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -142,14 +142,16 @@ void MainWindow::doLogin(const QString &errorMsg) TaskDialog* tDialog = new TaskDialog(this); LoginTask* loginTask = new LoginTask(uInfo, tDialog); connect(loginTask, SIGNAL(loginComplete(LoginResponse)), - SLOT(onLoginComplete(LoginResponse))); + SLOT(onLoginComplete(LoginResponse)), Qt::QueuedConnection); connect(loginTask, SIGNAL(loginFailed(QString)), - SLOT(doLogin(QString))); + SLOT(doLogin(QString)), Qt::QueuedConnection); tDialog->exec(loginTask); } } void MainWindow::onLoginComplete(LoginResponse response) { - + QMessageBox::information(this, "Login Successful", + QString("Logged in as %1 with session ID %2."). + arg(response.getUsername(), response.getSessionID())); } diff --git a/main.cpp b/main.cpp index 019a88531..6e840317c 100644 --- a/main.cpp +++ b/main.cpp @@ -19,6 +19,7 @@ #include "data/appsettings.h" +#include "data/loginresponse.h" int main(int argc, char *argv[]) { @@ -28,6 +29,9 @@ int main(int argc, char *argv[]) settings = new AppSettings(&app); + // Register meta types. + qRegisterMetaType("LoginResponse"); + MainWindow mainWin; mainWin.show(); diff --git a/tasks/logintask.cpp b/tasks/logintask.cpp index 211e1c17a..f683b8114 100644 --- a/tasks/logintask.cpp +++ b/tasks/logintask.cpp @@ -15,6 +15,15 @@ #include "logintask.h" +#include + +#include +#include +#include + +#include +#include + LoginTask::LoginTask(const UserInfo &uInfo, QObject *parent) : Task(parent), uInfo(uInfo) { @@ -25,20 +34,88 @@ void LoginTask::executeTask() { setStatus("Logging in..."); - // TODO: PLACEHOLDER - for (int p = 0; p < 100; p++) + QNetworkAccessManager netMgr; + connect(&netMgr, SIGNAL(finished(QNetworkReply*)), + SLOT(processNetReply(QNetworkReply*))); + + QUrl loginURL("https://login.minecraft.net/"); + QNetworkRequest netRequest(loginURL); + netRequest.setHeader(QNetworkRequest::ContentTypeHeader, + "application/x-www-form-urlencoded"); + + QUrlQuery params; + params.addQueryItem("user", uInfo.getUsername()); + params.addQueryItem("password", uInfo.getPassword()); + params.addQueryItem("version", "13"); + + netReply = netMgr.post(netRequest, params.query(QUrl::EncodeSpaces).toUtf8()); + exec(); +} + +void LoginTask::processNetReply(QNetworkReply *reply) +{ + // Check for errors. + switch (reply->error()) { - msleep(25); - setProgress(p); + case QNetworkReply::NoError: + { + // Check the response code. + int responseCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + + if (responseCode == 200) + { + QString responseStr(reply->readAll()); + + QStringList strings = responseStr.split(":"); + if (strings.count() >= 4) + { + bool parseSuccess; + qint64 latestVersion = strings[0].toLongLong(&parseSuccess); + if (parseSuccess) + { + // strings[1] is the download ticket. It isn't used anymore. + QString username = strings[2]; + QString sessionID = strings[3]; + + LoginResponse response(username, sessionID, latestVersion); + emit loginComplete(response); + } + else + { + emit loginFailed("Failed to parse Minecraft version string."); + } + } + else + { + if (responseStr.toLower() == "bad login") + emit loginFailed("Invalid username or password."); + else if (responseStr.toLower() == "old version") + emit loginFailed("Launcher outdated, please update."); + else + emit loginFailed("Login failed: " + responseStr); + } + } + else if (responseCode == 503) + { + emit loginFailed("The login servers are currently unavailable. " + "Check http://help.mojang.com/ for more info."); + } + else + { + emit loginFailed(QString("Login failed: Unknown HTTP error %1 occurred."). + arg(QString::number(responseCode))); + } + break; + } + + case QNetworkReply::OperationCanceledError: + emit loginFailed("Login canceled."); + break; + + default: + emit loginFailed("Login failed: " + reply->errorString()); + break; } - if (uInfo.getUsername() == "test") - { - LoginResponse response("test", "Fake Session ID"); - emit loginComplete(response); - } - else - { - emit loginFailed("Testing"); - } + quit(); } diff --git a/tasks/logintask.h b/tasks/logintask.h index 93aab9b3b..d96bfec78 100644 --- a/tasks/logintask.h +++ b/tasks/logintask.h @@ -21,19 +21,27 @@ #include "data/userinfo.h" #include "data/loginresponse.h" +//class QNetworkAccessManager; +class QNetworkReply; + class LoginTask : public Task { Q_OBJECT public: explicit LoginTask(const UserInfo& uInfo, QObject *parent = 0); +public slots: + void processNetReply(QNetworkReply* reply); + signals: - void loginComplete(const LoginResponse& loginResponse); + void loginComplete(LoginResponse loginResponse); void loginFailed(const QString& errorMsg); protected: void executeTask(); + QNetworkReply* netReply; + UserInfo uInfo; };