diff options
author | Orochimarufan <orochimarufan.x3@gmail.com> | 2013-02-21 20:40:32 +0100 |
---|---|---|
committer | Orochimarufan <orochimarufan.x3@gmail.com> | 2013-02-21 20:40:32 +0100 |
commit | ca1fd44637ad5ce9ec287ff71addd38e98f66f4f (patch) | |
tree | 3642ff488dd144b014131de48bf926c6e3d1043c /libutil/include | |
parent | 576e979df4a54df9bf5ffeae3559f488b3045268 (diff) | |
parent | 50d1f62bf4a8d70466100463238228bc8305a5c7 (diff) | |
download | MultiMC-ca1fd44637ad5ce9ec287ff71addd38e98f66f4f.tar MultiMC-ca1fd44637ad5ce9ec287ff71addd38e98f66f4f.tar.gz MultiMC-ca1fd44637ad5ce9ec287ff71addd38e98f66f4f.tar.lz MultiMC-ca1fd44637ad5ce9ec287ff71addd38e98f66f4f.tar.xz MultiMC-ca1fd44637ad5ce9ec287ff71addd38e98f66f4f.zip |
Merge branch 'master' of http://github.com/peterix/MultiMC5
Conflicts:
CMakeLists.txt
gui/mainwindow.cpp
main.cpp
Diffstat (limited to 'libutil/include')
-rw-r--r-- | libutil/include/apputils.h | 21 | ||||
-rw-r--r-- | libutil/include/cmdutils.h | 239 | ||||
-rw-r--r-- | libutil/include/inifile.h | 38 | ||||
-rw-r--r-- | libutil/include/libutil_config.h | 27 | ||||
-rw-r--r-- | libutil/include/osutils.h | 29 | ||||
-rw-r--r-- | libutil/include/pathutils.h | 28 | ||||
-rw-r--r-- | libutil/include/siglist.h | 129 | ||||
-rw-r--r-- | libutil/include/siglist_impl.h | 156 | ||||
-rw-r--r-- | libutil/include/userutils.h | 17 |
9 files changed, 684 insertions, 0 deletions
diff --git a/libutil/include/apputils.h b/libutil/include/apputils.h new file mode 100644 index 00000000..a64adc50 --- /dev/null +++ b/libutil/include/apputils.h @@ -0,0 +1,21 @@ +/* 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 APPUTILS_H +#define APPUTILS_H + +#define STR_VAL(val) # val + +#endif // APPUTILS_H diff --git a/libutil/include/cmdutils.h b/libutil/include/cmdutils.h new file mode 100644 index 00000000..fc1162d9 --- /dev/null +++ b/libutil/include/cmdutils.h @@ -0,0 +1,239 @@ +/* Copyright 2013 MultiMC Contributors + * + * Authors: Orochimarufan <orochimarufan.x3@gmail.com> + * + * 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 CMDUTILS_H +#define CMDUTILS_H + +#include <exception> + +#include <QString> +#include <QVariant> +#include <QHash> +#include <QStringList> + +/** + * @file libutil/include/cmdutils.h + * @brief commandline parsing utilities + */ + +namespace Util { +namespace Commandline { + +/** + * @brief The FlagStyle enum + * Specifies how flags are decorated + */ +enum class FlagStyle { + GNU, /**< --option and -o (GNU Style) */ + Unix, /**< -option and -o (Unix Style) */ + Windows, /**< /option and /o (Windows Style) */ +#ifdef Q_OS_WIN32 + Default = Windows +#else + Default = GNU +#endif +}; + +/** + * @brief The ArgumentStyle enum + */ +enum class ArgumentStyle { + Space, /**< --option=value */ + Equals, /**< --option value */ + SpaceAndEquals, /**< --option[= ]value */ +#ifdef Q_OS_WIN32 + Default = Equals +#else + Default = SpaceAndEquals +#endif +}; + +/** + * @brief The ParsingError class + */ +class ParsingError : public std::exception +{ +public: + ParsingError(const QString &what); + ParsingError(const ParsingError &e); + ~ParsingError() throw() {} + const char *what() const throw(); + QString qwhat() const; +private: + QString m_what; +}; + +/** + * @brief The Parser class + */ +class Parser +{ +public: + /** + * @brief Parser constructor + * @param flagStyle the FlagStyle to use in this Parser + * @param argStyle the ArgumentStyle to use in this Parser + */ + Parser(FlagStyle flagStyle=FlagStyle::Default, ArgumentStyle argStyle=ArgumentStyle::Default); + + /** + * @brief set the flag style + * @param style + */ + void setFlagStyle(FlagStyle style); + + /** + * @brief get the flag style + * @return + */ + FlagStyle flagStyle(); + + /** + * @brief set the argument style + * @param style + */ + void setArgumentStyle(ArgumentStyle style); + + /** + * @brief get the argument style + * @return + */ + ArgumentStyle argumentStyle(); + + /** + * @brief define a boolean switch + * @param name the parameter name + * @param def the default value + */ + void addSwitch(QString name, bool def=false); + + /** + * @brief define an option that takes an additional argument + * @param name the parameter name + * @param def the default value + */ + void addOption(QString name, QVariant def=QVariant()); + + /** + * @brief define a positional argument + * @param name the parameter name + * @param required wether this argument is required + * @param def the default value + */ + void addArgument(QString name, bool required=true, QVariant def=QVariant()); + + /** + * @brief adds a flag to an existing parameter + * @param name the (existing) parameter name + * @param flag the flag character + * @see addSwitch addArgument addOption + * Note: any one parameter can only have one flag + */ + void addShortOpt(QString name, QChar flag); + + /** + * @brief adds documentation to a Parameter + * @param name the parameter name + * @param metavar a string to be displayed as placeholder for the value + * @param doc a QString containing the documentation + * Note: on positional arguments, metavar replaces the name as displayed. + * on options , metavar replaces the value placeholder + */ + void addDocumentation(QString name, QString doc, QString metavar=QString()); + + /** + * @brief generate a help message + * @param progName the program name to use in the help message + * @param helpIndent how much the parameter documentation should be indented + * @param flagsInUsage whether we should use flags instead of options in the usage + * @return a help message + */ + QString compileHelp(QString progName, int helpIndent=22, bool flagsInUsage=true); + + /** + * @brief generate a short usage message + * @param progName the program name to use in the usage message + * @param useFlags whether we should use flags instead of options + * @return a usage message + */ + QString compileUsage(QString progName, bool useFlags=true); + + /** + * @brief parse + * @param argv a QStringList containing the program ARGV + * @return a QHash mapping argument names to their values + */ + QHash<QString, QVariant> parse(QStringList argv); + + /** + * @brief clear all definitions + */ + void clear(); + + ~Parser(); + +private: + FlagStyle m_flagStyle; + ArgumentStyle m_argStyle; + + enum class OptionType { + Switch, + Option + }; + + // Important: the common part MUST BE COMMON ON ALL THREE structs + struct CommonDef { + QString name; + QString doc; + QString metavar; + QVariant def; + }; + + struct OptionDef { + // common + QString name; + QString doc; + QString metavar; + QVariant def; + // option + OptionType type; + QChar flag; + }; + + struct PositionalDef { + // common + QString name; + QString doc; + QString metavar; + QVariant def; + // positional + bool required; + }; + + QHash<QString, OptionDef *> m_options; + QHash<QChar, OptionDef *> m_flags; + QHash<QString, CommonDef *> m_params; + QList<PositionalDef *> m_positionals; + QList<OptionDef *> m_optionList; + + void getPrefix(QString &opt, QString &flag); +}; + +} +} + +#endif // CMDUTILS_H diff --git a/libutil/include/inifile.h b/libutil/include/inifile.h new file mode 100644 index 00000000..1280c7e3 --- /dev/null +++ b/libutil/include/inifile.h @@ -0,0 +1,38 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef INIFILE_H +#define INIFILE_H + +#include <QMap> +#include <QString> +#include <QVariant> + +#include "libutil_config.h" + +// Sectionless INI parser (for instance config files) +class LIBMMCUTIL_EXPORT INIFile : public QMap<QString, QVariant> +{ +public: + explicit INIFile(); + + bool loadFile(QString fileName); + bool saveFile(QString fileName); + + QVariant get(QString key, QVariant def) const; + void set(QString key, QVariant val); +}; + +#endif // INIFILE_H diff --git a/libutil/include/libutil_config.h b/libutil/include/libutil_config.h new file mode 100644 index 00000000..41766184 --- /dev/null +++ b/libutil/include/libutil_config.h @@ -0,0 +1,27 @@ +/* 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 LIBUTIL_CONFIG_H +#define LIBUTIL_CONFIG_H + +#include <QtCore/QtGlobal> + +#ifdef LIBMMCUTIL_LIBRARY +# define LIBMMCUTIL_EXPORT Q_DECL_EXPORT +#else +# define LIBMMCUTIL_EXPORT Q_DECL_IMPORT +#endif + +#endif // LIBUTIL_CONFIG_H diff --git a/libutil/include/osutils.h b/libutil/include/osutils.h new file mode 100644 index 00000000..c5d4bb61 --- /dev/null +++ b/libutil/include/osutils.h @@ -0,0 +1,29 @@ +/* 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 <QString> + +#if defined _WIN32 | defined _WIN64 +#define WINDOWS 1 +#elif __APPLE__ & __MACH__ +#define OSX 1 +#elif __linux__ +#define LINUX 1 +#endif + +#endif // OSUTILS_H diff --git a/libutil/include/pathutils.h b/libutil/include/pathutils.h new file mode 100644 index 00000000..d5f106ef --- /dev/null +++ b/libutil/include/pathutils.h @@ -0,0 +1,28 @@ +/* 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 PATHUTILS_H +#define PATHUTILS_H + +#include <QString> + +#include "libutil_config.h" + +LIBMMCUTIL_EXPORT QString PathCombine(QString path1, QString path2); +LIBMMCUTIL_EXPORT QString PathCombine(QString path1, QString path2, QString path3); + +LIBMMCUTIL_EXPORT QString AbsolutePath(QString path); + +#endif // PATHUTILS_H diff --git a/libutil/include/siglist.h b/libutil/include/siglist.h new file mode 100644 index 00000000..dcae7c04 --- /dev/null +++ b/libutil/include/siglist.h @@ -0,0 +1,129 @@ +/* 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(typename QList<T>::iterator pos); + virtual void erase(typename QList<T>::iterator first, typename QList<T>::iterator last); + + virtual void insert(int i, const T &t); + virtual void insert(typename QList<T>::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/libutil/include/siglist_impl.h b/libutil/include/siglist_impl.h new file mode 100644 index 00000000..5cdc632a --- /dev/null +++ b/libutil/include/siglist_impl.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, QList<T>::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 = QList<T>::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(typename QList<T>::iterator pos) +{ + T value = *pos; + int index = QList<T>::indexOf(*pos); + QList<T>::erase(pos); + onItemRemoved(value, index); +} + +template <typename T> +void SigList<T>::erase(typename QList<T>::iterator first, typename QList<T>::iterator last) +{ + QList<T> removedValues; + int firstIndex = QList<T>::indexOf(*first); + + for (auto 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(typename QList<T>::iterator before, const T &t) +{ + QList<T>::insert(before, t); + onItemAdded(t, QList<T>::indexOf(t)); +} + +template <typename T> +void SigList<T>::move(int from, int to) +{ + const T &item = QList<T>::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 = QList<T>::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 = QList<T>::at(i); + const T &item2 = QList<T>::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(QList<T>::length() - 1); +} + +template <typename T> +QList<T> &SigList<T>::operator =(const QList<T> &other) +{ + QList<T>::operator =(other); + onInvalidated(); + return *this; +} diff --git a/libutil/include/userutils.h b/libutil/include/userutils.h new file mode 100644 index 00000000..c99e758e --- /dev/null +++ b/libutil/include/userutils.h @@ -0,0 +1,17 @@ +#ifndef USERUTILS_H +#define USERUTILS_H + +#include <QString> + +namespace Util +{ + // Get the Directory representing the User's Desktop + QString getDesktopDir(); + + // Create a shortcut at *location*, pointing to *dest* called with the arguments *args* + // call it *name* and assign it the icon *icon* + // return true if operation succeeded + bool createShortCut(QString location, QString dest, QStringList args, QString name, QString iconLocation); +} + +#endif // USERUTILS_H |