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