Add Events
This commit is contained in:
parent
44ae8c96f3
commit
76b9d95ddf
|
@ -16,6 +16,11 @@ namespace Ooui
|
||||||
set => SetProperty (ref val, value, "value");
|
set => SetProperty (ref val, value, "value");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public event EventHandler Clicked {
|
||||||
|
add => AddEventListener ("onclick", value);
|
||||||
|
remove => RemoveEventListener ("onclick", value);
|
||||||
|
}
|
||||||
|
|
||||||
public Button ()
|
public Button ()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,12 +6,15 @@ namespace Ooui
|
||||||
{
|
{
|
||||||
public abstract class EventTarget
|
public abstract class EventTarget
|
||||||
{
|
{
|
||||||
|
readonly List<Message> stateMessages = new List<Message> ();
|
||||||
|
|
||||||
|
readonly Dictionary<string, List<EventHandler>> eventListeners =
|
||||||
|
new Dictionary<string, List<EventHandler>> ();
|
||||||
|
|
||||||
public string Id { get; private set; } = GenerateId ();
|
public string Id { get; private set; } = GenerateId ();
|
||||||
|
|
||||||
public Mapping Mapping { get; private set; }
|
public Mapping Mapping { get; private set; }
|
||||||
|
|
||||||
readonly List<Message> stateMessages = new List<Message> ();
|
|
||||||
|
|
||||||
public event Action<Message> MessageSent;
|
public event Action<Message> MessageSent;
|
||||||
|
|
||||||
public IEnumerable<Message> StateMessages => stateMessages;
|
public IEnumerable<Message> StateMessages => stateMessages;
|
||||||
|
@ -21,6 +24,36 @@ namespace Ooui
|
||||||
Mapping = Mapping.Get (GetType ());
|
Mapping = Mapping.Get (GetType ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void AddEventListener (string eventType, EventHandler handler)
|
||||||
|
{
|
||||||
|
if (eventType == null) return;
|
||||||
|
if (handler == null) return;
|
||||||
|
|
||||||
|
var sendListen = false;
|
||||||
|
|
||||||
|
List<EventHandler> handlers;
|
||||||
|
if (!eventListeners.TryGetValue (eventType, out handlers)) {
|
||||||
|
handlers = new List<EventHandler> ();
|
||||||
|
eventListeners[eventType] = handlers;
|
||||||
|
sendListen = true;
|
||||||
|
}
|
||||||
|
handlers.Add (handler);
|
||||||
|
|
||||||
|
if (sendListen)
|
||||||
|
SendListen (eventType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveEventListener (string eventType, EventHandler handler)
|
||||||
|
{
|
||||||
|
if (eventType == null) return;
|
||||||
|
if (handler == null) return;
|
||||||
|
|
||||||
|
List<EventHandler> handlers;
|
||||||
|
if (eventListeners.TryGetValue (eventType, out handlers)) {
|
||||||
|
handlers.Remove (handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected bool SetProperty<T> (ref T backingStore, T newValue, string attributeName, [System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
|
protected bool SetProperty<T> (ref T backingStore, T newValue, string attributeName, [System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
|
||||||
{
|
{
|
||||||
if (!backingStore.Equals (newValue)) {
|
if (!backingStore.Equals (newValue)) {
|
||||||
|
@ -73,6 +106,15 @@ namespace Ooui
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void SendListen (string eventType)
|
||||||
|
{
|
||||||
|
Send (new Message {
|
||||||
|
MessageType = MessageType.Listen,
|
||||||
|
TargetId = Id,
|
||||||
|
Key = eventType,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public virtual void Receive (Message message)
|
public virtual void Receive (Message message)
|
||||||
{
|
{
|
||||||
if (message == null)
|
if (message == null)
|
||||||
|
@ -110,11 +152,21 @@ namespace Ooui
|
||||||
ReplaceStateMessage (old, message);
|
ReplaceStateMessage (old, message);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case MessageType.Listen:
|
||||||
|
SaveStateMessage (message);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void TriggerEventFromMessage (Message message)
|
protected virtual void TriggerEventFromMessage (Message message)
|
||||||
{
|
{
|
||||||
|
List<EventHandler> handlers;
|
||||||
|
if (eventListeners.TryGetValue (message.Key, out handlers)) {
|
||||||
|
var args = EventArgs.Empty;
|
||||||
|
foreach (var h in handlers) {
|
||||||
|
h.Invoke (this, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,18 @@ namespace Ooui
|
||||||
set => v = FixupValue (value);
|
set => v = FixupValue (value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Message Listen (string targetId, string eventType) => new Message {
|
||||||
|
MessageType = MessageType.Listen,
|
||||||
|
TargetId = targetId,
|
||||||
|
Key = eventType,
|
||||||
|
};
|
||||||
|
|
||||||
|
public static Message Event (string targetId, string eventType) => new Message {
|
||||||
|
MessageType = MessageType.Event,
|
||||||
|
TargetId = targetId,
|
||||||
|
Key = eventType,
|
||||||
|
};
|
||||||
|
|
||||||
static object FixupValue (object v)
|
static object FixupValue (object v)
|
||||||
{
|
{
|
||||||
if (v is Array a) {
|
if (v is Array a) {
|
||||||
|
@ -60,5 +72,9 @@ namespace Ooui
|
||||||
Set,
|
Set,
|
||||||
[EnumMember(Value = "call")]
|
[EnumMember(Value = "call")]
|
||||||
Call,
|
Call,
|
||||||
|
[EnumMember(Value = "listen")]
|
||||||
|
Listen,
|
||||||
|
[EnumMember(Value = "event")]
|
||||||
|
Event,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,5 +21,24 @@ namespace Tests
|
||||||
var b = new Button ("Hello World!");
|
var b = new Button ("Hello World!");
|
||||||
Assert.AreEqual ("Hello World!", b.Text);
|
Assert.AreEqual ("Hello World!", b.Text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void Clicked ()
|
||||||
|
{
|
||||||
|
var b = new Button ("Hello World!");
|
||||||
|
var clicked = false;
|
||||||
|
var listened = false;
|
||||||
|
b.MessageSent += m => {
|
||||||
|
listened = listened || (m.MessageType == MessageType.Listen);
|
||||||
|
};
|
||||||
|
Assert.IsFalse (listened);
|
||||||
|
b.Clicked += (s, e) => {
|
||||||
|
clicked = true;
|
||||||
|
};
|
||||||
|
Assert.IsTrue (listened);
|
||||||
|
Assert.IsFalse (clicked);
|
||||||
|
b.Receive (Message.Event (b.Id, "onclick"));
|
||||||
|
Assert.IsTrue (clicked);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue