diff -r 3d8ab0f89102 -r 450827da2376 src/Configuration.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Configuration.h Tue Jan 21 02:09:14 2014 +0200
@@ -0,0 +1,192 @@
+/*
+ * LDForge: LDraw parts authoring CAD
+ * Copyright (C) 2013, 2014 Santeri Piippo
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#ifndef LDFORGE_CONFIG_H
+#define LDFORGE_CONFIG_H
+
+#include "PropertyMacro.h"
+#include "Types.h"
+
+// =============================================================================
+#include
+#include
+#include
+class QSettings;
+
+#define MAX_INI_LINE 512
+#define MAX_CONFIG 512
+
+#define cfg(T, NAME, DEFAULT) \
+ Config::T##Type NAME; \
+ T##Config config_##NAME (&NAME, #NAME, DEFAULT);
+
+#define extern_cfg(T, NAME) extern Config::T##Type NAME;
+
+// =========================================================
+class Config
+{
+ PROPERTY (private, QString, Name, STR_OPS, STOCK_WRITE)
+
+ public:
+ enum Type
+ {
+ EIntType,
+ EStringType,
+ EFloatType,
+ EBoolType,
+ EKeySequenceType,
+ EListType,
+ EVertexType,
+ };
+
+ using IntType = int;
+ using StringType = QString;
+ using FloatType = float;
+ using BoolType = bool;
+ using KeySequenceType = QKeySequence;
+ using ListType = QList;
+ using VertexType = Vertex;
+
+ Config (QString name);
+
+ virtual QVariant getDefaultAsVariant() const = 0;
+ virtual Type getType() const = 0;
+ virtual bool isDefault() const = 0;
+ virtual void loadFromVariant (const QVariant& val) = 0;
+ virtual void resetValue() = 0;
+ virtual QVariant toVariant() const = 0;
+
+ // ------------------------------------------
+ static bool load();
+ static bool save();
+ static void reset();
+ static QString dirpath();
+ static QString filepath (QString file);
+
+ protected:
+ static void addToArray (Config* ptr);
+};
+
+// =============================================================================
+#define IMPLEMENT_CONFIG(NAME) \
+public: \
+ using ValueType = Config::NAME##Type; \
+ \
+ NAME##Config (ValueType* valueptr, QString name, ValueType def) : \
+ Config (name), \
+ m_valueptr (valueptr), \
+ m_default (def) \
+ { \
+ Config::addToArray (this); \
+ *m_valueptr = def; \
+ } \
+ \
+ inline ValueType getValue() const \
+ { \
+ return *m_valueptr; \
+ } \
+ \
+ inline void setValue (ValueType val) \
+ { \
+ *m_valueptr = val; \
+ } \
+ \
+ virtual Config::Type getType() const \
+ { \
+ return Config::E##NAME##Type; \
+ } \
+ \
+ virtual void resetValue() \
+ { \
+ *m_valueptr = m_default; \
+ } \
+ \
+ virtual const ValueType& getDefault() const \
+ { \
+ return m_default; \
+ } \
+ \
+ virtual bool isDefault() const \
+ { \
+ return *m_valueptr == m_default; \
+ } \
+ \
+ virtual void loadFromVariant (const QVariant& val) \
+ { \
+ *m_valueptr = val.value(); \
+ } \
+ \
+ virtual QVariant toVariant() const \
+ { \
+ return QVariant::fromValue (*m_valueptr); \
+ } \
+ \
+ virtual QVariant getDefaultAsVariant() const \
+ { \
+ return QVariant::fromValue (m_default); \
+ } \
+ \
+ static NAME##Config* getByName (QString name); \
+ \
+private: \
+ ValueType* m_valueptr; \
+ ValueType m_default;
+
+// =============================================================================
+class IntConfig : public Config
+{
+ IMPLEMENT_CONFIG (Int)
+};
+
+// =============================================================================
+class StringConfig : public Config
+{
+ IMPLEMENT_CONFIG (String)
+};
+
+// =============================================================================
+class FloatConfig : public Config
+{
+ IMPLEMENT_CONFIG (Float)
+};
+
+// =============================================================================
+class BoolConfig : public Config
+{
+ IMPLEMENT_CONFIG (Bool)
+};
+
+// =============================================================================
+class KeySequenceConfig : public Config
+{
+ IMPLEMENT_CONFIG (KeySequence)
+};
+
+// =============================================================================
+class ListConfig : public Config
+{
+ IMPLEMENT_CONFIG (List)
+};
+
+// =============================================================================
+class VertexConfig : public Config
+{
+ IMPLEMENT_CONFIG (Vertex)
+};
+
+#endif // LDFORGE_CONFIG_H