public SelfSelectorViewModel(PlayerNumber number, OverlayViewModel overlay)
 {
     Number        = number;
     SelectCommand = new ReactiveCommand();
     SelectCommand
     .Subscribe(_ => overlay.Ready(number))
     .AddTo(DisposeBag);
 }
예제 #2
0
        public OtherViewModel(PlayerNumber number, OverlayViewModel overlay) : base(number)
        {
            IsNextMatchCandidate = overlay.State.InBattle()
                                   .Select(it => it.NextMatchCandidates().Contains(number))
                                   .ToReactiveProperty()
                                   .AddTo(DisposeBag);

            IsDefeated = overlay.State.InBattle()
                         .Select(it => it.IsDefeated(number))
                         .ToReadOnlyReactiveProperty()
                         .AddTo(DisposeBag);

            IsAlived = IsDefeated
                       .Select(it => !it)
                       .ToReadOnlyReactiveProperty()
                       .AddTo(DisposeBag);

            BackgroundColor = Observable.CombineLatest(IsNextMatchCandidate, IsDefeated, (a, b) => (isNextMatchCandidate: a, isDefeated: b))
                              .Select(it =>
            {
                if (it.isNextMatchCandidate)
                {
                    return(new SolidColorBrush(Colors.Orange));
                }

                if (it.isDefeated)
                {
                    return(new SolidColorBrush(Colors.DarkGray));
                }

                return(new SolidColorBrush(Colors.Transparent));
            })
                              .ToReadOnlyReactiveProperty()
                              .AddTo(DisposeBag);

            MatchedCommand = IsNextMatchCandidate
                             .ToReactiveCommand()
                             .AddTo(DisposeBag);

            DefeatedCommand = overlay.State.InBattle()
                              .Select(it => it.LastRound.HasValue && !it.IsDefeated(number))
                              .ToReactiveCommand()
                              .AddTo(DisposeBag);

            MatchedCommand
            .Subscribe(_ => overlay.Matched(number))
            .AddTo(DisposeBag);

            DefeatedCommand
            .Subscribe(_ => overlay.Defeated(number))
            .AddTo(DisposeBag);
        }
예제 #3
0
        public OverlayWindow()
        {
            ViewModel   = new OverlayViewModel().AddTo(DisposeBag);
            DataContext = ViewModel;
            InitializeComponent();

            Observable.Merge(
                ViewModel.SelfSelectors.ObserveRemoveChanged().Select(vm => vm.Number),
                ViewModel.Players.ObserveRemoveChanged().Select(vm => vm.Number)
                )
            .Subscribe(number => Player(number, g => g.Children.Clear()))
            .AddTo(DisposeBag);

            Observable.Merge(
                ViewModel.SelfSelectors.ObserveResetChanged(),
                ViewModel.Players.ObserveResetChanged())
            .Subscribe(_ =>
            {
                foreach (var grid in PlayerViewContainers())
                {
                    grid.Children.Clear();
                }
            })
            .AddTo(DisposeBag);

            ViewModel.SelfSelectors
            .ObserveAddChanged()
            .Subscribe(it => Player(it.Number, g => g.Children.Add(new SelfSelectorView(it))))
            .AddTo(DisposeBag);

            ViewModel.Players
            .ObserveAddChanged()
            .OfType <OtherViewModel>()
            .Subscribe(vm => Player(vm.Number, g => g.Children.Add(new OtherView(vm))))
            .AddTo(DisposeBag);

            ViewModel.Players
            .ObserveAddChanged()
            .OfType <SelfViewModel>()
            .Subscribe(vm => Player(vm.Number, g => g.Children.Add(new SelfView(vm))))
            .AddTo(DisposeBag);

            ViewModel.Initialize();
        }