summaryrefslogtreecommitdiffstats
path: root/juk/tracksequenceiterator.h
diff options
context:
space:
mode:
Diffstat (limited to 'juk/tracksequenceiterator.h')
-rw-r--r--juk/tracksequenceiterator.h232
1 files changed, 232 insertions, 0 deletions
diff --git a/juk/tracksequenceiterator.h b/juk/tracksequenceiterator.h
new file mode 100644
index 00000000..a2339f01
--- /dev/null
+++ b/juk/tracksequenceiterator.h
@@ -0,0 +1,232 @@
+/***************************************************************************
+ 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 _TRACKSEQUENCEITERATOR_H
+#define _TRACKSEQUENCEITERATOR_H
+
+#include "playlistitem.h"
+#include "playlistsearch.h"
+
+class Playlist;
+
+/**
+ * This abstract class defines an interface to be used by TrackSequenceManager,
+ * to iterate over the items in a playlist. Implement this class in a subclass
+ * in order to define your own ordering for playlist sequences. For an example,
+ * see the UpcomingPlaylist class.
+ *
+ * @author Michael Pyne <michael.pyne@kdemail.net>
+ * @see UpcomingPlaylist
+ * @see TrackSequenceManager
+ */
+class TrackSequenceIterator
+{
+public:
+ /**
+ * Default constructor.
+ */
+ TrackSequenceIterator();
+
+ /**
+ * Default copy constructor.
+ *
+ * @param other the TrackSequenceIterator we are copying
+ */
+ TrackSequenceIterator(const TrackSequenceIterator & other);
+
+ /**
+ * Default destructor.
+ */
+ virtual ~TrackSequenceIterator();
+
+ /**
+ * This function moves the current item to the next track. You must
+ * reimplement this function in your subclasses.
+ */
+ virtual void advance() = 0;
+
+ /**
+ * This function moves the current item to the previous track. This may
+ * not always make sense, and the history functionality of the Playlist
+ * class currently overrides this. You must reimplement this function in
+ * your subclass.
+ */
+ virtual void backup() = 0;
+
+ /**
+ * This function returns the current PlaylistItem, or 0 if the iterator is
+ * not pointing at any PlaylistItem.
+ *
+ * @return current track
+ */
+ virtual PlaylistItem *current() const { return m_current; }
+
+ /**
+ * This function creates a perfect copy of the object it is called on, to
+ * avoid the C++ slicing problem. When you reimplement this function, you
+ * should change the return type to the name of the subclass.
+ *
+ * @return pointer to a copy of the object
+ */
+ virtual TrackSequenceIterator *clone() const = 0;
+
+ /**
+ * This function is called by the TrackSequenceManager when current() returns
+ * 0, if the TrackSequenceManager has a playlist defined. This function
+ * should choose an appropriate starting track and set it as the current
+ * item. This function must be reimplemented in subclasses.
+ *
+ * @param playlist the playlist to iterate over
+ */
+ virtual void prepareToPlay(Playlist *playlist) = 0;
+
+ /**
+ * This function is called whenever the current playlist changes, such as
+ * having a new search applied, items added/removed, etc. If you need to
+ * update internal state, you should do so without affecting the current
+ * playing item. Default implementation does nothing.
+ */
+ virtual void playlistChanged();
+
+ /**
+ * This function is called by the manager when \p item is about to be
+ * removed. Subclasses should ensure that they're not still holding a
+ * pointer to the item. The default implementation does nothing.
+ *
+ * @param item the item about to be removed.
+ */
+ virtual void itemAboutToDie(const PlaylistItem *item);
+
+ /**
+ * This function is called by the TrackSequenceManager is some situations,
+ * such as when playback is being stopped. If you subclass needs to reset
+ * any internal data members, do so in this function. This function must
+ * be reimplemented in subclasses.
+ */
+ virtual void reset() = 0;
+
+ /**
+ * This function is a public mutator to set the current item.
+ *
+ * @param current the new current item
+ */
+ virtual void setCurrent(PlaylistItem *current);
+
+private:
+ PlaylistItem::Pointer m_current; ///< the current item
+};
+
+/**
+ * This is the default iterator for JuK, supporting normal, random, and album
+ * random playback with or without looping.
+ *
+ * @author Michael Pyne <michael.pyne@kdemail.net>
+ */
+class DefaultSequenceIterator : public TrackSequenceIterator
+{
+public:
+ /**
+ * Default constructor.
+ */
+ DefaultSequenceIterator();
+
+ /**
+ * Default copy constructor.
+ *
+ * @param other the DefaultSequenceIterator to copy.
+ */
+ DefaultSequenceIterator(const DefaultSequenceIterator &other);
+
+ /**
+ * Default destructor.
+ */
+ virtual ~DefaultSequenceIterator();
+
+ /**
+ * This function advances to the next item in the current sequence. The
+ * algorithm used depends on what playback mode is selected.
+ */
+ virtual void advance();
+
+ /**
+ * This function moves to the previous item in the playlist. This occurs
+ * no matter what playback mode is selected.
+ */
+ virtual void backup();
+
+ /**
+ * This function prepares the class for iterator. If no random play mode
+ * is selected, the first item in the given playlist is the starting item.
+ * Otherwise, an item is randomly picked to be the starting item.
+ *
+ * @param playlist The playlist to initialize for.
+ */
+ virtual void prepareToPlay(Playlist *playlist);
+
+ /**
+ * This function clears all internal state, including any random play lists,
+ * and what the current album is.
+ */
+ virtual void reset();
+
+ /**
+ * This function recalculates the random lists, and is should be called
+ * whenever its current playlist changes (at least for searches).
+ */
+ virtual void playlistChanged();
+
+ /**
+ * Called when \p item is about to be removed. This function ensures that
+ * it isn't remaining in the random play list.
+ */
+ virtual void itemAboutToDie(const PlaylistItem *item);
+
+ /**
+ * This function sets the current item, and initializes any internal lists
+ * that may be needed for playback.
+ *
+ * @param current The new current item.
+ */
+ virtual void setCurrent(PlaylistItem *current);
+
+ /**
+ * This function returns a perfect copy of the object it is called on, to
+ * get around the C++ slicing problem.
+ *
+ * @return A copy of the object the method is called on.
+ */
+ virtual DefaultSequenceIterator *clone() const;
+
+private:
+
+ /**
+ * Reinitializes the internal random play list based on the playlist given
+ * by \p p. The currently playing item, if any, is automatically removed
+ * from the list.
+ *
+ * @param p The Playlist to read items from. If p is 0, the playlist of
+ * the currently playing item is used instead.
+ */
+ void refillRandomList(Playlist *p = 0);
+ void initAlbumSearch(PlaylistItem *searchItem);
+
+private:
+ PlaylistItemList m_randomItems;
+ PlaylistSearch m_albumSearch;
+};
+
+#endif /* _TRACKSEQUENCEITERATOR_H */
+
+// vim: set et sw=4: