Skip to content

Commit 9178618

Browse files
committed
Support document undo
1 parent 3b1c5af commit 9178618

File tree

9 files changed

+954
-121
lines changed

9 files changed

+954
-121
lines changed

src/libs/application/dspxmodel/src/BasicModelStrategy.cpp

Lines changed: 3 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -2,129 +2,18 @@
22

33
#include <algorithm>
44

5-
#include <QHash>
6-
#include <QVariant>
7-
85
#include <dspxmodel/private/SpliceHelper_p.h>
6+
#include <dspxmodel/private/BasicModelStrategyEntity_p.h>
97

108
namespace dspx {
119

12-
class BasicModelStrategyEntity : public QObject {
13-
Q_OBJECT
14-
public:
15-
using QObject::QObject;
16-
17-
ModelStrategy::Entity type{};
18-
};
19-
20-
class BasicModelStrategyItemEntity : public BasicModelStrategyEntity {
21-
Q_OBJECT
22-
public:
23-
using BasicModelStrategyEntity::BasicModelStrategyEntity;
24-
25-
QHash<ModelStrategy::Property, QVariant> properties;
26-
QHash<ModelStrategy::Relationship, BasicModelStrategyEntity *> associatedSubEntities;
27-
};
28-
29-
class BasicModelStrategySequenceContainerEntity : public BasicModelStrategyEntity {
30-
Q_OBJECT
31-
public:
32-
using BasicModelStrategyEntity::BasicModelStrategyEntity;
33-
34-
QSet<BasicModelStrategyEntity *> sequence;
35-
};
36-
37-
class BasicModelStrategyListContainerEntity : public BasicModelStrategyEntity {
38-
Q_OBJECT
39-
public:
40-
using BasicModelStrategyEntity::BasicModelStrategyEntity;
41-
42-
QList<BasicModelStrategyEntity *> list;
43-
};
44-
45-
class BasicModelStrategyMapContainerEntity : public BasicModelStrategyEntity {
46-
Q_OBJECT
47-
public:
48-
using BasicModelStrategyEntity::BasicModelStrategyEntity;
49-
50-
QHash<QString, BasicModelStrategyEntity *> map;
51-
};
52-
53-
class BasicModelStrategyDataArrayEntity : public BasicModelStrategyEntity {
54-
Q_OBJECT
55-
public:
56-
using BasicModelStrategyEntity::BasicModelStrategyEntity;
57-
58-
QVariantList data;
59-
};
60-
61-
static BasicModelStrategyEntity *createByType(ModelStrategy::Entity type, QObject *parent) {
62-
BasicModelStrategyEntity *obj;
63-
switch (type) {
64-
case ModelStrategy::EI_AudioClip:
65-
case ModelStrategy::EI_Global:
66-
case ModelStrategy::EI_Label:
67-
case ModelStrategy::EI_Note:
68-
case ModelStrategy::EI_Param:
69-
case ModelStrategy::EI_ParamCurveAnchor:
70-
case ModelStrategy::EI_ParamCurveFree:
71-
case ModelStrategy::EI_ParamCurveAnchorNode:
72-
case ModelStrategy::EI_Phoneme:
73-
case ModelStrategy::EI_SingingClip:
74-
case ModelStrategy::EI_Source:
75-
case ModelStrategy::EI_Tempo:
76-
case ModelStrategy::EI_TimeSignature:
77-
case ModelStrategy::EI_Track:
78-
case ModelStrategy::EI_WorkspaceInfo:
79-
obj = new BasicModelStrategyItemEntity(parent);
80-
obj->type = type;
81-
break;
82-
case ModelStrategy::ES_Clips:
83-
case ModelStrategy::ES_Labels:
84-
case ModelStrategy::ES_Notes:
85-
case ModelStrategy::ES_ParamCurveAnchorNodes:
86-
case ModelStrategy::ES_ParamCurves:
87-
case ModelStrategy::ES_Tempos:
88-
case ModelStrategy::ES_TimeSignatures:
89-
obj = new BasicModelStrategySequenceContainerEntity(parent);
90-
obj->type = type;
91-
break;
92-
case ModelStrategy::EL_Phonemes:
93-
case ModelStrategy::EL_Tracks:
94-
obj = new BasicModelStrategyListContainerEntity(parent);
95-
obj->type = type;
96-
break;
97-
case ModelStrategy::ED_ParamCurveFreeValues:
98-
case ModelStrategy::ED_VibratoPoints:
99-
obj = new BasicModelStrategyDataArrayEntity(parent);
100-
obj->type = type;
101-
break;
102-
case ModelStrategy::EM_Params:
103-
case ModelStrategy::EM_Sources:
104-
case ModelStrategy::EM_Workspace:
105-
obj = new BasicModelStrategyMapContainerEntity(parent);
106-
obj->type = type;
107-
break;
108-
default:
109-
Q_UNREACHABLE();
110-
}
111-
return obj;
112-
}
113-
114-
template <class T>
115-
T *handleCast(Handle entity) {
116-
auto obj = qobject_cast<T *>(reinterpret_cast<BasicModelStrategyEntity *>(entity.d));
117-
Q_ASSERT(obj);
118-
return obj;
119-
}
120-
12110
BasicModelStrategy::BasicModelStrategy(QObject *parent) : ModelStrategy(parent) {
12211
}
12312

12413
BasicModelStrategy::~BasicModelStrategy() = default;
12514

12615
Handle BasicModelStrategy::createEntity(Entity entityType) {
127-
auto object = createByType(entityType, this);
16+
auto object = BasicModelStrategyEntity::createByType(entityType, this);
12817
Handle entity{reinterpret_cast<quintptr>(object)};
12918
Q_EMIT createEntityNotified(entity, entityType);
13019
return entity;
@@ -300,13 +189,11 @@ namespace dspx {
300189
auto subObject = object->associatedSubEntities.value(relationship);
301190
if (!subObject) {
302191
Entity subObjectType = getAssociatedSubEntityTypeFromEntityTypeAndRelationship(object->type, relationship);
303-
subObject = createByType(subObjectType, object);
192+
subObject = BasicModelStrategyEntity::createByType(subObjectType, object);
304193
object->associatedSubEntities.insert(relationship, subObject);
305194
}
306195
Handle subEntity{reinterpret_cast<quintptr>(subObject)};
307196
return subEntity;
308197
}
309198

310199
}
311-
312-
#include "BasicModelStrategy.moc"
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
#ifndef DIFFSCOPE_DSPX_MODEL_BASICMODELSTRATEGYENTITY_P_H
2+
#define DIFFSCOPE_DSPX_MODEL_BASICMODELSTRATEGYENTITY_P_H
3+
4+
#include <QHash>
5+
#include <QVariant>
6+
#include <QList>
7+
8+
#include <dspxmodel/ModelStrategy.h>
9+
10+
namespace dspx {
11+
class BasicModelStrategyEntity : public QObject {
12+
Q_OBJECT
13+
public:
14+
using QObject::QObject;
15+
16+
ModelStrategy::Entity type{};
17+
18+
static inline BasicModelStrategyEntity *createByType(ModelStrategy::Entity type, QObject *parent);
19+
};
20+
21+
class BasicModelStrategyItemEntity : public BasicModelStrategyEntity {
22+
Q_OBJECT
23+
public:
24+
using BasicModelStrategyEntity::BasicModelStrategyEntity;
25+
26+
QHash<ModelStrategy::Property, QVariant> properties;
27+
QHash<ModelStrategy::Relationship, BasicModelStrategyEntity *> associatedSubEntities;
28+
};
29+
30+
class BasicModelStrategySequenceContainerEntity : public BasicModelStrategyEntity {
31+
Q_OBJECT
32+
public:
33+
using BasicModelStrategyEntity::BasicModelStrategyEntity;
34+
35+
QSet<BasicModelStrategyEntity *> sequence;
36+
};
37+
38+
class BasicModelStrategyListContainerEntity : public BasicModelStrategyEntity {
39+
Q_OBJECT
40+
public:
41+
using BasicModelStrategyEntity::BasicModelStrategyEntity;
42+
43+
QList<BasicModelStrategyEntity *> list;
44+
};
45+
46+
class BasicModelStrategyMapContainerEntity : public BasicModelStrategyEntity {
47+
Q_OBJECT
48+
public:
49+
using BasicModelStrategyEntity::BasicModelStrategyEntity;
50+
51+
QHash<QString, BasicModelStrategyEntity *> map;
52+
};
53+
54+
class BasicModelStrategyDataArrayEntity : public BasicModelStrategyEntity {
55+
Q_OBJECT
56+
public:
57+
using BasicModelStrategyEntity::BasicModelStrategyEntity;
58+
59+
QVariantList data;
60+
};
61+
62+
BasicModelStrategyEntity *BasicModelStrategyEntity::createByType(ModelStrategy::Entity type, QObject *parent) {
63+
BasicModelStrategyEntity *obj;
64+
switch (type) {
65+
case ModelStrategy::EI_AudioClip:
66+
case ModelStrategy::EI_Global:
67+
case ModelStrategy::EI_Label:
68+
case ModelStrategy::EI_Note:
69+
case ModelStrategy::EI_Param:
70+
case ModelStrategy::EI_ParamCurveAnchor:
71+
case ModelStrategy::EI_ParamCurveFree:
72+
case ModelStrategy::EI_ParamCurveAnchorNode:
73+
case ModelStrategy::EI_Phoneme:
74+
case ModelStrategy::EI_SingingClip:
75+
case ModelStrategy::EI_Source:
76+
case ModelStrategy::EI_Tempo:
77+
case ModelStrategy::EI_TimeSignature:
78+
case ModelStrategy::EI_Track:
79+
case ModelStrategy::EI_WorkspaceInfo:
80+
obj = new BasicModelStrategyItemEntity(parent);
81+
obj->type = type;
82+
break;
83+
case ModelStrategy::ES_Clips:
84+
case ModelStrategy::ES_Labels:
85+
case ModelStrategy::ES_Notes:
86+
case ModelStrategy::ES_ParamCurveAnchorNodes:
87+
case ModelStrategy::ES_ParamCurves:
88+
case ModelStrategy::ES_Tempos:
89+
case ModelStrategy::ES_TimeSignatures:
90+
obj = new BasicModelStrategySequenceContainerEntity(parent);
91+
obj->type = type;
92+
break;
93+
case ModelStrategy::EL_Phonemes:
94+
case ModelStrategy::EL_Tracks:
95+
obj = new BasicModelStrategyListContainerEntity(parent);
96+
obj->type = type;
97+
break;
98+
case ModelStrategy::ED_ParamCurveFreeValues:
99+
case ModelStrategy::ED_VibratoPoints:
100+
obj = new BasicModelStrategyDataArrayEntity(parent);
101+
obj->type = type;
102+
break;
103+
case ModelStrategy::EM_Params:
104+
case ModelStrategy::EM_Sources:
105+
case ModelStrategy::EM_Workspace:
106+
obj = new BasicModelStrategyMapContainerEntity(parent);
107+
obj->type = type;
108+
break;
109+
default:
110+
Q_UNREACHABLE();
111+
}
112+
return obj;
113+
}
114+
115+
template <class T>
116+
T *handleCast(Handle entity) {
117+
auto obj = qobject_cast<T *>(reinterpret_cast<BasicModelStrategyEntity *>(entity.d));
118+
Q_ASSERT(obj);
119+
return obj;
120+
}
121+
}
122+
123+
#endif //DIFFSCOPE_DSPX_MODEL_BASICMODELSTRATEGYENTITY_P_H

0 commit comments

Comments
 (0)