From 2b4cabfb57438f7a1b25802cc04fe10458c930b7 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Tue, 31 Mar 2015 15:20:37 -0600 Subject: [PATCH] Added keybinding for reloading songs on SSM, and lua function for doing it from lua. Added NeverCacheList preference for WIP groups that should never be cached. Rewrote TimingData::CopyRange in preparation for using it to copy/paste timing data from the selected area in edit mode. --- Docs/Changelog_sm5.txt | 8 ++++++++ src/PrefsManager.cpp | 1 + src/PrefsManager.h | 1 + src/ScreenSelectMusic.cpp | 17 ++++++++++++++++- src/Song.cpp | 28 ++++++++++++++++++++++++++++ src/SongManager.cpp | 12 ++++++++++++ src/SongManager.h | 3 +++ src/TimingData.cpp | 34 ++++++++++++++++------------------ src/TimingData.h | 2 +- 9 files changed, 86 insertions(+), 20 deletions(-) diff --git a/Docs/Changelog_sm5.txt b/Docs/Changelog_sm5.txt index a1458ebbb7..7e5ff65cc4 100644 --- a/Docs/Changelog_sm5.txt +++ b/Docs/Changelog_sm5.txt @@ -4,6 +4,14 @@ The StepMania 5 Changelog covers all post-sm-ssc changes. For a list of changes from StepMania 4 alpha 5 to sm-ssc v1.2.5, see Changelog_sm-ssc.txt. ________________________________________________________________________________ +2015/03/30 +---------- +* [Select Music] Ctrl+Shift+R mapped to reload the current song. [kyzentun] +* [Song] ReloadFromSongDir lua function exposed. [kyzentun] +* [Preferences] NeverCacheList preference added. It's a comma separated + list of group names, if a song is in one of the named groups, it is never + cached. [kyzentun] + 2015/03/27 ---------- * [Select Music] Ability to delete the current song by pressing Ctrl+Backspace added. [Wallacoloo] diff --git a/src/PrefsManager.cpp b/src/PrefsManager.cpp index 3e296a5928..2bdb98f58a 100644 --- a/src/PrefsManager.cpp +++ b/src/PrefsManager.cpp @@ -193,6 +193,7 @@ PrefsManager::PrefsManager() : //m_BackgroundCache ( "BackgroundCache", BGCACHE_LOW_RES_PRELOAD ), m_bFastLoad ( "FastLoad", true ), m_bFastLoadAdditionalSongs ( "FastLoadAdditionalSongs", true ), + m_NeverCacheList("NeverCacheList", ""), m_bOnlyDedicatedMenuButtons ( "OnlyDedicatedMenuButtons", false ), m_bMenuTimer ( "MenuTimer", false ), diff --git a/src/PrefsManager.h b/src/PrefsManager.h index 01571298f6..4aded80335 100644 --- a/src/PrefsManager.h +++ b/src/PrefsManager.h @@ -185,6 +185,7 @@ public: //Preference m_BackgroundCache; Preference m_bFastLoad; Preference m_bFastLoadAdditionalSongs; + Preference m_NeverCacheList; Preference m_bOnlyDedicatedMenuButtons; Preference m_bMenuTimer; diff --git a/src/ScreenSelectMusic.cpp b/src/ScreenSelectMusic.cpp index 6b0bafc724..6065f9d27a 100644 --- a/src/ScreenSelectMusic.cpp +++ b/src/ScreenSelectMusic.cpp @@ -441,10 +441,25 @@ bool ScreenSelectMusic::Input( const InputEventPlus &input ) INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, KEY_LCTRL)) || INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, KEY_RCTRL)); + bool holding_shift= + INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, KEY_LSHIFT)) || + INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, KEY_RSHIFT)); + wchar_t c = INPUTMAN->DeviceInputToChar(input.DeviceI,false); MakeUpper( &c, 1 ); - if( bHoldingCtrl && ( c >= 'A' ) && ( c <= 'Z' ) ) + if(holding_shift && bHoldingCtrl && c == 'R' && m_MusicWheel.IsSettled()) + { + // Reload the currently selected song. -Kyz + Song* to_reload= m_MusicWheel.GetSelectedSong(); + if(to_reload) + { + to_reload->ReloadFromSongDir(); + AfterMusicChange(); + return true; + } + } + else if( bHoldingCtrl && ( c >= 'A' ) && ( c <= 'Z' ) ) { // Only allow changing the sort order if the wheel is not locked // and we're not in course mode. -aj diff --git a/src/Song.cpp b/src/Song.cpp index 1ae98e94fb..2c33a4a71a 100644 --- a/src/Song.cpp +++ b/src/Song.cpp @@ -17,8 +17,10 @@ #include "Sprite.h" #include "RageFileManager.h" #include "RageSurface.h" +#include "RageTextureManager.h" #include "NoteDataUtil.h" #include "SongUtil.h" +#include "SongManager.h" #include "StepsUtil.h" #include "Foreach.h" #include "BackgroundUtil.h" @@ -455,6 +457,28 @@ bool Song::ReloadFromSongDir( RString sDir ) } AddAutoGenNotes(); + // Reload any images associated with the song. -Kyz + vector to_reload; + to_reload.reserve(7); + to_reload.push_back(m_sBannerFile); + to_reload.push_back(m_sJacketFile); + to_reload.push_back(m_sCDFile); + to_reload.push_back(m_sDiscFile); + to_reload.push_back(m_sBackgroundFile); + to_reload.push_back(m_sCDTitleFile); + to_reload.push_back(m_sPreviewVidFile); + for(vector::iterator file= to_reload.begin(); file != to_reload.end(); ++file) + { + RageTextureID id(*file); + if(TEXTUREMAN->IsTextureRegistered(id)) + { + RageTexture* tex= TEXTUREMAN->LoadTexture(id); + if(tex) + { + tex->Reload(); + } + } + } return true; } @@ -1224,6 +1248,10 @@ bool Song::SaveToJsonFile( RString sPath ) bool Song::SaveToCacheFile() { + if(SONGMAN->IsGroupNeverCached(m_sGroupName)) + { + return true; + } SONGINDEX->AddCacheIndex(m_sSongDir, GetHashForDirectory(m_sSongDir)); const RString sPath = GetCacheFilePath(); return SaveToSSCFile(sPath, true); diff --git a/src/SongManager.cpp b/src/SongManager.cpp index f42baea434..85b0d7ab6e 100644 --- a/src/SongManager.cpp +++ b/src/SongManager.cpp @@ -91,6 +91,13 @@ SongManager::~SongManager() void SongManager::InitAll( LoadingWindow *ld ) { + vector never_cache; + split(PREFSMAN->m_NeverCacheList, ",", never_cache); + for(vector::iterator group= never_cache.begin(); + group != never_cache.end(); ++group) + { + m_GroupsToNeverCache.insert(*group); + } InitSongsFromDisk( ld ); InitCoursesFromDisk( ld ); InitAutogenCourses(); @@ -469,6 +476,11 @@ void SongManager::UnlistSong(Song *song) } } +bool SongManager::IsGroupNeverCached(const RString& group) const +{ + return m_GroupsToNeverCache.find(group) != m_GroupsToNeverCache.end(); +} + RString SongManager::GetSongGroupBannerPath( RString sSongGroup ) const { for( unsigned i = 0; i < m_sSongGroupNames.size(); ++i ) diff --git a/src/SongManager.h b/src/SongManager.h index 328df59183..f7802193af 100644 --- a/src/SongManager.h +++ b/src/SongManager.h @@ -68,6 +68,8 @@ public: void Reload( bool bAllowFastLoad, LoadingWindow *ld=NULL ); // songs, courses, groups - everything. void PreloadSongImages(); + bool IsGroupNeverCached(const RString& group) const; + RString GetSongGroupBannerPath( RString sSongGroup ) const; //RString GetSongGroupBackgroundPath( RString sSongGroup ) const; void GetSongGroupNames( vector &AddTo ) const; @@ -182,6 +184,7 @@ protected: /** @brief All of the songs that can be played. */ vector m_pSongs; map m_SongsByDir; + set m_GroupsToNeverCache; /** @brief Hold pointers to all the songs that have been deleted from disk but must at least be kept temporarily alive for smooth audio transitions. */ vector m_pDeletedSongs; /** @brief The most popular songs ranked by number of plays. */ diff --git a/src/TimingData.cpp b/src/TimingData.cpp index c884a9f2a2..c684de6ff6 100644 --- a/src/TimingData.cpp +++ b/src/TimingData.cpp @@ -164,31 +164,29 @@ bool TimingData::empty() const return true; } -TimingData TimingData::CopyRange(int startRow, int endRow) const +void TimingData::CopyRange(int start_row, int end_row, + TimingSegmentType copy_type, int dest_row, TimingData& dest) const { - TimingData ret; - - FOREACH_TimingSegmentType( tst ) + int row_offset= dest_row - start_row; + FOREACH_TimingSegmentType(seg_type) { - const vector &vSegs = GetTimingSegments(tst); - - for (unsigned i = 0; i < vSegs.size(); i++) + if(seg_type == copy_type || copy_type == TimingSegmentType_Invalid) { - const TimingSegment *seg = vSegs[i]; - int row = seg->GetRow(); - - if (row >= startRow && row < endRow) + const vector& segs= GetTimingSegments(seg_type); + for(size_t i= 0; i < segs.size(); ++i) { - TimingSegment *cpy = seg->Copy(); - - // offset rows as though startRow were beat 0. - cpy->SetRow(seg->GetRow() - startRow); - ret.AddSegment(cpy); + if(segs[i]->GetRow() >= start_row && segs[i]->GetRow() <= end_row) + { + TimingSegment* copy= segs[i]->Copy(); + copy->SetRow(segs[i]->GetRow() + row_offset); + dest.AddSegment(copy); + // TimingSegment::Copy creates a new segment with new, and + // AddSegment copies it again, so delete the temp. -Kyz + delete copy; + } } } } - - return ret; } void TimingData::GetActualBPM( float &fMinBPMOut, float &fMaxBPMOut, float highest ) const diff --git a/src/TimingData.h b/src/TimingData.h index 325e7bf8cf..fcad1f125b 100644 --- a/src/TimingData.h +++ b/src/TimingData.h @@ -149,7 +149,7 @@ public: bool empty() const; - TimingData CopyRange(int startRow, int endRow) const; + void CopyRange(int start_row, int end_row, TimingSegmentType copy_type, int dest_row, TimingData& dest) const; /** * @brief Gets the actual BPM of the song, * while respecting a limit.