loupiottes/DMX-2.0/EventManager.cs
2013-11-12 15:12:46 +00:00

117 lines
2.3 KiB
C#

using System;
using System.Collections.Generic;
namespace DMX2
{
public struct EventData
{
public string id;
public byte value;
}
public interface IEventProvider
{
string MenuName{ get; }
string[] GetEventList();
bool Bind (string eventId, IEventTarget target);
void Unbind (string eventId, IEventTarget target);
Gtk.Menu GetProviderSubMenu( Gtk.ButtonPressEventHandler handler );
}
public interface IEventTarget
{
bool FireEvent(EventData data);
}
public class EventManager
{
class eventBinding
{
private eventBinding(){}
public eventBinding(string _id, IEventTarget _target, IEventProvider _provider){
id=_id;
target=_target;
provider=_provider;
}
public string id;
public IEventTarget target;
public IEventProvider provider;
}
List<eventBinding> bindings = new List<eventBinding>();
List<IEventProvider> providers = new List<IEventProvider>();
public EventManager ()
{
}
public void RegisterProvider (IEventProvider prov)
{
providers.Add (prov);
List<string> evList = new List<string>(prov.GetEventList());
foreach (eventBinding b in bindings) {
if(b.provider == null && evList.Contains(b.id))
{
prov.Bind(b.id,b.target);
b.provider = prov;
}
}
}
public Gtk.Menu GetMenu ( Gtk.ButtonPressEventHandler handler )
{
Gtk.Menu menu = new Gtk.Menu();
return menu;
}
public void UnregisterProvider (IEventProvider prov)
{
foreach (eventBinding b in bindings)
if(b.provider == prov)
b.provider = null;
providers.Remove(prov);
}
public bool Bind (string eventId, IEventTarget target)
{
foreach (IEventProvider prov in providers) {
if (prov.Bind (eventId, target)) {
bindings.Add(new eventBinding(eventId,target,prov));
return true;
}
}
bindings.Add(new eventBinding(eventId,target,null));
return false;
}
eventBinding findBinding (string eventId, IEventTarget target)
{
foreach (eventBinding b in bindings) {
if (b.id == eventId && b.target == target) {
return b;
}
}
return null;
}
public void Unbind (string eventId, IEventTarget target)
{
eventBinding b = findBinding(eventId,target);
if(b==null)return;
b.provider.Unbind(eventId,target);
bindings.Remove (b);
}
}
}