PlaylistCollection (was Re: [Amarok] step 1 in my secret plan: provide a wrapper around)
Bart Cerneels
bart.cerneels at kde.org
Sat Sep 26 20:47:08 CEST 2009
I'm intrigued, what is the use of PlaylistCollection? It's not really
what I thought about when I said I wanted the playlists integrated in
the Meta/Collection system.
And I fear this would put a kind in my playlist synchronization plans.
Or perhaps it's a better way to implement the same...
In short: tell us about your secret plan Max :)
On Sat, Sep 26, 2009 at 20:24, Maximilian Kossick
<maximilian.kossick at googlemail.com> wrote:
> commit c47fad1197995562169ec19325a1e76e39caca0b
> Author: Maximilian Kossick <maximilian.kossick at googlemail.com>
> AuthorDate: Sat Sep 26 20:20:09 2009 +0200
> Commit: Maximilian Kossick <maximilian.kossick at googlemail.com>
> CommitDate: Sat Sep 26 20:22:26 2009 +0200
>
> step 1 in my secret plan: provide a wrapper around playlists that makes them behave like collections
> provide a querymaker to query collections and a CollectionLocation that allows adding and removing of tracks.
>
> diff --git a/src/collection/support/PlaylistCollection.cpp b/src/collection/support/PlaylistCollection.cpp
> new file mode 100644
> index 0000000..6842bc0
> --- /dev/null
> +++ b/src/collection/support/PlaylistCollection.cpp
> @@ -0,0 +1,132 @@
> +/****************************************************************************************
> + * Copyright (c) 2009 Maximilian Kossick <maximilian.kossick at googlemail.com> *
> + * *
> + * 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. *
> + * *
> + * This program is distributed in the hope that it will be useful, but WITHOUT ANY *
> + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A *
> + * PARTICULAR PURPOSE. See the GNU General Public License for more details. *
> + * *
> + * You should have received a copy of the GNU General Public License along with *
> + * this program. If not, see <http://www.gnu.org/licenses/>. *
> + ****************************************************************************************/
> +
> +#include "PlaylistCollection.h"
> +
> +#include "MemoryQueryMaker.h"
> +#include "PlaylistCollectionLocation.h"
> +#include "playlistmanager/PlaylistProvider.h"
> +
> +PlaylistCollection::PlaylistCollection( const Meta::PlaylistPtr &playlist )
> + : Amarok::Collection()
> + , MemoryCollection()
> + , Meta::PlaylistObserver()
> + , m_playlist( playlist )
> +{
> + subscribeTo( playlist );
> + acquireWriteLock();
> + foreach( const Meta::TrackPtr &track, m_playlist->tracks() )
> + {
> + insertTrack( track );
> + }
> + releaseLock();
> +}
> +
> +PlaylistCollection::~PlaylistCollection()
> +{
> + //nothing to do?
> +}
> +
> +QueryMaker*
> +PlaylistCollection::queryMaker()
> +{
> + return new MemoryQueryMaker( this, collectionId() );
> +}
> +
> +CollectionLocation*
> +PlaylistCollection::location() const
> +{
> + return new PlaylistCollectionLocation( this );
> +}
> +
> +QString
> +PlaylistCollection::collectionId() const
> +{
> + return m_playlist->name(); //add prefix?
> +}
> +
> +QString
> +PlaylistCollection::prettyName() const
> +{
> + return m_playlist->prettyName();
> +}
> +
> +KIcon
> +PlaylistCollection::icon() const
> +{
> + if( m_playlist->provider() )
> + return m_playlist->provider()->icon();
> + else
> + return KIcon();
> +}
> +
> +void
> +PlaylistCollection::trackAdded( Meta::PlaylistPtr playlist, Meta::TrackPtr track, int position )
> +{
> + Q_UNUSED( position );
> + if( playlist != m_playlist )
> + return;
> +
> + if( track )
> + {
> + acquireWriteLock();
> + insertTrack( track );
> + releaseLock();
> + }
> +}
> +
> +void
> +PlaylistCollection::trackRemoved( Meta::PlaylistPtr playlist, int position )
> +{
> + //ok, what now? is the removed track still availabe at position
> + //as this is not clear from the API, and apparently not used
> + //anywhere, do it the hard way...
> + acquireWriteLock();
> + setTrackMap( TrackMap() );
> + setArtistMap( ArtistMap() );
> + setAlbumMap( AlbumMap() );
> + setGenreMap( GenreMap() );
> + setComposerMap( ComposerMap() );
> + setYearMap( YearMap() );
> + foreach( const Meta::TrackPtr &track, playlist->tracks() )
> + {
> + insertTrack( track );
> + }
> + releaseLock();
> +}
> +
> +//should be moved to MemoryCollection I guess
> +void
> +PlaylistCollection::insertTrack( const Meta::TrackPtr &track )
> +{
> + addTrack( track );
> + if( track->artist() )
> + addArtist( track->artist() );
> + if( track->album() )
> + addAlbum( track->album() );
> + if( track->composer() )
> + addComposer( track->composer() );
> + if( track->genre() )
> + addGenre( track->genre() );
> + if( track->year() )
> + addYear( track->year() );
> +}
> +
> +Meta::PlaylistPtr
> +PlaylistCollection::playlist() const
> +{
> + return m_playlist;
> +}
> diff --git a/src/collection/support/PlaylistCollection.h b/src/collection/support/PlaylistCollection.h
> new file mode 100644
> index 0000000..f92564a
> --- /dev/null
> +++ b/src/collection/support/PlaylistCollection.h
> @@ -0,0 +1,51 @@
> +/****************************************************************************************
> + * Copyright (c) 2009 Maximilian Kossick <maximilian.kossick at googlemail.com> *
> + * *
> + * 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. *
> + * *
> + * This program is distributed in the hope that it will be useful, but WITHOUT ANY *
> + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A *
> + * PARTICULAR PURPOSE. See the GNU General Public License for more details. *
> + * *
> + * You should have received a copy of the GNU General Public License along with *
> + * this program. If not, see <http://www.gnu.org/licenses/>. *
> + ****************************************************************************************/
> +
> +#ifndef PLAYLISTCOLLECTION_H
> +#define PLAYLISTCOLLECTION_H
> +
> +#include "collection/Collection.h"
> +#include "MemoryCollection.h"
> +#include "meta/Playlist.h"
> +
> +/**
> + * Utility class that wraps a playlist as collection and makes it possible to
> + * query the content of the playlist using QueryMaker.
> + */
> +class PlaylistCollection : public Amarok::Collection, public MemoryCollection, public Meta::PlaylistObserver
> +{
> +public:
> + PlaylistCollection( const Meta::PlaylistPtr &playlist );
> + virtual ~PlaylistCollection();
> +
> + virtual QString collectionId() const;
> + virtual QString prettyName() const;
> + virtual QueryMaker* queryMaker();
> + virtual CollectionLocation* location() const;
> +
> + KIcon icon() const; //why is this pure virtual?
> +
> + virtual void trackAdded( Meta::PlaylistPtr playlist, Meta::TrackPtr track, int position ) = 0;
> + virtual void trackRemoved( Meta::PlaylistPtr playlist, int position ) = 0;
> +
> + Meta::PlaylistPtr playlist() const;
> +private:
> + void insertTrack( const Meta::TrackPtr &track );
> +
> + Meta::PlaylistPtr m_playlist;
> +};
> +
> +#endif // PLAYLISTCOLLECTION_H
> diff --git a/src/collection/support/PlaylistCollectionLocation.cpp b/src/collection/support/PlaylistCollectionLocation.cpp
> new file mode 100644
> index 0000000..a5787d8
> --- /dev/null
> +++ b/src/collection/support/PlaylistCollectionLocation.cpp
> @@ -0,0 +1,71 @@
> +/****************************************************************************************
> + * Copyright (c) 2009 Maximilian Kossick <maximilian.kossick at googlemail.com> *
> + * *
> + * 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. *
> + * *
> + * This program is distributed in the hope that it will be useful, but WITHOUT ANY *
> + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A *
> + * PARTICULAR PURPOSE. See the GNU General Public License for more details. *
> + * *
> + * You should have received a copy of the GNU General Public License along with *
> + * this program. If not, see <http://www.gnu.org/licenses/>. *
> + ****************************************************************************************/
> +
> +#include "PlaylistCollectionLocation.h"
> +
> +#include "meta/Playlist.h"
> +#include "PlaylistCollection.h"
> +
> +PlaylistCollectionLocation::PlaylistCollectionLocation( const PlaylistCollection *collection )
> + : CollectionLocation()
> + , m_collection( collection )
> +{
> +}
> +
> +QString
> +PlaylistCollectionLocation::prettyLocation() const
> +{
> + //think of something better
> + return m_collection->prettyName();
> +}
> +
> +bool
> +PlaylistCollectionLocation::isWritable() const
> +{
> + return true;
> +}
> +
> +bool
> +PlaylistCollectionLocation::remove( const Meta::TrackPtr &track )
> +{
> + Meta::PlaylistPtr playlist = m_collection->playlist();
> + int index = playlist->tracks().indexOf( track );
> + if( index != -1 )
> + {
> + playlist->removeTrack( index );
> + }
> + //always succeed as we are not doing anything dangerous
> + return true;
> +}
> +
> +void
> +PlaylistCollectionLocation::copyUrlsToCollection( const QMap<Meta::TrackPtr, KUrl> &sources )
> +{
> + Meta::PlaylistPtr playlist = m_collection->playlist();
> + foreach( const Meta::TrackPtr &track, sources.keys() )
> + {
> + playlist->addTrack( track );
> + }
> +}
> +
> +void
> +PlaylistCollectionLocation::removeUrlsFromCollection( const Meta::TrackList &tracks )
> +{
> + foreach( const Meta::TrackPtr &track, tracks )
> + {
> + remove( track );
> + }
> +}
> diff --git a/src/collection/support/PlaylistCollectionLocation.h b/src/collection/support/PlaylistCollectionLocation.h
> new file mode 100644
> index 0000000..3dd1dde
> --- /dev/null
> +++ b/src/collection/support/PlaylistCollectionLocation.h
> @@ -0,0 +1,50 @@
> +/****************************************************************************************
> + * Copyright (c) 2009 Maximilian Kossick <maximilian.kossick at googlemail.com> *
> + * *
> + * 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. *
> + * *
> + * This program is distributed in the hope that it will be useful, but WITHOUT ANY *
> + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A *
> + * PARTICULAR PURPOSE. See the GNU General Public License for more details. *
> + * *
> + * You should have received a copy of the GNU General Public License along with *
> + * this program. If not, see <http://www.gnu.org/licenses/>. *
> + ****************************************************************************************/
> +
> +#ifndef PLAYLISTCOLLECTIONLOCATION_H
> +#define PLAYLISTCOLLECTIONLOCATION_H
> +
> +#include "collection/CollectionLocation.h"
> +
> +class PlaylistCollection;
> +
> +/**
> + * Utility class that allows modification of playlists using the standard
> + * CollectionLocation API.
> + * caveat: although it is writable, moving tracks to this "collection" does not
> + * work, as it is just a wrapper around a playlist, which only holds references to tracks
> + *
> + * It is safe though as this collection does not signal that it has copied tracks successfully
> + */
> +class PlaylistCollectionLocation : public CollectionLocation
> +{
> +public:
> + PlaylistCollectionLocation( const PlaylistCollection *collection );
> +
> + QString prettyLocation() const;
> + bool isWritable() const;
> + bool remove( const Meta::TrackPtr &track );
> +
> +protected:
> + void copyUrlsToCollection( const QMap<Meta::TrackPtr, KUrl> &sources );
> + //why is this called "removeUrls" if the argument are only tracks?
> + void removeUrlsFromCollection( const Meta::TrackList &tracks );
> +
> +private:
> + const PlaylistCollection *m_collection;
> +};
> +
> +#endif // PLAYLISTCOLLECTIONLOCATION_H
>
>
>
More information about the Amarok-devel
mailing list