Thu, 03 Oct 2019 23:44:28 +0300
language support
#pragma once #include <memory> #include "main.h" #include "header.h" #include "objecttypes/modelobject.h" class Model : public QObject { Q_OBJECT public: class EditContext; Model(); Model(const Model&) = delete; int size() const; EditContext edit(); signals: void objectAdded(modelobjects::Id id, int position); private: template<typename T, typename... Args> T* append(Args&&... args); template<typename T, typename... Args> T* insert(int position, Args&&... args); bool modified = false; QString path; using ModelObjectPointer = std::unique_ptr<modelobjects::BaseObject>; LDHeader header; std::vector<ModelObjectPointer> body; std::map<modelobjects::Id, modelobjects::BaseObject*> objectsById; }; template<typename T, typename... Args> T* Model::append(Args&&... args) { this->body.push_back(std::make_unique<T>(args...)); T* pointer = static_cast<T*>(this->body.back().get()); this->objectsById[pointer->id] = pointer; emit objectAdded(pointer->id, this->body.size() - 1); return pointer; } template<typename T, typename... Args> T* Model::insert(int position, Args&&... args) { this->body.insert(position, std::make_unique<T>(args...)); T* pointer = static_cast<T*>(this->body[position]); this->objectsById[pointer->id] = pointer; emit objectAdded(pointer->id, position); return pointer; }