src/config.h

changeset 667
31540c1f22ea
parent 625
3afe6a110c61
--- a/src/config.h	Wed Oct 23 13:14:17 2013 +0300
+++ b/src/config.h	Mon Jan 20 15:04:26 2014 +0200
@@ -1,6 +1,6 @@
 /*
  *  LDForge: LDraw parts authoring CAD
- *  Copyright (C) 2013 Santeri Piippo
+ *  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
@@ -19,7 +19,8 @@
 #ifndef LDFORGE_CONFIG_H
 #define LDFORGE_CONFIG_H
 
-#include "common.h"
+#include "property.h"
+#include "types.h"
 
 // =============================================================================
 #include <QString>
@@ -27,220 +28,165 @@
 #include <QKeySequence>
 class QSettings;
 
-typedef QChar qchar;
-typedef QString str;
-
 #define MAX_INI_LINE 512
 #define MAX_CONFIG 512
 
-#define cfg(T, NAME, DEFAULT) T##Config NAME (DEFAULT, #NAME, #DEFAULT)
-#define extern_cfg(T, NAME)   extern T##Config NAME
+#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
-{	public:
+{
+	PROPERTY (private, QString, Name, STR_OPS, STOCK_WRITE)
+
+	public:
 		enum Type
-		{	Int,
-			String,
-			Float,
-			Bool,
-			KeySequence,
-			List,
+		{
+			EIntType,
+			EStringType,
+			EFloatType,
+			EBoolType,
+			EKeySequenceType,
+			EListType,
+			EVertexType,
 		};
 
-		Config (const char* name, const char* defstring);
-		const char* name;
-
-		virtual Type getType() const
-		{	return (Type) 0;
-		}
-
-		virtual void resetValue() {}
-		virtual void loadFromVariant (const QVariant& val)
-		{	(void) val;
-		}
+		using IntType			= int;
+		using StringType		= QString;
+		using FloatType			= float;
+		using BoolType			= bool;
+		using KeySequenceType	= QKeySequence;
+		using ListType			= QList<QVariant>;
+		using VertexType		= Vertex;
 
-		virtual bool isDefault() const
-		{	return false;
-		}
+		Config (QString name);
 
-		virtual QVariant toVariant() const
-		{	return QVariant();
-		}
-
-		virtual QVariant defaultVariant() const
-		{	return QVariant();
-		}
+		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 str dirpath();
-		static str filepath (str file);
+		static QString dirpath();
+		static QString filepath (QString file);
 
 	protected:
 		static void addToArray (Config* ptr);
-
-	private:
-		const char* m_defstring;
 };
 
 // =============================================================================
-#define IMPLEMENT_CONFIG(NAME, T) \
-	T value, defval; \
-	NAME##Config (T defval, const char* name, const char* defstring) : \
-		Config (name, defstring), value (defval), defval (defval) \
-		{ Config::addToArray (this); } \
-	\
-	operator const T&() const { return value; } \
-	Config::Type getType() const override { return Config::NAME; } \
-	virtual void resetValue() override { value = defval; } \
-	virtual bool isDefault() const override { return value == defval; } \
-	virtual QVariant toVariant() const override { return QVariant::fromValue<T> (value); } \
-	virtual QVariant defaultVariant() const override { return QVariant::fromValue<T> (defval); } \
-	virtual void loadFromVariant (const QVariant& val) override { value = val.value<T>(); } \
-
-#define DEFINE_UNARY_OPERATOR(T, OP) \
-	T operator OP() { \
-		return OP value; \
-	}
-
-#define DEFINE_BINARY_OPERATOR(T, OP) \
-	T operator OP (const T other) { \
-		return value OP other; \
-	}
-
-#define DEFINE_ASSIGN_OPERATOR(T, OP) \
-	T& operator OP (const T other) { \
-		return value OP other; \
-	}
-
-#define DEFINE_COMPARE_OPERATOR(T, OP) \
-	bool operator OP (const T other) { \
-		return value OP other; \
-	}
-
-#define DEFINE_CAST_OPERATOR(T) \
-	operator T() { \
-		return (T) value; \
-	}
-
-#define DEFINE_ALL_COMPARE_OPERATORS(T) \
-	DEFINE_COMPARE_OPERATOR (T, ==) \
-	DEFINE_COMPARE_OPERATOR (T, !=) \
-	DEFINE_COMPARE_OPERATOR (T, >) \
-	DEFINE_COMPARE_OPERATOR (T, <) \
-	DEFINE_COMPARE_OPERATOR (T, >=) \
-	DEFINE_COMPARE_OPERATOR (T, <=) \
-
-#define DEFINE_INCREMENT_OPERATORS(T) \
-	T operator++() { return ++value; } \
-	T operator++(int) { return value++; } \
-	T operator--() { return --value; } \
-	T operator--(int) { return value--; }
+#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
-{	public:
-		IMPLEMENT_CONFIG (Int, int)
-		DEFINE_ALL_COMPARE_OPERATORS (int)
-		DEFINE_INCREMENT_OPERATORS (int)
-		DEFINE_BINARY_OPERATOR (int, +)
-		DEFINE_BINARY_OPERATOR (int, -)
-		DEFINE_BINARY_OPERATOR (int, *)
-		DEFINE_BINARY_OPERATOR (int, /)
-		DEFINE_BINARY_OPERATOR (int, %)
-		DEFINE_BINARY_OPERATOR (int, ^)
-		DEFINE_BINARY_OPERATOR (int, |)
-		DEFINE_BINARY_OPERATOR (int, &)
-		DEFINE_BINARY_OPERATOR (int, >>)
-		DEFINE_BINARY_OPERATOR (int, <<)
-		DEFINE_UNARY_OPERATOR (int, !)
-		DEFINE_UNARY_OPERATOR (int, ~)
-		DEFINE_UNARY_OPERATOR (int, -)
-		DEFINE_UNARY_OPERATOR (int, +)
-		DEFINE_ASSIGN_OPERATOR (int, =)
-		DEFINE_ASSIGN_OPERATOR (int, +=)
-		DEFINE_ASSIGN_OPERATOR (int, -=)
-		DEFINE_ASSIGN_OPERATOR (int, *=)
-		DEFINE_ASSIGN_OPERATOR (int, /=)
-		DEFINE_ASSIGN_OPERATOR (int, %=)
-		DEFINE_ASSIGN_OPERATOR (int, >>=)
-		DEFINE_ASSIGN_OPERATOR (int, <<=)
+{
+	IMPLEMENT_CONFIG (Int)
 };
 
 // =============================================================================
 class StringConfig : public Config
-{	public:
-		IMPLEMENT_CONFIG (String, str)
-
-		DEFINE_COMPARE_OPERATOR (str, ==)
-		DEFINE_COMPARE_OPERATOR (str, !=)
-		DEFINE_ASSIGN_OPERATOR (str, =)
-		DEFINE_ASSIGN_OPERATOR (str, +=)
-
-		QChar operator[] (int n)
-		{	return value[n];
-		}
+{
+	IMPLEMENT_CONFIG (String)
 };
 
 // =============================================================================
 class FloatConfig : public Config
-{	public:
-		IMPLEMENT_CONFIG (Float, float)
-		DEFINE_ALL_COMPARE_OPERATORS (float)
-		DEFINE_INCREMENT_OPERATORS (float)
-		DEFINE_BINARY_OPERATOR (float, +)
-		DEFINE_BINARY_OPERATOR (float, -)
-		DEFINE_BINARY_OPERATOR (float, *)
-		DEFINE_UNARY_OPERATOR (float, !)
-		DEFINE_ASSIGN_OPERATOR (float, =)
-		DEFINE_ASSIGN_OPERATOR (float, +=)
-		DEFINE_ASSIGN_OPERATOR (float, -=)
-		DEFINE_ASSIGN_OPERATOR (float, *=)
+{
+	IMPLEMENT_CONFIG (Float)
 };
 
 // =============================================================================
 class BoolConfig : public Config
-{	public:
-		IMPLEMENT_CONFIG (Bool, bool)
-		DEFINE_ALL_COMPARE_OPERATORS (bool)
-		DEFINE_ASSIGN_OPERATOR (bool, =)
+{
+	IMPLEMENT_CONFIG (Bool)
 };
 
 // =============================================================================
 class KeySequenceConfig : public Config
-{	public:
-		IMPLEMENT_CONFIG (KeySequence, QKeySequence)
-		DEFINE_ALL_COMPARE_OPERATORS (QKeySequence)
-		DEFINE_ASSIGN_OPERATOR (QKeySequence, =)
+{
+	IMPLEMENT_CONFIG (KeySequence)
 };
 
 // =============================================================================
 class ListConfig : public Config
-{	public:
-		IMPLEMENT_CONFIG (List, QList<QVariant>)
-		DEFINE_ASSIGN_OPERATOR (QList<QVariant>, =)
-
-		typedef QList<QVariant>::iterator it;
-		typedef QList<QVariant>::const_iterator c_it;
-
-		it begin()
-		{	return value.begin();
-		}
+{
+	IMPLEMENT_CONFIG (List)
+};
 
-		c_it begin() const
-		{	return value.constBegin();
-		}
-
-		it end()
-		{	return value.end();
-		}
-
-		c_it end() const
-		{	return value.constEnd();
-		}
+// =============================================================================
+class VertexConfig : public Config
+{
+	IMPLEMENT_CONFIG (Vertex)
 };
 
 #endif // LDFORGE_CONFIG_H

mercurial