114 lines
2.4 KiB
C++
114 lines
2.4 KiB
C++
#pragma once
|
|
|
|
#include "KObject.h"
|
|
#include "SContentsManager.h"
|
|
#include "SGameMessage.h"
|
|
//#include "SGameMessageUI.h"
|
|
|
|
struct SGameMessage;
|
|
|
|
class SGuiObj
|
|
{
|
|
public:
|
|
SGuiObj( SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE objId );
|
|
KObject* operator -> ();
|
|
operator bool () const;
|
|
private:
|
|
SIMSG_TOGGLE_UIWINDOW::_UIWINDOW_TYPE mObjId;
|
|
KObject* mObj;
|
|
static KObject mNull;
|
|
};
|
|
|
|
class IContents : public KObject
|
|
{
|
|
public:
|
|
IContents( const char* name, SContentsManager& contentsMgr )
|
|
: mName( name )
|
|
, mContentsMgr( contentsMgr )
|
|
{
|
|
mContentsMgr._addContents( mName.c_str(), *this );
|
|
}
|
|
virtual ~IContents()
|
|
{
|
|
mContentsMgr._rmvContents( mName.c_str() );
|
|
}
|
|
virtual void process( DWORD time ) = 0;
|
|
virtual void notifyMsg( SGameMessage* msg ) = 0;
|
|
|
|
protected:
|
|
const std::string mName;
|
|
SContentsManager& mContentsMgr;
|
|
};
|
|
|
|
template< typename T >
|
|
class SMsgMapper
|
|
{
|
|
public:
|
|
typedef void ( T::*MsgProcFn )( SGameMessage* );
|
|
typedef std::map< int, MsgProcFn > MsgMap;
|
|
|
|
virtual ~SMsgMapper() {}
|
|
void mapProc( const int msgId, MsgProcFn fn )
|
|
{
|
|
mMsgMap[ msgId ] = fn;
|
|
}
|
|
void executeFn( const int msgId, SGameMessage* msg )
|
|
{
|
|
MsgMap::iterator found = mMsgMap.find( msgId );
|
|
if( found != mMsgMap.end() )
|
|
{
|
|
MsgProcFn fn = found->second;
|
|
T* instance = static_cast< T* >( this );
|
|
( instance->*fn )( msg );
|
|
}
|
|
}
|
|
|
|
protected:
|
|
MsgMap mMsgMap;
|
|
};
|
|
|
|
template< typename T >
|
|
class SContents : public IContents, public SMsgMapper< T >
|
|
{
|
|
public:
|
|
SContents( const char* name, SContentsManager& contentsMgr );
|
|
virtual ~SContents();
|
|
virtual void process( DWORD time ) {}
|
|
virtual void notifyMsg( SGameMessage* msg );
|
|
|
|
protected:
|
|
void defMsgProc( const int msg, MsgProcFn fn );
|
|
void cleanMsg();
|
|
};
|
|
|
|
template< typename T > SContents< T >::SContents( const char* name, SContentsManager& contentsMgr )
|
|
: IContents( name, contentsMgr )
|
|
{
|
|
}
|
|
|
|
template< typename T > SContents< T >::~SContents()
|
|
{
|
|
cleanMsg();
|
|
}
|
|
|
|
template< typename T > void SContents< T >::notifyMsg( SGameMessage* msg )
|
|
{
|
|
executeFn( msg->nType, msg );
|
|
}
|
|
|
|
template< typename T > void SContents< T >::defMsgProc( const int msgId, MsgProcFn fn )
|
|
{
|
|
mContentsMgr.registerMsgObserver( msgId, *this );
|
|
mapProc( msgId, fn );
|
|
}
|
|
|
|
template< typename T > void SContents< T >::cleanMsg()
|
|
{
|
|
if( mMsgMap.empty() )
|
|
return;
|
|
|
|
MsgMap::iterator it = mMsgMap.begin(), end = mMsgMap.end();
|
|
|
|
for( ; it != end; ++it )
|
|
mContentsMgr.deregisterMsgObserver( it->first, *this );
|
|
} |