dynamicplaylist.cpp 5.63 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
#include "dynamicplaylist.h"
#include "collectionlist.h"
20
#include "playlistcollection.h"
21
#include "tracksequencemanager.h"
Laurent Montel's avatar
Laurent Montel committed
22 23 24 25
//Added by qt3to4:
#include <QShowEvent>
#include <Q3ValueList>
#include <QPaintEvent>
26

27 28 29 30
class PlaylistDirtyObserver : public PlaylistObserver
{
public:
    PlaylistDirtyObserver(DynamicPlaylist *parent, Playlist *playlist) :
31 32
        PlaylistObserver(playlist),
        m_parent(parent)
33 34 35
    {

    }
36 37
    virtual void updateData() { m_parent->slotSetDirty(); }
    virtual void updateCurrent() {}
38 39 40 41 42

private:
    DynamicPlaylist *m_parent;
};

43 44 45 46
////////////////////////////////////////////////////////////////////////////////
// public methods
////////////////////////////////////////////////////////////////////////////////

47 48 49
DynamicPlaylist::DynamicPlaylist(const PlaylistList &playlists,
                                 PlaylistCollection *collection,
                                 const QString &name,
50
                                 const QString &iconName,
51 52
                                 bool setupPlaylist,
                                 bool synchronizePlaying) :
53
    Playlist(collection, true),
54
    m_playlists(playlists),
55 56
    m_dirty(true),
    m_synchronizePlaying(synchronizePlaying)
57
{
58 59 60 61
    if(setupPlaylist)
        collection->setupPlaylist(this, iconName);
    setName(name);

62 63
    setSorting(columns() + 1);

64
    for(PlaylistList::ConstIterator it = playlists.begin(); it != playlists.end(); ++it)
65 66
        m_observers.append(new PlaylistDirtyObserver(this, *it));

67
    connect(CollectionList::instance(), SIGNAL(signalCollectionChanged()), this, SLOT(slotSetDirty()));
68 69
}

70 71
DynamicPlaylist::~DynamicPlaylist()
{
72
    lower();
73

Laurent Montel's avatar
Laurent Montel committed
74
    for(Q3ValueList<PlaylistObserver *>::ConstIterator it = m_observers.begin();
75 76 77 78 79 80 81
        it != m_observers.end();
        ++it)
    {
        delete *it;
    }
}

82 83 84 85 86 87
void DynamicPlaylist::setPlaylists(const PlaylistList &playlists)
{
    m_playlists = playlists;
    updateItems();
}

88 89 90 91 92 93 94
////////////////////////////////////////////////////////////////////////////////
// public slots
////////////////////////////////////////////////////////////////////////////////

void DynamicPlaylist::slotReload()
{
    for(PlaylistList::Iterator it = m_playlists.begin(); it != m_playlists.end(); ++it)
95
        (*it)->slotReload();
96 97 98 99

    checkUpdateItems();
}

100 101 102
void DynamicPlaylist::lower(QWidget *top)
{
    if(top == this)
103
        return;
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126

    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());
}

127 128 129 130
////////////////////////////////////////////////////////////////////////////////
// protected methods
////////////////////////////////////////////////////////////////////////////////

131
PlaylistItemList DynamicPlaylist::items()
132
{
133 134
    checkUpdateItems();
    return Playlist::items();
135 136 137
}

void DynamicPlaylist::showEvent(QShowEvent *e)
138 139 140 141 142
{
    checkUpdateItems();
    Playlist::showEvent(e);
}

143 144 145 146 147 148
void DynamicPlaylist::paintEvent(QPaintEvent *e)
{
    checkUpdateItems();
    Playlist::paintEvent(e);
}

149
void DynamicPlaylist::updateItems()
150
{
151 152 153 154 155 156 157 158
    PlaylistItemList siblings;

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


    PlaylistItemList newSiblings = siblings;
    if(m_siblings != newSiblings) {
159
        m_siblings = newSiblings;
160
        QTimer::singleShot(0, this, SLOT(slotUpdateItems()));
161
    }
162 163
}

164 165 166 167 168
bool DynamicPlaylist::synchronizePlaying() const
{
    return m_synchronizePlaying;
}

169 170 171 172 173 174 175
////////////////////////////////////////////////////////////////////////////////
// private methods
////////////////////////////////////////////////////////////////////////////////

void DynamicPlaylist::checkUpdateItems()
{
    if(!m_dirty)
176
        return;
177 178 179

    updateItems();

180
    m_dirty = false;
181 182
}

183 184 185 186 187 188 189 190 191 192
////////////////////////////////////////////////////////////////////////////////
// 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();
193
    createItems(m_siblings);
194 195
    if(m_synchronizePlaying)
        synchronizePlayingItems(m_playlists, true);
196 197
}

198
#include "dynamicplaylist.moc"
199 200

// vim: set et sw=4 tw=0 sta: