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/tracksequencemanager.h

194 lines
6.5 KiB

/***************************************************************************
begin : Thu Aug 19 2004
copyright : (C) 2002 - 2004 by Michael Pyne
email : michael.pyne@kde.org
***************************************************************************/
/***************************************************************************
* *
* 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 _TRACKSEQUENCEMANAGER_H
#define _TRACKSEQUENCEMANAGER_H
#include <tqobject.h>
class KPopupMenu;
class TrackSequenceIterator;
class PlaylistItem;
class Playlist;
/**
* This class is responsible for managing the music play sequence for JuK.
* Instead of playlists deciding which song goes next, this class is used to
* do so. You can replace the iterator used as well, although the class
* provides a default iterator that supports random play and playlist looping.
*
* @see Playlist
* @see TrackSequenceIterator
* @author Michael Pyne <michael.pyne@kdemail.net>
*/
class TrackSequenceManager : public TQObject
{
Q_OBJECT
TQ_OBJECT
public:
/**
* Destroys the track sequence manager. The sequence iterators will also
* be deleted, but the playlist, popup menu, and playlist items will not be
* touched.
*/
~TrackSequenceManager();
/**
* This function installs a new iterator to be used instead of the old
* one. TrackSequenceManager will control the iterator after that,
* deleting the iterator when another is installed, or when the
* TrackSequenceManager is destroyed.
*
* @param iterator the iterator to install, or 0 for the default
* @return true if installation successfully happened
*/
bool installIterator(TrackSequenceIterator *iterator);
/**
* @return currently selected iterator
*/
TrackSequenceIterator *iterator() const { return m_iterator; }
/**
* This function returns a pointer to the currently set iterator, and
* then removes the TrackSequenceManager's pointer to the iterator without
* deleting the iterator. You should only do this if you are going to be
* using @see installIterator to give control of the iterator back to the
* TrackSequenceManager at some point. Also, you must install a
* replacement iterator before the TrackSequenceManager is otherwise
* used. If you use this function, you must manually set the current
* item of the iterator you replace the old one with (if you want).
*
* @see installIterator
* @return the currently set iterator.
*/
TrackSequenceIterator *takeIterator();
/**
* Returns the global TrackSequenceManager object. This is the only way to
* access the TrackSequenceManager.
*
* @return the global TrackSequenceManager
*/
static TrackSequenceManager *instance();
/**
* Returns the next track, and advances in the current sequence..
*
* @return the next track in the current sequence, or 0 if the end has
* been reached
*/
PlaylistItem *nextItem();
/**
* Returns the previous track, and backs up in the current sequence. Note
* that if you have an item x, nextItem(previousItem(x)) is not guaranteed
* to equal x, even ignoring the effect of hitting the end of list.
*
* @return the previous track in the current sequence, or 0 if the
* beginning has been reached
*/
PlaylistItem *previousItem();
/**
* @return the current track in the current sequence, or 0 if there is no
* current track (for example, an empty playlist)
*/
PlaylistItem *currentItem() const;
/**
* @return the current KPopupMenu used by the manager, or 0 if none is
* set
*/
KPopupMenu *popupMenu() const { return m_popupMenu; }
/**
* @return the TrackSequenceManager's idea of the current playlist
*/
Playlist *currentPlaylist() const { return m_playlist; }
public slots:
/**
* Set the next item to play to @p item
*
* @param item the next item to play
*/
void setNextItem(PlaylistItem *item);
/**
* Sets the current playlist. This is necessary in order for some of the
* actions in the popup menu used by this class to work. Note that the
* current playlist is not necessarily the same as the playlist that is
* playlist. The TrackSequenceManager does not own @p list after this
* call.
*
* @param list the current playlist
*/
void setCurrentPlaylist(Playlist *list);
/**
* Sets the current item to @p item. You should try to avoid calling this
* function, instead allowing the manager to perform its work. However,
* this function is useful for clearing the current item. Remember that
* you must have a valid playlist to iterate if you clear the current item.
*
* @param item the PlaylistItem that is currently playing. Set to 0 if
* there is no item playing.
*/
void setCurrent(PlaylistItem *item);
private:
/**
* Sets up various connections, to be run after the GUI is running.
* Automatically run by instance().
*
* @see instance
*/
void initialize();
/**
* Constructs the sequence manager. The constructor will work even before
* the GUI has been created. Note that you can't actually construct an
* object with this function, use instance().
*
* @see instance
*/
TrackSequenceManager();
protected slots:
/**
* This slot should be called when @a item is about to be deleted, so that
* the TrackSequenceManager can make sure that any pointers held pointing
* to @a item are corrected.
*
* @param item The PlaylistItem about to be deleted.
*/
void slotItemAboutToDie(PlaylistItem *item);
private:
Playlist *m_playlist;
PlaylistItem *m_curItem, *m_playNextItem;
KPopupMenu *m_popupMenu;
TrackSequenceIterator *m_iterator;
TrackSequenceIterator *m_defaultIterator;
bool m_initialized;
};
#endif /* _TRACKSEQUENCEMANAGER_H */
// vim: set et sw=4: