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..984bbd056 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)
@@ -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})
@@ -24,16 +25,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)
@@ -104,34 +95,48 @@ data/appsettings.cpp
data/inifile.cpp
data/instancebase.cpp
data/instancemodel.cpp
-data/settingsbase.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
java/javautils.cpp
java/annotations.cpp
+
+tasks/task.cpp
+tasks/logintask.cpp
)
SET(MULTIMC_HEADERS
gui/mainwindow.h
gui/modeditwindow.h
gui/settingsdialog.h
+gui/newinstancedialog.h
+gui/logindialog.h
+gui/taskdialog.h
data/appsettings.h
data/inifile.h
data/instancebase.h
data/instancemodel.h
-data/settingsbase.h
-data/settingsmacros.h
-data/settingsmacrosundef.h
data/stdinstance.h
+data/version.h
+data/userinfo.h
+data/loginresponse.h
+util/apputils.h
util/pathutils.h
+util/osutils.h
multimc_pragma.h
@@ -142,21 +147,75 @@ java/endian.h
java/errors.h
java/javautils.h
java/membuffer.h
+
+tasks/task.h
+tasks/logintask.h
)
SET(MULTIMC5_UIS
gui/mainwindow.ui
gui/modeditwindow.ui
gui/settingsdialog.ui
+gui/newinstancedialog.ui
+gui/logindialog.ui
+gui/taskdialog.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})
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 Network)
+target_link_libraries(MultiMC quazip patchlib ${MultiMC_LINK_ADDITIONAL_LIBS})
+add_dependencies(MultiMC MultiMCLauncher)
+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/MultiMC.pro b/MultiMC.pro
index 0ca6daee6..3f4805298 100644
--- a/MultiMC.pro
+++ b/MultiMC.pro
@@ -20,7 +20,8 @@ SOURCES += main.cpp\
data/stdinstance.cpp \
data/inifile.cpp \
gui/settingsdialog.cpp \
- gui/modeditwindow.cpp
+ gui/modeditwindow.cpp \
+ util/appsettings.cpp
HEADERS += gui/mainwindow.h \
data/instancebase.h \
@@ -29,7 +30,9 @@ HEADERS += gui/mainwindow.h \
data/stdinstance.h \
data/inifile.h \
gui/settingsdialog.h \
- gui/modeditwindow.h
+ gui/modeditwindow.h \
+ util/apputils.h \
+ util/appsettings.h
FORMS += gui/mainwindow.ui \
gui/settingsdialog.ui \
diff --git a/MultiMC.pro.user b/MultiMC.pro.user
deleted file mode 100644
index 21852a101..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
-
-
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..a9068bfdf 100644
--- a/data/appsettings.h
+++ b/data/appsettings.h
@@ -16,12 +16,104 @@
#ifndef APPSETTINGS_H
#define APPSETTINGS_H
-#include "settingsbase.h"
+#include
+#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)
+
+ // 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))
+ 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);
+
+ QSettings& getConfig() { return config; }
+
+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/instancemodel.cpp b/data/instancemodel.cpp
index 44d2844bd..0f1e59f6d 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
@@ -58,54 +61,105 @@ 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;
- using namespace boost::property_tree;
- ptree pt;
-
- try
+ if (QFileInfo(groupFileName).exists())
{
- read_json(groupFile.toStdString(), pt);
-
- if (pt.get_optional("formatVersion") != GROUP_FILE_FORMAT_VERSION)
+ QFile groupFile(groupFileName);
+
+ 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);
@@ -397,4 +451,4 @@ QVariant InstanceGroup::data ( int role ) const
default:
return QVariant();
}
-}
\ No newline at end of file
+}
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;
};
diff --git a/data/loginresponse.cpp b/data/loginresponse.cpp
new file mode 100644
index 000000000..44bc80eb8
--- /dev/null
+++ b/data/loginresponse.cpp
@@ -0,0 +1,69 @@
+/* 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,
+ 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.getUsername();
+ this->sessionID = other.getSessionID();
+ this->latestVersion = other.getLatestVersion();
+}
+
+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;
+}
+
+qint64 LoginResponse::getLatestVersion() const
+{
+ return latestVersion;
+}
+
+void LoginResponse::setLatestVersion(qint64 v)
+{
+ this->latestVersion = v;
+}
diff --git a/data/loginresponse.h b/data/loginresponse.h
new file mode 100644
index 000000000..bcb77d560
--- /dev/null
+++ b/data/loginresponse.h
@@ -0,0 +1,47 @@
+/* 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,
+ qint64 latestVersion, QObject *parent = 0);
+ LoginResponse();
+ LoginResponse(const LoginResponse& other);
+
+ QString getUsername() const;
+ void setUsername(const QString& username);
+
+ 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/data/settingsmacros.h b/data/settingsmacros.h
deleted file mode 100644
index 94e521558..000000000
--- a/data/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
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/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/data/version.cpp b/data/version.cpp
new file mode 100644
index 000000000..eec50e13a
--- /dev/null
+++ b/data/version.cpp
@@ -0,0 +1,46 @@
+/* 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_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;
+}
+
+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(
+ 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..321b1680d
--- /dev/null
+++ b/data/version.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 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);
+
+ Version(const Version& ver);
+
+ QString toString() const;
+
+ int major;
+ int minor;
+ int revision;
+ int build;
+
+ static Version current;
+};
+
+#endif // VERSION_H
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()
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 87a1dcc01..bc0840a07 100644
--- a/gui/mainwindow.cpp
+++ b/gui/mainwindow.cpp
@@ -16,16 +16,35 @@
#include "mainwindow.h"
#include "ui_mainwindow.h"
+#include
+#include
+
#include
#include
-#include "../gui/settingsdialog.h"
+#include "util/osutils.h"
+
+#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)
{
ui->setupUi(this);
+
+ 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);
}
@@ -37,12 +56,13 @@ MainWindow::~MainWindow()
void MainWindow::on_actionAddInstance_triggered()
{
-
+ NewInstanceDialog *newInstDlg = new NewInstanceDialog(this);
+ newInstDlg->exec();
}
void MainWindow::on_actionViewInstanceFolder_triggered()
{
-
+ openInDefaultProgram(settings->getInstanceDir());
}
void MainWindow::on_actionRefresh_triggered()
@@ -52,7 +72,7 @@ void MainWindow::on_actionRefresh_triggered()
void MainWindow::on_actionViewCentralModsFolder_triggered()
{
-
+ openInDefaultProgram(settings->getCentralModsDir());
}
void MainWindow::on_actionCheckUpdate_triggered()
@@ -68,15 +88,70 @@ 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()
{
}
+
+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);
+}
+
+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));
+}
+
+
+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)), Qt::QueuedConnection);
+ connect(loginTask, SIGNAL(loginFailed(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/gui/mainwindow.h b/gui/mainwindow.h
index 772455317..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
{
@@ -33,6 +34,8 @@ public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
+ void closeEvent(QCloseEvent *event);
+
private slots:
void on_actionAbout_triggered();
@@ -52,6 +55,18 @@ private slots:
void on_actionNews_triggered();
+ void on_mainToolBar_visibilityChanged(bool);
+
+ 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/mainwindow.ui b/gui/mainwindow.ui
index 5abfb37db..137f7e97a 100644
--- a/gui/mainwindow.ui
+++ b/gui/mainwindow.ui
@@ -6,8 +6,8 @@
0
0
- 739
- 657
+ 600
+ 400
@@ -44,11 +44,17 @@
false
+
+ Qt::CustomContextMenu
+
+
+ Main Toolbar
+
false
@@ -74,6 +80,38 @@
+
+
+ Instance Toolbar
+
+
+ false
+
+
+ RightToolBarArea
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -85,6 +123,9 @@
Add a new instance.
+
+ Add a new instance.
+
@@ -97,6 +138,9 @@
Open the instance folder in a file browser.
+
+ Open the instance folder in a file browser.
+
@@ -109,6 +153,9 @@
Reload the instance list.
+
+ Reload the instance list.
+
@@ -121,6 +168,9 @@
Open the central mods folder in a file browser.
+
+ Open the central mods folder in a file browser.
+
@@ -133,6 +183,9 @@
Check for new updates for MultiMC
+
+ Check for new updates for MultiMC
+
@@ -145,6 +198,9 @@
Change settings.
+
+ Change settings.
+
QAction::PreferencesRole
@@ -160,6 +216,9 @@
Open the bug tracker to report a bug with MultiMC.
+
+ Open the bug tracker to report a bug with MultiMC.
+
@@ -172,6 +231,9 @@
Open the MultiMC dev blog to read news about MultiMC.
+
+ Open the MultiMC dev blog to read news about MultiMC.
+
@@ -184,10 +246,167 @@
View information about MultiMC.
+
+ About MultiMC
+
QAction::AboutRole
+
+
+ Play
+
+
+ Launch the selected instance.
+
+
+ Launch the selected instance.
+
+
+
+
+ Rename
+
+
+ Rename the selected instance.
+
+
+ Rename the selected instance.
+
+
+
+
+ Change Group
+
+
+ Change the selected instance's group.
+
+
+ Change the selected instance's group.
+
+
+
+
+ Change Icon
+
+
+ Change the selected instance's icon.
+
+
+ Change the selected instance's icon.
+
+
+
+
+ Edit Notes
+
+
+ Edit the notes for the selected instance.
+
+
+ Edit the notes for the selected instance.
+
+
+
+
+ Settings
+
+
+ Change settings for the selected instance.
+
+
+ Change settings for the selected instance.
+
+
+
+
+ Make Shortcut
+
+
+ Make a shortcut on the desktop for the selected instance.
+
+
+ Make a shortcut on the desktop for the selected instance.
+
+
+
+
+ Manage Saves
+
+
+ Manage saves for the selected instance.
+
+
+ Manage saves for the selected instance.
+
+
+
+
+ Edit Mods
+
+
+ Edit the mods for the selected instance.
+
+
+ Edit the mods for the selected instance.
+
+
+
+
+ Change Version
+
+
+ Change the selected instance's Minecraft version.
+
+
+ Change the selected instance's Minecraft version.
+
+
+
+
+ Change LWJGL
+
+
+ Change the version of LWJGL for the selected instance to use.
+
+
+ Change the version of LWJGL for the selected instance to use.
+
+
+
+
+ Rebuild Jar
+
+
+ Reinstall the mods for the selected instance.
+
+
+ Reinstall the mods for the selected instance.
+
+
+
+
+ View Folder
+
+
+ Open the selected instance's root folder in a file browser.
+
+
+ Open the selected instance's root folder in a file browser.
+
+
+
+
+ Delete
+
+
+ Delete the selected instance.
+
+
+ Delete the selected instance.
+
+
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/data/settingsbase.h b/gui/newinstancedialog.h
similarity index 66%
rename from data/settingsbase.h
rename to gui/newinstancedialog.h
index 71f0e30de..263136f12 100644
--- a/data/settingsbase.h
+++ b/gui/newinstancedialog.h
@@ -13,21 +13,25 @@
* limitations under the License.
*/
-#ifndef SETTINGSBASE_H
-#define SETTINGSBASE_H
+#ifndef NEWINSTANCEDIALOG_H
+#define NEWINSTANCEDIALOG_H
-#include
+#include
-#include "settingsmacros.h"
+namespace Ui {
+class NewInstanceDialog;
+}
-class SettingsBase : public QSettings
+class NewInstanceDialog : public QDialog
{
+ Q_OBJECT
+
public:
- SettingsBase(QString fileName);
-
+ explicit NewInstanceDialog(QWidget *parent = 0);
+ ~NewInstanceDialog();
+private:
+ Ui::NewInstanceDialog *ui;
};
-#include "settingsmacrosundef.h"
-
-#endif // SETTINGSBASE_H
+#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/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/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/main.cpp b/main.cpp
index 0d429c8dd..6e840317c 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,20 @@
#include "gui/mainwindow.h"
#include
+#include "data/appsettings.h"
+
+#include "data/loginresponse.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
+ app.setOrganizationName("Forkk");
+ app.setApplicationName("MultiMC 5");
+
+ settings = new AppSettings(&app);
+
+ // Register meta types.
+ qRegisterMetaType("LoginResponse");
MainWindow mainWin;
mainWin.show();
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
+
diff --git a/tasks/logintask.cpp b/tasks/logintask.cpp
new file mode 100644
index 000000000..f683b8114
--- /dev/null
+++ b/tasks/logintask.cpp
@@ -0,0 +1,121 @@
+/* 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"
+
+#include
+
+#include
+#include
+#include
+
+#include
+#include
+
+LoginTask::LoginTask(const UserInfo &uInfo, QObject *parent) :
+ Task(parent), uInfo(uInfo)
+{
+
+}
+
+void LoginTask::executeTask()
+{
+ setStatus("Logging in...");
+
+ 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())
+ {
+ 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;
+ }
+
+ quit();
+}
diff --git a/tasks/logintask.h b/tasks/logintask.h
new file mode 100644
index 000000000..d96bfec78
--- /dev/null
+++ b/tasks/logintask.h
@@ -0,0 +1,48 @@
+/* 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 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(LoginResponse loginResponse);
+ void loginFailed(const QString& errorMsg);
+
+protected:
+ void executeTask();
+
+ QNetworkReply* netReply;
+
+ UserInfo uInfo;
+};
+
+#endif // LOGINTASK_H
diff --git a/tasks/task.cpp b/tasks/task.cpp
new file mode 100644
index 000000000..d581a1dde
--- /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;
+ emit statusChanged(status);
+}
+
+int Task::getProgress() const
+{
+ return progress;
+}
+
+void Task::setProgress(int progress)
+{
+ this->progress = progress;
+ emit progressChanged(progress);
+}
+
+void Task::startTask()
+{
+ start();
+}
+
+void Task::run()
+{
+ emit taskStarted(this);
+ executeTask();
+ emit taskEnded(this);
+}
diff --git a/tasks/task.h b/tasks/task.h
new file mode 100644
index 000000000..0124d8cfb
--- /dev/null
+++ b/tasks/task.h
@@ -0,0 +1,54 @@
+/* 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;
+
+public slots:
+ void setStatus(const QString& status);
+ void setProgress(int progress);
+
+signals:
+ void taskStarted(Task* task);
+ void taskEnded(Task* task);
+
+ void statusChanged(const QString& status);
+ void progressChanged(int progress);
+
+protected:
+ virtual void run();
+ virtual void executeTask() = 0;
+
+ QString status;
+ int progress;
+};
+
+#endif // TASK_H
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/data/settingsmacrosundef.h b/util/osutils.cpp
similarity index 74%
rename from data/settingsmacrosundef.h
rename to util/osutils.cpp
index 85b13bacb..6b0955185 100644
--- a/data/settingsmacrosundef.h
+++ b/util/osutils.cpp
@@ -13,14 +13,13 @@
* limitations under the License.
*/
-#ifndef SETTINGSMACROSUNDEF_H
-#define SETTINGSMACROSUNDEF_H
+#include "osutils.h"
-#undef DEFINE_SETTING
-#undef DEFINE_SETTING_STR
-#undef DEFINE_SETTING_BOOL
-#undef DEFINE_SETTING_INT
+#include
+#include
+#include
-#undef STR_VAL
-
-#endif // SETTINGSMACROSUNDEF_H
+void openInDefaultProgram(QString filename)
+{
+ QDesktopServices::openUrl("file:///" + QFileInfo(filename).absolutePath());
+}
diff --git a/util/osutils.h b/util/osutils.h
new file mode 100644
index 000000000..f779ea2df
--- /dev/null
+++ b/util/osutils.h
@@ -0,0 +1,32 @@
+/* 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 OSUTILS_H
+#define OSUTILS_H
+
+#include
+
+#if defined _WIN32 | defined _WIN64
+#define WINDOWS 1
+#elif __APPLE__ & __MACH__
+#define OSX 1
+#elif __linux__
+#define LINUX 1
+#endif
+
+// Opens the given file in the default application.
+void openInDefaultProgram(QString filename);
+
+#endif // OSUTILS_H