openmohaa/code/client/usignal.cpp

250 lines
3.8 KiB
C++

/*
===========================================================================
Copyright (C) 1999-2005 Id Software, Inc.
This file is part of Quake III Arena source code.
Quake III Arena source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
Quake III Arena source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Quake III Arena source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
#include "../uilib/ui_local.h"
UConnection::UConnection()
{
}
UConnection::UConnection(const Event& inevent, const Event& outevent)
: m_inevent(inevent)
, m_outevent(outevent)
{
}
bool UConnection::TypeIs
(
Event& ev
)
{
return ev.eventnum == m_inevent.eventnum;
}
bool UConnection::AddListener
(
Listener *object,
Event& ev
)
{
Event *e;
SafePtr< Listener > ptr;
if( !object )
return false;
ptr = object;
// don't add the same listener
if (m_listeners.ObjectInList(ptr))
{
return false;
}
m_listeners.AddObject( ptr );
e = new Event( ev );
m_events.AddObject( e );
return true;
}
bool UConnection::RemoveListener
(
Listener *object
)
{
int i;
ListenerPtr ptr;
if( !object )
return false;
ptr = object;
if( !m_listeners.ObjectInList( ptr ) )
{
return false;
}
i = m_listeners.IndexOfObject( ptr );
delete m_events.ObjectAt( i );
m_events.RemoveObjectAt( i );
m_listeners.RemoveObjectAt( i );
return true;
}
bool UConnection::SendEvent
(
Listener *object,
Event& ev
)
{
int n;
int i;
int j;
bool sent;
Listener *ptr;
int numargs;
sent = false;
n = m_listeners.NumObjects();
numargs = ev.NumArgs();
for( i = n; i > 0; i-- )
{
ptr = m_listeners.ObjectAt( i );
if( ptr )
{
Event *e = new Event( *m_events.ObjectAt( i ) );
for( j = 1; j < numargs; j++ )
{
e->AddToken( ev.GetToken( j ) );
}
ptr->ProcessEvent( e );
sent = true;
}
else
{
Event *e = m_events.ObjectAt( i );
delete e;
m_listeners.RemoveObjectAt( i );
m_events.RemoveObjectAt( i );
}
}
return sent;
}
CLASS_DECLARATION( Listener, USignal, NULL )
{
{ NULL, NULL }
};
bool USignal::SendSignal
(
Event& ev
)
{
int i;
int n;
UConnection *c;
n = m_connections.NumObjects();
for( i = 1; i <= n; i++ )
{
c = m_connections.ObjectAt( i );
if( c->TypeIs( ev ) )
{
return c->SendEvent( this, ev );
}
}
return false;
}
bool USignal::Connect
(
Listener *object,
Event& inevent,
Event& outevent
)
{
int i;
int n;
UConnection *c;
n = m_connections.NumObjects();
for( i = 1; i <= n; i++ )
{
c = m_connections.ObjectAt( i );
if( c->TypeIs( inevent ) )
{
return c->AddListener( object, outevent );
}
}
c = new UConnection(inevent, outevent);
m_connections.AddObject( c );
return c->AddListener( object, outevent );
}
bool USignal::Disconnect
(
Listener *object,
Event& ev
)
{
int i;
int n;
UConnection *c;
n = m_connections.NumObjects();
for( i = 1; i <= n; i++ )
{
c = m_connections.ObjectAt( i );
if( c->TypeIs( ev ) )
{
return c->RemoveListener( object );
}
}
return false;
}
bool USignal::Disconnect
(
Listener *object
)
{
int i;
int n;
bool result;
UConnection *c;
result = false;
n = m_connections.NumObjects();
for( i = 1; i <= n; i++ )
{
c = m_connections.ObjectAt( i );
if( c->RemoveListener( object ) )
{
result = true;
}
}
return result;
}