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.
This commit is contained in:
@@ -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.
|
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
|
2015/03/27
|
||||||
----------
|
----------
|
||||||
* [Select Music] Ability to delete the current song by pressing Ctrl+Backspace added. [Wallacoloo]
|
* [Select Music] Ability to delete the current song by pressing Ctrl+Backspace added. [Wallacoloo]
|
||||||
|
|||||||
@@ -193,6 +193,7 @@ PrefsManager::PrefsManager() :
|
|||||||
//m_BackgroundCache ( "BackgroundCache", BGCACHE_LOW_RES_PRELOAD ),
|
//m_BackgroundCache ( "BackgroundCache", BGCACHE_LOW_RES_PRELOAD ),
|
||||||
m_bFastLoad ( "FastLoad", true ),
|
m_bFastLoad ( "FastLoad", true ),
|
||||||
m_bFastLoadAdditionalSongs ( "FastLoadAdditionalSongs", true ),
|
m_bFastLoadAdditionalSongs ( "FastLoadAdditionalSongs", true ),
|
||||||
|
m_NeverCacheList("NeverCacheList", ""),
|
||||||
|
|
||||||
m_bOnlyDedicatedMenuButtons ( "OnlyDedicatedMenuButtons", false ),
|
m_bOnlyDedicatedMenuButtons ( "OnlyDedicatedMenuButtons", false ),
|
||||||
m_bMenuTimer ( "MenuTimer", false ),
|
m_bMenuTimer ( "MenuTimer", false ),
|
||||||
|
|||||||
@@ -185,6 +185,7 @@ public:
|
|||||||
//Preference<BackgroundCacheMode> m_BackgroundCache;
|
//Preference<BackgroundCacheMode> m_BackgroundCache;
|
||||||
Preference<bool> m_bFastLoad;
|
Preference<bool> m_bFastLoad;
|
||||||
Preference<bool> m_bFastLoadAdditionalSongs;
|
Preference<bool> m_bFastLoadAdditionalSongs;
|
||||||
|
Preference<RString> m_NeverCacheList;
|
||||||
|
|
||||||
Preference<bool> m_bOnlyDedicatedMenuButtons;
|
Preference<bool> m_bOnlyDedicatedMenuButtons;
|
||||||
Preference<bool> m_bMenuTimer;
|
Preference<bool> m_bMenuTimer;
|
||||||
|
|||||||
@@ -441,10 +441,25 @@ bool ScreenSelectMusic::Input( const InputEventPlus &input )
|
|||||||
INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, KEY_LCTRL)) ||
|
INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, KEY_LCTRL)) ||
|
||||||
INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, KEY_RCTRL));
|
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);
|
wchar_t c = INPUTMAN->DeviceInputToChar(input.DeviceI,false);
|
||||||
MakeUpper( &c, 1 );
|
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
|
// Only allow changing the sort order if the wheel is not locked
|
||||||
// and we're not in course mode. -aj
|
// and we're not in course mode. -aj
|
||||||
|
|||||||
@@ -17,8 +17,10 @@
|
|||||||
#include "Sprite.h"
|
#include "Sprite.h"
|
||||||
#include "RageFileManager.h"
|
#include "RageFileManager.h"
|
||||||
#include "RageSurface.h"
|
#include "RageSurface.h"
|
||||||
|
#include "RageTextureManager.h"
|
||||||
#include "NoteDataUtil.h"
|
#include "NoteDataUtil.h"
|
||||||
#include "SongUtil.h"
|
#include "SongUtil.h"
|
||||||
|
#include "SongManager.h"
|
||||||
#include "StepsUtil.h"
|
#include "StepsUtil.h"
|
||||||
#include "Foreach.h"
|
#include "Foreach.h"
|
||||||
#include "BackgroundUtil.h"
|
#include "BackgroundUtil.h"
|
||||||
@@ -455,6 +457,28 @@ bool Song::ReloadFromSongDir( RString sDir )
|
|||||||
}
|
}
|
||||||
|
|
||||||
AddAutoGenNotes();
|
AddAutoGenNotes();
|
||||||
|
// Reload any images associated with the song. -Kyz
|
||||||
|
vector<RString> 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<RString>::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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1224,6 +1248,10 @@ bool Song::SaveToJsonFile( RString sPath )
|
|||||||
|
|
||||||
bool Song::SaveToCacheFile()
|
bool Song::SaveToCacheFile()
|
||||||
{
|
{
|
||||||
|
if(SONGMAN->IsGroupNeverCached(m_sGroupName))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
SONGINDEX->AddCacheIndex(m_sSongDir, GetHashForDirectory(m_sSongDir));
|
SONGINDEX->AddCacheIndex(m_sSongDir, GetHashForDirectory(m_sSongDir));
|
||||||
const RString sPath = GetCacheFilePath();
|
const RString sPath = GetCacheFilePath();
|
||||||
return SaveToSSCFile(sPath, true);
|
return SaveToSSCFile(sPath, true);
|
||||||
|
|||||||
@@ -91,6 +91,13 @@ SongManager::~SongManager()
|
|||||||
|
|
||||||
void SongManager::InitAll( LoadingWindow *ld )
|
void SongManager::InitAll( LoadingWindow *ld )
|
||||||
{
|
{
|
||||||
|
vector<RString> never_cache;
|
||||||
|
split(PREFSMAN->m_NeverCacheList, ",", never_cache);
|
||||||
|
for(vector<RString>::iterator group= never_cache.begin();
|
||||||
|
group != never_cache.end(); ++group)
|
||||||
|
{
|
||||||
|
m_GroupsToNeverCache.insert(*group);
|
||||||
|
}
|
||||||
InitSongsFromDisk( ld );
|
InitSongsFromDisk( ld );
|
||||||
InitCoursesFromDisk( ld );
|
InitCoursesFromDisk( ld );
|
||||||
InitAutogenCourses();
|
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
|
RString SongManager::GetSongGroupBannerPath( RString sSongGroup ) const
|
||||||
{
|
{
|
||||||
for( unsigned i = 0; i < m_sSongGroupNames.size(); ++i )
|
for( unsigned i = 0; i < m_sSongGroupNames.size(); ++i )
|
||||||
|
|||||||
@@ -68,6 +68,8 @@ public:
|
|||||||
void Reload( bool bAllowFastLoad, LoadingWindow *ld=NULL ); // songs, courses, groups - everything.
|
void Reload( bool bAllowFastLoad, LoadingWindow *ld=NULL ); // songs, courses, groups - everything.
|
||||||
void PreloadSongImages();
|
void PreloadSongImages();
|
||||||
|
|
||||||
|
bool IsGroupNeverCached(const RString& group) const;
|
||||||
|
|
||||||
RString GetSongGroupBannerPath( RString sSongGroup ) const;
|
RString GetSongGroupBannerPath( RString sSongGroup ) const;
|
||||||
//RString GetSongGroupBackgroundPath( RString sSongGroup ) const;
|
//RString GetSongGroupBackgroundPath( RString sSongGroup ) const;
|
||||||
void GetSongGroupNames( vector<RString> &AddTo ) const;
|
void GetSongGroupNames( vector<RString> &AddTo ) const;
|
||||||
@@ -182,6 +184,7 @@ protected:
|
|||||||
/** @brief All of the songs that can be played. */
|
/** @brief All of the songs that can be played. */
|
||||||
vector<Song*> m_pSongs;
|
vector<Song*> m_pSongs;
|
||||||
map<RString, Song*> m_SongsByDir;
|
map<RString, Song*> m_SongsByDir;
|
||||||
|
set<RString> 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. */
|
/** @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<Song*> m_pDeletedSongs;
|
vector<Song*> m_pDeletedSongs;
|
||||||
/** @brief The most popular songs ranked by number of plays. */
|
/** @brief The most popular songs ranked by number of plays. */
|
||||||
|
|||||||
+16
-18
@@ -164,31 +164,29 @@ bool TimingData::empty() const
|
|||||||
return true;
|
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;
|
int row_offset= dest_row - start_row;
|
||||||
|
FOREACH_TimingSegmentType(seg_type)
|
||||||
FOREACH_TimingSegmentType( tst )
|
|
||||||
{
|
{
|
||||||
const vector<TimingSegment*> &vSegs = GetTimingSegments(tst);
|
if(seg_type == copy_type || copy_type == TimingSegmentType_Invalid)
|
||||||
|
|
||||||
for (unsigned i = 0; i < vSegs.size(); i++)
|
|
||||||
{
|
{
|
||||||
const TimingSegment *seg = vSegs[i];
|
const vector<TimingSegment*>& segs= GetTimingSegments(seg_type);
|
||||||
int row = seg->GetRow();
|
for(size_t i= 0; i < segs.size(); ++i)
|
||||||
|
|
||||||
if (row >= startRow && row < endRow)
|
|
||||||
{
|
{
|
||||||
TimingSegment *cpy = seg->Copy();
|
if(segs[i]->GetRow() >= start_row && segs[i]->GetRow() <= end_row)
|
||||||
|
{
|
||||||
// offset rows as though startRow were beat 0.
|
TimingSegment* copy= segs[i]->Copy();
|
||||||
cpy->SetRow(seg->GetRow() - startRow);
|
copy->SetRow(segs[i]->GetRow() + row_offset);
|
||||||
ret.AddSegment(cpy);
|
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
|
void TimingData::GetActualBPM( float &fMinBPMOut, float &fMaxBPMOut, float highest ) const
|
||||||
|
|||||||
+1
-1
@@ -149,7 +149,7 @@ public:
|
|||||||
|
|
||||||
bool empty() const;
|
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,
|
* @brief Gets the actual BPM of the song,
|
||||||
* while respecting a limit.
|
* while respecting a limit.
|
||||||
|
|||||||
Reference in New Issue
Block a user