Skip to content

Commit a9e0e2c

Browse files
committed
Added AsObservable Event Extensions
1 parent f7122d0 commit a9e0e2c

File tree

4 files changed

+61
-1
lines changed

4 files changed

+61
-1
lines changed

Runtime/Scripts/EventExtensions.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using System;
2+
using System.Collections;
3+
using System.Collections.Generic;
4+
using UniRx;
5+
using UniRx.Operators;
6+
using UnityEngine;
7+
using UnityEngine.UIElements;
8+
9+
namespace RedMoon.ReactiveKit
10+
{
11+
public static class EventExtensions
12+
{
13+
public static IObservable<TEventType> AsObservable<TEventType>(this VisualElement element) where TEventType : EventBase<TEventType>, new()
14+
{
15+
return new EventCallbackObservable<TEventType>(element);
16+
}
17+
}
18+
19+
internal class EventCallbackObservable<TEventType> : OperatorObservableBase<TEventType> where TEventType : EventBase<TEventType>, new()
20+
{
21+
readonly VisualElement element;
22+
public EventCallbackObservable(VisualElement element) : base(true)
23+
{
24+
this.element = element;
25+
}
26+
27+
protected override IDisposable SubscribeCore(IObserver<TEventType> observer, IDisposable cancel)
28+
{
29+
return element.BindCallback<TEventType>(x => observer.OnNext(x));
30+
}
31+
}
32+
}

Runtime/Scripts/EventExtensions.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Samples/SamplesBasicUI/Scripts/MainView.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using RedMoon.ReactiveKit;
2+
using System;
23
using System.Collections;
34
using System.Collections.Generic;
45
using UniRx;
56
using UnityEngine;
7+
using System.Linq;
68
using UnityEngine.UIElements;
79

810
namespace RedMoon.ReactiveKit.Samples
@@ -21,7 +23,17 @@ public override void OnActivation(MainViewModel viewModel, CompositeDisposable d
2123
//Bind such that whenever OnButtonClick can Execute, you can click button.
2224
//Bind such that whenever Button is clicked, it executes OnButtonClick.
2325
button.BindClick(viewModel.OnButtonClick).AddTo(disposable);
24-
26+
27+
//Turn Event into Observable
28+
//Buffer based on Throttle Window
29+
//Check that there is more than 2 clicks
30+
//Double Click Detected
31+
var clickStream = button.AsObservable<ClickEvent>();
32+
clickStream.Buffer(clickStream.Throttle(TimeSpan.FromMilliseconds(250))).Where(xs => xs.Count >= 2).Subscribe(x =>
33+
{
34+
viewModel.OnDoubleClick.Execute(x.Last());
35+
});
36+
2537
//Bind such that whenever DebugText changes, it updates label value.
2638
label.BindToValueChanged(viewModel.DebugText).AddTo(disposable);
2739

Samples/SamplesBasicUI/Scripts/MainViewModel.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,18 @@ public class MainViewModel : ViewModel<MainViewModel>
1414
public ReactiveProperty<string> ReactiveText { get; protected set; } = new ReactiveProperty<string>("");
1515

1616
public ReactiveCommand<ClickEvent> OnButtonClick;
17+
public ReactiveCommand<ClickEvent> OnDoubleClick;
1718
public ReactiveCommand<ChangeEvent<string>> OnTextFieldChange;
1819

1920
public override void OnInitialization()
2021
{
2122
OnButtonClick = new ReactiveCommand<ClickEvent>();
2223
OnButtonClick.Subscribe((c) => UpdateDebugText(c, "Button Clicked"));
2324

25+
OnDoubleClick = new ReactiveCommand<ClickEvent>();
26+
OnDoubleClick.Subscribe((c) => UpdateDebugText(c, "Double Clicked"));
27+
28+
2429
OnTextFieldChange = new ReactiveCommand<ChangeEvent<string>>();
2530
OnTextFieldChange.Subscribe((c) => UpdateDebugText(c, "Field Changed:"));
2631
}

0 commit comments

Comments
 (0)