add more BroadcastOnChange templates
This commit is contained in:
@@ -10,6 +10,11 @@ MessageManager* MESSAGEMAN = NULL; // global and accessable from anywhere in our
|
|||||||
|
|
||||||
static const CString MessageNames[NUM_MESSAGES] = {
|
static const CString MessageNames[NUM_MESSAGES] = {
|
||||||
"CurrentSongChanged",
|
"CurrentSongChanged",
|
||||||
|
"CurrentStepsP1Changed",
|
||||||
|
"CurrentStepsP2Changed",
|
||||||
|
"EditStepsTypeChanged",
|
||||||
|
"EditSourceStepsChanged",
|
||||||
|
"EditSourceStepsTypeChanged",
|
||||||
};
|
};
|
||||||
XToString( Message );
|
XToString( Message );
|
||||||
|
|
||||||
@@ -50,12 +55,16 @@ void MessageManager::Unsubscribe( IMessageSubscriber* pSubscriber, Message m )
|
|||||||
Unsubscribe( pSubscriber, MessageToString(m) );
|
Unsubscribe( pSubscriber, MessageToString(m) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageManager::Broadcast( const CString& sMessage )
|
void MessageManager::Broadcast( const CString& sMessage ) const
|
||||||
{
|
{
|
||||||
SubscribersSet& subs = m_MessageToSubscribers[sMessage];
|
map<CString,SubscribersSet>::const_iterator iter = m_MessageToSubscribers.find( sMessage );
|
||||||
FOREACHS_CONST( IMessageSubscriber*, subs, p )
|
if( iter == m_MessageToSubscribers.end() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
FOREACHS_CONST( IMessageSubscriber*, iter->second, p )
|
||||||
{
|
{
|
||||||
(*p)->HandleMessage( sMessage );
|
IMessageSubscriber *pSub = *p;
|
||||||
|
pSub->HandleMessage( sMessage );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,22 +17,55 @@ struct lua_State;
|
|||||||
enum Message
|
enum Message
|
||||||
{
|
{
|
||||||
MESSAGE_CURRENT_SONG_CHANGED,
|
MESSAGE_CURRENT_SONG_CHANGED,
|
||||||
|
MESSAGE_CURRENT_STEPS_P1_CHANGED,
|
||||||
|
MESSAGE_CURRENT_STEPS_P2_CHANGED,
|
||||||
|
MESSAGE_EDIT_STEPS_TYPE_CHANGED,
|
||||||
|
MESSAGE_EDIT_SOURCE_STEPS_CHANGED,
|
||||||
|
MESSAGE_EDIT_SOURCE_STEPS_TYPE_CHANGED,
|
||||||
NUM_MESSAGES
|
NUM_MESSAGES
|
||||||
};
|
};
|
||||||
const CString& MessageToString( Message m );
|
const CString& MessageToString( Message m );
|
||||||
|
|
||||||
template<class T, Message M>
|
template<class T>
|
||||||
|
class BroadcastOnChange
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Message mSendWhenChanged;
|
||||||
|
T val;
|
||||||
|
public:
|
||||||
|
BroadcastOnChange( Message m ) { mSendWhenChanged = m; }
|
||||||
|
const T Get() const { return val; }
|
||||||
|
void Set( T t ) { val = t; MESSAGEMAN->Broadcast( MessageToString(mSendWhenChanged) ); }
|
||||||
|
operator T () const { return val; }
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class T>
|
||||||
class BroadcastOnChangePtr
|
class BroadcastOnChangePtr
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
Message mSendWhenChanged;
|
||||||
T *val;
|
T *val;
|
||||||
public:
|
public:
|
||||||
const T* Get() { return val; }
|
BroadcastOnChangePtr( Message m ) { mSendWhenChanged = m; }
|
||||||
void Set( T* t ) { val = t; MESSAGEMAN->Broadcast( MessageToString(M) ); }
|
const T* Get() const { return val; }
|
||||||
|
void Set( T* t ) { val = t; MESSAGEMAN->Broadcast( MessageToString(mSendWhenChanged) ); }
|
||||||
operator T* () const { return val; }
|
operator T* () const { return val; }
|
||||||
T* operator->() const { return val; }
|
T* operator->() const { return val; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<class T, int N>
|
||||||
|
class BroadcastOnChangePtr1D
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Message mSendWhenChanged;
|
||||||
|
T *val[N];
|
||||||
|
public:
|
||||||
|
BroadcastOnChangePtr1D( Message m ) { mSendWhenChanged = m; }
|
||||||
|
const T* Get( unsigned i ) const { return val[i]; }
|
||||||
|
void Set( unsigned i, T* t ) { val[i] = t; MESSAGEMAN->Broadcast( MessageToString((Message)(mSendWhenChanged+i)) ); }
|
||||||
|
T* operator[]( unsigned i ) const { return val[i]; }
|
||||||
|
};
|
||||||
|
|
||||||
class MessageManager
|
class MessageManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -43,7 +76,7 @@ public:
|
|||||||
void Subscribe( IMessageSubscriber* pSubscriber, Message m );
|
void Subscribe( IMessageSubscriber* pSubscriber, Message m );
|
||||||
void Unsubscribe( IMessageSubscriber* pSubscriber, const CString& sMessage );
|
void Unsubscribe( IMessageSubscriber* pSubscriber, const CString& sMessage );
|
||||||
void Unsubscribe( IMessageSubscriber* pSubscriber, Message m );
|
void Unsubscribe( IMessageSubscriber* pSubscriber, Message m );
|
||||||
void Broadcast( const CString& sMessage );
|
void Broadcast( const CString& sMessage ) const;
|
||||||
|
|
||||||
// Lua
|
// Lua
|
||||||
void PushSelf( lua_State *L );
|
void PushSelf( lua_State *L );
|
||||||
|
|||||||
Reference in New Issue
Block a user