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 RegistrationService(IMarkerRegistrationField registrationField) { _registrationField = registrationField; _registrationField.OnPointersCountChanged += UpdateCandidateState; }
public ModelRoot() { RegistrationField = new RegistrationField(_trackingService); RegistrationService = new RegistrationService(RegistrationField); }