From dd2e836b4cf4cfa043f9ea2911f58f1d22d4e282 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 20 Feb 2013 19:10:09 -0600 Subject: Split MultiMC up into a few separate libraries. Fixed plugin system. Tons of other stuff... --- libutil/include/apputils.h | 21 ++++++ libutil/include/inifile.h | 38 ++++++++++ libutil/include/libutil_config.h | 27 +++++++ libutil/include/osutils.h | 29 ++++++++ libutil/include/pathutils.h | 28 +++++++ libutil/include/siglist.h | 130 ++++++++++++++++++++++++++++++++ libutil/include/siglist_impl.h | 156 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 429 insertions(+) create mode 100644 libutil/include/apputils.h create mode 100644 libutil/include/inifile.h create mode 100644 libutil/include/libutil_config.h create mode 100644 libutil/include/osutils.h create mode 100644 libutil/include/pathutils.h create mode 100644 libutil/include/siglist.h create mode 100644 libutil/include/siglist_impl.h (limited to 'libutil/include') 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/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 +#include +#include + +#include "libutil_config.h" + +// Sectionless INI parser (for instance config files) +class LIBMMCUTIL_EXPORT INIFile : public QMap +{ +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 + +#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 + +#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 + +#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..b6432b6e --- /dev/null +++ b/libutil/include/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 +#include + +// 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 and then +// call the DEFINE_SIGLIST_SIGNALS(T) and SETUP_SIGLIST_SIGNALS(T) macros. +template +class SigList : public QList +{ + +public: + explicit SigList() : QList() {} + + virtual void append(const T &value); + virtual void append(const QList &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 &other); + virtual void swap(int i, int j); + + virtual T takeAt(int i); + virtual T takeFirst(); + virtual T takeLast(); + + virtual QList &operator +=(const QList &other) { append(other); return *this; } + virtual QList &operator +=(const T &value) { append(value); return *this; } + virtual QList &operator <<(const QList &other) { append(other); return *this; } + virtual QList &operator <<(const T &value) { append(value); return *this; } + + virtual QList &operator =(const QList &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 &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 &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 &items, int firstIndex);\ + Q_SIGNAL void itemRemoved(TYPE const &item, int index);\ + Q_SIGNAL void itemsRemoved(const QList &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 &items, int firstIndex)\ + { emit itemsAdded(items, firstIndex); }\ + virtual void onItemRemoved(TYPE const &item, int index)\ + { emit itemRemoved(item, index); }\ + virtual void onItemsRemoved(const QList &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..16ddd9b0 --- /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 +void SigList::append(const T &value) +{ + QList::append(value); + onItemAdded(value, length() - 1); +} + +template +void SigList::prepend(const T &value) +{ + QList::prepend(value); + onItemAdded(value, 0); +} + +template +void SigList::append(const QList &other) +{ + int index = length(); + QList::append(other); + onItemsAdded(other, index); +} + +template +void SigList::clear() +{ + QList::clear(); + onInvalidated(); +} + +template +void SigList::erase(QList::iterator pos) +{ + T value = *pos; + int index = indexOf(*pos); + QList::erase(pos); + onItemRemoved(value, index); +} + +template +void SigList::erase(QList::iterator first, QList::iterator last) +{ + QList removedValues; + int firstIndex = indexOf(*first); + + for (QList::iterator iter = first; iter < last; iter++) + { + removedValues << *iter; + QList::erase(iter); + } + + onItemsRemoved(removedValues, firstIndex); +} + +template +void SigList::insert(int i, const T &t) +{ + QList::insert(i, t); + onItemAdded(t, i); +} + +template +void SigList::insert(QList::iterator before, const T &t) +{ + QList::insert(before, t); + onItemAdded(t, indexOf(t)); +} + +template +void SigList::move(int from, int to) +{ + const T &item = at(from); + QList::move(from, to); + onItemMoved(item, from, to); +} + +template +int SigList::removeAll(const T &t) +{ + int retVal = QList::removeAll(t); + onInvalidated(); + return retVal; +} + +template +bool SigList::removeOne(const T &t) +{ + int index = indexOf(t); + if (QList::removeOne(t)) + { + onItemRemoved(t, index); + return true; + } + return false; +} + +template +void SigList::swap(QList &other) +{ + QList::swap(other); + onInvalidated(); +} + +template +void SigList::swap(int i, int j) +{ + const T &item1 = at(i); + const T &item2 = at(j); + QList::swap(i, j); + onItemMoved(item1, i, j); + onItemMoved(item2, j, i); +} + +template +T SigList::takeAt(int i) +{ + T val = QList::takeAt(i); + onItemRemoved(val, i); + return val; +} + +template +T SigList::takeFirst() +{ + return takeAt(0); +} + +template +T SigList::takeLast() +{ + return takeAt(length() - 1); +} + +template +QList &SigList::operator =(const QList &other) +{ + QList::operator =(other); + onInvalidated(); + return *this; +} -- cgit v1.2.3 From e9ef332ec409209626716da43ab8bb14651723b4 Mon Sep 17 00:00:00 2001 From: Andrew Okin Date: Thu, 21 Feb 2013 12:10:10 -0600 Subject: Fixed some issues with GCC. --- libutil/include/siglist.h | 2 ++ libutil/include/siglist_impl.h | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) (limited to 'libutil/include') diff --git a/libutil/include/siglist.h b/libutil/include/siglist.h index b6432b6e..347cf752 100644 --- a/libutil/include/siglist.h +++ b/libutil/include/siglist.h @@ -26,6 +26,8 @@ template class SigList : public QList { +private: + typedef typename QList::iterator iterator; public: explicit SigList() : QList() {} diff --git a/libutil/include/siglist_impl.h b/libutil/include/siglist_impl.h index 16ddd9b0..cb37ea4b 100644 --- a/libutil/include/siglist_impl.h +++ b/libutil/include/siglist_impl.h @@ -19,7 +19,7 @@ template void SigList::append(const T &value) { QList::append(value); - onItemAdded(value, length() - 1); + onItemAdded(value, QList::length() - 1); } template @@ -32,7 +32,7 @@ void SigList::prepend(const T &value) template void SigList::append(const QList &other) { - int index = length(); + int index = QList::length(); QList::append(other); onItemsAdded(other, index); } @@ -45,7 +45,7 @@ void SigList::clear() } template -void SigList::erase(QList::iterator pos) +void SigList::erase(SigList::iterator pos) { T value = *pos; int index = indexOf(*pos); @@ -54,12 +54,12 @@ void SigList::erase(QList::iterator pos) } template -void SigList::erase(QList::iterator first, QList::iterator last) +void SigList::erase(SigList::iterator first, SigList::iterator last) { QList removedValues; int firstIndex = indexOf(*first); - for (QList::iterator iter = first; iter < last; iter++) + for (SigList::iterator iter = first; iter < last; iter++) { removedValues << *iter; QList::erase(iter); @@ -76,7 +76,7 @@ void SigList::insert(int i, const T &t) } template -void SigList::insert(QList::iterator before, const T &t) +void SigList::insert(SigList::iterator before, const T &t) { QList::insert(before, t); onItemAdded(t, indexOf(t)); @@ -85,7 +85,7 @@ void SigList::insert(QList::iterator before, const T &t) template void SigList::move(int from, int to) { - const T &item = at(from); + const T &item = QList::at(from); QList::move(from, to); onItemMoved(item, from, to); } @@ -120,8 +120,8 @@ void SigList::swap(QList &other) template void SigList::swap(int i, int j) { - const T &item1 = at(i); - const T &item2 = at(j); + const T &item1 = QList::at(i); + const T &item2 = QList::at(j); QList::swap(i, j); onItemMoved(item1, i, j); onItemMoved(item2, j, i); @@ -144,7 +144,7 @@ T SigList::takeFirst() template T SigList::takeLast() { - return takeAt(length() - 1); + return takeAt(QList::length() - 1); } template -- cgit v1.2.3 From 2020d9c24bf0c2d024a3f42f38d7e106ab8a49eb Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 21 Feb 2013 12:42:16 -0600 Subject: Fixed MSVC issues. --- libutil/include/siglist.h | 9 +++------ libutil/include/siglist_impl.h | 6 +++--- 2 files changed, 6 insertions(+), 9 deletions(-) (limited to 'libutil/include') diff --git a/libutil/include/siglist.h b/libutil/include/siglist.h index 347cf752..dcae7c04 100644 --- a/libutil/include/siglist.h +++ b/libutil/include/siglist.h @@ -26,9 +26,6 @@ template class SigList : public QList { -private: - typedef typename QList::iterator iterator; - public: explicit SigList() : QList() {} @@ -37,11 +34,11 @@ public: virtual void clear(); - virtual void erase(iterator pos); - virtual void erase(iterator first, iterator last); + virtual void erase(typename QList::iterator pos); + virtual void erase(typename QList::iterator first, typename QList::iterator last); virtual void insert(int i, const T &t); - virtual void insert(iterator before, const T &t); + virtual void insert(typename QList::iterator before, const T &t); virtual void move(int from, int to); diff --git a/libutil/include/siglist_impl.h b/libutil/include/siglist_impl.h index cb37ea4b..9736b2cf 100644 --- a/libutil/include/siglist_impl.h +++ b/libutil/include/siglist_impl.h @@ -45,7 +45,7 @@ void SigList::clear() } template -void SigList::erase(SigList::iterator pos) +void SigList::erase(typename QList::iterator pos) { T value = *pos; int index = indexOf(*pos); @@ -54,7 +54,7 @@ void SigList::erase(SigList::iterator pos) } template -void SigList::erase(SigList::iterator first, SigList::iterator last) +void SigList::erase(typename QList::iterator first, typename QList::iterator last) { QList removedValues; int firstIndex = indexOf(*first); @@ -76,7 +76,7 @@ void SigList::insert(int i, const T &t) } template -void SigList::insert(SigList::iterator before, const T &t) +void SigList::insert(typename QList::iterator before, const T &t) { QList::insert(before, t); onItemAdded(t, indexOf(t)); -- cgit v1.2.3 From 50d1f62bf4a8d70466100463238228bc8305a5c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Thu, 21 Feb 2013 19:59:34 +0100 Subject: More GCC fixes --- libutil/include/siglist_impl.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'libutil/include') diff --git a/libutil/include/siglist_impl.h b/libutil/include/siglist_impl.h index 9736b2cf..5cdc632a 100644 --- a/libutil/include/siglist_impl.h +++ b/libutil/include/siglist_impl.h @@ -48,7 +48,7 @@ template void SigList::erase(typename QList::iterator pos) { T value = *pos; - int index = indexOf(*pos); + int index = QList::indexOf(*pos); QList::erase(pos); onItemRemoved(value, index); } @@ -57,9 +57,9 @@ template void SigList::erase(typename QList::iterator first, typename QList::iterator last) { QList removedValues; - int firstIndex = indexOf(*first); + int firstIndex = QList::indexOf(*first); - for (SigList::iterator iter = first; iter < last; iter++) + for (auto iter = first; iter < last; iter++) { removedValues << *iter; QList::erase(iter); @@ -79,7 +79,7 @@ template void SigList::insert(typename QList::iterator before, const T &t) { QList::insert(before, t); - onItemAdded(t, indexOf(t)); + onItemAdded(t, QList::indexOf(t)); } template @@ -101,7 +101,7 @@ int SigList::removeAll(const T &t) template bool SigList::removeOne(const T &t) { - int index = indexOf(t); + int index = QList::indexOf(t); if (QList::removeOne(t)) { onItemRemoved(t, index); -- cgit v1.2.3