mirror of
https://github.com/openmoh/openmohaa.git
synced 2025-04-28 21:57:57 +03:00
250 lines
3.8 KiB
C++
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;
|
|
}
|