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.
tdemultimedia/juk/tagtransactionmanager.h

213 lines
7.2 KiB

/***************************************************************************
begin : Wed Sep 22 2004
copyright : (C) 2004 by Michael Pyne
email : michael.pyne@kdemail.net
***************************************************************************/
/***************************************************************************
* *
* 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 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef _TAGTRANSACTIONMANAGER_H
#define _TAGTRANSACTIONMANAGER_H
class PlaylistItem;
class TQWidget;
class Tag;
/**
* Class to encapsulate a change to the tag, and optionally the file name, of
* a PlaylistItem.
*
* @author Michael Pyne <michael.pyne@kdemail.net>
* @see TagTransactionManager
*/
class TagTransactionAtom
{
public:
/**
* Default constructor, for use by TQValueList.
*/
TagTransactionAtom();
/**
* Copy constructor. This takes ownership of the m_tag pointer, so the
* object being copied no longer has access to the tag. This function also
* exists mainly for TQValueList's benefit.
*
* @param other The TagTransactionAtom to copy.
*/
TagTransactionAtom(const TagTransactionAtom &other);
/**
* Creates an atom detailing a change made by \p tag to \p item.
*
* @param tag Contains the new tag to apply to item.
* @param item The PlaylistItem to change.
*/
TagTransactionAtom(PlaylistItem *item, Tag *tag);
/**
* Destroys the atom. This function deletes the tag, so make sure you've
* already copied out any data you need. The PlaylistItem is unaffected.
*/
~TagTransactionAtom();
/**
* Assignment operator. This operator takes ownership of the m_tag pointer,
* so the object being assigned from no longer has access to the tag. This
* function exists mainly for the benefit of TQValueList.
*
* @param other The TagTransactionAtom to copy from.
* @return The TagTransactionAtom being assigned to.
*/
TagTransactionAtom &operator=(const TagTransactionAtom &other);
/**
* Accessor function to retrieve the PlaylistItem.
*
* @return The PlaylistItem being changed.
*/
PlaylistItem *item() const { return m_item; }
/**
* Accessor function to retrieve the changed Tag.
*
* @return The Tag containing the changes to apply to item().
*/
Tag *tag() const { return m_tag; }
private:
PlaylistItem *m_item;
mutable Tag *m_tag;
};
typedef TQValueList<TagTransactionAtom> TagAlterationList;
/**
* This class manages alterations of a group of PlaylistItem's FileHandles. What this
* means in practice is that you will use this class to change the tags and/or
* filename of a PlaylistItem.
*
* This class supports a limited transactional interface. Once you commit a
* group of changes, you can call the undo() method to revert back to the way
* things were (except possibly for file renames). You can call forget() to
* forget a series of changes as well.
*
* @author Michael Pyne <michael.pyne@kdemail.net>
*/
class TagTransactionManager : public TQObject
{
TQ_OBJECT
public:
/**
* Constructs a TagTransactionManager, owned by @p parent.
*
* @param parent The parent TQWidget.
*/
TagTransactionManager(TQWidget *parent = 0);
/**
* Returns the global TagTransactionManager instance.
*
* @return The global TagTransactionManager.
*/
static TagTransactionManager *instance();
/**
* Adds a change to the list of changes to apply. Internally this
* function extracts the CollectionListItem of @p item, and uses that
* instead, so there is no need to do so yourself.
*
* @param item The PlaylistItem to change.
* @param newTag The Tag containing the changed data.
*/
void changeTagOnItem(PlaylistItem *item, Tag *newTag);
/**
* Convienience function to duplicate a Tag object, since the Tag
* object doesn't have a decent copy constructor.
*
* @param tag The Tag to duplicate.
* @param fileName The filename to assign to the tag. If TQString()
* (the default) is passed, the filename of the existing tag is
* used.
* @bug Tag should have a correct copy ctor and assignment operator.
* @return The duplicate Tag.
*/
static Tag *duplicateTag(const Tag *tag, const TQString &fileName = TQString());
/**
* Commits the changes to the PlaylistItems. It is important that the
* PlaylistItems still exist when you call this function, although this
* shouldn't be a problem in practice. After altering the tags, and
* renaming the files if necessary, you can call undo() to back out the
* changes.
*
* If any errors have occurred, the user will be notified with a dialog
* box, and those files which were unabled to be altered will be excluded
* from the undo set.
*
* @return true if no errors occurred, false otherwise.
*/
bool commit();
/**
* Clears the current update list. The current undo list is unaffected.
*/
void forget();
/**
* Undoes the changes caused by commit(). Like commit(), if any errors
* occur changing the state back (for example, it may be impossible to
* rename a file back to its original name), the user will be shown notified
* via a dialog box.
*
* After performing the undo operation, it is impossible to call undo()
* again on the same set of files. Namely, you can't repeatedly call
* undo() to switch between two different file states.
*
* @return true if no errors occurred, false otherwise.
*/
bool undo();
signals:
void signalAboutToModifyTags();
void signalDoneModifyingTags();
private:
/**
* Renames the file identified by @p from to have the name given by @p to,
* prompting the user to confirm if necessary.
*
* @param from TQFileInfo with the filename of the original file.
* @param to TQFileInfo with the new filename.
* @return true if no errors occurred, false otherwise.
*/
bool renameFile(const TQFileInfo &from, const TQFileInfo &to) const;
/**
* Used internally by commit() and undo(). Performs the work of updating
* the PlaylistItems and then updating the various GUI elements that need
* to be updated.
*
* @param undo true if operating in undo mode, false otherwise.
*/
bool processChangeList(bool undo = false);
TagAlterationList m_list; ///< holds a list of changes to commit
TagAlterationList m_undoList; ///< holds a list of changes to undo
static TagTransactionManager *m_manager; ///< used by instance()
};
#endif /* _TAGTRANSACTIONMANAGER_H */