src/Configuration.h

changeset 675
450827da2376
parent 629
b75c6cce02e2
child 641
425b169a82aa
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LDFORGE_CONFIG_H
+#define LDFORGE_CONFIG_H
+
+#include "PropertyMacro.h"
+#include "Types.h"
+
+// =============================================================================
+#include <QString>
+#include <QVariant>
+#include <QKeySequence>
+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<QVariant>;
+		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<ValueType>();									\
+	}																			\
+																				\
+	virtual QVariant toVariant() const											\
+	{																			\
+		return QVariant::fromValue<ValueType> (*m_valueptr);					\
+	}																			\
+																				\
+	virtual QVariant getDefaultAsVariant() const								\
+	{																			\
+		return QVariant::fromValue<ValueType> (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

mercurial