run profile's CustomLoadFunction when changing theme or assigning a local profile to a player

This should make the custom load functions a lot more useful.
This commit is contained in:
sigatrev
2014-04-30 21:30:30 -05:00
parent bea5f1cef9
commit f1fc291989
4 changed files with 40 additions and 22 deletions
+24 -19
View File
@@ -789,6 +789,29 @@ void Profile::IncrementCategoryPlayCount( StepsType st, RankingCategory rc )
if( X==NULL ) LOG->Warn("Failed to read section " #X); \
else Load##X##FromNode(X); }
void Profile::LoadCustomFunction( RString sDir )
{
/* Get the theme's custom load function:
* [Profile]
* CustomLoadFunction=function(profile, profileDir) ... end
*/
Lua *L = LUA->Get();
LuaReference customLoadFunc = THEME->GetMetricR("Profile", "CustomLoadFunction");
customLoadFunc.PushSelf(L);
ASSERT_M(!lua_isnil(L, -1), "CustomLoadFunction not defined");
// Pass profile and profile directory as arguments
this->PushSelf(L);
LuaHelpers::Push(L, sDir);
// Run it
RString sError;
if (!LuaHelpers::RunScriptOnStack(L, sError, 2, 0))
LOG->Warn("Error running CustomLoadFunction: %s", sError.c_str());
LUA->Release(L);
}
ProfileLoadResult Profile::LoadAllFromDir( RString sDir, bool bRequireSignature )
{
CHECKPOINT;
@@ -881,25 +904,7 @@ ProfileLoadResult Profile::LoadAllFromDir( RString sDir, bool bRequireSignature
if (ret != ProfileLoadResult_Success)
return ret;
/* Get the theme's custom load function:
* [Profile]
* CustomLoadFunction=function(profile, profileDir) ... end
*/
Lua *L = LUA->Get();
LuaReference customLoadFunc = THEME->GetMetricR("Profile", "CustomLoadFunction");
customLoadFunc.PushSelf(L);
ASSERT_M(!lua_isnil(L, -1), "CustomLoadFunction not defined");
// Pass profile and profile directory as arguments
this->PushSelf(L);
LuaHelpers::Push(L, sDir);
// Run it
RString sError;
if (!LuaHelpers::RunScriptOnStack(L, sError, 2, 0))
LOG->Warn("Error running CustomLoadFunction: %s", sError.c_str());
LUA->Release(L);
LoadCustomFunction( sDir );
return ProfileLoadResult_Success;
}
+1
View File
@@ -349,6 +349,7 @@ public:
// Loading and saving
ProfileLoadResult LoadAllFromDir( RString sDir, bool bRequireSignature );
void LoadCustomFunction( RString sDir );
bool SaveAllToDir( RString sDir, bool bSignData ) const;
ProfileLoadResult LoadEditableDataFromDir( RString sDir );
+5 -3
View File
@@ -148,7 +148,7 @@ ProfileLoadResult ProfileManager::LoadProfile( PlayerNumber pn, RString sProfile
// Try to load the original, non-backup data.
ProfileLoadResult lr = GetProfile(pn)->LoadAllFromDir( m_sProfileDir[pn], PREFSMAN->m_bSignProfileData );
RString sBackupDir = m_sProfileDir[pn] + LAST_GOOD_SUBDIR;
if( lr == ProfileLoadResult_Success )
@@ -201,6 +201,8 @@ bool ProfileManager::LoadLocalProfileFromMachine( PlayerNumber pn )
return false;
}
GetProfile(pn)->LoadCustomFunction( m_sProfileDir[pn] );
return true;
}
@@ -247,7 +249,7 @@ bool ProfileManager::LoadProfileFromMemoryCard( PlayerNumber pn, bool bLoadEdits
m_sProfileDirImportedFrom[pn] = asDirsToTry[i];
break;
}
if( res == ProfileLoadResult_FailedTampered )
{
m_bNewProfile[pn] = false;
@@ -277,7 +279,7 @@ bool ProfileManager::LoadProfileFromMemoryCard( PlayerNumber pn, bool bLoadEdits
return true; // If a card is inserted, we want to use the memory card to save - even if the Profile load failed.
}
bool ProfileManager::LoadFirstAvailableProfile( PlayerNumber pn, bool bLoadEdits )
{
if( LoadProfileFromMemoryCard(pn, bLoadEdits) )
+10
View File
@@ -12,6 +12,8 @@
#include "RageFile.h"
#if !defined(SMPACKAGE)
#include "ScreenManager.h"
#include "ProfileManager.h"
#include "Profile.h"
#include "ActorUtil.h"
#endif
#include "Foreach.h"
@@ -415,12 +417,20 @@ void ThemeManager::SwitchThemeAndLanguage( const RString &sThemeName_, const RSt
// reload common sounds
if( SCREENMAN != NULL )
SCREENMAN->ThemeChanged();
#endif
/* Lua globals can use metrics which are cached, and vice versa. Update Lua
* globals first; it's Lua's job to explicitly update cached metrics that it
* uses. */
UpdateLuaGlobals();
// Reload MachineProfile with new theme's CustomLoadFunction
if( PROFILEMAN != NULL )
{
Profile* pProfile = PROFILEMAN->GetMachineProfile();
pProfile->LoadCustomFunction( "/Save/MachineProfile/" );
}
}
// Use theme metrics for localization.