src/model.h

changeset 151
e628fc2e0c72
parent 150
b6cbba6e29a1
child 152
03f8e6d42e13
equal deleted inserted replaced
150:b6cbba6e29a1 151:e628fc2e0c72
41 int size() const; 41 int size() const;
42 ldraw::id_t at(int index) const; 42 ldraw::id_t at(int index) const;
43 EditContext edit(); 43 EditContext edit();
44 int rowCount(const QModelIndex&) const override; 44 int rowCount(const QModelIndex&) const override;
45 QVariant data(const QModelIndex& index, int role) const override; 45 QVariant data(const QModelIndex& index, int role) const override;
46 QVariant getHeaderProperty(const HeaderProperty property); 46 ldraw::Object* findObjectById(const ldraw::id_t id);
47 QVariant getObjectProperty(const int index, const ldraw::Property property) const; 47 const ldraw::Object* findObjectById(const ldraw::id_t id) const;
48 template<ldraw::Property Property>
49 ldraw::PropertyType<Property> getObjectProperty(const ldraw::id_t id) const;
50 QModelIndex find(ldraw::id_t id) const; 48 QModelIndex find(ldraw::id_t id) const;
51 ldraw::id_t idAt(const QModelIndex& index) const; 49 ldraw::id_t idAt(const QModelIndex& index) const;
52 template<typename R> 50 template<typename R>
53 const R* get(ldraw::Id<R> id) const; 51 const R* get(ldraw::Id<R> id) const;
54 template<typename R> 52 template<typename R>
57 QModelIndex index; 55 QModelIndex index;
58 const R* object; 56 const R* object;
59 }; 57 };
60 template<typename R> 58 template<typename R>
61 Get2Result<R> get2(ldraw::Id<R> id) const; 59 Get2Result<R> get2(ldraw::Id<R> id) const;
62 template<typename R, typename Fn>
63 void apply(Fn f) const;
64 void save(QIODevice *device) const;
65 ldraw::Object* operator[](int index); 60 ldraw::Object* operator[](int index);
61 const ldraw::Object* operator[](int index) const;
66 Q_SIGNALS: 62 Q_SIGNALS:
67 void objectAdded(int position); 63 void objectAdded(int position);
68 void objectModified(int position); 64 void objectModified(int position);
69 void objectRemoved(ldraw::id_t id); 65 void objectRemoved(ldraw::id_t id);
70 private: 66 private:
73 ldraw::Id<T> append(Args&&... args); 69 ldraw::Id<T> append(Args&&... args);
74 void append(ModelObjectPointer&& object); 70 void append(ModelObjectPointer&& object);
75 template<typename T, typename... Args> 71 template<typename T, typename... Args>
76 ldraw::Id<T> insert(std::size_t position, Args&&... args); 72 ldraw::Id<T> insert(std::size_t position, Args&&... args);
77 void remove(int position); 73 void remove(int position);
78 ldraw::Object* objectAt(const QModelIndex& index);
79 const ldraw::Object* objectAt(const QModelIndex& index) const;
80 template<typename T>
81 T* objectAt(ldraw::Id<T> id);
82 template<typename T>
83 const T* objectAt(ldraw::Id<T> id) const;
84 void editFinished(); 74 void editFinished();
85 void objectModified(ldraw::id_t id); 75 void objectModified(ldraw::id_t id);
86 bool modified = false; 76 bool modified = false;
87 LDHeader header;
88 std::vector<ModelObjectPointer> body; 77 std::vector<ModelObjectPointer> body;
89 std::map<ldraw::id_t, ldraw::Object*> objectsById; 78 std::map<ldraw::id_t, ldraw::Object*> objectsById;
90 /** 79 /**
91 * @brief Amount of model edit contexts active 80 * @brief Amount of model edit contexts active
92 */ 81 */
93 int editCounter = 0; 82 int editCounter = 0;
94 }; 83 };
95 84
96 void makeUnofficial(Model& model); 85 void makeUnofficial(Model& model);
86 void save(const Model& model, QIODevice *device);
97 87
98 /** 88 /**
99 * @brief Calls the specified function to all matching objects in the model 89 * @brief Calls the specified function to all matching objects in the model
100 * @tparam R Type of LDraw line type object to filter by 90 * @tparam R Type of LDraw line type object to filter by
101 * @param fn Function to call. 91 * @param fn Function to call.
102 */ 92 */
103 template<typename R, typename Fn> 93 template<typename R, typename Fn>
104 void Model::apply(Fn f) const 94 void applyToModel(const Model& model, Fn&& f)
105 { 95 {
106 for (const ModelObjectPointer& object : this->body) 96 for (int i = 0; i < model.size(); i += 1)
107 { 97 {
108 const R* subobject = dynamic_cast<const R*>(object.get()); 98 const ldraw::Object* object = model[i];
99 const R* subobject = dynamic_cast<const R*>(object);
109 if (subobject != nullptr) 100 if (subobject != nullptr)
110 { 101 {
111 f(subobject); 102 f(subobject);
112 } 103 }
113 } 104 }
149 { 140 {
150 Get2Result<R> result; 141 Get2Result<R> result;
151 result.index = this->find(id); 142 result.index = this->find(id);
152 if (result.index.isValid()) 143 if (result.index.isValid())
153 { 144 {
154 result.object = static_cast<const R*>(this->objectAt(result.index)); 145 result.object = static_cast<const R*>((*this)[result.index.row()]);
155 } 146 }
156 else 147 else
157 { 148 {
158 result.object = nullptr; 149 result.object = nullptr;
159 } 150 }
160 return result; 151 return result;
161 } 152 }
162
163 /**
164 * @brief Gets an object pointer by id. Used by the editing context to actually modify objects.
165 * @param id
166 * @return object pointer
167 */
168 template<typename T>
169 T* Model::objectAt(ldraw::Id<T> id)
170 {
171 return static_cast<T*>(this->objectAt(this->find(id)));
172 }
173
174 template<typename T>
175 const T* Model::objectAt(ldraw::Id<T> id) const
176 {
177 return static_cast<const T*>(this->objectAt(this->find(id)));
178 }
179
180 /**
181 * @brief Gets an object property by id
182 * @tparam Property Property to obtain
183 * @param id ID of object
184 * @returns property or default value
185 */
186 template<ldraw::Property Property>
187 ldraw::PropertyType<Property> Model::getObjectProperty(const ldraw::id_t id) const
188 {
189 const ldraw::Object* const object = this->objectAt(id);
190 ldraw::PropertyType<Property> result;
191 if (object != nullptr)
192 {
193 result = object->getProperty<Property>();
194 }
195 return result;
196 }

mercurial