summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2013-02-21 17:40:11 +0100
committerPetr Mrázek <peterix@gmail.com>2013-02-21 17:40:11 +0100
commit1beef3f73cd126af9ce3805b6990c64b835a593b (patch)
tree9673caef42b2a2de6d5a7694a351341d0d38b7d5
parent18b087e99280d2c8d5a6115a178f9e6f03606656 (diff)
parentb8844e441334db5e9bf90348aa591b63087193c4 (diff)
downloadMultiMC-1beef3f73cd126af9ce3805b6990c64b835a593b.tar
MultiMC-1beef3f73cd126af9ce3805b6990c64b835a593b.tar.gz
MultiMC-1beef3f73cd126af9ce3805b6990c64b835a593b.tar.lz
MultiMC-1beef3f73cd126af9ce3805b6990c64b835a593b.tar.xz
MultiMC-1beef3f73cd126af9ce3805b6990c64b835a593b.zip
Merge https://github.com/Forkk/MultiMC5
-rw-r--r--CMakeLists.txt157
-rw-r--r--MultiMC.icnsbin0 -> 177400 bytes
-rw-r--r--data/siglist.h130
-rw-r--r--data/siglist_imp.h156
-rw-r--r--dependencies.cmake.in12
-rwxr-xr-xpackage/linux/MultiMC9
6 files changed, 434 insertions, 30 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 984bbd05..ed930d3c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -35,10 +35,16 @@ include_directories(patchlib)
# add the java launcher
add_subdirectory(launcher)
-IF(UNIX)
+IF(APPLE)
+ # assume clang 4.1.0+, add C++0x/C++11 stuff
+ message(STATUS "Using APPLE CMAKE_CXX_FLAGS")
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -stdlib=libc++")
+ELSEIF(UNIX)
# assume GCC, add C++0x/C++11 stuff
+ message(STATUS "Using UNIX CMAKE_CXX_FLAGS")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
ELSEIF(MINGW)
+ message(STATUS "Using MINGW CMAKE_CXX_FLAGS")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x")
ENDIF()
@@ -133,6 +139,8 @@ data/stdinstance.h
data/version.h
data/userinfo.h
data/loginresponse.h
+data/siglist.h
+data/siglist_imp.h
util/apputils.h
util/pathutils.h
@@ -161,50 +169,125 @@ gui/logindialog.ui
gui/taskdialog.ui
)
-IF(WIN32)
-SET(MultiMC_LINK_ADDITIONAL_LIBS ${MultiMC_LINK_ADDITIONAL_LIBS}
-Ws2_32)
-ENDIF()
+################################ Install ################################
+
+################ ICNS File ################
+
+IF(APPLE)
+ SET(MACOSX_BUNDLE_ICON_FILE MultiMC.icns)
+ SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/MultiMC.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
+ SET(MULTIMC_SOURCES ${MULTIMC_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/MultiMC.icns)
+ENDIF(APPLE)
+
+
+################ Build ################
+
+IF (WIN32)
+ SET(MultiMC_LINK_ADDITIONAL_LIBS ${MultiMC_LINK_ADDITIONAL_LIBS}
+ Qt5::WinMain
+ )
+ENDIF (WIN32)
SET_SOURCE_FILES_PROPERTIES(resources/MultiMCLauncher.jar GENERATED)
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})
+add_executable(MultiMC MACOSX_BUNDLE WIN32 ${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})
+
+
+################ Dirs ################
+
+SET(PLUGIN_DEST_DIR bin)
+SET(QTCONF_DEST_DIR bin)
+SET(APPS "\${CMAKE_INSTALL_PREFIX}/bin/MultiMC")
IF(WIN32)
-IF(CMAKE_BUILD_TYPE STREQUAL "Debug")
-SET(D "d")
-ELSE()
-SET(D "")
+ #SET(PLUGIN_DEST_DIR .)
+ #SET(QTCONF_DEST_DIR .)
+ SET(APPS "\${CMAKE_INSTALL_PREFIX}/bin/MultiMC.exe")
+ENDIF()
+IF(APPLE)
+ SET(PLUGIN_DEST_DIR MultiMC.app/Contents/MacOS)
+ SET(QTCONF_DEST_DIR MultiMC.app/Contents/Resources)
+ SET(APPS "\${CMAKE_INSTALL_PREFIX}/MultiMC.app")
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})
+SET(QT_PLUGINS_DIR ${Qt5_DIR}/plugins)
+SET(QT_LIBRARY_DIRS ${Qt5_DIR}/lib)
-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)
+################ OS X Bundle Info ################
+
+IF(APPLE)
+ SET(MACOSX_BUNDLE_BUNDLE_NAME "MultiMC")
+ SET(MACOSX_BUNDLE_INFO_STRING "MultiMC Minecraft launcher and management utility.")
+ SET(MACOSX_BUNDLE_BUNDLE_VERSION "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}.${MultiMC_VERSION_REV}.${MultiMC_VERSION_BUILD}")
+ #SET(MACOSX_BUNDLE_GUI_IDENTIFIER "")
+ SET(MACOSX_BUNDLE_ICON_FILE MultiMC.icns)
+ENDIF(APPLE)
+
+################ Install ################
+
+# Executable
+IF(WIN32)
+INSTALL(TARGETS MultiMC
+ BUNDLE DESTINATION . COMPONENT Runtime
+ RUNTIME DESTINATION bin COMPONENT Runtime
+)
ENDIF()
+IF(UNIX)
+IF(APPLE)
+INSTALL(TARGETS MultiMC
+ BUNDLE DESTINATION . COMPONENT Runtime
+ RUNTIME DESTINATION MultiMC.app/Contents/MacOS COMPONENT Runtime
+)
+ELSE()
+INSTALL(TARGETS MultiMC
+ BUNDLE DESTINATION . COMPONENT Runtime
+ RUNTIME DESTINATION bin COMPONENT Runtime
+)
+ENDIF()
+ENDIF()
+
+# Plugins
+
+# Image formats
+INSTALL(DIRECTORY "${QT_PLUGINS_DIR}/imageformats" DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime)
+
+# Platform plugins
+INSTALL(DIRECTORY "${QT_PLUGINS_DIR}/platforms" DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime)
+
+# qtconf
+INSTALL(CODE "
+ FILE(WRITE \"\${CMAKE_INSTALL_PREFIX}/${QTCONF_DEST_DIR}/qt.conf\" \"\")
+ " COMPONENT Runtime)
-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")
+# Dirs to look for dependencies.
+SET(DIRS ${QT_LIBRARY_DIRS})
+INSTALL(CODE "
+ file(GLOB_RECURSE QTPLUGINS
+ \"\${CMAKE_INSTALL_PREFIX}/${PLUGIN_DEST_DIR}/plugins/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
+ include(BundleUtilities)
+ fixup_bundle(\"${APPS}\" \"\${QTPLUGINS}\" \"${DIRS}\")
+ " COMPONENT Runtime)
+
+
+#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 ################
# Package with CPack
IF(UNIX)
@@ -216,6 +299,24 @@ IF(UNIX)
ELSEIF(WIN32)
SET(CPACK_GENERATOR "ZIP")
ENDIF()
-set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0)
-set(CPACK_PACKAGE_FILE_NAME "MultiMC")
+SET(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0)
+
+SET(CPACK_PACKAGE_NAME "MultiMC 5")
+SET(CPACK_PACKAGE_VENDOR "")
+SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "MultiMC - Minecraft launcher and management tool.")
+SET(CPACK_PACKAGE_VERSION "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}.${MultiMC_VERSION_REV}.${MultiMC_VERSION_BUILD}")
+SET(CPACK_PACKAGE_VERSION_MAJOR ${MultiMC_VERSION_MAJOR})
+SET(CPACK_PACKAGE_VERSION_MINOR ${MultiMC_VERSION_MINOR})
+SET(CPACK_PACKAGE_VERSION_PATCH ${MultiMC_VERSION_REV})
+
+IF(CPACK_GENERATOR STREQUAL "NSIS")
+SET(CPACK_PACKAGE_FILE_NAME "Setup-MultiMC")
+ELSE()
+SET(CPACK_PACKAGE_FILE_NAME "MultiMC")
+ENDIF()
+
+IF(WIN32)
+SET(CPACK_PACKAGE_INSTALL_DIRECTORY "MultiMC 5")
+ENDIF()
+
INCLUDE(CPack)
diff --git a/MultiMC.icns b/MultiMC.icns
new file mode 100644
index 00000000..f96fd5a4
--- /dev/null
+++ b/MultiMC.icns
Binary files differ
diff --git a/data/siglist.h b/data/siglist.h
new file mode 100644
index 00000000..b6432b6e
--- /dev/null
+++ b/data/siglist.h
@@ -0,0 +1,130 @@
+/* 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 SIGLIST_H
+#define SIGLIST_H
+
+#include <QObject>
+#include <QList>
+
+// A QList that allows emitting signals when the list changes.
+// Since QObject doesn't support templates, to use this class with a
+// certain type, you should create a class deriving from SigList<T> and then
+// call the DEFINE_SIGLIST_SIGNALS(T) and SETUP_SIGLIST_SIGNALS(T) macros.
+template <typename T>
+class SigList : public QList<T>
+{
+
+public:
+ explicit SigList() : QList<T>() {}
+
+ virtual void append(const T &value);
+ virtual void append(const QList<T> &other);
+
+ virtual void clear();
+
+ virtual void erase(iterator pos);
+ virtual void erase(iterator first, iterator last);
+
+ virtual void insert(int i, const T &t);
+ virtual void insert(iterator before, const T &t);
+
+ virtual void move(int from, int to);
+
+ virtual void pop_back() { takeLast(); }
+ virtual void pop_front() { takeFirst(); }
+
+ virtual void push_back(const T &t) { append(t); }
+ virtual void push_front(const T &t) { prepend(t); }
+
+ virtual void prepend(const T &t);
+
+ virtual int removeAll(const T &t);
+ virtual bool removeOne(const T &t);
+
+ virtual void removeAt(int i) { takeAt(i); }
+ virtual void removeFirst() { takeFirst(); }
+ virtual void removeLast() { takeLast(); }
+
+ virtual void swap(QList<T> &other);
+ virtual void swap(int i, int j);
+
+ virtual T takeAt(int i);
+ virtual T takeFirst();
+ virtual T takeLast();
+
+ virtual QList<T> &operator +=(const QList<T> &other) { append(other); return *this; }
+ virtual QList<T> &operator +=(const T &value) { append(value); return *this; }
+ virtual QList<T> &operator <<(const QList<T> &other) { append(other); return *this; }
+ virtual QList<T> &operator <<(const T &value) { append(value); return *this; }
+
+ virtual QList<T> &operator =(const QList<T> &other);
+
+
+ // Signal emitted after an item is added to the list.
+ // Contains a reference to item and the item's new index.
+ virtual void onItemAdded(const T &item, int index) = 0;
+
+ // Signal emitted after multiple items are added to the list at once.
+ // The items parameter is a const reference to a QList of the items that
+ // were added.
+ // The firstIndex parameter is the new index of the first item added.
+ virtual void onItemsAdded(const QList<T> &items, int firstIndex) = 0;
+
+ // Signal emitted after an item is removed to the list.
+ // Contains a reference to the item and the item's old index.
+ virtual void onItemRemoved(const T &item, int index) = 0;
+
+ // Signal emitted after multiple items are removed from the list at once.
+ // The items parameter is a const reference to a QList of the items that
+ // were added.
+ // The firstIndex parameter is the new index of the first item added.
+ virtual void onItemsRemoved(const QList<T> &items, int firstIndex) = 0;
+
+ // Signal emitted after an item is moved to another index.
+ // Contains the item, the old index, and the new index.
+ virtual void onItemMoved(const T &item, int oldIndex, int newIndex) = 0;
+
+ // Signal emitted after an operation that changes the whole list occurs.
+ // This signal should be treated as if all data in the entire list was cleared
+ // and new data added in its place.
+ virtual void onInvalidated() = 0;
+};
+
+// Defines the signals for a SigList
+#define DEFINE_SIGLIST_SIGNALS(TYPE) \
+ Q_SIGNAL void itemAdded(TYPE const &item, int index);\
+ Q_SIGNAL void itemsAdded(const QList<TYPE> &items, int firstIndex);\
+ Q_SIGNAL void itemRemoved(TYPE const &item, int index);\
+ Q_SIGNAL void itemsRemoved(const QList<TYPE> &items, int firstIndex);\
+ Q_SIGNAL void itemMoved(TYPE const &item, int oldIndex, int newIndex);\
+ Q_SIGNAL void invalidated();
+
+// Overrides the onItem* functions and causes them to emit their corresponding
+// signals.
+#define SETUP_SIGLIST_SIGNALS(TYPE) \
+ virtual void onItemAdded(TYPE const &item, int index)\
+ { emit itemAdded(item, index); }\
+ virtual void onItemsAdded(const QList<TYPE> &items, int firstIndex)\
+ { emit itemsAdded(items, firstIndex); }\
+ virtual void onItemRemoved(TYPE const &item, int index)\
+ { emit itemRemoved(item, index); }\
+ virtual void onItemsRemoved(const QList<TYPE> &items, int firstIndex)\
+ { emit itemsRemoved(items, firstIndex); }\
+ virtual void onItemMoved(TYPE const &item, int oldIndex, int newIndex)\
+ { emit itemMoved(item, oldIndex, newIndex); }\
+ virtual void onInvalidated() { emit invalidated(); }
+
+#endif // SIGLIST_H
diff --git a/data/siglist_imp.h b/data/siglist_imp.h
new file mode 100644
index 00000000..16ddd9b0
--- /dev/null
+++ b/data/siglist_imp.h
@@ -0,0 +1,156 @@
+/* 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 "siglist.h"
+
+template <typename T>
+void SigList<T>::append(const T &value)
+{
+ QList<T>::append(value);
+ onItemAdded(value, length() - 1);
+}
+
+template <typename T>
+void SigList<T>::prepend(const T &value)
+{
+ QList<T>::prepend(value);
+ onItemAdded(value, 0);
+}
+
+template <typename T>
+void SigList<T>::append(const QList<T> &other)
+{
+ int index = length();
+ QList<T>::append(other);
+ onItemsAdded(other, index);
+}
+
+template <typename T>
+void SigList<T>::clear()
+{
+ QList<T>::clear();
+ onInvalidated();
+}
+
+template <typename T>
+void SigList<T>::erase(QList<T>::iterator pos)
+{
+ T value = *pos;
+ int index = indexOf(*pos);
+ QList<T>::erase(pos);
+ onItemRemoved(value, index);
+}
+
+template <typename T>
+void SigList<T>::erase(QList<T>::iterator first, QList<T>::iterator last)
+{
+ QList<T> removedValues;
+ int firstIndex = indexOf(*first);
+
+ for (QList<T>::iterator iter = first; iter < last; iter++)
+ {
+ removedValues << *iter;
+ QList<T>::erase(iter);
+ }
+
+ onItemsRemoved(removedValues, firstIndex);
+}
+
+template <typename T>
+void SigList<T>::insert(int i, const T &t)
+{
+ QList<T>::insert(i, t);
+ onItemAdded(t, i);
+}
+
+template <typename T>
+void SigList<T>::insert(QList<T>::iterator before, const T &t)
+{
+ QList<T>::insert(before, t);
+ onItemAdded(t, indexOf(t));
+}
+
+template <typename T>
+void SigList<T>::move(int from, int to)
+{
+ const T &item = at(from);
+ QList<T>::move(from, to);
+ onItemMoved(item, from, to);
+}
+
+template <typename T>
+int SigList<T>::removeAll(const T &t)
+{
+ int retVal = QList<T>::removeAll(t);
+ onInvalidated();
+ return retVal;
+}
+
+template <typename T>
+bool SigList<T>::removeOne(const T &t)
+{
+ int index = indexOf(t);
+ if (QList<T>::removeOne(t))
+ {
+ onItemRemoved(t, index);
+ return true;
+ }
+ return false;
+}
+
+template <typename T>
+void SigList<T>::swap(QList<T> &other)
+{
+ QList<T>::swap(other);
+ onInvalidated();
+}
+
+template <typename T>
+void SigList<T>::swap(int i, int j)
+{
+ const T &item1 = at(i);
+ const T &item2 = at(j);
+ QList<T>::swap(i, j);
+ onItemMoved(item1, i, j);
+ onItemMoved(item2, j, i);
+}
+
+template <typename T>
+T SigList<T>::takeAt(int i)
+{
+ T val = QList<T>::takeAt(i);
+ onItemRemoved(val, i);
+ return val;
+}
+
+template <typename T>
+T SigList<T>::takeFirst()
+{
+ return takeAt(0);
+}
+
+template <typename T>
+T SigList<T>::takeLast()
+{
+ return takeAt(length() - 1);
+}
+
+template <typename T>
+QList<T> &SigList<T>::operator =(const QList<T> &other)
+{
+ QList<T>::operator =(other);
+ onInvalidated();
+ return *this;
+}
diff --git a/dependencies.cmake.in b/dependencies.cmake.in
index 1790b97b..9d4d1f63 100644
--- a/dependencies.cmake.in
+++ b/dependencies.cmake.in
@@ -4,6 +4,12 @@ message(STATUS "Running install script...")
SET(Qt5_DIR @Qt5_DIR@)
+IF(WIN32)
+SET(LIB_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
+ELSE()
+SET(LIB_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}/lib)
+ENDIF()
+
INCLUDE(GetPrerequisites)
GET_PREREQUISITES(@BINARY_LOCATION@ MULTIMC_PREREQS 1 1 "" "")
@@ -11,13 +17,15 @@ message(STATUS "Prerequisites: ${MULTIMC_PREREQS}")
FOREACH(PREREQ ${MULTIMC_PREREQS})
GET_FILENAME_COMPONENT(PREREQ_NAME "${PREREQ}" NAME)
- GET_FILENAME_COMPONENT(_PREREQ_ACTUAL "${PREREQ}" REALPATH)
+ GET_FILENAME_COMPONENT(PREREQ_ACTUAL "${PREREQ}" REALPATH)
+ IF(WIN32)
SET(PREREQ_ACTUAL "${Qt5_DIR}/bin/${PREREQ}")
+ ENDIF()
message(STATUS "Adding install prerequisite: ${PREREQ_NAME}")
FILE(INSTALL
- DESTINATION "${CMAKE_INSTALL_PREFIX}"
+ DESTINATION "${LIB_INSTALL_PREFIX}"
TYPE PROGRAM
RENAME "${PREREQ_NAME}"
FILES "${PREREQ_ACTUAL}"
diff --git a/package/linux/MultiMC b/package/linux/MultiMC
new file mode 100755
index 00000000..235d17c5
--- /dev/null
+++ b/package/linux/MultiMC
@@ -0,0 +1,9 @@
+#!/bin/sh
+# Basic start script for running MultiMC with the libs packaged with it.
+
+MMC_DIR=$(dirname "$0")
+cd "${MMC_DIR}"
+
+export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"./lib"
+export QT_PLUGIN_PATH=$QT_PLUGIN_PATH:"."
+exec ./bin/MultiMC