[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    extragear/multimedia/amarok/src
From:       Joe Rabinoff <bobqwatson () yahoo ! com>
Date:       2006-09-07 16:25:33
Message-ID: 1157646333.080861.5107.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 581818 by rabinoff:

Moodbar files are now moved / deleted when the corresponding music
file is either moved / deleted by hand, or detected to have been moved
/ deleted by the ScanController + AFT code.



 M  +3 -0      app.cpp  
 M  +87 -18    moodbar.cpp  
 M  +9 -3      moodbar.h  
 M  +7 -1      playlist.cpp  
 M  +4 -0      playlistitem.cpp  


--- trunk/extragear/multimedia/amarok/src/app.cpp #581817:581818
@@ -636,6 +636,9 @@
     bool restoreSession = args->count() == 0 || args->isSet( "append" ) || args->isSet( "enqueue" )
                                 || Amarok::config()->readBoolEntry( "AppendAsDefault", false );
 
+    // Make this instance so it can start receiving signals
+    MoodServer::instance();
+
     // Remember old folder setup, so we can detect changes after the wizard was used
     //const QStringList oldCollectionFolders = MountPointManager::instance()->collectionFolders();
 
--- trunk/extragear/multimedia/amarok/src/moodbar.cpp #581817:581818
@@ -262,6 +262,12 @@
 //   (private slot) slotMoodbarPrefs(): Called when the Amarok config changes.
 //       If the moodbar has been disabled completely, kill the current job
 //       (if any), clear the queue, and notify the interested Moodbar's.
+//
+//   (private slot) slotFileDeleted(): Called when a music file is deleted, so
+//       we can delete the associated moodbar
+//
+//   (private slot) slotFileMoved(): Called when a music file is moved, so
+//       we can move the associated moodbar
 
 // TODO: off-color single bars in dark areas -- do some interpolation when
 //       averaging.  Big jumps in hues when near black.
@@ -275,6 +281,7 @@
 #include "amarok.h"
 #include "amarokconfig.h"
 #include "app.h"
+#include "collectiondb.h"
 #include "debug.h"
 #include "metabundle.h"
 #include "mountpointmanager.h"
@@ -314,6 +321,18 @@
 {
     connect( App::instance(), SIGNAL( moodbarPrefs( bool, bool, int, bool ) ),
              SLOT( slotMoodbarPrefs( bool, bool, int, bool ) ) );
+    connect( CollectionDB::instance(), 
+             SIGNAL( fileMoved( const QString &, const QString & ) ),
+             SLOT( slotFileMoved( const QString &, const QString & ) ) );
+    connect( CollectionDB::instance(), 
+             SIGNAL( fileMoved( const QString &, const QString &, const QString & ) ),
+             SLOT( slotFileMoved( const QString &, const QString & ) ) );
+    connect( CollectionDB::instance(),
+             SIGNAL( fileDeleted( const QString & ) ),
+             SLOT( slotFileDeleted( const QString & ) ) );
+    connect( CollectionDB::instance(),
+             SIGNAL( fileDeleted( const QString &, const QString & ) ),
+             SLOT( slotFileDeleted( const QString & ) ) );
 }
 
 
@@ -356,7 +375,7 @@
 
     m_jobQueue.append( ProcData( bundle->url(),
                                  bundle->url().path(),
-                                 bundle->moodbar().moodFilename() ) );
+                                 bundle->moodbar().moodFilename( bundle->url() ) ) );
 
     debug() << "MoodServer::queueJob: Queued job for " << bundle->url().path()
             << ", " << m_jobQueue.size() << " jobs in queue." << endl;
@@ -589,6 +608,40 @@
 }
 
 
+// When a file is deleted, either manually using Organize Collection or
+// automatically detected using AFT, delete the corresponding mood file.
+void 
+MoodServer::slotFileDeleted( const QString &path )
+{
+    QString mood = Moodbar::moodFilename( KURL::fromPathOrURL( path ) );
+    if( mood.isEmpty()  ||  !QFile::exists( mood ) )
+      return;
+    
+    debug() << "MoodServer::slotFileDeleted: deleting " << mood << endl;
+    QFile::remove( mood );
+}
+
+
+// When a file is moved, either manually using Organize Collection or
+// automatically using AFT, move the corresponding mood file.
+void
+MoodServer::slotFileMoved( const QString &srcPath, const QString &dstPath )
+{
+    QString srcMood = Moodbar::moodFilename( KURL::fromPathOrURL( srcPath ) );
+    QString dstMood = Moodbar::moodFilename( KURL::fromPathOrURL( dstPath ) );
+    
+    if( srcMood.isEmpty()   ||  dstMood.isEmpty()  ||
+        srcMood == dstMood  ||  !QFile::exists( srcMood ) )
+      return;
+    
+    debug() << "MoodServer::slotFileMoved: moving " << srcMood << " to "
+            << dstMood << endl;
+    
+    Moodbar::copyFile( srcMood, dstMood );
+    QFile::remove( srcMood );
+}
+
+
 // This is called when we decide that the moodbar analyzer is
 // never going to work.  Disable further jobs, and let the user
 // know about it.  This should only be called when m_currentProcess == 0.
@@ -801,7 +854,7 @@
     if( !AmarokConfig::showMoodbar()   ||
         !m_bundle->url().isLocalFile() ||
         !m_bundle->length()            ||
-        moodFilename().isEmpty() )
+        moodFilename( m_bundle->url() ).isEmpty() )
       {
         m_state = CantLoad;
         return false;
@@ -895,7 +948,7 @@
 
     // If we get here it means the analyzer job went wrong, but
     // somehow the MoodServer didn't know about it
-    debug() << "WARNING: Failed to open file " << moodFilename()
+    debug() << "WARNING: Failed to open file " << moodFilename( m_bundle->url() )
             << " -- something is very wrong" << endl;
     m_state = JobFailed;
     m_mutex.unlock();
@@ -1019,7 +1072,7 @@
     if( m_state == Loaded )
       return true;
 
-    QString path = moodFilename();
+    QString path = moodFilename( m_bundle->url() );
     if( path.isEmpty() )
       return false;
 
@@ -1035,7 +1088,8 @@
         // in the other place, so we should check there before giving
         // up.
 
-        QString path2 = moodFilename( !AmarokConfig::moodsWithMusic() );
+        QString path2 = moodFilename( m_bundle->url(), 
+                                      !AmarokConfig::moodsWithMusic() );
         moodFile.setName( path2 );
 
         if( !QFile::exists( path2 )  ||
@@ -1045,15 +1099,10 @@
         debug() << "Moodbar::readFile: Found a file at " << path2
                 << " instead, using that and copying." << endl;
 
-        QByteArray contents = moodFile.readAll();
         moodFile.close();
+        if( !copyFile( path2, path ) )
+          return false;
         moodFile.setName( path );
-        if( !moodFile.open( IO_WriteOnly ) )
-          return false;
-        bool res = ( uint( moodFile.writeBlock( contents ) ) == contents.size() );
-        moodFile.close();
-        if( !res )
-          return false;
         if( !moodFile.open( IO_ReadOnly ) )
           return false;
       }
@@ -1254,13 +1303,13 @@
 // return QString::null.
 
 QString
-Moodbar::moodFilename( void )
+Moodbar::moodFilename( const KURL &url )
 {
-  return moodFilename( AmarokConfig::moodsWithMusic() );
+  return moodFilename( url, AmarokConfig::moodsWithMusic() );
 }
 
 QString
-Moodbar::moodFilename( bool withMusic )
+Moodbar::moodFilename( const KURL &url, bool withMusic )
 {
     // No need to lock the object
 
@@ -1268,7 +1317,7 @@
 
     if( withMusic )
       {
-        path = m_bundle->url().path();
+        path = url.path();
         path.truncate(path.findRev('.'));
 
         if (path.isEmpty())  // Weird...
@@ -1284,10 +1333,10 @@
     else
       {
         // The moodbar file is {device id},{relative path}.mood}
-        int deviceid = MountPointManager::instance()->getIdForUrl( m_bundle->url() );
+        int deviceid = MountPointManager::instance()->getIdForUrl( url );
         KURL relativePath;
         MountPointManager::instance()->getRelativePath( deviceid,
-            m_bundle->url(), relativePath );
+            url, relativePath );
         path = relativePath.path();
         path.truncate(path.findRev('.'));
 
@@ -1305,6 +1354,26 @@
 }
 
 
+// Quick-n-dirty -->synchronous<-- file copy (the GUI needs its
+// moodbars immediately!)
+bool
+Moodbar::copyFile( const QString &srcPath, const QString &dstPath )
+{
+  QFile file( srcPath );
+  if( !file.open( IO_ReadOnly ) )
+    return false;
+  QByteArray contents = file.readAll();
+  file.close();
+  file.setName( dstPath );
+  if( !file.open( IO_WriteOnly | IO_Truncate ) )
+    return false;
+  bool res = ( uint( file.writeBlock( contents ) ) == contents.size() );
+  file.close();
+  return res;
+}
+
+
+
 // Can we find the moodbar program?
 bool
 Moodbar::executableExists( void )
--- trunk/extragear/multimedia/amarok/src/moodbar.h #581817:581818
@@ -81,8 +81,9 @@
   { return m_state; }
   
   // Where are we storing the .mood file?
-  QString moodFilename( void );
-  QString moodFilename( bool withMusic );
+  static QString moodFilename( const KURL &url );
+  static QString moodFilename( const KURL &url, bool withMusic );
+  static bool copyFile( const QString &srcPath, const QString &dstPath );
 
   static bool executableExists( void );
   
@@ -111,7 +112,7 @@
 
 class KProcess;
 
-// For internal use only.
+// For internal use only (well, mostly)
 class MoodServer : public QObject
 {
   Q_OBJECT
@@ -133,6 +134,11 @@
   void slotNewJob( void );
   void slotMoodbarPrefs( bool show, bool moodier, int alter, bool withMusic );
 
+public slots:
+  // Moodbar file organization slots
+  void slotFileDeleted( const QString &absPath );
+  void slotFileMoved( const QString &srcPath, const QString &dstPath );
+
 private:
 
   class ProcData
--- trunk/extragear/multimedia/amarok/src/playlist.cpp #581817:581818
@@ -1027,8 +1027,11 @@
 }
 
 void
-Playlist::updateEntriesUrl( const QString &/*oldUrl*/, const QString &newUrl, const QString &uniqueid )
+Playlist::updateEntriesUrl( const QString &oldUrl, const QString &newUrl, const QString &uniqueid )
 {
+    // Make sure the MoodServer gets this signal first!
+    MoodServer::instance()->slotFileMoved( oldUrl, newUrl );
+
     PlaylistItem *item;
     if( m_uniqueMap.contains( uniqueid ) )
     {
@@ -3674,6 +3677,9 @@
 void
 Playlist::fileMoved( const QString &srcPath, const QString &dstPath )
 {
+    // Make sure the MoodServer gets this signal first!
+    MoodServer::instance()->slotFileMoved( srcPath, dstPath );
+
     for( MyIt it( this, MyIt::All ); *it; ++it )
     {
         PlaylistItem *item = static_cast<PlaylistItem*>( *it );
--- trunk/extragear/multimedia/amarok/src/playlistitem.cpp #581817:581818
@@ -177,12 +177,16 @@
 {
     bool totals = false, ref = false;
     for( int i = 0, n = columns.count(); i < n; ++i )
+      {
+        if( columns[i] == Mood )
+          moodbar().reset();
         switch( columns[i] )
         {
             case Artist: case Album: ref = true; //note, no breaks
             case Track: case Rating: case Score: case LastPlayed: totals = true;
             default: updateColumn( columns[i] );
         }
+      }
     if( ref )
         refAlbum();
     if( totals )
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic