summaryrefslogtreecommitdiffstats
path: root/juk/upcomingplaylist.h
diff options
context:
space:
mode:
Diffstat (limited to 'juk/upcomingplaylist.h')
-rw-r--r--juk/upcomingplaylist.h213
1 files changed, 213 insertions, 0 deletions
diff --git a/juk/upcomingplaylist.h b/juk/upcomingplaylist.h
new file mode 100644
index 00000000..ee0570f9
--- /dev/null
+++ b/juk/upcomingplaylist.h
@@ -0,0 +1,213 @@
+/***************************************************************************
+ 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 _UPCOMINGPLAYLIST_H
+#define _UPCOMINGPLAYLIST_H
+
+
+#include <qguardedptr.h>
+
+#include "playlist.h"
+#include "tracksequenceiterator.h"
+
+class TrackSequenceManager;
+
+/**
+ * A class to implement upcoming playlist support in JuK. It is closely
+ * associated with the UpcomingSequenceIterator class. It works by using
+ * whatever iterator is currently being used by the TrackSequenceManager
+ * instance when this playlist is constructed to form a list of upcoming tracks.
+ * After the playlist is created, tracks are played from top to bottom until
+ * the list is empty. If loop playlist is enabled, tracks are automatically
+ * added as tracks are removed. Also, enabling this playlist causes the base
+ * Playlist class to add an item to the context-menu to add the selected items
+ * to this playlist. If the user double-clicks any track to force it to play,
+ * it is added to the top of this playlist automatically, replacing any
+ * currently playing song.
+ *
+ * @author Michael Pyne <michael.pyne@kdemail.net>
+ * @see UpcomingSequenceIterator
+ */
+class UpcomingPlaylist : public Playlist
+{
+public:
+ /**
+ * Constructor for the UpcomingPlaylist object. You should only ever have
+ * one instance of this class. You should call the initialize() function
+ * before using the created object.
+ *
+ * @see initialize
+ * @param collection The PlaylistCollection that owns this playlist.
+ * @param defaultSize The default number of tracks to place in the playlist.
+ */
+ UpcomingPlaylist(PlaylistCollection *collection, int defaultSize = 15);
+ /**
+ * Destructor for the UpcomingPlaylist. This destructor will restore the
+ * iterator for the TrackSequenceManager, and if a song is playing when
+ * this playlist is removed, it will remain playing after the playlist is
+ * destroyed.
+ */
+ virtual ~UpcomingPlaylist();
+
+ /**
+ * This function initializes the upcoming playlist, so that you can create
+ * it before the GUI has been completely setup. If a song is playing when
+ * this function is called, then the song will be added to this playlist,
+ * automatically with no interruption in playback.
+ */
+ void initialize();
+
+ /**
+ * Appends the given items to the end of the playlist. Use this function
+ * instead of createItems() since this function ensures that the items are
+ * added to the end of the playlist.
+ *
+ * @see createItems(const PlaylistItemList &, PlaylistItem *)
+ * @param itemList The list of PlaylistItems to append.
+ */
+ void appendItems(const PlaylistItemList &itemList);
+
+ /**
+ * Reimplemented to set the playing item in both the source playlist
+ * and the upcoming playlist.
+ */
+ virtual void playNext();
+
+ /**
+ * Reimplemented to remove the item from the Playlist index.
+ */
+ virtual void clearItem(PlaylistItem *item, bool emitChanged = true);
+
+ virtual void addFiles(const QStringList &files, PlaylistItem *after = 0);
+
+ /**
+ * Returns a reference to the index between items in the list and the
+ * playlist that they came from. This is used to remap the currently
+ * playing item to the source playlist.
+ */
+ QMap<PlaylistItem::Pointer, QGuardedPtr<Playlist> > &playlistIndex();
+
+ bool active() const { return m_active; }
+
+private:
+
+ /**
+ * Internal function to restore the TrackSequenceManager to the state
+ * it was in when the object was constructed, except for the playing
+ * item.
+ */
+ void removeIteratorOverride();
+
+ /**
+ * This function returns the instance of the TrackSequenceManager.
+ *
+ * @return the TrackSequenceManager instance.
+ * @see TrackSequenceManager::instance()
+ */
+ TrackSequenceManager *manager() const;
+
+private:
+ class UpcomingSequenceIterator;
+ friend class UpcomingSequenceIterator;
+
+ bool m_active;
+ TrackSequenceIterator *m_oldIterator;
+ int m_defaultSize;
+ QMap<PlaylistItem::Pointer, QGuardedPtr<Playlist> > m_playlistIndex;
+};
+
+/**
+ * An implementation of TrackSequenceIterator designed to work with
+ * UpcomingPlaylist. It is installed by UpcomingPlaylist to ensure that the
+ * UpcomingPlaylist is in charge of the playback sequence.
+ *
+ * @see UpcomingPlaylist
+ * @see TrackSequenceManager
+ * @author Michael Pyne <michael.pyne@kdemail.net>
+ */
+class UpcomingPlaylist::UpcomingSequenceIterator : public TrackSequenceIterator
+{
+public:
+ /**
+ * Default constructor.
+ *
+ * @param playlist The UpcomingPlaylist this iterator belongs to.
+ */
+ UpcomingSequenceIterator(UpcomingPlaylist *playlist);
+
+ /**
+ * Copy constructor.
+ *
+ * @param other The UpcomingSequenceIterator to copy.
+ */
+ UpcomingSequenceIterator(const UpcomingSequenceIterator &other);
+
+ /**
+ * Destructor.
+ */
+ virtual ~UpcomingSequenceIterator();
+
+ /**
+ * Advances to the next song in the UpcomingPlaylist.
+ */
+ virtual void advance();
+
+ /**
+ * This function does nothing, as the currently playing song in the
+ * UpcomingPlaylist is always the first song in the sequence.
+ */
+ virtual void backup();
+
+ /**
+ * This function returns a perfect duplicate of the object it is called
+ * on, to avoid the C++ slicing problem.
+ *
+ * @return A pointer to a copy of the object it is called on.
+ */
+ virtual UpcomingSequenceIterator *clone() const;
+
+ /**
+ * This function sets the currently playing item to @a currentItem. If the
+ * item doesn't belong to the parent UpcomingPlaylist, it will be added to
+ * the UpcomingPlaylist, replacing any track that may be playing.
+ * Otherwise, it is moved up and set to play, replacing any track that may
+ * be playing.
+ *
+ * @param currentItem The PlaylistItem to play.
+ */
+ virtual void setCurrent(PlaylistItem *currentItem);
+
+ /**
+ * This function resets any internet state.
+ */
+ virtual void reset();
+
+ /**
+ * This function readies the UpcomingSequenceIterator for playback, by
+ * making sure the parent UpcomingPlaylist has items to play if it is
+ * empty.
+ */
+ virtual void prepareToPlay(Playlist *);
+
+private:
+ UpcomingPlaylist *m_playlist;
+};
+
+QDataStream &operator<<(QDataStream &s, const UpcomingPlaylist &p);
+QDataStream &operator>>(QDataStream &s, UpcomingPlaylist &p);
+
+#endif /* _UPCOMINGPLAYLIST_H */
+
+// vim: set et sw=4 ts=4: