protected override IDisposable SubscribeCore(ReactiveSpace spaceListener) { var deselectWhenUnlocked = spaceListener.IsLocked() .ObserveOn(UI) .Subscribe(isLocked => { if(!isLocked) ClearCurrent(); }); var updatePosition = spaceListener .LockedHands() .ObserveOn(UI) .Select(g => new { Group = g, CenterPosition = g.Key.PalmPosition }) .SelectMany(g => g .Group .Select(p => new { Position = p, GroupContext = g })) .Subscribe((hand) => { var offset = hand.Position.PalmPosition.To2D() - hand.GroupContext.CenterPosition.To2D(); if(-ZoneHeight/2f < offset.y && offset.y < ZoneHeight / 2f && -ZoneHeight/2f < offset.x && offset.x < ZoneHeight / 2f) GoTo(Center); if(-ZoneHeight / 2f < offset.y && offset.y < ZoneHeight / 2f) { if(-ZoneHeight / 2f >= offset.x) { GoTo(Left); } if(offset.x >= ZoneHeight / 2f) { GoTo(Right); } } if(-ZoneHeight / 2f < offset.x && offset.x < ZoneHeight / 2f) { if(-ZoneHeight / 2f >= offset.y) { GoTo(Down); } if(offset.y >= ZoneHeight / 2f) { GoTo(Up); } } }); CompositeDisposable subscriptions = new CompositeDisposable(); subscriptions.Add(deselectWhenUnlocked); subscriptions.Add(updatePosition); subscriptions.Add(Disposable.Create(ClearCurrent)); return subscriptions; }
private void Subscribe(ReactiveSpace spaceListener) { var minimized = spaceListener .ReactiveListener .FingersMoves() .SelectMany(m => m) .ThrottleWithDefault(TimeSpan.FromSeconds(1)) .ObserveOn(UI) .Subscribe(b => { if(!ShowConfig) { State = MainViewState.Minimized; } }); //var maximize = // spaceListener // .ReactiveListener // .Gestures // .Where(g => g.Key.Type == Gesture.GestureType.TYPECIRCLE) // .SelectMany(g => g.ToList().Select(l => new // { // Key = g.Key, // Values = l // })) // .Buffer(() => spaceListener.ReactiveListener.Gestures.SelectMany(g => g).OnlyTimeout(TimeSpan.FromMilliseconds(500))) // .Where(b => b.Count > 0) // .Take(1) // .Repeat() // .ObserveOn(UI) // .Subscribe(l => // { // var distinct = l.SelectMany(oo => oo.Values.SelectMany(o => o.Pointables)).Select(p => p.Id).Distinct().Count(); // State = MainViewState.Navigating; // }); var maximize = spaceListener .LockedHands() .SelectMany(h => h) .ObserveOn(UI) .Subscribe(h => { if(State == MainViewState.Minimized) State = MainViewState.Navigating; }); var lockedSubs = spaceListener .IsLocked() .ObserveOn(UI) .CombineLatest(Helper.PropertyChanged(this, () => this.State), (l, s) => new { Locked = l, State = s }) .Where(o => o.State != MainViewState.Minimized) .Subscribe(o => { State = o.Locked ? MainViewState.Locked : MainViewState.Navigating; }); _Subscriptions.Add(lockedSubs); _Subscriptions.Add(maximize); _Subscriptions.Add(minimized); }