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);
        }