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