| 66 void remove(int position); |
66 void remove(int position); |
| 67 void emitDataChangedSignal(int position); |
67 void emitDataChangedSignal(int position); |
| 68 private: |
68 private: |
| 69 bool modified = false; |
69 bool modified = false; |
| 70 std::vector<ModelObjectPointer> body; |
70 std::vector<ModelObjectPointer> body; |
| 71 std::map<ldraw::id_t, ldraw::Object*> objectsById; |
71 mutable std::map<ldraw::id_t, std::size_t> objectsById; |
| |
72 mutable bool needObjectsByIdRebuild = false; |
| 72 }; |
73 }; |
| 73 |
74 |
| 74 void save(const Model& model, QIODevice *device); |
75 void save(const Model& model, QIODevice *device); |
| 75 |
76 |
| 76 /** |
77 /** |
| 97 { |
98 { |
| 98 const int position = static_cast<int>(this->body.size()); |
99 const int position = static_cast<int>(this->body.size()); |
| 99 Q_EMIT beginInsertRows({}, position, position); |
100 Q_EMIT beginInsertRows({}, position, position); |
| 100 this->body.push_back(std::make_unique<T>(args...)); |
101 this->body.push_back(std::make_unique<T>(args...)); |
| 101 ldraw::Object* pointer = this->body.back().get(); |
102 ldraw::Object* pointer = this->body.back().get(); |
| 102 this->objectsById[pointer->id] = pointer; |
103 this->objectsById[pointer->id] = this->body.size() - 1; |
| 103 Q_EMIT endInsertRows(); |
104 Q_EMIT endInsertRows(); |
| 104 return ldraw::Id<T>{pointer->id.value}; |
105 return ldraw::Id<T>{pointer->id.value}; |
| 105 } |
106 } |
| 106 |
107 |
| 107 template<typename T, typename... Args> |
108 template<typename T, typename... Args> |
| 108 ldraw::Id<T> Model::insert(const std::size_t position, Args&&... args) |
109 ldraw::Id<T> Model::insert(const std::size_t position, Args&&... args) |
| 109 { |
110 { |
| 110 Q_EMIT beginInsertRows({}, position, position); |
111 Q_EMIT beginInsertRows({}, position, position); |
| 111 this->body.insert(std::begin(this->body) + position, std::make_unique<T>(args...)); |
112 this->body.insert(std::begin(this->body) + position, std::make_unique<T>(args...)); |
| 112 ldraw::Object* pointer = this->body[position].get(); |
113 ldraw::Object* pointer = this->body[position].get(); |
| 113 this->objectsById[pointer->id] = pointer; |
114 this->objectsById[pointer->id] = position; |
| 114 Q_EMIT endInsertRows(); |
115 Q_EMIT endInsertRows(); |
| 115 return ldraw::Id<T>{pointer->id.value}; |
116 return ldraw::Id<T>{pointer->id.value}; |
| 116 } |
117 } |
| 117 |
118 |
| 118 template<typename R> |
119 template<typename R> |