00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00028 #ifndef ALBUMMANAGER_H
00029 #define ALBUMMANAGER_H
00030
00031
00032
00033 #include <QList>
00034 #include <QObject>
00035 #include <QString>
00036 #include <QMap>
00037
00038
00039
00040 #include <kurl.h>
00041
00042
00043
00044 #include "albuminfo.h"
00045 #include "digikam_export.h"
00046
00047 class QDate;
00048
00049 class KJob;
00050 namespace KIO
00051 {
00052 class Job;
00053 }
00054
00055 namespace Digikam
00056 {
00057
00058 class CollectionLocation;
00059 class Album;
00060 class PAlbum;
00061 class TAlbum;
00062 class DAlbum;
00063 class SAlbum;
00064 class AlbumChangeset;
00065 class TagChangeset;
00066 class SearchChangeset;
00067 class CollectionImageChangeset;
00068 class ImageTagChangeset;
00069 class AlbumManagerPriv;
00070
00071 typedef QList<Album*> AlbumList;
00072
00090 class AlbumManager : public QObject
00091 {
00092 Q_OBJECT
00093
00094 public:
00095
00099 static AlbumManager* instance();
00100
00110 bool setDatabase(const QString& dbPath, bool priority, const QString& suggestedAlbumRoot = QString());
00111
00113 static void checkDatabaseDirsAfterFirstRun(const QString& dbPath, const QString& albumPath);
00114
00120 void changeDatabase(const QString& dbPath);
00121
00125 void cleanUp();
00126
00130 bool databaseEqual(const QString& dbPath) const;
00131
00138 void startScan();
00139
00147 void refresh();
00148
00152 void prepareItemCounts();
00154
00161 AlbumList allPAlbums() const;
00162
00166 AlbumList allTAlbums() const;
00167
00171 AlbumList allSAlbums() const;
00172
00176 AlbumList allDAlbums() const;
00177
00183 void setCurrentAlbum(Album *album);
00184
00188 Album* currentAlbum() const;
00190
00201 PAlbum* findPAlbum(const KUrl& url) const;
00202
00207 PAlbum* findPAlbum(int id) const;
00208
00213 TAlbum* findTAlbum(int id) const;
00214
00219 SAlbum* findSAlbum(int id) const;
00220
00225 DAlbum* findDAlbum(int id) const;
00226
00231 Album* findAlbum(int gid) const;
00232
00237 TAlbum* findTAlbum(const QString& tagPath) const;
00238
00243 SAlbum* findSAlbum(const QString& name) const;
00245
00267 PAlbum* createPAlbum(PAlbum* parent, const QString& name,
00268 const QString& caption, const QDate& date,
00269 const QString& category,
00270 QString& errMsg);
00271
00276 PAlbum* createPAlbum(const QString& albumRootPath, const QString& name,
00277 const QString& caption, const QDate& date,
00278 const QString& category,
00279 QString& errMsg);
00280
00285 PAlbum* createPAlbum(const CollectionLocation& location, const QString& name,
00286 const QString& caption, const QDate& date,
00287 const QString& category,
00288 QString& errMsg);
00289
00299 bool renamePAlbum(PAlbum* album, const QString& newName,
00300 QString& errMsg);
00301
00311 bool updatePAlbumIcon(PAlbum *album, qlonglong iconID, QString& errMsg);
00313
00317 QHash<int, QString> albumTitles() const;
00318
00335 TAlbum* createTAlbum(TAlbum* parent, const QString& name,
00336 const QString& iconkde, QString& errMsg);
00337
00344 AlbumList findOrCreateTAlbums(const QStringList& tagPaths);
00345
00356 bool deleteTAlbum(TAlbum* album, QString& errMsg);
00357
00367 bool renameTAlbum(TAlbum* album, const QString& name, QString& errMsg);
00368
00378 bool moveTAlbum(TAlbum* album, TAlbum *newParent, QString& errMsg);
00379
00392 bool updateTAlbumIcon(TAlbum* album, const QString& iconKDE,
00393 qlonglong iconID, QString& errMsg);
00394
00399 AlbumList getRecentlyAssignedTags() const;
00400
00405 QStringList tagPaths(const QList<int>& tagIDs, bool leadingSlash=true) const;
00406
00411 QStringList tagNames(const QList<int>& tagIDs) const;
00412
00416 QHash<int, QString> tagPaths(bool leadingSlash=true) const;
00417
00421 QHash<int, QString> tagNames() const;
00422
00424
00440 SAlbum* createSAlbum(const QString& name, DatabaseSearch::Type type, const QString& query);
00441
00450 bool updateSAlbum(SAlbum* album, const QString& changedQuery,
00451 const QString& changedName = QString(), DatabaseSearch::Type type = DatabaseSearch::UndefinedType);
00452
00460 bool deleteSAlbum(SAlbum* album);
00462
00463 Q_SIGNALS:
00464
00467 void signalAlbumAboutToBeAdded(Album *album, Album *parent, Album *prev);
00469 void signalAlbumAdded(Album* album);
00471 void signalAlbumAboutToBeDeleted(Album *album);
00473 void signalAlbumDeleted(Album* album);
00476 void signalAlbumHasBeenDeleted(void *);
00477 void signalAlbumsCleared();
00478 void signalAlbumCurrentChanged(Album* album);
00479 void signalAllAlbumsLoaded();
00480 void signalAllDAlbumsLoaded();
00481 void signalAlbumIconChanged(Album* album);
00482 void signalAlbumRenamed(Album* album);
00483 void signalSearchUpdated(SAlbum *album);
00484 void signalTAlbumMoved(TAlbum* album, TAlbum* newParent);
00485 void signalPAlbumsDirty(const QMap<int, int>&);
00486 void signalTAlbumsDirty(const QMap<int, int>&);
00487 void signalDAlbumsDirty(const QMap<YearMonth, int>&);
00488 void signalDatesMapDirty(const QMap<QDateTime, int>&);
00489
00490 private Q_SLOTS:
00491
00492 void slotDatesJobResult(KJob* job);
00493 void slotDatesJobData(KIO::Job* job, const QByteArray& data);
00494 void slotAlbumsJobResult(KJob* job);
00495 void slotAlbumsJobData(KIO::Job* job, const QByteArray& data);
00496 void slotTagsJobResult(KJob* job);
00497 void slotTagsJobData(KIO::Job* job, const QByteArray& data);
00498 void slotDirWatchDirty(const QString& path);
00499 void slotKioFileMoved(const QString& urlFrom, const QString& urlTo);
00500 void slotKioFilesDeleted(const QStringList& urls);
00501 void slotKioFilesAdded(const QString& directory);
00502 void slotNotifyFileChange(const QString& directory);
00503 void slotCollectionLocationStatusChanged(const CollectionLocation &, int);
00504 void slotCollectionLocationPropertiesChanged(const CollectionLocation& location);
00505 void slotAlbumChange(const AlbumChangeset& changeset);
00506 void slotTagChange(const TagChangeset& changeset);
00507 void slotSearchChange(const SearchChangeset& changeset);
00508 void slotCollectionImageChange(const CollectionImageChangeset& changeset);
00509 void slotImageTagChange(const ImageTagChangeset& changeset);
00510
00516 void scanPAlbums();
00517 void updateChangedPAlbums();
00523 void scanTAlbums();
00529 void scanSAlbums();
00534 void scanDAlbums();
00535
00536 void getAlbumItemsCount();
00537 void getTagItemsCount();
00538
00539 private:
00540
00541 friend class AlbumManagerCreator;
00542 AlbumManager();
00543 ~AlbumManager();
00544
00545 void insertPAlbum(PAlbum *album, PAlbum *parent);
00546 void removePAlbum(PAlbum *album);
00547 void insertTAlbum(TAlbum *album, TAlbum *parent);
00548 void removeTAlbum(TAlbum *album);
00549 void updateAlbumPathHash();
00550
00551 void notifyAlbumDeletion(Album *album);
00552
00553 void addAlbumRoot(const CollectionLocation& location);
00554 void removeAlbumRoot(const CollectionLocation& location);
00555
00556 void handleKioNotification(const KUrl& url);
00557
00558 template <class T> friend class AlbumPointer;
00559 friend class Album;
00560 static AlbumManager *internalInstance;
00561 void addGuardedPointer(Album *a, Album **pointer);
00562 void removeGuardedPointer(Album *a, Album **pointer);
00563 void changeGuardedPointer(Album *oldAlbum, Album *a, Album **pointer);
00564 void invalidateGuardedPointers(Album *album);
00565
00566 bool checkNepomukService();
00567
00568 private:
00569
00570 AlbumManagerPriv* const d;
00571 };
00572
00578 template <class T = Album>
00579
00580 class AlbumPointer
00581 {
00582 public:
00583
00584 AlbumPointer() : album(0) {}
00585 AlbumPointer(T *a) : album(a)
00586 { AlbumManager::instance()->addGuardedPointer(album, &album); }
00587 AlbumPointer(const AlbumPointer<T>& p) : album(p.album)
00588 { AlbumManager::instance()->addGuardedPointer(album, &album); }
00589
00590 ~AlbumPointer()
00591 { AlbumManager::instance()->removeGuardedPointer(album, &album); }
00592
00593 AlbumPointer<T> operator=(T* a)
00594 {
00595 Album *oldAlbum = album;
00596 album = a;
00597 AlbumManager::instance()->changeGuardedPointer(oldAlbum, album, &album);
00598 return *this;
00599 }
00600 AlbumPointer<T> operator=(const AlbumPointer<T>& p)
00601 {
00602 Album *oldAlbum = album;
00603 album = p.album;
00604 AlbumManager::instance()->changeGuardedPointer(oldAlbum, album, &album);
00605 return *this;
00606 }
00607
00608 T* operator->() const { return static_cast<T*>(const_cast<Album*>(album)); }
00609 T& operator*() const { return *static_cast<T*>(const_cast<Album*>(album)); }
00610 operator T*() const { return static_cast<T*>(const_cast<Album*>(album)); }
00611
00612 private:
00613
00614 friend class AlbumManager;
00615 Album *album;
00616 };
00617
00618 }
00619
00620 #endif