digiKam
Loading...
Searching...
No Matches
coredbfields.h
Go to the documentation of this file.
1/* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 2007-09-22
7 * Description : Core database field enumerations.
8 *
9 * SPDX-FileCopyrightText: 2007-2012 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
10 * SPDX-FileCopyrightText: 2011-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
11 * SPDX-FileCopyrightText: 2013 by Michael G. Hansen <mike at mghansen dot de>
12 *
13 * SPDX-License-Identifier: GPL-2.0-or-later
14 *
15 * ============================================================ */
16
17#pragma once
18
19#include "digikam_config.h"
20
21// C++ includes
22
23#include <stdint.h>
24
25// Qt includes
26
27#include <QFlags>
28#include <QHash>
29#include <QVariant>
30
31// Local includes
32
33#include "digikam_export.h"
34
35#ifdef HAVE_DBUS
36class QDBusArgument;
37#endif
38
39namespace Digikam
40{
41
42namespace DatabaseFields
43{
44
46{
48 Album = 1 << 0,
49 Name = 1 << 1,
50 Status = 1 << 2,
51 Category = 1 << 3,
53 FileSize = 1 << 5,
54 UniqueHash = 1 << 6,
55 ManualOrder = 1 << 7,
57 Name |
58 Status |
59 Category |
61 FileSize |
66};
67
68typedef uint8_t ImagesMinSizeType;
69
98
100
139
141
168
170
187
189
202
204
225
227
228Q_DECLARE_FLAGS(Images, ImagesField)
229Q_DECLARE_FLAGS(ItemInformation, ItemInformationField)
230Q_DECLARE_FLAGS(ImageMetadata, ImageMetadataField)
231Q_DECLARE_FLAGS(ItemComments, ItemCommentsField)
232Q_DECLARE_FLAGS(ItemPositions, ItemPositionsField)
233Q_DECLARE_FLAGS(ImageHistoryInfo, ImageHistoryInfoField)
234Q_DECLARE_FLAGS(VideoMetadata, VideoMetadataField)
235
236template<typename FieldName> class FieldMetaInfo
237{
238};
239
240#define DECLARE_FIELDMETAINFO(FieldName) \
241 template<> class DIGIKAM_DATABASE_EXPORT FieldMetaInfo <FieldName> \
242 { \
243 public: \
244 static const FieldName##Field First = FieldName##First; \
245 static const FieldName##Field Last = FieldName##Last; \
246 typedef FieldName##MinSizeType MinSizeType; \
247 inline static MinSizeType toMinSizeType(const FieldName value) { return MinSizeType(value); } \
248 inline static FieldName fromMinSizeType(const MinSizeType value) { return FieldName(value); } \
249 };
250
252DECLARE_FIELDMETAINFO(ItemInformation)
253DECLARE_FIELDMETAINFO(ImageMetadata)
254DECLARE_FIELDMETAINFO(ItemComments)
255DECLARE_FIELDMETAINFO(ItemPositions)
256DECLARE_FIELDMETAINFO(ImageHistoryInfo)
257DECLARE_FIELDMETAINFO(VideoMetadata)
258
259
264template<typename FieldName> class DatabaseFieldsEnumIterator
265{
266
267public:
268
270
271 bool atEnd() const
272 {
274 }
275
277 {
278 i = (i << 1);
279 }
280
281 FieldName operator*() const
282 {
283 return FieldName(i);
284 }
285
286private:
287
289};
290
294template<typename FieldName> class DatabaseFieldsEnumIteratorSetOnly
295{
296public:
297
298 explicit DatabaseFieldsEnumIteratorSetOnly(const FieldName setValues)
299 : i (),
300 values(setValues)
301 {
302 if (! (*i & values) )
303 {
304 operator++();
305 }
306 }
307
308 bool atEnd() const
309 {
310 return i.atEnd();
311 }
312
314 {
315 while (!i.atEnd())
316 {
317 ++i;
318
319 if (*i & values)
320 {
321 break;
322 }
323 }
324 }
325
326 FieldName operator*() const
327 {
328 return *i;
329 }
330
331private:
332
334 const FieldName values;
335};
336
337#define DATABASEFIELDS_ENUM_ITERATOR(Flag) \
338 typedef DatabaseFieldsEnumIterator<Flag> Flag##Iterator; \
339 typedef DatabaseFieldsEnumIteratorSetOnly<Flag> Flag##IteratorSetOnly;
340
342DATABASEFIELDS_ENUM_ITERATOR(ItemInformation)
343DATABASEFIELDS_ENUM_ITERATOR(ImageMetadata)
344DATABASEFIELDS_ENUM_ITERATOR(VideoMetadata)
345DATABASEFIELDS_ENUM_ITERATOR(ItemPositions)
347DATABASEFIELDS_ENUM_ITERATOR(ImageHistoryInfo)
348
349
354{
355};
356Q_DECLARE_FLAGS(CustomEnum, CustomEnumFlags)
357
358#define DATABASEFIELDS_SET_DECLARE_METHODS(Flag, variable) \
359 explicit Set(const Flag& f) { initialize(); variable = f; } \
360 explicit Set(const Flag##Field& f) { initialize(); variable = f; } \
361 inline Flag& operator=(const Flag& f) { return variable.operator=(f); } \
362 inline Flag& operator|=(Flag f) { return variable.operator|=(f); } \
363 inline Flag& operator^=(Flag f) { return variable.operator^=(f); } \
364 inline Flag operator|(Flag f) const { return variable.operator|(f); } \
365 inline Flag operator^(Flag f) const { return variable.operator^(f); } \
366 inline Flag operator&(Flag f) const { return variable.operator&(f); } \
367 inline operator Flag() const { return variable; } \
368 inline bool hasFieldsFrom##Flag() const { return variable & Flag##All; } \
369 inline Flag get##Flag() const { return variable; }
370
375class Set
376{
377public:
378
380 {
381 initialize();
382 }
383
385 {
386 images = ImagesNone;
387 imageInformation = ItemInformationNone;
388 imageMetadata = ImageMetadataNone;
389 imageComments = ItemCommentsNone;
390 imagePositions = ItemPositionsNone;
391 imageHistory = ImageHistoryInfoNone;
392 videoMetadata = VideoMetadataNone;
393 customEnum = CustomEnum();
394 }
395
396public:
397
399 DATABASEFIELDS_SET_DECLARE_METHODS(ItemInformation, imageInformation)
400 DATABASEFIELDS_SET_DECLARE_METHODS(VideoMetadata, videoMetadata)
401 DATABASEFIELDS_SET_DECLARE_METHODS(ImageMetadata, imageMetadata)
403 DATABASEFIELDS_SET_DECLARE_METHODS(ItemPositions, imagePositions)
404 DATABASEFIELDS_SET_DECLARE_METHODS(ImageHistoryInfo, imageHistory)
405
406 inline bool operator&(const Set& other)
407 {
408 return (images & other.images) ||
409 (imageInformation & other.imageInformation) ||
410 (imageMetadata & other.imageMetadata) ||
411 (imageComments & other.imageComments) ||
412 (imagePositions & other.imagePositions) ||
413 (imageHistory & other.imageHistory) ||
414 (customEnum & other.customEnum) ||
415 (videoMetadata & other.videoMetadata);
416 }
417
418 // overloading operator|= creates ambiguity with the database fields'
419 // operator|=, therefore we give it another name.
420 inline Set& setFields(const Set& otherSet)
421 {
422 images |= otherSet.images;
423 imageInformation |= otherSet.imageInformation;
424 imageMetadata |= otherSet.imageMetadata;
425 imageComments |= otherSet.imageComments;
426 imagePositions |= otherSet.imagePositions;
427 imageHistory |= otherSet.imageHistory;
428 customEnum |= otherSet.customEnum;
429 videoMetadata |= otherSet.videoMetadata;
430
431 return *this;
432 }
433
434 inline CustomEnum& operator=(const CustomEnum& f)
435 {
436 return customEnum.operator=(f);
437 }
438
439 inline CustomEnum& operator|=(CustomEnum f)
440 {
441 return customEnum.operator|=(f);
442 }
443
444 inline CustomEnum& operator^=(CustomEnum f)
445 {
446 return customEnum.operator^=(f);
447 }
448
449 inline CustomEnum operator|(CustomEnum f) const
450 {
451 return customEnum.operator|(f);
452 }
453
454 inline CustomEnum operator^(CustomEnum f) const
455 {
456 return customEnum.operator^(f);
457 }
458
459 inline CustomEnum operator&(CustomEnum f) const
460 {
461 return customEnum.operator&(f);
462 }
463
464#ifdef HAVE_DBUS
465 // databasechangesets.cpp
466 Set& operator<<(const QDBusArgument& argument);
467 const Set& operator>>(QDBusArgument& argument) const;
468#endif
469
470private:
471
472 Images images;
473 ItemInformation imageInformation;
474 ImageMetadata imageMetadata;
475 VideoMetadata videoMetadata;
476 ItemComments imageComments;
477 ItemPositions imagePositions;
478 ImageHistoryInfo imageHistory;
479 CustomEnum customEnum;
480};
481
482#define DATABASEFIELDS_HASH_DECLARE_METHODS(Key, method) \
483 void insertField(const Key& key, const T& value) { QHash<unsigned int, T>::insert(method(key), value); } \
484 int remove(const Key& key) { return QHash<unsigned int, T>::remove(method(key)); } \
485 int removeAllFields(const Key& key) \
486 { \
487 int removedCount = 0; \
488 \
489 for (DatabaseFieldsEnumIteratorSetOnly<Key> it(key) ; !it.atEnd() ; ++it) \
490 { \
491 removedCount += remove(*it); \
492 } \
493 \
494 return removedCount; \
495 } \
496 \
497 T take(const Key& key) { return QHash<unsigned int, T>::take(method(key)); } \
498 \
499 bool contains(const Key& key) const { return QHash<unsigned int, T>::contains(method(key)); } \
500 const T value(const Key& key) const { return QHash<unsigned int, T>::value(method(key)); } \
501 const T value(const Key& key, const T& defaultValue) const { return QHash<unsigned int, T>::value(method(key), defaultValue); } \
502 \
503 T& operator[](const Key& key) { return QHash<unsigned int, T>::operator[](method(key)); } \
504 const T operator[](const Key& key) const { return QHash<unsigned int, T>::operator[](method(key)); } \
505 \
506 QList<T> values(const Key& key) const { return QHash<unsigned int, T>::value(method(key)); } \
507 int count(const Key& key) const { return QHash<unsigned int, T>::count(method(key)); }
508
519template <class T>
520class Hash : public QHash<unsigned int, T>
521{
522public:
523
524 // We use the upper 6 bits to distinguish the enums, and give the lower 26 bits to the flags.
525 // So we can store up to 64 enums, with 26 flags each.
526 static inline unsigned int uniqueKey(Images f)
527 {
528 return (unsigned int)f;
529 }
530
531 static inline unsigned int uniqueKey(ItemInformation f)
532 {
533 return (unsigned int)f | (unsigned int)(1 << 26);
534 }
535
536 static inline unsigned int uniqueKey(ImageMetadata f)
537 {
538 return (unsigned int)f | (unsigned int)(2 << 26);
539 }
540
541 static inline unsigned int uniqueKey(ItemComments f)
542 {
543 return (unsigned int)f | (unsigned int)(3 << 26);
544 }
545
546 static inline unsigned int uniqueKey(ItemPositions f)
547 {
548 return (unsigned int)f | (unsigned int)(4 << 26);
549 }
550
551 static inline unsigned int uniqueKey(ImageHistoryInfo f)
552 {
553 return (unsigned int)f | (unsigned int)(5 << 26);
554 }
555
556 static inline unsigned int uniqueKey(VideoMetadata f)
557 {
558 return (unsigned int)f | (unsigned int)(6 << 26);
559 }
560
561 static inline unsigned int uniqueKey(CustomEnum f)
562 {
563 return (unsigned int)f | ((unsigned int)(63) << 26);
564 }
565
566 // override relevant methods from QHash
575};
576
577} // namespace DatabaseFields
578
579} // namespace Digikam
580
581// NOTE: must be outside the namespace!
582Q_DECLARE_OPERATORS_FOR_FLAGS(Digikam::DatabaseFields::Images)
583Q_DECLARE_OPERATORS_FOR_FLAGS(Digikam::DatabaseFields::ItemInformation)
584Q_DECLARE_OPERATORS_FOR_FLAGS(Digikam::DatabaseFields::ImageMetadata)
585Q_DECLARE_OPERATORS_FOR_FLAGS(Digikam::DatabaseFields::VideoMetadata)
586Q_DECLARE_OPERATORS_FOR_FLAGS(Digikam::DatabaseFields::ItemComments)
587Q_DECLARE_OPERATORS_FOR_FLAGS(Digikam::DatabaseFields::ItemPositions)
588Q_DECLARE_OPERATORS_FOR_FLAGS(Digikam::DatabaseFields::ImageHistoryInfo)
Abstract base class for all album types.
Definition album.h:57
FieldName operator*() const
Definition coredbfields.h:326
bool atEnd() const
Definition coredbfields.h:308
DatabaseFieldsEnumIteratorSetOnly(const FieldName setValues)
Definition coredbfields.h:298
FieldName operator*() const
Definition coredbfields.h:281
bool atEnd() const
Definition coredbfields.h:271
void operator++()
Definition coredbfields.h:276
Definition coredbfields.h:237
Definition coredbfields.h:521
DATABASEFIELDS_HASH_DECLARE_METHODS(ImageMetadata, uniqueKey)
DATABASEFIELDS_HASH_DECLARE_METHODS(ImageHistoryInfo, uniqueKey)
DATABASEFIELDS_HASH_DECLARE_METHODS(ItemPositions, uniqueKey)
DATABASEFIELDS_HASH_DECLARE_METHODS(ItemComments, uniqueKey)
static unsigned int uniqueKey(ItemInformation f)
Definition coredbfields.h:531
static unsigned int uniqueKey(ItemComments f)
Definition coredbfields.h:541
DATABASEFIELDS_HASH_DECLARE_METHODS(ItemInformation, uniqueKey)
static unsigned int uniqueKey(ImageMetadata f)
Definition coredbfields.h:536
static unsigned int uniqueKey(Images f)
Definition coredbfields.h:526
DATABASEFIELDS_HASH_DECLARE_METHODS(CustomEnum, uniqueKey)
static unsigned int uniqueKey(ImageHistoryInfo f)
Definition coredbfields.h:551
static unsigned int uniqueKey(VideoMetadata f)
Definition coredbfields.h:556
DATABASEFIELDS_HASH_DECLARE_METHODS(Images, uniqueKey)
DATABASEFIELDS_HASH_DECLARE_METHODS(VideoMetadata, uniqueKey)
static unsigned int uniqueKey(ItemPositions f)
Definition coredbfields.h:546
static unsigned int uniqueKey(CustomEnum f)
Definition coredbfields.h:561
Definition coredbfields.h:376
CustomEnum operator^(CustomEnum f) const
Definition coredbfields.h:454
CustomEnum & operator^=(CustomEnum f)
Definition coredbfields.h:444
Set()
Definition coredbfields.h:379
CustomEnum & operator|=(CustomEnum f)
Definition coredbfields.h:439
Set & setFields(const Set &otherSet)
Definition coredbfields.h:420
CustomEnum & operator=(const CustomEnum &f)
Definition coredbfields.h:434
void initialize()
Definition coredbfields.h:384
CustomEnum operator|(CustomEnum f) const
Definition coredbfields.h:449
CustomEnum operator&(CustomEnum f) const
Definition coredbfields.h:459
Definition itemcomments.h:38
#define DECLARE_FIELDMETAINFO(FieldName)
Definition coredbfields.h:240
#define DATABASEFIELDS_ENUM_ITERATOR(Flag)
Definition coredbfields.h:337
#define DATABASEFIELDS_SET_DECLARE_METHODS(Flag, variable)
Definition coredbfields.h:358
uint16_t ItemPositionsMinSizeType
Definition coredbfields.h:169
CustomEnumFlags
Definition coredbfields.h:354
ItemInformationField
Definition coredbfields.h:71
@ ItemInformationNone
Definition coredbfields.h:72
@ Width
Definition coredbfields.h:77
@ ItemInformationLast
Definition coredbfields.h:96
@ ItemInformationAll
Definition coredbfields.h:84
@ CreationDate
Definition coredbfields.h:74
@ DigitizationDate
Definition coredbfields.h:75
@ PickLabel
Definition coredbfields.h:83
@ Rating
Definition coredbfields.h:73
@ Orientation
Definition coredbfields.h:76
@ Height
Definition coredbfields.h:78
@ ColorModel
Definition coredbfields.h:81
@ ItemInformationFirst
Definition coredbfields.h:95
@ ColorDepth
Definition coredbfields.h:80
@ Format
Definition coredbfields.h:79
uint8_t VideoMetadataMinSizeType
Definition coredbfields.h:226
ImagesField
Definition coredbfields.h:46
@ ImagesAll
Definition coredbfields.h:56
@ Status
Definition coredbfields.h:50
@ ManualOrder
Definition coredbfields.h:55
@ Album
Definition coredbfields.h:48
@ Name
Definition coredbfields.h:49
@ FileSize
Definition coredbfields.h:53
@ ImagesFirst
Definition coredbfields.h:64
@ ModificationDate
Definition coredbfields.h:52
@ Category
Definition coredbfields.h:51
@ ImagesLast
Definition coredbfields.h:65
@ UniqueHash
Definition coredbfields.h:54
@ ImagesNone
Definition coredbfields.h:47
ItemCommentsField
Definition coredbfields.h:172
@ CommentDate
Definition coredbfields.h:177
@ Comment
Definition coredbfields.h:178
@ ItemCommentsFirst
Definition coredbfields.h:184
@ CommentAuthor
Definition coredbfields.h:176
@ CommentType
Definition coredbfields.h:174
@ ItemCommentsLast
Definition coredbfields.h:185
@ ItemCommentsNone
Definition coredbfields.h:173
@ ItemCommentsAll
Definition coredbfields.h:179
@ CommentLanguage
Definition coredbfields.h:175
VideoMetadataField
Definition coredbfields.h:206
@ VideoMetadataFirst
Definition coredbfields.h:222
@ VideoCodec
Definition coredbfields.h:214
@ AudioCodec
Definition coredbfields.h:211
@ VideoMetadataNone
Definition coredbfields.h:207
@ Duration
Definition coredbfields.h:212
@ FrameRate
Definition coredbfields.h:213
@ AspectRatio
Definition coredbfields.h:208
@ VideoMetadataAll
Definition coredbfields.h:215
@ AudioChannelType
Definition coredbfields.h:210
@ VideoMetadataLast
Definition coredbfields.h:223
@ AudioBitRate
Definition coredbfields.h:209
uint8_t ImagesMinSizeType
Definition coredbfields.h:68
uint8_t ItemCommentsMinSizeType
Definition coredbfields.h:188
uint16_t ImageMetadataMinSizeType
Definition coredbfields.h:140
uint8_t ImageHistoryInfoMinSizeType
Definition coredbfields.h:203
uint16_t ItemInformationMinSizeType
Definition coredbfields.h:99
ImageHistoryInfoField
Definition coredbfields.h:191
@ ImageHistoryInfoLast
Definition coredbfields.h:200
@ ImageHistory
Definition coredbfields.h:194
@ ImageHistoryInfoFirst
Definition coredbfields.h:199
@ ImageHistoryInfoNone
Definition coredbfields.h:192
@ ImageHistoryInfoAll
Definition coredbfields.h:196
@ ImageRelations
Definition coredbfields.h:195
@ ImageUUID
Definition coredbfields.h:193
ItemPositionsField
Definition coredbfields.h:143
@ ItemPositionsLast
Definition coredbfields.h:166
@ Altitude
Definition coredbfields.h:149
@ PositionRoll
Definition coredbfields.h:152
@ ItemPositionsNone
Definition coredbfields.h:144
@ PositionAccuracy
Definition coredbfields.h:153
@ Latitude
Definition coredbfields.h:145
@ LatitudeNumber
Definition coredbfields.h:146
@ Longitude
Definition coredbfields.h:147
@ ItemPositionsFirst
Definition coredbfields.h:165
@ LongitudeNumber
Definition coredbfields.h:148
@ PositionTilt
Definition coredbfields.h:151
@ PositionDescription
Definition coredbfields.h:154
@ PositionOrientation
Definition coredbfields.h:150
@ ItemPositionsAll
Definition coredbfields.h:155
ImageMetadataField
Definition coredbfields.h:102
@ ImageMetadataFirst
Definition coredbfields.h:136
@ FlashMode
Definition coredbfields.h:114
@ ExposureMode
Definition coredbfields.h:112
@ FocalLength
Definition coredbfields.h:108
@ Make
Definition coredbfields.h:104
@ ImageMetadataAll
Definition coredbfields.h:120
@ SubjectDistance
Definition coredbfields.h:118
@ ImageMetadataLast
Definition coredbfields.h:137
@ ExposureProgram
Definition coredbfields.h:111
@ Sensitivity
Definition coredbfields.h:113
@ FocalLength35
Definition coredbfields.h:109
@ ExposureTime
Definition coredbfields.h:110
@ MeteringMode
Definition coredbfields.h:117
@ ImageMetadataNone
Definition coredbfields.h:103
@ SubjectDistanceCategory
Definition coredbfields.h:119
@ WhiteBalanceColorTemperature
Definition coredbfields.h:116
@ Lens
Definition coredbfields.h:106
@ Aperture
Definition coredbfields.h:107
@ Model
Definition coredbfields.h:105
@ WhiteBalance
Definition coredbfields.h:115
Definition datefolderview.cpp:34
QDebug operator<<(QDebug dbg, const DbEngineParameters &p)
Definition dbengineparameters.cpp:930
QDataStream & operator>>(QDataStream &ds, PhotoInfoContainer &info)
Definition photoinfocontainer.cpp:108
ColorLabel
Definition digikam_globals.h:90
PickLabel
Definition digikam_globals.h:109