src/model.h

changeset 8
44679e468ba9
parent 6
73e448b2943d
child 12
fe67489523b5
equal deleted inserted replaced
7:68443f5be176 8:44679e468ba9
1 #pragma once 1 #pragma once
2 #include <QAbstractListModel>
2 #include <memory> 3 #include <memory>
3 #include "main.h" 4 #include "main.h"
4 #include "header.h" 5 #include "header.h"
5 #include "objecttypes/modelobject.h" 6 #include "objecttypes/modelobject.h"
6 7
7 class Model : public QObject 8 enum class HeaderProperty
9 {
10 Name
11 };
12
13 class Model : public QAbstractListModel
8 { 14 {
9 Q_OBJECT 15 Q_OBJECT
10 public: 16 public:
11 class EditContext; 17 class EditContext;
12 Model(); 18 Model();
13 Model(const Model&) = delete; 19 Model(const Model&) = delete;
14 int size() const; 20 int size() const;
15 EditContext edit(); 21 EditContext edit();
22 int rowCount(const QModelIndex&) const override;
23 QVariant data(const QModelIndex& index, int role) const override;
24 QVariant getHeaderProperty(const HeaderProperty property);
25 const QString& getName() const;
16 signals: 26 signals:
17 void objectAdded(modelobjects::Id id, int position); 27 void objectAdded(modelobjects::Id id, int position);
18 private: 28 private:
29 using ModelObjectPointer = std::unique_ptr<modelobjects::BaseObject>;
19 template<typename T, typename... Args> 30 template<typename T, typename... Args>
20 T* append(Args&&... args); 31 T* append(Args&&... args);
32 void append(ModelObjectPointer&& object);
21 template<typename T, typename... Args> 33 template<typename T, typename... Args>
22 T* insert(int position, Args&&... args); 34 T* insert(int position, Args&&... args);
23 bool modified = false; 35 bool modified = false;
24 QString path; 36 QString path;
25 using ModelObjectPointer = std::unique_ptr<modelobjects::BaseObject>;
26 LDHeader header; 37 LDHeader header;
27 std::vector<ModelObjectPointer> body; 38 std::vector<ModelObjectPointer> body;
28 std::map<modelobjects::Id, modelobjects::BaseObject*> objectsById; 39 std::map<modelobjects::Id, modelobjects::BaseObject*> objectsById;
29 }; 40 };
30 41
31 template<typename T, typename... Args> 42 template<typename T, typename... Args>
32 T* Model::append(Args&&... args) 43 T* Model::append(Args&&... args)
33 { 44 {
45 emit layoutAboutToBeChanged();
34 this->body.push_back(std::make_unique<T>(args...)); 46 this->body.push_back(std::make_unique<T>(args...));
35 T* pointer = static_cast<T*>(this->body.back().get()); 47 T* pointer = static_cast<T*>(this->body.back().get());
36 this->objectsById[pointer->id] = pointer; 48 this->objectsById[pointer->id] = pointer;
37 emit objectAdded(pointer->id, this->body.size() - 1); 49 emit objectAdded(pointer->id, this->body.size() - 1);
50 emit layoutChanged();
38 return pointer; 51 return pointer;
39 } 52 }
40 53
41 template<typename T, typename... Args> 54 template<typename T, typename... Args>
42 T* Model::insert(int position, Args&&... args) 55 T* Model::insert(int position, Args&&... args)
43 { 56 {
57 emit layoutAboutToBeChanged();
44 this->body.insert(position, std::make_unique<T>(args...)); 58 this->body.insert(position, std::make_unique<T>(args...));
45 T* pointer = static_cast<T*>(this->body[position]); 59 T* pointer = static_cast<T*>(this->body[position]);
46 this->objectsById[pointer->id] = pointer; 60 this->objectsById[pointer->id] = pointer;
47 emit objectAdded(pointer->id, position); 61 emit objectAdded(pointer->id, position);
62 emit layoutChanged();
48 return pointer; 63 return pointer;
49 } 64 }

mercurial