public static IObservable <float> ScaleToScreenHeight( this IObservable <float> observable, ScaleAdapter scaleAdapter ) => observable.CombineLatest( scaleAdapter.WindowSize, (value, windowSize) => value * windowSize.Y );
public static IObservable <Vector2> ScaleToScreen( this IObservable <Vector2> observable, ScaleAdapter scaleAdapter ) => observable .CombineLatest( scaleAdapter.WindowSize, (vector, windowSize) => new Vector2( vector.X * windowSize.X, vector.Y * windowSize.Y ) );
public MarkerTrackingViewModel(ITrackingService markerTracking, ScaleAdapter scaleAdapter) { _scaleAdapter = scaleAdapter; _disposables = new List <IDisposable>() { Observable.FromEvent <TrackerEvents>( handler => markerTracking.OnEvents += handler, handler => markerTracking.OnEvents -= handler ) .SelectMany(events => events.markerEvents) .ObserveOn(SynchronizationContext.Current) .Subscribe(HandleMarkerEvent) }; }
public MainViewModel() { ScaleAdapter = new ScaleAdapter(); MarkerRegistration = new MarkerRegistrationViewModel( _modelRoot.RegistrationService, _modelRoot.RegistrationField, ScaleAdapter ); MarkerTracking = new MarkerTrackingViewModel(_modelRoot.TrackingService, ScaleAdapter); Pointers = new PointersViewModel(_modelRoot.TrackingService); Dispatcher.CurrentDispatcher.ShutdownStarted += (sender, e) => Dispose(); _modelRoot.Start(); }
public MarkerRegistrationViewModel( IMarkerRegistrationService registrationService, IMarkerRegistrationField registrationField, ScaleAdapter scaleAdapter ) { IdSelectionPanel = new IdSelectionViewModel(registrationService); FieldPosition = Observable.Return(registrationField.FieldPosition) .ScaleToScreen(scaleAdapter) .ToReactiveProperty(); FieldSize = Observable.Return(registrationField.FieldSize) .ScaleToScreen(scaleAdapter) .ToReactiveProperty(); IsCandidatePlaced = Observable.FromEvent <MarkerCandidateState>( h => registrationService.OnMarkerCandidateUpdated += h, h => registrationService.OnMarkerCandidateUpdated -= h ) .Do(value => Debug.WriteLine($"-> Candidate update = {value}")) .Select(state => state == MarkerCandidateState.Detected) .ToReactiveProperty(); IsSelectingId = IsCandidatePlaced .SelectMany(async isSelecting => { if (isSelecting) { await IdSelectionPanel.UpdateRegisteredIdsAsync(); return(IsCandidatePlaced.Value); } return(false); }) .ToReactiveProperty(); _disposable = IdSelectionPanel.SelectedId .Subscribe(id => { registrationService.RegisterCandidate(id); IsSelectingId.Value = false; IsCandidatePlaced.ForceNotify(); }); }
public TrackedMarkerViewModel(int index, ScaleAdapter scaleAdapter) { Index = index; Color = _colors[index % _colors.Length]; Position = new ReactiveProperty <Vector2>(); Radius = new ReactiveProperty <float>(); Rotation = new ReactiveProperty <float>(); ScaledPosition = Observable.CombineLatest( Position, scaleAdapter.WindowWidth, scaleAdapter.WindowHeight, (position, width, height) => new Vector2(position.X * width, position.Y * height) ) .ToReactiveProperty(); ScaledRadius = Radius.ScaleToScreenHeight(scaleAdapter) .ToReactiveProperty(); }