dynamicplaylist.cpp 4.28 KB
Newer Older
1 2
/***************************************************************************
    begin                : Mon May 5 2003
3
    copyright            : (C) 2003 - 2004 by Scott Wheeler
4 5 6 7 8 9 10 11 12 13 14 15
    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.                                   *
 *                                                                         *
 ***************************************************************************/

16 17
#include <kdebug.h>

18 19 20
#include "dynamicplaylist.h"
#include "collectionlist.h"

21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
// TODO: this current updates even when things are just played in the watched
// playlists.  There should be different update types and this should only
// watch the data changes.

class PlaylistDirtyObserver : public PlaylistObserver
{
public:
    PlaylistDirtyObserver(DynamicPlaylist *parent, Playlist *playlist) :
	PlaylistObserver(playlist),
        m_parent(parent) 
    {

    }
    virtual void update() { m_parent->slotSetDirty(); }

private:
    DynamicPlaylist *m_parent;
};

40 41 42 43
////////////////////////////////////////////////////////////////////////////////
// public methods
////////////////////////////////////////////////////////////////////////////////

44 45 46 47 48
DynamicPlaylist::DynamicPlaylist(const PlaylistList &playlists,
                                 PlaylistCollection *collection,
                                 const QString &name,
                                 const QString &iconName) :
    Playlist(collection, name, iconName),
49 50 51
    m_playlists(playlists),
    m_dirty(true)
{
52 53
    setSorting(columns() + 1);

54 55 56
    for(PlaylistList::ConstIterator it = playlists.begin(); it != playlists.end(); ++it)
        m_observers.append(new PlaylistDirtyObserver(this, *it));

57
    connect(CollectionList::instance(), SIGNAL(signalCollectionChanged()), this, SLOT(slotSetDirty()));
58 59
}

60 61 62 63 64 65 66 67 68 69
DynamicPlaylist::~DynamicPlaylist()
{
    for(QValueList<PlaylistObserver *>::ConstIterator it = m_observers.begin();
        it != m_observers.end();
        ++it)
    {
        delete *it;
    }
}

70 71 72 73 74 75 76
////////////////////////////////////////////////////////////////////////////////
// public slots
////////////////////////////////////////////////////////////////////////////////

void DynamicPlaylist::slotReload()
{
    for(PlaylistList::Iterator it = m_playlists.begin(); it != m_playlists.end(); ++it)
77
        (*it)->slotReload();
78 79 80 81

    checkUpdateItems();
}

82 83 84 85
////////////////////////////////////////////////////////////////////////////////
// protected methods
////////////////////////////////////////////////////////////////////////////////

86
PlaylistItemList DynamicPlaylist::items()
87
{
88 89
    checkUpdateItems();
    return Playlist::items();
90 91 92
}

void DynamicPlaylist::showEvent(QShowEvent *e)
93 94 95 96 97
{
    checkUpdateItems();
    Playlist::showEvent(e);
}

98
void DynamicPlaylist::updateItems()
99
{
100 101 102 103 104 105 106 107
    PlaylistItemList siblings;

    for(PlaylistList::ConstIterator it = m_playlists.begin(); it != m_playlists.end(); ++it)
        siblings += (*it)->items();


    PlaylistItemList newSiblings = siblings;
    if(m_siblings != newSiblings) {
108
        m_siblings = newSiblings;
109
        QTimer::singleShot(0, this, SLOT(slotUpdateItems()));
110
    }
111 112 113 114 115 116 117 118 119
}

////////////////////////////////////////////////////////////////////////////////
// private methods
////////////////////////////////////////////////////////////////////////////////

void DynamicPlaylist::checkUpdateItems()
{
    if(!m_dirty)
120
        return;
121 122 123

    updateItems();

124
    m_dirty = false;
125 126
}

127 128 129 130 131 132 133 134 135 136
////////////////////////////////////////////////////////////////////////////////
// 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();
137
    createItems(m_siblings);
138 139
}

140
#include "dynamicplaylist.moc"