Пример #1
0
        public MidiPanelViewModel(int rows, int columns, int controllerStartIndex, MidiInputManager midiInputManager)
        {
            _controllerStartIndex = controllerStartIndex;
            _midiInputManager     = midiInputManager;
            Rows    = rows;
            Columns = columns;
            var pads = new List <MidiPadButtonViewModel>();

            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < columns; j++)
                {
                    pads.Add(new MidiPadButtonViewModel(controllerStartIndex + (columns * i) + j));
                }
            }

            Pads = pads.ToArray();

            midiInputManager.PadPressed.Subscribe(x =>
            {
                var viewmodel = Pads[x.ControllerIndex - controllerStartIndex];
                viewmodel.PadPressed(x);


                if (!viewmodel.KeyDown && viewmodel.AnimationName != null)
                {
                    StartAnimation.Execute(viewmodel.Animation).Subscribe().Dispose();
                }
            });

            StartAnimation = ReactiveCommand.Create <IAnimation, IAnimation>(unit =>
            {
                return(unit);
            });
        }
        public MainControlPanelViewModel(StellaServerLib.StellaServer stellaServer,
                                         StoryboardRepository storyboardRepository, BitmapStoryboardCreator bitmapStoryboardCreator,
                                         BitmapRepository bitmapRepository, BitmapThumbnailRepository thumbnailRepository, LogViewModel logViewModel,
                                         MidiInputManager midiInputManager)
        {
            _stellaServer            = stellaServer;
            AnimationsPanelViewModel = new AnimationsPanelViewModel(storyboardRepository, bitmapStoryboardCreator, bitmapRepository);
            AnimationsPanelViewModel.StartAnimationRequested += StartAnimation;
            AnimationsPanelViewModel.SendToPadRequested      += AnimationsPanelViewModel_OnSendToPadRequested;

            this.WhenAnyValue(x => x.AnimationsPanelViewModel.SelectedAnimation)
            .Subscribe(onNext =>
            {
                if (onNext == null)
                {
                    SelectedViewModel = null;
                    return;
                }

                if (onNext.Animation is Storyboard storyboard)
                {
                    var viewmodel = new StoryboardDetailsControlViewModel(storyboard, bitmapRepository);
                    viewmodel.Back.Subscribe(next => { SelectedViewModel = NavigationViewModel; });
                    SelectedViewModel = viewmodel;
                    return;
                }

                if (onNext.Animation is PlayList playList)
                {
                    var viewmodel = new PlaylistDetailsContolViewModel(playList, bitmapRepository);
                    viewmodel.Back.Subscribe(next => { SelectedViewModel = NavigationViewModel; });
                    SelectedViewModel = viewmodel;
                    return;
                }

                throw new NotImplementedException("Unknown animation type");
            });

            StatusViewModel            = new StatusViewModel(stellaServer, 3, logViewModel);                                                    //TODO insert number of clients
            AnimationCreationViewModel = new AnimationCreationViewModel(bitmapRepository, bitmapStoryboardCreator, thumbnailRepository, 6, 24); // Todo insert number of rows, number of tubes
            AnimationCreationViewModel.Save.Subscribe(onNext => AnimationsPanelViewModel.AddItem(onNext));
            AnimationCreationViewModel.Start.Subscribe(onNext => StartAnimation(null, onNext));
            AnimationCreationViewModel.Back.Subscribe(onNext => SelectedViewModel = NavigationViewModel);

            if (midiInputManager != null)
            {
                MidiPanelViewModel = new MidiPanelViewModel(4, 4, 10, midiInputManager); //TODO configurable midi buttons
                MidiPanelViewModel.StartAnimation.Subscribe(x =>
                {
                    StartAnimation(null, x);
                });
                midiInputManager.Stop.Subscribe(x =>
                {
                    StartAnimation(null, FindStopAnimation());
                });
            }

            NavigationViewModel = new NavigationViewModel();
            NavigationViewModel.NavigateToCreateAnimation.Subscribe(onNext => SelectedViewModel = AnimationCreationViewModel);
            NavigationViewModel.NavigateToMidiPanel.Subscribe(onNext => SelectedViewModel       = MidiPanelViewModel);
            SelectedViewModel = NavigationViewModel;
        }