117 lines
2.3 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
|