You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
473 lines
15 KiB
473 lines
15 KiB
/* ============================================================
|
|
*
|
|
* This file is a part of digiKam project
|
|
* http://www.digikam.org
|
|
*
|
|
* Date : 2004-06-15
|
|
* Description : Albums manager interface.
|
|
*
|
|
* Copyright (C) 2004-2005 by Renchi Raju <renchi@pooh.tam.uiuc.edu>
|
|
* Copyright (C) 2006-2008 by Gilles Caulier <caulier dot gilles at gmail dot com>
|
|
*
|
|
* This program is free software; you can redistribute it
|
|
* and/or modify it under the terms of the GNU General
|
|
* Public License as published by the Free Software Foundation;
|
|
* either version 2, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* ============================================================ */
|
|
|
|
/** @file albummanager.h */
|
|
|
|
#ifndef ALBUMMANAGER_H
|
|
#define ALBUMMANAGER_H
|
|
|
|
// TQt includes.
|
|
|
|
#include <tqdatetime.h>
|
|
#include <tqobject.h>
|
|
#include <tqstring.h>
|
|
#include <tqvaluelist.h>
|
|
#include <tqmap.h>
|
|
#include <tqptrlist.h>
|
|
|
|
// KDE includes.
|
|
|
|
#include <kurl.h>
|
|
|
|
// Local includes.
|
|
|
|
#include "digikam_export.h"
|
|
|
|
class TQDate;
|
|
|
|
namespace TDEIO
|
|
{
|
|
class Job;
|
|
}
|
|
|
|
namespace Digikam
|
|
{
|
|
|
|
class Album;
|
|
class PAlbum;
|
|
class TAlbum;
|
|
class DAlbum;
|
|
class SAlbum;
|
|
class AlbumDB;
|
|
class AlbumItemHandler;
|
|
class SplashScreen;
|
|
class AlbumManagerPriv;
|
|
|
|
typedef TQValueList<Album*> AlbumList;
|
|
typedef TQPair<int, int> YearMonth;
|
|
|
|
/**
|
|
* \class AlbumManager
|
|
*
|
|
* There are two primary managers which manage the listing and
|
|
* lifetime of Album and ImageInfo: AlbumManager and AlbumLister
|
|
*
|
|
* AlbumManager manages albums: does listing of albums and controls the lifetime of it.
|
|
* For PAlbums and TAlbums, the listing is done by reading the db directly and
|
|
* building the hierarchy of the albums. For DAlbums, since the listing takes
|
|
* time, the work is delegated to a tdeioslave. Interested frontend entities can
|
|
* connect to the albummanager to receive notifications of new Albums, when
|
|
* Albums are deleted and when the current album is changed.
|
|
*
|
|
* Additional operations are provided for: creating/deleting/rename Albums,
|
|
* updating icons and moving Albums.
|
|
*
|
|
*/
|
|
class DIGIKAM_EXPORT AlbumManager : public TQObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
AlbumManager();
|
|
|
|
/**
|
|
* Destructor
|
|
*/
|
|
~AlbumManager();
|
|
|
|
/**
|
|
* A convenience function to get the instance of the AlbumManager
|
|
*/
|
|
static AlbumManager* instance();
|
|
|
|
/**
|
|
* returns a pointer to the current AlbumDB
|
|
*/
|
|
AlbumDB* albumDB();
|
|
|
|
/** @name Library path And Scanning
|
|
*/
|
|
//@{
|
|
/**
|
|
* Set the @p libraryPath to the given path
|
|
*
|
|
* If the libraryPath is the same as the current path, nothing happens.
|
|
* Otherwise the currently listed albums are cleared. The albums in the new
|
|
* library path are not listed till you call startScan()
|
|
* @param path the new libraryPath
|
|
* @see startScan
|
|
*/
|
|
void setLibraryPath(const TQString& path, SplashScreen *splash=0);
|
|
|
|
/**
|
|
* @return the current libraryPath
|
|
*/
|
|
TQString getLibraryPath() const;
|
|
|
|
/**
|
|
* starts scanning the libraryPath and listing the albums. If the
|
|
* libraryPath has not changed since the lastscan, then nothing happens
|
|
* @see setLibraryPath
|
|
* @see refresh
|
|
*/
|
|
void startScan();
|
|
|
|
/**
|
|
* This is similar to startScan, except that it assumes you have run
|
|
* startScan at least once. It checks the database to see if any new albums
|
|
* have been added and updates them accordingly. Use this when a change in the
|
|
* filesystem is detected (but the album library path hasn't changed)
|
|
* @see startScan
|
|
*/
|
|
void refresh();
|
|
//@}
|
|
|
|
/** @name List of Albums and current Album
|
|
*/
|
|
//@{
|
|
/**
|
|
* @return a list of all PAlbums
|
|
*/
|
|
AlbumList allPAlbums() const;
|
|
|
|
/**
|
|
* @return a list of all TAlbums
|
|
*/
|
|
AlbumList allTAlbums() const;
|
|
|
|
/**
|
|
* @return a list of all SAlbums
|
|
*/
|
|
AlbumList allSAlbums() const;
|
|
|
|
/**
|
|
* @return a list of all SAlbums
|
|
*/
|
|
AlbumList allDAlbums() const;
|
|
|
|
/**
|
|
* set the current album to @p album. Call this from views which show
|
|
* listing of albums. This also causes it to fire the signal
|
|
* signalAlbumCurrentChanged()
|
|
*/
|
|
void setCurrentAlbum(Album *album);
|
|
|
|
/**
|
|
* @returns the current albumm
|
|
*/
|
|
Album* currentAlbum() const;
|
|
//@}
|
|
|
|
/** @name Finding Albums
|
|
*/
|
|
//@{
|
|
/**
|
|
* Given a complete file url (kde url with file protocol), it will try to find
|
|
* a PAlbum corresponding to it.
|
|
* \warning This should not be used, unless really necessary
|
|
* @return PAlbum correspoding to supplied @p url
|
|
* @param url the url we need to check
|
|
*/
|
|
PAlbum* findPAlbum(const KURL& url) const;
|
|
|
|
/**
|
|
* @return a PAlbum with given ID
|
|
* @param id the id for the PAlbum
|
|
*/
|
|
PAlbum* findPAlbum(int id) const;
|
|
|
|
/**
|
|
* @return a TAlbum with given ID
|
|
* @param id the id for the TAlbum
|
|
*/
|
|
TAlbum* findTAlbum(int id) const;
|
|
|
|
/**
|
|
* @return a SAlbum with given ID
|
|
* @param id the id for the SAlbum
|
|
*/
|
|
SAlbum* findSAlbum(int id) const;
|
|
|
|
/**
|
|
* @return a DAlbum with given ID
|
|
* @param id the id for the DAlbum
|
|
*/
|
|
DAlbum* findDAlbum(int id) const;
|
|
|
|
/**
|
|
* @return a Album with the given globalID
|
|
* @param gid the global id for the album
|
|
*/
|
|
Album* findAlbum(int gid) const;
|
|
|
|
/**
|
|
* @return a TAlbum with given tag path, or 0 if not found
|
|
* @param tagPath the tag path ("People/Friend/John")
|
|
*/
|
|
TAlbum* findTAlbum(const TQString &tagPath) const;
|
|
//@}
|
|
|
|
/** @name Operations on PAlbum
|
|
*/
|
|
//@{
|
|
/**
|
|
* Create a new PAlbum with supplied properties as a child of the parent
|
|
* This is equivalent to creating a new folder on the disk with supplied
|
|
* name in the parent's folder path. Also the supplied attributes are written
|
|
* out to the database
|
|
* \note the signalAlbumAdded will be fired before this function returns. Its
|
|
* recommended to connect to that signal to get notification of new album added
|
|
* @return the newly created PAlbum or 0 if it fails
|
|
* @param parent the parent album under which to create the new Album
|
|
* @param name the name of the new album
|
|
* @param caption the caption for the new album
|
|
* @param date the date for the new album
|
|
* @param collection the collection for the new album
|
|
* @param errMsg this will contain the error message describing why the
|
|
* operation failed
|
|
*/
|
|
PAlbum* createPAlbum(PAlbum* parent, const TQString& name,
|
|
const TQString& caption, const TQDate& date,
|
|
const TQString& collection,
|
|
TQString& errMsg);
|
|
|
|
/**
|
|
* Renames a PAlbum. This is equivalent to actually renaming the corresponding
|
|
* folder on the disk.
|
|
* @return true if the operation succeeds, false otherwise
|
|
* @param album the Album which should be renamed
|
|
* @param newName the new name for the album
|
|
* @param errMsg this will contain the error message describing why the
|
|
* operation failed
|
|
*/
|
|
bool renamePAlbum(PAlbum* album, const TQString& newName,
|
|
TQString& errMsg);
|
|
|
|
/**
|
|
* Update the icon for an album. The @p icon is the name (and not full path)
|
|
* of the file in the album
|
|
* @return true if the operation succeeds, false otherwise
|
|
* @param album the album for which icon should be changed
|
|
* @param iconID the filename of the new icon
|
|
* @param errMsg if the operation fails, this will contain the error message
|
|
* describing why the operation failed
|
|
*/
|
|
bool updatePAlbumIcon(PAlbum *album, TQ_LLONG iconID, TQString& errMsg);
|
|
//@}
|
|
|
|
/** @name Operations on TAlbum
|
|
*/
|
|
//@{
|
|
/**
|
|
* Create a new TAlbum with supplied properties as a child of the parent
|
|
* The tag is added to the database
|
|
* \note the signalAlbumAdded will be fired before this function returns. Its
|
|
* recommended to connect to that signal to get notification of new album added
|
|
* @return the newly created TAlbum or 0 if it fails
|
|
* @param parent the parent album under which to create the new Album
|
|
* @param name the name of the new album
|
|
* @param iconkde the iconkde for the new album (this is a filename which
|
|
* kde iconloader can load up
|
|
* @param errMsg this will contain the error message describing why the
|
|
* operation failed
|
|
*/
|
|
TAlbum* createTAlbum(TAlbum* parent, const TQString& name,
|
|
const TQString& iconkde, TQString& errMsg);
|
|
|
|
/**
|
|
* A list of tag paths is supplied.
|
|
* If no corresponding TAlbum exists, a new one will be created.
|
|
* @param tagPath A list of tag paths
|
|
* @returns A list of all TAlbums for the list (already existing or newly created)
|
|
*/
|
|
AlbumList findOrCreateTAlbums(const TQStringList &tagPaths);
|
|
|
|
/**
|
|
* Delete a TAlbum.
|
|
* The tag is removed from the database
|
|
* \note the signalAlbumDeleted will be fired before this function returns. Its
|
|
* recommended to connect to that signal to get notification of album deletes
|
|
* @return true if the operation succeeds or false otherwise
|
|
* @param album the TAlbum to delete
|
|
* @param errMsg this will contain the error message describing why the
|
|
* operation failed
|
|
*/
|
|
bool deleteTAlbum(TAlbum* album, TQString& errMsg);
|
|
|
|
/**
|
|
* Renames a TAlbum.
|
|
* This updates the tag name in the database
|
|
* @return true if the operation succeeds, false otherwise
|
|
* @param album the Album which should be renamed
|
|
* @param name the new name for the album
|
|
* @param errMsg this will contain the error message describing why the
|
|
* operation failed
|
|
*/
|
|
bool renameTAlbum(TAlbum* album, const TQString& name, TQString& errMsg);
|
|
|
|
/**
|
|
* Move a TAlbum to a new parent.
|
|
* This updates the tag parent ID in the database
|
|
* @return true if the operation succeeds, false otherwise
|
|
* @param album the Album which should be moved
|
|
* @param newParent the Parent Album to which album should be moved
|
|
* @param errMsg this will contain the error message describing why the
|
|
* operation failed
|
|
*/
|
|
bool moveTAlbum(TAlbum* album, TAlbum *newParent, TQString &errMsg);
|
|
|
|
/**
|
|
* Update the icon for a TAlbum.
|
|
* @return true if the operation succeeds, false otherwise
|
|
* @param album the album for which icon should be changed
|
|
* @param iconKDE a simple filename which can be loaded by TDEIconLoader
|
|
* @param iconID id of the icon image file
|
|
* @param errMsg this will contain the error message describing why the
|
|
* operation failed
|
|
* \note if iconKDE is not empty then iconID is used. So if you want to set
|
|
* the icon to a file which can be loaded by TDEIconLoader, pass it in as
|
|
* iconKDE. otherwise pass a null TQString to iconKDE and set iconID
|
|
*/
|
|
bool updateTAlbumIcon(TAlbum* album, const TQString& iconKDE,
|
|
TQ_LLONG iconID, TQString& errMsg);
|
|
//@}
|
|
|
|
/** @name Operations on SAlbum
|
|
*/
|
|
//@{
|
|
/**
|
|
* Create a new SAlbum with supplied url. If an existing SAlbum with same name
|
|
* exists this function will return a pointer to that album, instead of creating
|
|
* a new one. A newly created search album is added to the database. For an
|
|
* existing SAlbum, the url is updated and written out to the database
|
|
* \note the signalAlbumAdded will be fired before this function returns. Its
|
|
* recommended to connect to that signal to get notification of new album added
|
|
* @return the newly created SAlbum or an existing SAlbum with same name
|
|
* @param url the url of the album
|
|
* @param simple indicates whether the Search album is of simple type or
|
|
* extended type
|
|
*/
|
|
SAlbum* createSAlbum(const KURL& url, bool simple);
|
|
|
|
/**
|
|
* Update the url for a SAlbum
|
|
* @return true if the operation succeeds, false otherwise
|
|
* @param album the album to update
|
|
* @param newURL the new url of the album
|
|
*/
|
|
bool updateSAlbum(SAlbum* album, const KURL& newURL);
|
|
|
|
/**
|
|
* Delete a SAlbum from the database
|
|
* \note the signalAlbumDeleted will be fired before this function returns. Its
|
|
* recommended to connect to that signal to get notification of album deletes
|
|
* @return true if the operation succeeds, false otherwise
|
|
* @param album the album to delete
|
|
*/
|
|
bool deleteSAlbum(SAlbum* album);
|
|
//@}
|
|
|
|
void setItemHandler(AlbumItemHandler *handler);
|
|
AlbumItemHandler* getItemHandler();
|
|
void refreshItemHandler(const KURL::List& itemList=KURL::List());
|
|
void emitAlbumItemsSelected(bool val);
|
|
|
|
signals:
|
|
|
|
void signalAlbumAdded(Album* album);
|
|
void signalAlbumDeleted(Album* album);
|
|
void signalAlbumItemsSelected(bool selected);
|
|
void signalAlbumsCleared();
|
|
void signalAlbumCurrentChanged(Album* album);
|
|
void signalAllAlbumsLoaded();
|
|
void signalAllDAlbumsLoaded();
|
|
void signalAlbumIconChanged(Album* album);
|
|
void signalAlbumRenamed(Album* album);
|
|
void signalTAlbumMoved(TAlbum* album, TAlbum* newParent);
|
|
void signalPAlbumDirty(PAlbum* album);
|
|
void signalPAlbumsDirty(const TQMap<int, int>&);
|
|
void signalTAlbumsDirty(const TQMap<int, int>&);
|
|
void signalDAlbumsDirty(const TQMap<YearMonth, int>&);
|
|
void signalDatesMapDirty(const TQMap<TQDateTime, int>&);
|
|
|
|
private slots:
|
|
|
|
void slotDatesJobResult(TDEIO::Job* job);
|
|
void slotDatesJobData(TDEIO::Job* job, const TQByteArray& data);
|
|
void slotAlbumsJobResult(TDEIO::Job* job);
|
|
void slotAlbumsJobData(TDEIO::Job* job, const TQByteArray& data);
|
|
void slotTagsJobResult(TDEIO::Job* job);
|
|
void slotTagsJobData(TDEIO::Job* job, const TQByteArray& data);
|
|
void slotDirty(const TQString& path);
|
|
|
|
private:
|
|
|
|
void insertPAlbum(PAlbum *album);
|
|
void removePAlbum(PAlbum *album);
|
|
void insertTAlbum(TAlbum *album);
|
|
void removeTAlbum(TAlbum *album);
|
|
|
|
/**
|
|
* Scan albums directly from database and creates new PAlbums
|
|
* It only create those PAlbums which haven't already been
|
|
* created
|
|
*/
|
|
void scanPAlbums();
|
|
|
|
/**
|
|
* Scan tags directly from database and creates new TAlbums
|
|
* It only create those TAlbums which haven't already been
|
|
* created
|
|
*/
|
|
void scanTAlbums();
|
|
|
|
/**
|
|
* Scan searches directly from database and creates new SAlbums
|
|
* It only create those SAlbums which haven't already been
|
|
* created
|
|
*/
|
|
void scanSAlbums();
|
|
|
|
/**
|
|
* Makes use of a TDEIO::Job to list dates from the database
|
|
* @see slotResult
|
|
* @see slotData
|
|
*/
|
|
void scanDAlbums();
|
|
|
|
private:
|
|
|
|
static AlbumManager *m_instance;
|
|
|
|
AlbumManagerPriv *d;
|
|
};
|
|
|
|
} // namespace Digikam
|
|
|
|
#endif /* ALBUMMANAGER_H */
|