This commit is contained in:
Orochimarufan 2013-02-20 13:17:03 +01:00
commit 519f66efee
4 changed files with 381 additions and 110 deletions

View File

@ -143,6 +143,8 @@ data/stdinstance.h
data/version.h data/version.h
data/userinfo.h data/userinfo.h
data/loginresponse.h data/loginresponse.h
data/siglist.h
data/siglist_imp.h
util/apputils.h util/apputils.h
util/pathutils.h util/pathutils.h
@ -174,17 +176,31 @@ gui/taskdialog.ui
gui/browserdialog.ui gui/browserdialog.ui
) )
################################ 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) IF (WIN32)
SET(MultiMC_LINK_ADDITIONAL_LIBS ${MultiMC_LINK_ADDITIONAL_LIBS} SET(MultiMC_LINK_ADDITIONAL_LIBS ${MultiMC_LINK_ADDITIONAL_LIBS}
Ws2_32) Qt5::WinMain
ENDIF() )
ENDIF (WIN32)
SET_SOURCE_FILES_PROPERTIES(resources/MultiMCLauncher.jar GENERATED) SET_SOURCE_FILES_PROPERTIES(resources/MultiMCLauncher.jar GENERATED)
QT5_WRAP_UI(MULTIMC_UI ${MULTIMC5_UIS}) QT5_WRAP_UI(MULTIMC_UI ${MULTIMC5_UIS})
QT5_ADD_RESOURCES(MULTIMC_QRC multimc.qrc) 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 WebKitWidgets) qt5_use_modules(MultiMC Widgets Network WebKitWidgets)
target_link_libraries(MultiMC quazip patchlib ${MultiMC_LINK_ADDITIONAL_LIBS}) target_link_libraries(MultiMC quazip patchlib ${MultiMC_LINK_ADDITIONAL_LIBS})
add_dependencies(MultiMC MultiMCLauncher) add_dependencies(MultiMC MultiMCLauncher)
@ -195,126 +211,95 @@ ELSE()
install(TARGETS MultiMC RUNTIME DESTINATION bin) install(TARGETS MultiMC RUNTIME DESTINATION bin)
ENDIF() ENDIF()
################ Dirs ################
SET(PLUGIN_DEST_DIR bin)
# Extra libs and files to package. SET(QTCONF_DEST_DIR bin)
SET(APPS "\${CMAKE_INSTALL_PREFIX}/bin/MultiMC")
IF(WIN32) IF(WIN32)
SET(LIB_INSTALL_PREFIX .) #SET(PLUGIN_DEST_DIR .)
SET(LIB_INSTALL_PREFIX_ABS ${CMAKE_INSTALL_PREFIX}) #SET(QTCONF_DEST_DIR .)
ELSE() SET(APPS "\${CMAKE_INSTALL_PREFIX}/bin/MultiMC.exe")
SET(LIB_INSTALL_PREFIX lib)
SET(LIB_INSTALL_PREFIX_ABS ${CMAKE_INSTALL_PREFIX}/lib)
ENDIF() ENDIF()
# Image format plugins.
SET(IMAGE_FORMAT_PLUGINS svg ico gif jpeg)
INCLUDE(GetPrerequisites)
# Includes DLL dependencies for the given file. Does not include installed system DLLs. Recursive.
MACRO(INCLUDE_DLL_DEPS DLL_FILE DEST)
GET_PREREQUISITES(${DLL_FILE} DLL_PREREQS 1 1 "" "")
MESSAGE(STATUS "Installing ${DLL_FILE} and its prerequisites.")
INSTALL(FILES ${DLL_FILE} DESTINATION ${DEST})
FOREACH(PREREQ ${DLL_PREREQS})
GET_FILENAME_COMPONENT(PREREQ_NAME "${PREREQ}" NAME)
GET_FILENAME_COMPONENT(PREREQ_ACTUAL "${PREREQ}" REALPATH)
IF(WIN32)
SET(PREREQ_ACTUAL "${Qt5_DIR}/bin/${PREREQ}")
ENDIF()
MESSAGE(STATUS "Adding install prerequisite for ${DLL_FILE}: ${PREREQ_NAME}")
INSTALL(FILES ${PREREQ_ACTUAL} RENAME ${PREREQ_NAME} DESTINATION ${LIB_INSTALL_PREFIX})
ENDFOREACH()
ENDMACRO()
MACRO(INSTALL_SYMLINK_DEST LINK_FILENAME DEST)
GET_FILENAME_COMPONENT(DEST_NAME "${LINK_FILENAME}" NAME)
GET_FILENAME_COMPONENT(DEST_ACTUAL "${LINK_FILENAME}" REALPATH)
INSTALL(FILES "${DEST_ACTUAL}" RENAME "${DEST_NAME}" DESTINATION "${DEST}")
ENDMACRO()
SET(Qt5_DIR $ENV{QTDIR})
IF(WIN32)
# Windows
IF(CMAKE_BUILD_TYPE STREQUAL "Debug")
SET(D "d")
ELSE()
SET(D "")
ENDIF()
# Install platform plugins.
SET(PLATFORM_PLUGINS windows minimal)
FOREACH(PLATFORM_PLUGIN ${PLATFORM_PLUGINS})
INCLUDE_DLL_DEPS("${Qt5_DIR}/plugins/platforms/q${PLATFORM_PLUGIN}${D}.dll" platforms)
ENDFOREACH()
# Install image format plugins.
FOREACH(IMGFMT_PLUGIN ${IMAGE_FORMAT_PLUGINS})
INCLUDE_DLL_DEPS("${Qt5_DIR}/plugins/imageformats/q${IMGFMT_PLUGIN}${D}.dll" imageformats)
ENDFOREACH()
ELSEIF(UNIX)
IF(APPLE) IF(APPLE)
SET(PLUGIN_DEST_DIR MultiMC.app/Contents/MacOS)
# OS X SET(QTCONF_DEST_DIR MultiMC.app/Contents/Resources)
# TODO: OS X packaging support SET(APPS "\${CMAKE_INSTALL_PREFIX}/MultiMC.app")
ELSE()
# Linux
# Install platform plugins.
SET(PLATFORM_PLUGINS linuxfb xcb minimal)
FOREACH(PLATFORM_PLUGIN ${PLATFORM_PLUGINS})
INCLUDE_DLL_DEPS("${Qt5_DIR}/plugins/platforms/libq${PLATFORM_PLUGIN}.so" platforms)
ENDFOREACH()
# Install image format plugins.
FOREACH(IMGFMT_PLUGIN ${IMAGE_FORMAT_PLUGINS})
INCLUDE_DLL_DEPS("${Qt5_DIR}/plugins/imageformats/libq${IMGFMT_PLUGIN}.so" imageformats)
ENDFOREACH()
# This just turns into a mess. It's probably better to leave installing dependencies to the user.
IF(INCLUDE_BULLSHIT_DLLS)
# This stuff *should* be added automatically by the INCLUDE_ALL_DLL_DEPS macro. Include them manually just in case.
# Install ICU libs
SET(ICU_LIBS data i18n io le lx test tu uc)
FOREACH(ICU_LIB ${ICU_LIBS})
INSTALL_SYMLINK_DEST("/usr/lib/libicu${ICU_LIB}.so.48" ${LIB_INSTALL_PREFIX})
ENDFOREACH()
SET(XCB_LIBS render-util.so.0 image.so.0 icccm.so.4 sync.so.0 xfixes.so.0)
FOREACH(XCB_LIB ${XCB_LIBS})
INSTALL_SYMLINK_DEST("/usr/lib/libxcb-${XCB_LIB}" ${LIB_INSTALL_PREFIX})
ENDFOREACH()
ENDIF() ENDIF()
# Install the start script. SET(QT_PLUGINS_DIR ${Qt5_DIR}/plugins)
INSTALL(FILES "${CMAKE_CURRENT_SOURCE_DIR}/package/linux/MultiMC" DESTINATION .) SET(QT_LIBRARY_DIRS ${Qt5_DIR}/lib)
ENDIF()
ENDIF()
GET_TARGET_PROPERTY(BINARY_LOCATION MultiMC LOCATION) ################ OS X Bundle Info ################
CONFIGURE_FILE(
"${CMAKE_CURRENT_SOURCE_DIR}/dependencies.cmake.in" IF(APPLE)
"${CMAKE_CURRENT_BINARY_DIR}/dependencies.cmake" SET(MACOSX_BUNDLE_BUNDLE_NAME "MultiMC")
@ONLY 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
) )
INSTALL(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/dependencies.cmake") 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)
# 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 # Package with CPack
IF(UNIX) IF(UNIX)

BIN
MultiMC.icns Normal file

Binary file not shown.

130
data/siglist.h Normal file
View File

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

156
data/siglist_imp.h Normal file
View File

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