Git commit bbbf5abc82b3b470d92b78b591487732310f8428 by Matěj Laitl. Committed on 12/05/2013 at 21:24. Pushed by laitl into branch 'master'.
MountPointManager: fix inability to deselect "Use MusicLocation" ...and also inability to clear the Local Collection if collection folders are cleared. BUGFIXES: * Fix inability to reverse "Use Music Location" decision and inability to clear database once all collection directories have been unset. This patch is a candidate for inclusion into 2.7.1 BUG: 316216 FIXED-IN: 2.8 CCMAIL: amarok-devel@kde.org M +2 -0 ChangeLog M +16 -20 src/App.cpp M +31 -19 src/core-impl/collections/db/MountPointManager.cpp M +7 -0 src/core-impl/collections/db/MountPointManager.h M +2 -1 src/scanner/GenericScanManager.cpp http://commits.kde.org/amarok/bbbf5abc82b3b470d92b78b591487732310f8428 diff --git a/ChangeLog b/ChangeLog index f244a82..0f4a2af 100644 --- a/ChangeLog +++ b/ChangeLog @@ -52,6 +52,8 @@ VERSION 2.8-Beta 1 not to fool users. BUGFIXES: + * Fix inability to reverse "Use Music Location" decision and inability to clear + database once all collection directories have been unset. (BR 316216) * Fix `amarok --play file.mp3` option didn't actually start playback. * Fix frequent crashes on Linux when starting to play a track. (BR 319371) * Reason why a particular track is not playable is now shown in playlist tooltip; patch diff --git a/src/App.cpp b/src/App.cpp index 36500ea..4e96d3b 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -650,33 +650,29 @@ void App::handleFirstRun() int result = KMessageBox::No; if( dir.exists() && dir.isReadable() ) { - result = KMessageBox::questionYesNoCancel( - mainWindow(), - i18n( "A music path, %1, is set in System Settings.\nWould you like to use that as a collection folder?", musicDir ) - ); + result = KMessageBox::questionYesNoCancel( mainWindow(), i18n( "A music path, " + "%1, is set in System Settings.\nWould you like to use that as a " + "collection folder?", musicDir ) ); } - KConfigGroup folderConf = Amarok::config( "Collection Folders" ); - bool useMusicLocation( false ); switch( result ) { - case KMessageBox::Yes: - if( CollectionManager::instance()->primaryCollection() ) + case KMessageBox::Yes: { - CollectionManager::instance()->primaryCollection()->setProperty( "collectionFolders", QStringList() << musicDir ); - CollectionManager::instance()->startFullScan(); - useMusicLocation = true; + Collections::Collection *coll = CollectionManager::instance()->primaryCollection(); + if( coll ) + { + coll->setProperty( "collectionFolders", QStringList() << musicDir ); + CollectionManager::instance()->startFullScan(); + } + break; } - break; - - case KMessageBox::No: - slotConfigAmarok( "CollectionConfig" ); - break; - - default: - break; + case KMessageBox::No: + slotConfigAmarok( "CollectionConfig" ); + break; + default: + break; } - folderConf.writeEntry( "Use MusicLocation", useMusicLocation ); config.writeEntry( "First Run", false ); } diff --git a/src/core-impl/collections/db/MountPointManager.cpp b/src/core-impl/collections/db/MountPointManager.cpp index caaa484..a64da1e 100644 --- a/src/core-impl/collections/db/MountPointManager.cpp +++ b/src/core-impl/collections/db/MountPointManager.cpp @@ -49,6 +49,7 @@ MountPointManager::MountPointManager( QObject *parent, SqlStorage *storage ) { debug() << "Dynamic Collection deactivated in amarokrc, not loading plugins, not connecting signals"; m_ready = true; + handleMusicLocation(); return; } @@ -58,6 +59,34 @@ MountPointManager::MountPointManager( QObject *parent, SqlStorage *storage ) createDeviceFactories(); } +void +MountPointManager::handleMusicLocation() +{ + // For users who were using QDesktopServices::MusicLocation exclusively up + // to v2.2.2, which did not store the location into config. + // and also for versions up to 2.7-git that did wrote the Use MusicLocation entry + + KConfigGroup folders = Amarok::config( "Collection Folders" ); + const QString entryKey( "Use MusicLocation" ); + if( !folders.hasKey( entryKey ) ) + return; // good, already solved, nothing to do + + // write the music location as another collection folder in this case + if( folders.readEntry( entryKey, false ) ) + { + const KUrl musicUrl = QDesktopServices::storageLocation( QDesktopServices::MusicLocation ); + const QString musicDir = musicUrl.toLocalFile( KUrl::RemoveTrailingSlash ); + const QDir dir( musicDir ); + if( dir.exists() && dir.isReadable() ) + { + QStringList currentFolders = collectionFolders(); + if( !currentFolders.contains( musicDir ) ) + setCollectionFolders( currentFolders << musicDir ); + } + } + + folders.deleteEntry( entryKey ); // get rid of it for good +} MountPointManager::~MountPointManager() { @@ -96,6 +125,7 @@ MountPointManager::createDeviceFactories() createHandlerFromDevice( device, device.udi() ); } m_ready = true; + handleMusicLocation(); } int @@ -240,7 +270,7 @@ MountPointManager::getMountedDeviceIds() const QStringList MountPointManager::collectionFolders() const { - if (!m_ready) + if( !m_ready ) { debug() << "requested collectionFolders from MountPointManager that is not yet ready"; return QStringList(); @@ -263,24 +293,6 @@ MountPointManager::collectionFolders() const } } - // For users who were using QDesktopServices::MusicLocation exclusively up - // to v2.2.2, which did not store the location into config. - const KConfigGroup generalConfig = KGlobal::config()->group( "General" ); - if( result.isEmpty() && folders.readEntry( "Use MusicLocation", true ) - && !generalConfig.readEntry( "First Run", true ) ) - { - const KUrl musicUrl = QDesktopServices::storageLocation( QDesktopServices::MusicLocation ); - const QString musicDir = musicUrl.toLocalFile( KUrl::RemoveTrailingSlash ); - const QDir dir( musicDir ); - bool useMusicLocation( false ); - if( dir.exists() && dir.isReadable() ) - { - result << musicDir; - const_cast<MountPointManager*>(this)->setCollectionFolders( result ); - useMusicLocation = true; - } - folders.writeEntry( "Use MusicLocation", useMusicLocation ); - } return result; } diff --git a/src/core-impl/collections/db/MountPointManager.h b/src/core-impl/collections/db/MountPointManager.h index 8c6bf95..4e588d7 100644 --- a/src/core-impl/collections/db/MountPointManager.h +++ b/src/core-impl/collections/db/MountPointManager.h @@ -191,6 +191,13 @@ private: void createDeviceFactories(); /** + * Old Amarok versions used to have "Use MusicLocation" config option which caused + * problems (bug 316216). This method converts out of it and needs to be run after + * MountPointManager has initialized. + */ + void handleMusicLocation(); + + /** * checks whether a medium identified by its unique database id is currently mounted. * Note: does not handle deviceId = -1! It only checks real devices * @param deviceId the mediums unique id diff --git a/src/scanner/GenericScanManager.cpp b/src/scanner/GenericScanManager.cpp index eb13de3..b668ac9 100644 --- a/src/scanner/GenericScanManager.cpp +++ b/src/scanner/GenericScanManager.cpp @@ -89,7 +89,8 @@ GenericScanManager::requestScan( QList<KUrl> directories, ScanType type ) scanDirsSet << path; } - if( scanDirsSet.isEmpty() ) + // we cannot skip the scan even for empty scanDirsSet and non-partial scan, bug 316216 + if( scanDirsSet.isEmpty() && type == PartialUpdateScan ) return; // nothing to do m_scannerJob = new GenericScannerJob( this, scanDirsSet.toList(), type ); _______________________________________________ Amarok-devel mailing list Amarok-devel@kde.org https://mail.kde.org/mailman/listinfo/amarok-devel