Implement progress bar in SongManager
authorMarc Cannon <vyhdycokio@gmail.com>
Wed, 2 Jan 2013 15:24:54 +0000 (15:24 +0000)
committerMarc Cannon <vyhdycokio@gmail.com>
Wed, 2 Jan 2013 15:24:54 +0000 (15:24 +0000)
src/SongManager.cpp

index bfd7e4a..ba3d91b 100755 (executable)
@@ -114,7 +114,7 @@ void SongManager::Reload( LoadingWindow *ld )
 void SongManager::InitSongsFromDisk( LoadingWindow *ld )\r
 {\r
        RageTimer tm;\r
-       \r
+\r
        /* this loads the songs into m_pMachineSongs */\r
        LoadStepManiaSongDir( SONGS_DIR, ld );\r
 \r
@@ -185,37 +185,62 @@ void SongManager::LoadStepManiaSongDir( CString sDir, LoadingWindow *ld )
                sDir += "/";\r
 \r
        // Find all group directories in "Songs" folder\r
-       CStringArray arrayGroupDirs;\r
+       vector<CString> arrayGroupDirs;\r
        GetDirListing( sDir+"*", arrayGroupDirs, true );\r
        SortCStringArray( arrayGroupDirs );\r
 \r
-       for( unsigned i=0; i< arrayGroupDirs.size(); i++ )      // for each dir in /Songs/\r
+       /* Build a list of song directories to read through */\r
+       if( ld )\r
+               ld->SetText( "Building Songs directory..." );\r
+\r
+       unsigned iNumSongsLoaded = 0, iNumSongsToLoad = 0;\r
+       vector< vector<CString> > arrayGroupSongDirs( arrayGroupDirs.size(), vector<CString>() );\r
+\r
+       for( unsigned i=0; i< arrayGroupDirs.size(); ++i )      // for each dir in /Songs/\r
        {\r
-               CString sGroupDirName = arrayGroupDirs[i];\r
+               const CString &sGroupDirName = arrayGroupDirs[i];\r
+               const CString sGroupDirPath = sDir + sGroupDirName;\r
 \r
-               SanityCheckGroupDir(sDir+sGroupDirName);\r
+               SanityCheckGroupDir( sGroupDirPath );\r
 \r
                // Find all Song folders in this group directory\r
-               CStringArray arraySongDirs;\r
-               GetDirListing( sDir+sGroupDirName + "/*", arraySongDirs, true, true );\r
+               vector<CString> &arraySongDirs = arrayGroupSongDirs[i];\r
+               GetDirListing( sGroupDirPath + "/*" /**/, arraySongDirs, true, true );\r
                SortCStringArray( arraySongDirs );\r
 \r
-               LOG->Trace("Attempting to load %i songs from \"%s\"", int(arraySongDirs.size()),\r
-                                  (sDir+sGroupDirName).c_str() );\r
-               int loaded = 0;\r
+               iNumSongsToLoad += arraySongDirs.size();\r
+               LOG->Trace( "Found %d song folders in \"%s\"", arraySongDirs.size(), sGroupDirPath.c_str() );\r
+       }\r
+\r
+       ASSERT( arrayGroupDirs.size() == arrayGroupSongDirs.size() );\r
+\r
+       for( unsigned i = 0; i < arrayGroupSongDirs.size(); ++i )\r
+       {\r
+               vector<CString> &arraySongDirs = arrayGroupSongDirs[i];\r
+               const CString &sGroupDirName = arrayGroupDirs[i];\r
+\r
+               unsigned iLoadedFromThisDir = 0;\r
 \r
-               for( unsigned j=0; j< arraySongDirs.size(); ++j )       // for each song dir\r
+               for( unsigned j = 0; j < arraySongDirs.size(); ++j )\r
                {\r
-                       CString sSongDirName = arraySongDirs[j];\r
+                       const CString &sSongDirName = arraySongDirs[j];\r
+                       ++iNumSongsLoaded;\r
 \r
-                       // this is a song directory.  Load a new song!\r
                        if( ld )\r
                        {\r
-                               ld->SetText( ssprintf("Loading songs...\n%s\n%s",\r
-                                                                         Basename(sGroupDirName).c_str(),\r
-                                                                         Basename(sSongDirName).c_str()));\r
+                               ld->SetProgress( iNumSongsLoaded, iNumSongsToLoad );\r
+\r
+                               ld->SetText(\r
+                                       ssprintf("Loading songs (%d of %d)...\n%s\n%s",\r
+                                               iNumSongsLoaded, iNumSongsToLoad,\r
+                                               Basename(sGroupDirName).c_str(),\r
+                                               Basename(sSongDirName).c_str()\r
+                                       )\r
+                               );\r
+\r
                                ld->Paint();\r
                        }\r
+\r
                        Song* pNewSong = new Song;\r
                        if( !pNewSong->LoadFromSongDir( sSongDirName ) )\r
                        {\r
@@ -223,22 +248,23 @@ void SongManager::LoadStepManiaSongDir( CString sDir, LoadingWindow *ld )
                                delete pNewSong;\r
                                continue;\r
                        }\r
-                       \r
+\r
                        m_pMachineSongs.push_back( pNewSong );\r
-                       loaded++;\r
+                       ++iLoadedFromThisDir;\r
                }\r
 \r
-               LOG->Trace("Loaded %i songs from \"%s\"", loaded, (sDir+sGroupDirName).c_str() );\r
+               LOG->Trace("Loaded %i songs from \"%s\"", iLoadedFromThisDir, (sDir+sGroupDirName).c_str() );\r
 \r
                /* Don't add the group name if we didn't load any songs in this group. */\r
-               if(!loaded) continue;\r
+               if( iLoadedFromThisDir == 0 )\r
+                       continue;\r
 \r
                /* Add this group to the group array. */\r
                AddGroup(sDir, sGroupDirName);\r
 \r
                /* Cache and load the group banner. */\r
                BANNERCACHE->CacheBanner( GetGroupBannerPath(sGroupDirName) );\r
-               \r
+\r
                /* Load the group sym links (if any)*/\r
                LoadGroupSymLinks(sDir, sGroupDirName);\r
        }\r