generalize overlay screens; ScreenSystemLayer is no longer a special
case
This commit is contained in:
@@ -28,7 +28,7 @@
|
|||||||
#include "SongManager.h"
|
#include "SongManager.h"
|
||||||
#include "RageTextureManager.h"
|
#include "RageTextureManager.h"
|
||||||
#include "ThemeManager.h"
|
#include "ThemeManager.h"
|
||||||
#include "ScreenSystemLayer.h"
|
#include "Screen.h"
|
||||||
#include "BGAnimation.h"
|
#include "BGAnimation.h"
|
||||||
#include "Foreach.h"
|
#include "Foreach.h"
|
||||||
#include "ActorUtil.h"
|
#include "ActorUtil.h"
|
||||||
@@ -54,7 +54,6 @@ void ScreenManager::Register( const CString& sClassName, CreateScreenFn pfn )
|
|||||||
ScreenManager::ScreenManager()
|
ScreenManager::ScreenManager()
|
||||||
{
|
{
|
||||||
m_pSharedBGA = new Actor;
|
m_pSharedBGA = new Actor;
|
||||||
m_SystemLayer = NULL;
|
|
||||||
|
|
||||||
m_MessageSendOnPop = SM_None;
|
m_MessageSendOnPop = SM_None;
|
||||||
|
|
||||||
@@ -79,7 +78,8 @@ ScreenManager::~ScreenManager()
|
|||||||
for( unsigned i=0; i<m_ScreenStack.size(); i++ )
|
for( unsigned i=0; i<m_ScreenStack.size(); i++ )
|
||||||
SAFE_DELETE( m_ScreenStack[i] );
|
SAFE_DELETE( m_ScreenStack[i] );
|
||||||
DeletePreparedScreens();
|
DeletePreparedScreens();
|
||||||
SAFE_DELETE( m_SystemLayer );
|
for( unsigned i=0; i<m_OverlayScreens.size(); i++ )
|
||||||
|
SAFE_DELETE( m_OverlayScreens[i] );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is called when we start up, and when the theme changes or is reloaded. */
|
/* This is called when we start up, and when the theme changes or is reloaded. */
|
||||||
@@ -94,10 +94,20 @@ void ScreenManager::ThemeChanged()
|
|||||||
m_soundScreenshot.Load( THEME->GetPathS("Common","screenshot") );
|
m_soundScreenshot.Load( THEME->GetPathS("Common","screenshot") );
|
||||||
m_soundBack.Load( THEME->GetPathS("Common","back") );
|
m_soundBack.Load( THEME->GetPathS("Common","back") );
|
||||||
|
|
||||||
// reload system layer
|
// reload overlay screens
|
||||||
SAFE_DELETE( m_SystemLayer );
|
for( unsigned i=0; i<m_OverlayScreens.size(); i++ )
|
||||||
m_SystemLayer = new ScreenSystemLayer;
|
SAFE_DELETE( m_OverlayScreens[i] );
|
||||||
m_SystemLayer->Init();
|
m_OverlayScreens.clear();
|
||||||
|
|
||||||
|
CString sOverlays = THEME->GetMetric( "Common","OverlayScreens" );
|
||||||
|
vector<CString> asOverlays;
|
||||||
|
split( sOverlays, ",", asOverlays );
|
||||||
|
for( unsigned i=0; i<asOverlays.size(); i++ )
|
||||||
|
{
|
||||||
|
Screen *pScreen = MakeNewScreenInternal( asOverlays[i] );
|
||||||
|
m_OverlayScreens.push_back( pScreen );
|
||||||
|
}
|
||||||
|
|
||||||
this->RefreshCreditsMessages();
|
this->RefreshCreditsMessages();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,7 +174,8 @@ void ScreenManager::Update( float fDeltaTime )
|
|||||||
|
|
||||||
m_pSharedBGA->Update( fDeltaTime );
|
m_pSharedBGA->Update( fDeltaTime );
|
||||||
|
|
||||||
m_SystemLayer->Update( fDeltaTime );
|
for( unsigned i=0; i<m_OverlayScreens.size(); i++ )
|
||||||
|
m_OverlayScreens[i]->Update( fDeltaTime );
|
||||||
|
|
||||||
/* The music may be started on the first update. If we're reading from a CD,
|
/* The music may be started on the first update. If we're reading from a CD,
|
||||||
* it might not start immediately. Make sure we start playing the sound before
|
* it might not start immediately. Make sure we start playing the sound before
|
||||||
@@ -214,7 +225,8 @@ void ScreenManager::Draw()
|
|||||||
m_ScreenStack[i]->Draw();
|
m_ScreenStack[i]->Draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_SystemLayer->Draw();
|
for( unsigned i=0; i<m_OverlayScreens.size(); i++ )
|
||||||
|
m_OverlayScreens[i]->Draw();
|
||||||
|
|
||||||
|
|
||||||
DISPLAY->EndFrame();
|
DISPLAY->EndFrame();
|
||||||
@@ -231,6 +243,24 @@ void ScreenManager::Input( const DeviceInput& DeviceI, const InputEventType type
|
|||||||
m_ScreenStack.back()->Input( DeviceI, type, GameI, MenuI, StyleI );
|
m_ScreenStack.back()->Input( DeviceI, type, GameI, MenuI, StyleI );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Just create a new screen; don't do any associated cleanup. */
|
||||||
|
Screen* ScreenManager::MakeNewScreenInternal( const CString &sScreenName )
|
||||||
|
{
|
||||||
|
RageTimer t;
|
||||||
|
LOG->Trace( "Loading screen name '%s'", sScreenName.c_str() );
|
||||||
|
|
||||||
|
CString sClassName = THEME->GetMetric(sScreenName,"Class");
|
||||||
|
|
||||||
|
map<CString,CreateScreenFn>::iterator iter = g_pmapRegistrees->find( sClassName );
|
||||||
|
ASSERT_M( iter != g_pmapRegistrees->end(), ssprintf("Screen '%s' has an invalid class '%s'",sScreenName.c_str(),sClassName.c_str()) )
|
||||||
|
|
||||||
|
CreateScreenFn pfn = iter->second;
|
||||||
|
Screen* ret = pfn( sScreenName );
|
||||||
|
|
||||||
|
LOG->Trace( "Loaded '%s' ('%s') in %f", sScreenName.c_str(), sClassName.c_str(), t.GetDeltaTime());
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
Screen* ScreenManager::MakeNewScreen( const CString &sScreenName )
|
Screen* ScreenManager::MakeNewScreen( const CString &sScreenName )
|
||||||
{
|
{
|
||||||
@@ -245,18 +275,7 @@ Screen* ScreenManager::MakeNewScreen( const CString &sScreenName )
|
|||||||
* creating the new screen, to lower peak memory usage slightly. */
|
* creating the new screen, to lower peak memory usage slightly. */
|
||||||
SONGMAN->Cleanup();
|
SONGMAN->Cleanup();
|
||||||
|
|
||||||
RageTimer t;
|
Screen* ret = MakeNewScreenInternal( sScreenName );
|
||||||
LOG->Trace( "Loading screen name '%s'", sScreenName.c_str() );
|
|
||||||
|
|
||||||
CString sClassName = THEME->GetMetric(sScreenName,"Class");
|
|
||||||
|
|
||||||
map<CString,CreateScreenFn>::iterator iter = g_pmapRegistrees->find( sClassName );
|
|
||||||
ASSERT_M( iter != g_pmapRegistrees->end(), ssprintf("Screen '%s' has an invalid class '%s'",sScreenName.c_str(),sClassName.c_str()) )
|
|
||||||
|
|
||||||
CreateScreenFn pfn = iter->second;
|
|
||||||
Screen* ret = pfn( sScreenName );
|
|
||||||
|
|
||||||
LOG->Trace( "Loaded '%s' ('%s') in %f", sScreenName.c_str(), sClassName.c_str(), t.GetDeltaTime());
|
|
||||||
|
|
||||||
/* Loading probably took a little while. Let's reset stats. This prevents us
|
/* Loading probably took a little while. Let's reset stats. This prevents us
|
||||||
* from displaying an unnaturally low FPS value, and the next FPS value we
|
* from displaying an unnaturally low FPS value, and the next FPS value we
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public:
|
|||||||
void PlaySharedBackgroundOffCommand();
|
void PlaySharedBackgroundOffCommand();
|
||||||
private:
|
private:
|
||||||
vector<Screen*> m_ScreenStack; // bottommost to topmost
|
vector<Screen*> m_ScreenStack; // bottommost to topmost
|
||||||
Screen *m_SystemLayer;
|
vector<Screen*> m_OverlayScreens;
|
||||||
|
|
||||||
CString m_sLastLoadedBackgroundPath;
|
CString m_sLastLoadedBackgroundPath;
|
||||||
CString m_sDelayedScreen;
|
CString m_sDelayedScreen;
|
||||||
@@ -79,6 +79,7 @@ private:
|
|||||||
bool m_bZeroNextUpdate;
|
bool m_bZeroNextUpdate;
|
||||||
|
|
||||||
Screen* MakeNewScreen( const CString &sName );
|
Screen* MakeNewScreen( const CString &sName );
|
||||||
|
Screen* MakeNewScreenInternal( const CString &sName );
|
||||||
void SetFromNewScreen( Screen *pNewScreen, bool Stack );
|
void SetFromNewScreen( Screen *pNewScreen, bool Stack );
|
||||||
void ClearScreenStack();
|
void ClearScreenStack();
|
||||||
void EmptyDeleteQueue();
|
void EmptyDeleteQueue();
|
||||||
|
|||||||
@@ -28,8 +28,8 @@
|
|||||||
#define CREDITS_JOIN_ONLY THEME->GetMetricB("ScreenSystemLayer","CreditsJoinOnly")
|
#define CREDITS_JOIN_ONLY THEME->GetMetricB("ScreenSystemLayer","CreditsJoinOnly")
|
||||||
|
|
||||||
|
|
||||||
//REGISTER_SCREEN_CLASS( ScreenSystemLayer );
|
REGISTER_SCREEN_CLASS( ScreenSystemLayer );
|
||||||
ScreenSystemLayer::ScreenSystemLayer() : Screen("ScreenSystemLayer")
|
ScreenSystemLayer::ScreenSystemLayer( const CString &sName ) : Screen(sName)
|
||||||
{
|
{
|
||||||
MESSAGEMAN->Subscribe( this, "RefreshCreditText" );
|
MESSAGEMAN->Subscribe( this, "RefreshCreditText" );
|
||||||
MESSAGEMAN->Subscribe( this, "SystemMessage" );
|
MESSAGEMAN->Subscribe( this, "SystemMessage" );
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ const int NUM_SKIPS_TO_SHOW = 5;
|
|||||||
class ScreenSystemLayer : public Screen
|
class ScreenSystemLayer : public Screen
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ScreenSystemLayer();
|
ScreenSystemLayer( const CString &sName );
|
||||||
virtual ~ScreenSystemLayer();
|
virtual ~ScreenSystemLayer();
|
||||||
virtual void Init();
|
virtual void Init();
|
||||||
void HandleMessage( const CString &sCommandName );
|
void HandleMessage( const CString &sCommandName );
|
||||||
|
|||||||
Reference in New Issue
Block a user