FeedbackObserverFunc <KeyboardState, TKeyboardEvent> SelectionFeedback() { return(UI.Bind <KeyboardState, TKeyboardEvent>(state => { return UIBindings <TKeyboardEvent> .Create( Observable.CombineLatest( state.Select(s => s.Data.GetOrDefault(s.Layer)), state.Select(s => s.Layer).DistinctUntilChanged(), (a, b) => Tuple.Create(a, b) ) .SubscribeOn(state.Scheduler) .Subscribe(t => { var keyMap = t.Item1; var layer = t.Item2; foreach (var btn in keyboard.KeyViews) { var key = (KeyboardKey)btn.Tag; if (key.Type == EKeyType.Normal) { btn.Content = keyMap.Get(key.IsoCode, ""); } else if (key.Type == EKeyType.Shift) { Console.WriteLine("{0} {1}", key.Type, layer); if (layer == ELayer.Shifted) { btn.BorderBrush = SystemColors.HighlightBrush; btn.Background = SystemColors.HighlightBrush; } else { btn.ClearValue(BorderBrushProperty); btn.ClearValue(BackgroundProperty); } } } }), // All shift buttons Observable.Merge(keyboard.KeyViews .Where(btn => ((KeyboardKey)btn.Tag).Type == EKeyType.Shift) .Select(btn => btn.ReactiveClick()) ).Select(_ => new KeyboardEvent.ToggleShift()), // All normal buttons Observable.Merge(keyboard.KeyViews .Where(key => ((KeyboardKey)key.Tag).Type == EKeyType.Normal) .Select(btn => btn.ReactiveClick())) .Select(evt => (Button)evt.Sender) .Select(btn => (KeyboardKey)btn.Tag) .Select(key => new KeyboardEvent.SetSelectedKey(key)) ); })); }
FeedbackObserverFunc <KeyboardState, TKeyboardEvent> PropertiesFeedback() { return(UI.Bind <KeyboardState, TKeyboardEvent>(state => { return UIBindings <TKeyboardEvent> .Create( state.Where(s => s.SelectedKey != null).Subscribe(s => { AugmentPropField(s, ELayer.Default, txtKeyDefault); AugmentPropField(s, ELayer.Shifted, txtKeyShifted); HighlightSelectedKey(s.SelectedKey); }), txtKeyDefault.ReactiveTextChanged() .Select(_ => new KeyboardEvent.SetKeyValue(ELayer.Default, txtKeyDefault.Text)), txtKeyShifted.ReactiveTextChanged() .Select(_ => new KeyboardEvent.SetKeyValue(ELayer.Shifted, txtKeyShifted.Text)) ); })); }