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.
195 lines
5.5 KiB
195 lines
5.5 KiB
/***************************************************************************
|
|
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 TQString &name,
|
|
const TQString &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(), TQT_SIGNAL(signalCollectionChanged()), this, TQT_SLOT(slotSetDirty()));
|
|
}
|
|
|
|
DynamicPlaylist::~DynamicPlaylist()
|
|
{
|
|
lower();
|
|
|
|
for(TQValueList<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(TQWidget *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(TQShowEvent *e)
|
|
{
|
|
checkUpdateItems();
|
|
Playlist::showEvent(e);
|
|
}
|
|
|
|
void DynamicPlaylist::paintEvent(TQPaintEvent *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;
|
|
TQTimer::singleShot(0, this, TQT_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"
|