Chris@0
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
Chris@0
|
2
|
Chris@0
|
3 #ifndef _CLASSICAL_DATA_OBJECTS_H_
|
Chris@0
|
4 #define _CLASSICAL_DATA_OBJECTS_H_
|
Chris@0
|
5
|
Chris@0
|
6 #include <QObject>
|
Chris@0
|
7 #include <QMetaType>
|
Chris@0
|
8 #include <QString>
|
Chris@0
|
9 #include <QStringList>
|
Chris@0
|
10 #include <QSharedPointer>
|
Chris@0
|
11 #include <QUrl>
|
Chris@0
|
12 #include <QSet>
|
Chris@0
|
13 #include <QMutex>
|
Chris@0
|
14 #include <QMutexLocker>
|
Chris@0
|
15 #include <QMap>
|
Chris@0
|
16
|
Chris@0
|
17 namespace ClassicalData {
|
Chris@0
|
18
|
Chris@0
|
19 class HistoricalEvent : public QObject
|
Chris@0
|
20 {
|
Chris@0
|
21 Q_OBJECT
|
Chris@0
|
22
|
Chris@0
|
23 Q_PROPERTY(int year READ year WRITE setYear STORED true)
|
Chris@0
|
24 Q_PROPERTY(QString place READ place WRITE setPlace STORED true)
|
Chris@0
|
25 Q_PROPERTY(bool approximate READ approximate WRITE setApproximate STORED true)
|
Chris@0
|
26
|
Chris@0
|
27 public:
|
Chris@0
|
28 HistoricalEvent() : m_year(0), m_place(), m_approximate(false) { }
|
Chris@0
|
29 HistoricalEvent(int y) : m_year(y), m_approximate(false) { }
|
Chris@0
|
30 HistoricalEvent(int y, QString p) : m_year(y), m_place(p), m_approximate(false) { }
|
Chris@0
|
31
|
Chris@0
|
32 int year() const { return m_year; }
|
Chris@0
|
33 void setYear(int y) { m_year = y; }
|
Chris@0
|
34 QString place() const { return m_place; }
|
Chris@0
|
35 void setPlace(QString p) { m_place = p; }
|
Chris@0
|
36 bool approximate() const { return m_approximate; }
|
Chris@0
|
37 void setApproximate(bool a) { m_approximate = a; }
|
Chris@0
|
38
|
Chris@0
|
39 private:
|
Chris@0
|
40 int m_year;
|
Chris@0
|
41 QString m_place;
|
Chris@0
|
42 bool m_approximate;
|
Chris@0
|
43 };
|
Chris@0
|
44
|
Chris@0
|
45 class Birth : public HistoricalEvent
|
Chris@0
|
46 {
|
Chris@0
|
47 Q_OBJECT
|
Chris@0
|
48
|
Chris@0
|
49 public:
|
Chris@0
|
50 Birth() : HistoricalEvent() { }
|
Chris@0
|
51 Birth(int y) : HistoricalEvent(y) { }
|
Chris@0
|
52 Birth(int y, QString p) : HistoricalEvent(y, p) { }
|
Chris@0
|
53 };
|
Chris@0
|
54
|
Chris@0
|
55 class Death : public HistoricalEvent
|
Chris@0
|
56 {
|
Chris@0
|
57 Q_OBJECT
|
Chris@0
|
58
|
Chris@0
|
59 public:
|
Chris@0
|
60 Death() : HistoricalEvent() { }
|
Chris@0
|
61 Death(int y) : HistoricalEvent(y) { }
|
Chris@0
|
62 Death(int y, QString p) : HistoricalEvent(y, p) { }
|
Chris@0
|
63 };
|
Chris@0
|
64
|
Chris@0
|
65 class Composer;
|
Chris@0
|
66 class Work;
|
Chris@0
|
67
|
Chris@0
|
68 class Composition : public HistoricalEvent
|
Chris@0
|
69 {
|
Chris@0
|
70 Q_OBJECT
|
Chris@0
|
71
|
Chris@0
|
72 Q_PROPERTY(ClassicalData::Composer *composer READ composer WRITE setComposer STORED true)
|
Chris@0
|
73 Q_PROPERTY(QSet<ClassicalData::Work *> works READ works WRITE setWorks STORED true)
|
Chris@0
|
74 Q_PROPERTY(QString composerName READ composerName WRITE setComposerName STORED false)
|
Chris@0
|
75
|
Chris@0
|
76 public:
|
Chris@0
|
77 Composition() : HistoricalEvent(), m_composer(0) { }
|
Chris@0
|
78 Composition(int y) : HistoricalEvent(y), m_composer(0) { }
|
Chris@0
|
79 Composition(int y, QString p) : HistoricalEvent(y, p), m_composer(0) { }
|
Chris@0
|
80
|
Chris@0
|
81 Composer *composer() { return m_composer; }
|
Chris@0
|
82 void setComposer(Composer *c) { m_composer = c; }
|
Chris@0
|
83
|
Chris@0
|
84 QSet<Work *> works() { return m_works; }
|
Chris@0
|
85 void setWorks(QSet<Work *> c) { m_works = c; }
|
Chris@0
|
86 void addWork(Work *w) { m_works.insert(w); }
|
Chris@0
|
87
|
Chris@0
|
88 // Not a storable property, set temporarily while composer record is found
|
Chris@0
|
89 QString composerName() const { return m_cname; }
|
Chris@0
|
90 void setComposerName(QString n) { m_cname = n; }
|
Chris@0
|
91
|
Chris@0
|
92 private:
|
Chris@0
|
93 Composer *m_composer;
|
Chris@0
|
94 QSet<Work *> m_works;
|
Chris@0
|
95 QString m_cname;
|
Chris@0
|
96 };
|
Chris@0
|
97
|
Chris@0
|
98 class Document : public QObject
|
Chris@0
|
99 {
|
Chris@0
|
100 Q_OBJECT
|
Chris@0
|
101
|
Chris@0
|
102 Q_PROPERTY(QUrl uri READ uri WRITE setUri STORED true)
|
Chris@0
|
103 Q_PROPERTY(QString siteName READ siteName WRITE setSiteName STORED true)
|
Chris@0
|
104 Q_PROPERTY(QObject *topic READ topic WRITE setTopic STORED true)
|
Chris@0
|
105
|
Chris@0
|
106 public:
|
Chris@0
|
107 Document(QObject *parent = 0) : QObject(parent), m_topic(0) { }
|
Chris@0
|
108
|
Chris@0
|
109 QUrl uri() const { return m_uri; }
|
Chris@0
|
110 void setUri(QUrl uri) { m_uri = uri; }
|
Chris@0
|
111
|
Chris@0
|
112 QString siteName() const { return m_siteName; }
|
Chris@0
|
113 void setSiteName(QString n) { m_siteName = n; }
|
Chris@0
|
114
|
Chris@0
|
115 QObject *topic() const { return m_topic; }
|
Chris@0
|
116 void setTopic(QObject *t) { m_topic = t; }
|
Chris@0
|
117
|
Chris@0
|
118 private:
|
Chris@0
|
119 QUrl m_uri;
|
Chris@0
|
120 QString m_siteName;
|
Chris@0
|
121 QObject *m_topic;
|
Chris@0
|
122 };
|
Chris@0
|
123
|
Chris@0
|
124
|
Chris@0
|
125 class NamedEntity : public QObject
|
Chris@0
|
126 {
|
Chris@0
|
127 Q_OBJECT
|
Chris@0
|
128
|
Chris@0
|
129 Q_PROPERTY(QString name READ name WRITE setName STORED true)
|
Chris@0
|
130 Q_PROPERTY(QSet<QString> aliases READ aliases WRITE setAliases STORED true)
|
Chris@0
|
131 Q_PROPERTY(QString remarks READ remarks WRITE setRemarks STORED true)
|
Chris@0
|
132 Q_PROPERTY(QSet<ClassicalData::Document*> pages READ pages WRITE setPages STORED true)
|
Chris@0
|
133
|
Chris@0
|
134 public:
|
Chris@0
|
135 NamedEntity(QObject *parent = 0) : QObject(parent) { }
|
Chris@0
|
136
|
Chris@0
|
137 QString name() const { return m_name; }
|
Chris@0
|
138 void setName(QString n) { m_name = n; }
|
Chris@0
|
139
|
Chris@0
|
140 QString remarks() const { return m_remarks; }
|
Chris@0
|
141 void setRemarks(QString n) { m_remarks = n; }
|
Chris@0
|
142
|
Chris@0
|
143 QSet<QString> aliases() const { return m_aliases; }
|
Chris@0
|
144 void setAliases(QSet<QString> l) { m_aliases = l; }
|
Chris@0
|
145 void addAlias(QString a) { m_aliases.insert(a); }
|
Chris@0
|
146
|
Chris@0
|
147 QSet<Document *> pages() const { return m_pages; }
|
Chris@0
|
148 void addPage(Document *p) { m_pages.insert(p); }
|
Chris@0
|
149 void setPages(QSet<Document *> p) { m_pages = p; } //!!! destroy old ones? do we own?
|
Chris@0
|
150
|
Chris@0
|
151 private:
|
Chris@0
|
152 QString m_name;
|
Chris@0
|
153 QString m_remarks;
|
Chris@0
|
154 QSet<QString> m_aliases;
|
Chris@0
|
155 QSet<Document *> m_pages;
|
Chris@0
|
156 };
|
Chris@0
|
157
|
Chris@0
|
158 class Movement;
|
Chris@0
|
159
|
Chris@0
|
160 class Form;
|
Chris@0
|
161
|
Chris@0
|
162 class Work : public NamedEntity
|
Chris@0
|
163 {
|
Chris@0
|
164 Q_OBJECT
|
Chris@0
|
165
|
Chris@0
|
166 Q_PROPERTY(QString key READ key WRITE setKey STORED true)
|
Chris@0
|
167 Q_PROPERTY(QString opus READ opus WRITE setOpus STORED true)
|
Chris@0
|
168 Q_PROPERTY(QString catalogue READ catalogue WRITE setCatalogue STORED true)
|
Chris@0
|
169 Q_PROPERTY(QString number READ number WRITE setNumber STORED true)
|
Chris@0
|
170 Q_PROPERTY(QSet<ClassicalData::Form*> forms READ forms WRITE setForms STORED true)
|
Chris@0
|
171 Q_PROPERTY(ClassicalData::Work* partOf READ partOf WRITE setPartOf STORED true)
|
Chris@0
|
172 Q_PROPERTY(QSet<ClassicalData::Work*> parts READ parts WRITE setParts STORED true)
|
Chris@0
|
173 Q_PROPERTY(QSet<ClassicalData::Movement*> movements READ movements WRITE setMovements STORED true)
|
Chris@0
|
174 Q_PROPERTY(ClassicalData::Composition *composition READ composition WRITE setComposition STORED true)
|
Chris@0
|
175
|
Chris@0
|
176 public:
|
Chris@0
|
177 Work(QObject *parent = 0) : NamedEntity(parent), m_partOf(0), m_composition(0) { }
|
Chris@0
|
178
|
Chris@0
|
179 QString key() const { return m_key; }
|
Chris@0
|
180 void setKey(QString n) { m_key = n; }
|
Chris@0
|
181
|
Chris@0
|
182 QString opus() const { return m_opus; }
|
Chris@0
|
183 void setOpus(QString n) { m_opus = n; }
|
Chris@0
|
184
|
Chris@0
|
185 QString catalogue() const { return m_catalogue; }
|
Chris@0
|
186 void setCatalogue(QString n) { m_catalogue = n; }
|
Chris@0
|
187
|
Chris@0
|
188 QString number() const { return m_number; }
|
Chris@0
|
189 void setNumber(QString n) { m_number = n; }
|
Chris@0
|
190
|
Chris@0
|
191 QSet<Form *> forms() const { return m_forms; }
|
Chris@0
|
192 void setForms(QSet<Form *> f) { m_forms = f; }
|
Chris@0
|
193 void addForm(Form *f) { m_forms.insert(f); }
|
Chris@0
|
194
|
Chris@0
|
195 Work *partOf() const { return m_partOf; }
|
Chris@0
|
196 void setPartOf(Work *w) { m_partOf = w; }
|
Chris@0
|
197
|
Chris@0
|
198 QSet<Work *> parts() const { return m_parts; }
|
Chris@0
|
199 void setParts(QSet<Work *> l) { m_parts = l; }
|
Chris@0
|
200 void addPart(Work *w) { m_parts.insert(w); }
|
Chris@0
|
201
|
Chris@0
|
202 QSet<Movement *> movements() const { return m_movements; }
|
Chris@0
|
203 void setMovements(QSet<Movement *> l) { m_movements = l; }
|
Chris@0
|
204 void addMovement(Movement *w) { m_movements.insert(w); }
|
Chris@0
|
205
|
Chris@0
|
206 Composition *composition() { return m_composition; }
|
Chris@0
|
207 const Composition *composition() const { return m_composition; }
|
Chris@0
|
208 void setComposition(Composition *c) { m_composition = c; }
|
Chris@0
|
209
|
Chris@0
|
210 struct Ordering {
|
Chris@0
|
211 bool operator()(Work *, Work *);
|
Chris@0
|
212 };
|
Chris@0
|
213
|
Chris@0
|
214 private:
|
Chris@0
|
215 QString m_key;
|
Chris@0
|
216 QString m_opus;
|
Chris@0
|
217 QString m_catalogue;
|
Chris@0
|
218 QString m_number;
|
Chris@0
|
219 QSet<Form *> m_forms;
|
Chris@0
|
220 Work *m_partOf;
|
Chris@0
|
221 QSet<Work *> m_parts;
|
Chris@0
|
222 QSet<Movement *> m_movements;
|
Chris@0
|
223 Composition *m_composition;
|
Chris@0
|
224 };
|
Chris@0
|
225
|
Chris@0
|
226 class Movement : public NamedEntity
|
Chris@0
|
227 {
|
Chris@0
|
228 Q_OBJECT
|
Chris@0
|
229
|
Chris@0
|
230 Q_PROPERTY(QString key READ key WRITE setKey STORED true)
|
Chris@0
|
231 Q_PROPERTY(QString number READ number WRITE setNumber STORED true)
|
Chris@0
|
232 Q_PROPERTY(ClassicalData::Work* partOf READ partOf WRITE setPartOf STORED true)
|
Chris@0
|
233 Q_PROPERTY(QSet<ClassicalData::Movement*> parts READ parts WRITE setParts STORED true) // movements can be nested
|
Chris@0
|
234 Q_PROPERTY(ClassicalData::Composition *composition READ composition WRITE setComposition STORED true)
|
Chris@0
|
235
|
Chris@0
|
236 public:
|
Chris@0
|
237 Movement(QObject *parent = 0) : NamedEntity(parent), m_partOf(0), m_composition(0) { }
|
Chris@0
|
238
|
Chris@0
|
239 QString key() const { return m_key; }
|
Chris@0
|
240 void setKey(QString n) { m_key = n; }
|
Chris@0
|
241
|
Chris@0
|
242 QString number() const { return m_number; }
|
Chris@0
|
243 void setNumber(QString n) { m_number = n; }
|
Chris@0
|
244
|
Chris@0
|
245 Work *partOf() const { return m_partOf; }
|
Chris@0
|
246 void setPartOf(Work *w) { m_partOf = w; }
|
Chris@0
|
247
|
Chris@0
|
248 QSet<Movement *> parts() const { return m_parts; }
|
Chris@0
|
249 void setParts(QSet<Movement *> l) { m_parts = l; }
|
Chris@0
|
250 void addPart(Movement *w) { m_parts.insert(w); }
|
Chris@0
|
251
|
Chris@0
|
252 Composition *composition() { return m_composition; }
|
Chris@0
|
253 const Composition *composition() const { return m_composition; }
|
Chris@0
|
254 void setComposition(Composition *c) { m_composition = c; }
|
Chris@0
|
255
|
Chris@0
|
256 private:
|
Chris@0
|
257 QString m_key;
|
Chris@0
|
258 QString m_number;
|
Chris@0
|
259 Work *m_partOf;
|
Chris@0
|
260 QSet<Movement *> m_parts;
|
Chris@0
|
261 Composition *m_composition;
|
Chris@0
|
262 };
|
Chris@0
|
263
|
Chris@0
|
264 class Composer : public NamedEntity
|
Chris@0
|
265 {
|
Chris@0
|
266 Q_OBJECT
|
Chris@0
|
267
|
Chris@0
|
268 Q_PROPERTY(QString gender READ gender WRITE setGender STORED true)
|
Chris@0
|
269 Q_PROPERTY(QString nationality READ nationality WRITE setNationality STORED true)
|
Chris@0
|
270 Q_PROPERTY(QString period READ period WRITE setPeriod STORED true)
|
Chris@0
|
271 Q_PROPERTY(ClassicalData::Birth *birth READ birth WRITE setBirth STORED true)
|
Chris@0
|
272 Q_PROPERTY(ClassicalData::Death *death READ death WRITE setDeath STORED true)
|
Chris@0
|
273
|
Chris@0
|
274 public:
|
Chris@0
|
275 Composer(QObject *parent = 0) : NamedEntity(parent), m_birth(0), m_death(0) { }
|
Chris@0
|
276
|
Chris@0
|
277 QString gender() const { return m_gender; }
|
Chris@0
|
278 void setGender(QString n) { m_gender = n; }
|
Chris@0
|
279
|
Chris@0
|
280 QString nationality() const { return m_nationality; }
|
Chris@0
|
281 void setNationality(QString n) { m_nationality = n; }
|
Chris@0
|
282
|
Chris@0
|
283 QString period() const { return m_period; }
|
Chris@0
|
284 void setPeriod(QString n) { m_period = n; }
|
Chris@0
|
285
|
Chris@0
|
286 Birth *birth() { return m_birth; }
|
Chris@0
|
287 const Birth *birth() const { return m_birth; }
|
Chris@0
|
288 void setBirth(Birth *b) { m_birth = b; }
|
Chris@0
|
289
|
Chris@0
|
290 Death *death() { return m_death; }
|
Chris@0
|
291 const Death *death() const { return m_death; }
|
Chris@0
|
292 void setDeath(Death *d) { m_death = d; }
|
Chris@0
|
293
|
Chris@1
|
294 bool datesMatch(const Composer *other) const; // "well enough"
|
Chris@0
|
295 QString getSortName(bool caps) const;
|
Chris@0
|
296 QString getDisplayDates() const;
|
Chris@0
|
297
|
Chris@0
|
298 private:
|
Chris@0
|
299 QString m_gender;
|
Chris@0
|
300 QString m_nationality;
|
Chris@0
|
301 QString m_period;
|
Chris@0
|
302 Birth *m_birth;
|
Chris@0
|
303 Death *m_death;
|
Chris@0
|
304 };
|
Chris@0
|
305
|
Chris@0
|
306 class Form : public NamedEntity
|
Chris@0
|
307 {
|
Chris@0
|
308 Q_OBJECT
|
Chris@0
|
309
|
Chris@0
|
310 Q_PROPERTY(QString uri READ uri)
|
Chris@0
|
311
|
Chris@0
|
312 public:
|
Chris@0
|
313 Form(QObject *parent = 0) : NamedEntity(parent) { }
|
Chris@0
|
314
|
Chris@0
|
315 static Form *getFormByName(QString name) {
|
Chris@0
|
316 QMutexLocker locker(&m_mutex);
|
Chris@0
|
317 if (!m_map.contains(name)) {
|
Chris@0
|
318 Form *f = new Form();
|
Chris@0
|
319 f->setName(name);
|
Chris@0
|
320 m_map[name] = f;
|
Chris@0
|
321 }
|
Chris@0
|
322 return m_map[name];
|
Chris@0
|
323 }
|
Chris@0
|
324
|
Chris@0
|
325 QString uri() const {
|
Chris@0
|
326 return QString(":form_%1").arg(name()).toLower().replace(' ', '_');
|
Chris@0
|
327 }
|
Chris@0
|
328
|
Chris@0
|
329 private:
|
Chris@0
|
330 static QMap<QString, Form *> m_map;
|
Chris@0
|
331 static QMutex m_mutex;
|
Chris@0
|
332 };
|
Chris@0
|
333
|
Chris@0
|
334 }
|
Chris@0
|
335
|
Chris@0
|
336 Q_DECLARE_METATYPE(ClassicalData::HistoricalEvent*);
|
Chris@0
|
337 Q_DECLARE_METATYPE(ClassicalData::Birth*);
|
Chris@0
|
338 Q_DECLARE_METATYPE(ClassicalData::Death*);
|
Chris@0
|
339 Q_DECLARE_METATYPE(ClassicalData::Composition*);
|
Chris@0
|
340 Q_DECLARE_METATYPE(ClassicalData::Work*);
|
Chris@0
|
341 Q_DECLARE_METATYPE(ClassicalData::Movement*);
|
Chris@0
|
342 Q_DECLARE_METATYPE(ClassicalData::Document*);
|
Chris@0
|
343 Q_DECLARE_METATYPE(QSet<QString>);
|
Chris@0
|
344 Q_DECLARE_METATYPE(QSet<ClassicalData::Work*>);
|
Chris@0
|
345 Q_DECLARE_METATYPE(QSet<ClassicalData::Movement*>);
|
Chris@0
|
346 Q_DECLARE_METATYPE(QSet<ClassicalData::Document*>);
|
Chris@0
|
347 Q_DECLARE_METATYPE(ClassicalData::Composer*);
|
Chris@0
|
348 Q_DECLARE_METATYPE(ClassicalData::Form*);
|
Chris@0
|
349 Q_DECLARE_METATYPE(QSet<ClassicalData::Form*>);
|
Chris@0
|
350
|
Chris@0
|
351 #endif
|