summaryrefslogtreecommitdiffstats
path: root/juk/dynamicplaylist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'juk/dynamicplaylist.cpp')
-rw-r--r--juk/dynamicplaylist.cpp194
1 files changed, 194 insertions, 0 deletions
diff --git a/juk/dynamicplaylist.cpp b/juk/dynamicplaylist.cpp
new file mode 100644
index 00000000..69d0a4ae
--- /dev/null
+++ b/juk/dynamicplaylist.cpp
@@ -0,0 +1,194 @@
+/***************************************************************************
+ begin : Mon May 5 2003
+ copyright : (C) 2003 - 2004 by Scott Wheeler
+ email : wheeler@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. *
+ * *
+ ***************************************************************************/
+
+#include <kdebug.h>
+
+#include "dynamicplaylist.h"
+#include "collectionlist.h"
+#include "playlistcollection.h"
+#include "tracksequencemanager.h"
+
+class PlaylistDirtyObserver : public PlaylistObserver
+{
+public:
+ PlaylistDirtyObserver(DynamicPlaylist *parent, Playlist *playlist) :
+ PlaylistObserver(playlist),
+ m_parent(parent)
+ {
+
+ }
+ virtual void updateData() { m_parent->slotSetDirty(); }
+ virtual void updateCurrent() {}
+
+private:
+ DynamicPlaylist *m_parent;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// public methods
+////////////////////////////////////////////////////////////////////////////////
+
+DynamicPlaylist::DynamicPlaylist(const PlaylistList &playlists,
+ PlaylistCollection *collection,
+ const QString &name,
+ const QString &iconName,
+ bool setupPlaylist,
+ bool synchronizePlaying) :
+ Playlist(collection, true),
+ m_playlists(playlists),
+ m_dirty(true),
+ m_synchronizePlaying(synchronizePlaying)
+{
+ if(setupPlaylist)
+ collection->setupPlaylist(this, iconName);
+ setName(name);
+
+ setSorting(columns() + 1);
+
+ for(PlaylistList::ConstIterator it = playlists.begin(); it != playlists.end(); ++it)
+ m_observers.append(new PlaylistDirtyObserver(this, *it));
+
+ connect(CollectionList::instance(), SIGNAL(signalCollectionChanged()), this, SLOT(slotSetDirty()));
+}
+
+DynamicPlaylist::~DynamicPlaylist()
+{
+ lower();
+
+ for(QValueList<PlaylistObserver *>::ConstIterator it = m_observers.begin();
+ it != m_observers.end();
+ ++it)
+ {
+ delete *it;
+ }
+}
+
+void DynamicPlaylist::setPlaylists(const PlaylistList &playlists)
+{
+ m_playlists = playlists;
+ updateItems();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// public slots
+////////////////////////////////////////////////////////////////////////////////
+
+void DynamicPlaylist::slotReload()
+{
+ for(PlaylistList::Iterator it = m_playlists.begin(); it != m_playlists.end(); ++it)
+ (*it)->slotReload();
+
+ checkUpdateItems();
+}
+
+void DynamicPlaylist::lower(QWidget *top)
+{
+ if(top == this)
+ return;
+
+ if(playing()) {
+ PlaylistList l;
+ l.append(this);
+ for(PlaylistList::Iterator it = m_playlists.begin();
+ it != m_playlists.end(); ++it)
+ {
+ (*it)->synchronizePlayingItems(l, true);
+ }
+ }
+
+ PlaylistItemList list = PlaylistItem::playingItems();
+ for(PlaylistItemList::Iterator it = list.begin(); it != list.end(); ++it) {
+ if((*it)->playlist() == this) {
+ list.remove(it);
+ break;
+ }
+ }
+
+ if(!list.isEmpty())
+ TrackSequenceManager::instance()->setCurrentPlaylist(list.front()->playlist());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// protected methods
+////////////////////////////////////////////////////////////////////////////////
+
+PlaylistItemList DynamicPlaylist::items()
+{
+ checkUpdateItems();
+ return Playlist::items();
+}
+
+void DynamicPlaylist::showEvent(QShowEvent *e)
+{
+ checkUpdateItems();
+ Playlist::showEvent(e);
+}
+
+void DynamicPlaylist::paintEvent(QPaintEvent *e)
+{
+ checkUpdateItems();
+ Playlist::paintEvent(e);
+}
+
+void DynamicPlaylist::updateItems()
+{
+ PlaylistItemList siblings;
+
+ for(PlaylistList::ConstIterator it = m_playlists.begin(); it != m_playlists.end(); ++it)
+ siblings += (*it)->items();
+
+
+ PlaylistItemList newSiblings = siblings;
+ if(m_siblings != newSiblings) {
+ m_siblings = newSiblings;
+ QTimer::singleShot(0, this, SLOT(slotUpdateItems()));
+ }
+}
+
+bool DynamicPlaylist::synchronizePlaying() const
+{
+ return m_synchronizePlaying;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// private methods
+////////////////////////////////////////////////////////////////////////////////
+
+void DynamicPlaylist::checkUpdateItems()
+{
+ if(!m_dirty)
+ return;
+
+ updateItems();
+
+ m_dirty = false;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// private slots
+////////////////////////////////////////////////////////////////////////////////
+
+void DynamicPlaylist::slotUpdateItems()
+{
+ // This should be optimized to check to see which items are already in the
+ // list and just adding those and removing the ones that aren't.
+
+ clear();
+ createItems(m_siblings);
+ if(m_synchronizePlaying)
+ synchronizePlayingItems(m_playlists, true);
+}
+
+#include "dynamicplaylist.moc"