Git commit 59fa0ee6d3f2cbbe1298e74b7fc56f838712fa0e by Matěj Laitl. Committed on 01/05/2012 at 18:14. Pushed by laitl into branch 'master'.
Meta::Album: introduce canUpdateCompilation(), setCompilation() and convert subclasses to use these. Many many subclasses already had equivalent methods, this reduces code duplication and eliminates one static_cast. Some subclasses had equivalent methods but never used them, these are deleted in order to avoid dead code. This is a prerequisite for next commit that unifies album actions across collections. This is rather a bigger change, so I'm CCing list - if anyone opposes, raise your voice. CCMAIL: amarok-devel@kde.org M +0 -1 src/amarokurls/BookmarkTreeView.cpp M +1 -1 src/core-impl/collections/audiocd/AudioCdCollection.cpp M +13 -7 src/core-impl/collections/audiocd/AudioCdMeta.cpp M +3 -1 src/core-impl/collections/audiocd/AudioCdMeta.h M +0 -6 src/core-impl/collections/daap/DaapMeta.cpp M +0 -1 src/core-impl/collections/daap/DaapMeta.h M +8 -0 src/core-impl/collections/db/sql/SqlMeta.cpp M +2 -11 src/core-impl/collections/db/sql/SqlMeta.h M +13 -0 src/core-impl/collections/ipodcollection/IpodMeta.cpp M +3 -0 src/core-impl/collections/ipodcollection/IpodMeta.h M +19 -1 src/core-impl/collections/support/MemoryMeta.cpp M +14 -3 src/core-impl/collections/support/MemoryMeta.h M +0 -6 src/core-impl/collections/upnpcollection/UpnpMeta.cpp M +0 -1 src/core-impl/collections/upnpcollection/UpnpMeta.h M +0 -5 src/core-impl/meta/timecode/TimecodeMeta.cpp M +0 -1 src/core-impl/meta/timecode/TimecodeMeta.h M +13 -0 src/core/meta/Meta.h M +11 -6 src/services/ServiceMetaBase.cpp M +3 -1 src/services/ServiceMetaBase.h M +1 -1 src/services/amazon/AmazonParser.cpp http://commits.kde.org/amarok/59fa0ee6d3f2cbbe1298e74b7fc56f838712fa0e diff --git a/src/amarokurls/BookmarkTreeView.cpp b/src/amarokurls/BookmarkTreeView.cpp index f5e8502..5c5261a 100644 --- a/src/amarokurls/BookmarkTreeView.cpp +++ b/src/amarokurls/BookmarkTreeView.cpp @@ -388,7 +388,6 @@ void BookmarkTreeView::slotCreateTimecodeTrack() const track->setGenre( genre ); album->setAlbumArtist( artist ); - album->setIsCompilation( false ); //make the user give us some info about this item... diff --git a/src/core-impl/collections/audiocd/AudioCdCollection.cpp b/src/core-impl/collections/audiocd/AudioCdCollection.cpp index c0e9f8e..637c2d3 100644 --- a/src/core-impl/collections/audiocd/AudioCdCollection.cpp +++ b/src/core-impl/collections/audiocd/AudioCdCollection.cpp @@ -291,7 +291,7 @@ AudioCdCollection::infoFetchComplete( KJob *job ) trackPtr->setArtist( artistPtr ); else { - albumPtr->setIsCompilation( true ); + albumPtr->setCompilation( true ); Meta::AudioCdArtistPtr trackArtistPtr = Meta::AudioCdArtistPtr( new Meta::AudioCdArtist( trackArtist ) ); trackArtistPtr->addTrack( trackPtr ); diff --git a/src/core-impl/collections/audiocd/AudioCdMeta.cpp b/src/core-impl/collections/audiocd/AudioCdMeta.cpp index 7ef9085..d767125 100644 --- a/src/core-impl/collections/audiocd/AudioCdMeta.cpp +++ b/src/core-impl/collections/audiocd/AudioCdMeta.cpp @@ -390,6 +390,19 @@ AudioCdAlbum::isCompilation() const } bool +AudioCdAlbum::canUpdateCompilation() const +{ + return true; +} + +void +AudioCdAlbum::setCompilation( bool compilation ) +{ + DEBUG_BLOCK + m_isCompilation = compilation; +} + +bool AudioCdAlbum::hasAlbumArtist() const { return !m_albumArtist.isNull(); @@ -450,13 +463,6 @@ AudioCdAlbum::setAlbumArtist( AudioCdArtistPtr artist ) m_albumArtist = artist; } -void -AudioCdAlbum::setIsCompilation( bool compilation ) -{ - DEBUG_BLOCK - m_isCompilation = compilation; -} - //AudioCdGenre AudioCdGenre::AudioCdGenre( const QString &name ) diff --git a/src/core-impl/collections/audiocd/AudioCdMeta.h b/src/core-impl/collections/audiocd/AudioCdMeta.h index 083a3e1..73ac547 100644 --- a/src/core-impl/collections/audiocd/AudioCdMeta.h +++ b/src/core-impl/collections/audiocd/AudioCdMeta.h @@ -164,6 +164,9 @@ class AudioCdAlbum : public Meta::Album virtual QString name() const; virtual bool isCompilation() const; + virtual bool canUpdateCompilation() const; + virtual void setCompilation( bool compilation ); + virtual bool hasAlbumArtist() const; virtual ArtistPtr albumArtist() const; virtual TrackList tracks(); @@ -176,7 +179,6 @@ class AudioCdAlbum : public Meta::Album //AudioCdAlbum specific methods void addTrack( AudioCdTrackPtr track ); void setAlbumArtist( AudioCdArtistPtr artist ); - void setIsCompilation( bool compilation ); private: QString m_name; diff --git a/src/core-impl/collections/daap/DaapMeta.cpp b/src/core-impl/collections/daap/DaapMeta.cpp index e4e47b3..a2429d7 100644 --- a/src/core-impl/collections/daap/DaapMeta.cpp +++ b/src/core-impl/collections/daap/DaapMeta.cpp @@ -420,12 +420,6 @@ DaapAlbum::setAlbumArtist( DaapArtistPtr artist ) m_albumArtist = artist; } -void -DaapAlbum::setIsCompilation( bool compilation ) -{ - m_isCompilation = compilation; -} - //DaapGenre DaapGenre::DaapGenre( const QString &name ) diff --git a/src/core-impl/collections/daap/DaapMeta.h b/src/core-impl/collections/daap/DaapMeta.h index dae7760..5278b57 100644 --- a/src/core-impl/collections/daap/DaapMeta.h +++ b/src/core-impl/collections/daap/DaapMeta.h @@ -167,7 +167,6 @@ class DaapAlbum : public Meta::Album //DaapAlbum specific methods void addTrack( DaapTrackPtr track ); void setAlbumArtist( DaapArtistPtr artist ); - void setIsCompilation( bool compilation ); private: QString m_name; diff --git a/src/core-impl/collections/db/sql/SqlMeta.cpp b/src/core-impl/collections/db/sql/SqlMeta.cpp index 3413a75..da4d506 100644 --- a/src/core-impl/collections/db/sql/SqlMeta.cpp +++ b/src/core-impl/collections/db/sql/SqlMeta.cpp @@ -1893,6 +1893,14 @@ SqlAlbum::setImage( const QString &path ) } } +/** Set the compilation flag. + * Actually it does not cange this album but instead moves + * the tracks to other albums (e.g. one with the same name which is a + * compilation) + * If the compilation flag is set to "false" then all songs + * with different artists will be moved to other albums, possibly even + * creating them. + */ void SqlAlbum::setCompilation( bool compilation ) { diff --git a/src/core-impl/collections/db/sql/SqlMeta.h b/src/core-impl/collections/db/sql/SqlMeta.h index c0253ac..8ee1014 100644 --- a/src/core-impl/collections/db/sql/SqlMeta.h +++ b/src/core-impl/collections/db/sql/SqlMeta.h @@ -365,9 +365,9 @@ class AMAROK_SQLCOLLECTION_EXPORT_TESTS SqlAlbum : public Meta::Album virtual Meta::TrackList tracks(); - /** Returns true if this album is a compilation, meaning that the included songs are from different artists. - */ virtual bool isCompilation() const; + virtual bool canUpdateCompilation() const { return true; } + void setCompilation( bool compilation ); /** Returns true if this album has an artist. * The following equation is always true: isCompilation() != hasAlbumArtist() @@ -411,15 +411,6 @@ class AMAROK_SQLCOLLECTION_EXPORT_TESTS SqlAlbum : public Meta::Album //SQL specific methods int id() const { return m_id; } - /** Set the compilation flag. - * Actually it does not cange this album but instead moves - * the tracks to other albums (e.g. one with the same name which is a - * compilation) - * If the compilation flag is set to "false" then all songs - * with different artists will be moved to other albums, possibly even - * creating them. - */ - void setCompilation( bool compilation ); Collections::SqlCollection *sqlCollection() const { return m_collection; } private: diff --git a/src/core-impl/collections/ipodcollection/IpodMeta.cpp b/src/core-impl/collections/ipodcollection/IpodMeta.cpp index 0f12bdb..dcb1431 100644 --- a/src/core-impl/collections/ipodcollection/IpodMeta.cpp +++ b/src/core-impl/collections/ipodcollection/IpodMeta.cpp @@ -770,6 +770,19 @@ Album::isCompilation() const } bool +Album::canUpdateCompilation() const +{ + Collections::Collection *coll = m_track->collection(); + return coll ? coll->isWritable() : false; +} + +void +Album::setCompilation( bool isCompilation ) +{ + m_track->setIsCompilation( isCompilation ); +} + +bool Album::hasAlbumArtist() const { readAlbumArtist(); diff --git a/src/core-impl/collections/ipodcollection/IpodMeta.h b/src/core-impl/collections/ipodcollection/IpodMeta.h index 2b14a9d..1df1342 100644 --- a/src/core-impl/collections/ipodcollection/IpodMeta.h +++ b/src/core-impl/collections/ipodcollection/IpodMeta.h @@ -258,6 +258,9 @@ namespace IpodMeta virtual Meta::TrackList tracks() { return Meta::TrackList(); } virtual bool isCompilation() const; + virtual bool canUpdateCompilation() const; + virtual void setCompilation( bool isCompilation ); + virtual bool hasAlbumArtist() const; virtual Meta::ArtistPtr albumArtist() const; diff --git a/src/core-impl/collections/support/MemoryMeta.cpp b/src/core-impl/collections/support/MemoryMeta.cpp index 8caa3dd..0332eda 100644 --- a/src/core-impl/collections/support/MemoryMeta.cpp +++ b/src/core-impl/collections/support/MemoryMeta.cpp @@ -49,12 +49,28 @@ Base::removeTrack( Track *track ) Album::Album( const Meta::AlbumPtr &other ) : Base( other->name() ) , m_isCompilation( other->isCompilation() ) + , m_canUpdateCompilation( other->canUpdateCompilation() ) , m_image( other->image() ) { if( other->hasAlbumArtist() && other->albumArtist() ) m_albumArtist = Meta::ArtistPtr( new Artist( other->albumArtist()->name() ) ); } +void +Album::setCompilation( bool isCompilation ) +{ + // we re-create the albums for each track - that's how MemoryMeta works - by + // aggregating multiple entities of same name into one. + foreach( Meta::TrackPtr track, tracks() ) + { + Track *memoryTrack = static_cast<Track *>( track.data() ); + Meta::AlbumPtr album = memoryTrack->originalTrack()->album(); + if( album && album->canUpdateCompilation() ) + album->setCompilation( isCompilation ); + } + // no notifyObservers() etc needed - this is done from down-up by proxied tracks +} + QImage Album::image( int size ) const { @@ -204,9 +220,11 @@ MapChanger::addExistingTrack( Meta::TrackPtr track, Track *memoryTrack ) m_mc->addAlbum( album ); } bool isCompilation = trackAlbum ? trackAlbum->isCompilation() : false; + bool canUpdateCompilation = trackAlbum ? trackAlbum->canUpdateCompilation() : false; Album *memoryAlbum = static_cast<Album *>( album.data() ); // be deterministic wrt track adding order: - memoryAlbum->setIsCompilation( memoryAlbum->isCompilation() || isCompilation ); + memoryAlbum->setCachedCompilation( memoryAlbum->isCompilation() || isCompilation ); + memoryAlbum->setCachedCanUpdateCompilation( memoryAlbum->canUpdateCompilation() || canUpdateCompilation ); // optimisation: only read album cover if no previous one exists: if( !memoryAlbum->hasImage() && trackAlbum && trackAlbum->hasImage() ) memoryAlbum->setImage( trackAlbum->image() ); diff --git a/src/core-impl/collections/support/MemoryMeta.h b/src/core-impl/collections/support/MemoryMeta.h index 50b3d64..9ba1d1d 100644 --- a/src/core-impl/collections/support/MemoryMeta.h +++ b/src/core-impl/collections/support/MemoryMeta.h @@ -71,7 +71,11 @@ class Album : public Meta::Album, public Base { public: Album( const QString &name, const Meta::ArtistPtr &albumArtist ) - : Base( name ), m_isCompilation( false ), m_albumArtist( albumArtist ) {} + : Base( name ) + , m_isCompilation( false ) + , m_canUpdateCompilation( false ) + , m_albumArtist( albumArtist ) + {} /** * Copy-like constructor for MapChanger */ @@ -79,8 +83,11 @@ class Album : public Meta::Album, public Base virtual QString name() const { return Base::name(); } - /** Meta::Album virtual methods */ + /* Meta::Album virtual methods */ virtual bool isCompilation() const { return m_isCompilation; } + virtual bool canUpdateCompilation() const { return m_canUpdateCompilation; } + virtual void setCompilation( bool isCompilation ); + virtual bool hasAlbumArtist() const { return !m_albumArtist.isNull(); } virtual Meta::ArtistPtr albumArtist() const { return m_albumArtist; } virtual Meta::TrackList tracks() { return Base::tracks(); } @@ -92,10 +99,14 @@ class Album : public Meta::Album, public Base virtual void setImage( const QImage &image ) { m_image = image; } /* MemoryMeta::Album methods: */ - void setIsCompilation( bool isCompilation ) { m_isCompilation = isCompilation; } + void setCachedCompilation( bool isCompilation ) + { m_isCompilation = isCompilation; } + void setCachedCanUpdateCompilation( bool canUpdateCompilation ) + { m_canUpdateCompilation = canUpdateCompilation; } private: bool m_isCompilation; + bool m_canUpdateCompilation; Meta::ArtistPtr m_albumArtist; QImage m_image; }; diff --git a/src/core-impl/collections/upnpcollection/UpnpMeta.cpp b/src/core-impl/collections/upnpcollection/UpnpMeta.cpp index a2f4fc0..8d8bfb1 100644 --- a/src/core-impl/collections/upnpcollection/UpnpMeta.cpp +++ b/src/core-impl/collections/upnpcollection/UpnpMeta.cpp @@ -485,12 +485,6 @@ UpnpAlbum::setAlbumArtist( UpnpArtistPtr artist ) } void -UpnpAlbum::setIsCompilation( bool compilation ) -{ - m_isCompilation = compilation; -} - -void UpnpAlbum::setAlbumArtUrl( const KUrl &url ) { m_albumArtUrl = url; diff --git a/src/core-impl/collections/upnpcollection/UpnpMeta.h b/src/core-impl/collections/upnpcollection/UpnpMeta.h index f1596b4..feabc1e 100644 --- a/src/core-impl/collections/upnpcollection/UpnpMeta.h +++ b/src/core-impl/collections/upnpcollection/UpnpMeta.h @@ -182,7 +182,6 @@ class UpnpAlbum : public QObject, public Meta::Album void addTrack( UpnpTrackPtr track ); void removeTrack( UpnpTrackPtr track ); void setAlbumArtist( UpnpArtistPtr artist ); - void setIsCompilation( bool compilation ); void setAlbumArtUrl( const KUrl &url ); private: diff --git a/src/core-impl/meta/timecode/TimecodeMeta.cpp b/src/core-impl/meta/timecode/TimecodeMeta.cpp index 5ebe859..5d78d59 100644 --- a/src/core-impl/meta/timecode/TimecodeMeta.cpp +++ b/src/core-impl/meta/timecode/TimecodeMeta.cpp @@ -544,11 +544,6 @@ void TimecodeAlbum::setAlbumArtist( TimecodeArtistPtr artist ) m_albumArtist = artist; } -void TimecodeAlbum::setIsCompilation( bool compilation ) -{ - m_isCompilation = compilation; -} - bool TimecodeAlbum::hasCapabilityInterface( Capabilities::Capability::Type type ) const { return type == Capabilities::Capability::Actions; diff --git a/src/core-impl/meta/timecode/TimecodeMeta.h b/src/core-impl/meta/timecode/TimecodeMeta.h index 7f24832..7ce2a67 100644 --- a/src/core-impl/meta/timecode/TimecodeMeta.h +++ b/src/core-impl/meta/timecode/TimecodeMeta.h @@ -201,7 +201,6 @@ public: //TimecodeAlbum specific methods void addTrack( TimecodeTrackPtr track ); void setAlbumArtist( TimecodeArtistPtr artist ); - void setIsCompilation( bool compilation ); bool operator==( const Meta::Album &other ) const { diff --git a/src/core/meta/Meta.h b/src/core/meta/Meta.h index 2797a10..d028c4c 100644 --- a/src/core/meta/Meta.h +++ b/src/core/meta/Meta.h @@ -377,7 +377,20 @@ namespace Meta virtual QString prettyName() const; + /** + * Whether this album is considered to be a compilation of tracks from various + * artists. + */ virtual bool isCompilation() const = 0; + /** + * Whether toggling the compilation status is currenlty supported. Default + * implementation returns false. + */ + virtual bool canUpdateCompilation() const { return false; } + /** + * Set compilation status. You should check canUpdateCompilation() first. + */ + virtual void setCompilation( bool isCompilation ) { Q_UNUSED( isCompilation ) } /** Returns true if this album has an album artist */ virtual bool hasAlbumArtist() const = 0; diff --git a/src/services/ServiceMetaBase.cpp b/src/services/ServiceMetaBase.cpp index 9d585d1..039146b 100644 --- a/src/services/ServiceMetaBase.cpp +++ b/src/services/ServiceMetaBase.cpp @@ -735,6 +735,17 @@ ServiceAlbum::isCompilation() const return m_isCompilation; } +bool ServiceAlbum::canUpdateCompilation() const +{ + return true; +} + +void +ServiceAlbum::setCompilation( bool compilation ) +{ + m_isCompilation = compilation; +} + bool ServiceAlbum::hasAlbumArtist() const { @@ -765,12 +776,6 @@ ServiceAlbum::setAlbumArtist( ArtistPtr artist ) m_albumArtist = artist; } -void -ServiceAlbum::setIsCompilation( bool compilation ) -{ - m_isCompilation = compilation; -} - void ServiceAlbum::setDescription(const QString &description) { m_description = description; diff --git a/src/services/ServiceMetaBase.h b/src/services/ServiceMetaBase.h index 195197e..793eb9e 100644 --- a/src/services/ServiceMetaBase.h +++ b/src/services/ServiceMetaBase.h @@ -363,6 +363,9 @@ class AMAROK_EXPORT ServiceAlbum : public Meta::Album, virtual QString name() const; virtual bool isCompilation() const; + virtual bool canUpdateCompilation() const; + virtual void setCompilation( bool compilation ); + virtual bool hasAlbumArtist() const; virtual ArtistPtr albumArtist() const; virtual TrackList tracks(); @@ -401,7 +404,6 @@ class AMAROK_EXPORT ServiceAlbum : public Meta::Album, //ServiceAlbum specific methods void addTrack( TrackPtr track ); void setAlbumArtist( ArtistPtr artist ); - void setIsCompilation( bool compilation ); void setDescription( const QString &description ); QString description( ) const; diff --git a/src/services/amazon/AmazonParser.cpp b/src/services/amazon/AmazonParser.cpp index 9988811..27ac3dc 100644 --- a/src/services/amazon/AmazonParser.cpp +++ b/src/services/amazon/AmazonParser.cpp @@ -192,7 +192,7 @@ AmazonParser::addAlbumToCollection( const QString &albumTitle, const QString &de results << albumID << albumTitle << description << artistID << price << imgUrl << albumAsin; Meta::AlbumPtr newAlbum = m_factory->createAlbum( results ); - dynamic_cast<Meta::AmazonAlbum*>( newAlbum.data() )->setIsCompilation( isCompilation ); + newAlbum->setCompilation( isCompilation ); m_collection->addAlbum( newAlbum ); m_collection->albumIDMap()->insert( albumAsin, albumID.toInt() ); } _______________________________________________ Amarok-devel mailing list Amarok-devel@kde.org https://mail.kde.org/mailman/listinfo/amarok-devel