1 #ifndef ADM_qtScript_VectorBasedCollection
2 #define ADM_qtScript_VectorBasedCollection
3 
4 #include <vector>
5 #include <QtScript/QScriptClass>
6 #include <QtScript/QScriptEngine>
7 #include <QtScript/QScriptClassPropertyIterator>
8 
9 #include "ADM_editor/include/IEditor.h"
10 #include "VectorBasedCollectionPrototype.h"
11 
12 namespace ADM_qtScript
13 {
14 	template <class ItemType>
15 	class VectorBasedCollectionClassPropertyIterator : public QScriptClassPropertyIterator
16 	{
17 	private:
18 		const std::vector<ItemType*>& _items;
19 		unsigned int _index;
20 		unsigned int _last;
21 
22 	public:
VectorBasedCollectionClassPropertyIterator(const std::vector<ItemType * > & items,const QScriptValue & object)23 		VectorBasedCollectionClassPropertyIterator(const std::vector<ItemType*>& items, const QScriptValue &object) :
24 			QScriptClassPropertyIterator(object), _items(items)
25 		{
26 			this->toFront();
27 		}
28 
~VectorBasedCollectionClassPropertyIterator()29 		~VectorBasedCollectionClassPropertyIterator() {	}
30 
hasNext()31 		bool hasNext() const
32 		{
33 			return _index < this->_items.size();
34 		}
35 
next()36 		void next()
37 		{
38 			_last = _index;
39 			_index++;
40 		}
41 
hasPrevious()42 		bool hasPrevious() const
43 		{
44 			return (_index > 0);
45 		}
46 
previous()47 		void previous()
48 		{
49 			_index--;
50 			_last = _index;
51 		}
52 
toFront()53 		void toFront()
54 		{
55 			_index = 0;
56 			_last = -1;
57 		}
58 
toBack()59 		void toBack()
60 		{
61 			_index = this->_items.size();
62 			_last = -1;
63 		}
64 
name()65 		QScriptString name() const
66 		{
67 			return object().engine()->toStringHandle(QString::number(_last));
68 		}
69 
id()70 		uint id() const
71 		{
72 			return _last;
73 		}
74 	};
75 
76 	template <class ItemType>
77 	class VectorBasedCollection : public QScriptClass
78 	{
79 	private:
80 		IEditor *_editor;
81 		std::vector<ItemType*>& _items;
82 		QScriptValue _prototype;
83 
84 	public:
VectorBasedCollection(QScriptEngine * engine,std::vector<ItemType * > & items,VectorBasedCollectionPrototype<ItemType> * prototype)85 		VectorBasedCollection(QScriptEngine *engine, std::vector<ItemType*>& items, VectorBasedCollectionPrototype<ItemType>* prototype) :
86 		  QScriptClass(engine), _items(items)
87 		{
88 			this->_prototype = engine->newQObject(
89 								   prototype, QScriptEngine::ScriptOwnership,
90 								   QScriptEngine::SkipMethodsInEnumeration | QScriptEngine::ExcludeSuperClassMethods |
91 								   QScriptEngine::ExcludeSuperClassProperties);
92 		}
93 
newIterator(const QScriptValue & object)94 		QScriptClassPropertyIterator* newIterator(const QScriptValue &object)
95 		{
96 			return new VectorBasedCollectionClassPropertyIterator<ItemType>(this->_items, object);
97 		}
98 
property(const QScriptValue & object,const QScriptString & name,uint id)99 		QScriptValue property(
100 			const QScriptValue &object,	const QScriptString &name, uint id)
101 		{
102 			if (id >= this->_items.size())
103 			{
104 				return QScriptValue();
105 			}
106 
107 			return this->engine()->newQObject(this->_items.at(id), QScriptEngine::ScriptOwnership);
108 		}
109 
propertyFlags(const QScriptValue & object,const QScriptString & name,uint id)110 		QScriptValue::PropertyFlags propertyFlags(
111 			const QScriptValue &object, const QScriptString &name, uint id)
112 		{
113 			return QScriptValue::Undeletable;
114 		}
115 
prototype()116 		QScriptValue prototype() const
117 		{
118 			return this->_prototype;
119 		}
120 
queryProperty(const QScriptValue & object,const QScriptString & name,QueryFlags flags,uint * id)121 		QScriptClass::QueryFlags queryProperty(
122 			const QScriptValue &object, const QScriptString &name, QueryFlags flags, uint *id)
123 		{
124 			bool isArrayIndex;
125 			quint32 pos = name.toArrayIndex(&isArrayIndex);
126 
127 			if (!isArrayIndex)
128 			{
129 				return 0;
130 			}
131 
132 			*id = pos;
133 
134 			if (pos >= this->_items.size())
135 			{
136 				return 0;
137 			}
138 
139 			return flags;
140 		}
141 	};
142 }
143 #endif
144