예제 #1
0
 public HotkeyActor(ScreenShotViewModel ScreenShotViewModel,
                    RecordingViewModel RecordingViewModel,
                    Settings Settings,
                    VideoSourcesViewModel VideoSourcesViewModel,
                    RegionSourceProvider RegionSourceProvider)
 {
     _screenShotViewModel   = ScreenShotViewModel;
     _recordingViewModel    = RecordingViewModel;
     _settings              = Settings;
     _videoSourcesViewModel = VideoSourcesViewModel;
     _regionSourceProvider  = RegionSourceProvider;
 }
예제 #2
0
        public RecordingModel(Settings Settings,
                              ILocalizationProvider Loc,
                              ISystemTray SystemTray,
                              WebcamOverlay WebcamOverlay,
                              IMainWindow MainWindow,
                              IPreviewWindow PreviewWindow,
                              VideoSourcesViewModel VideoSourcesViewModel,
                              VideoWritersViewModel VideoWritersViewModel,
                              AudioSource AudioSource,
                              WebcamModel WebcamModel,
                              KeymapViewModel Keymap,
                              IAudioPlayer AudioPlayer,
                              IRecentList RecentList,
                              TimerModel TimerModel,
                              IMessageProvider MessageProvider,
                              IFFmpegViewsProvider FFmpegViewsProvider) : base(Settings, Loc)
        {
            _systemTray            = SystemTray;
            _webcamOverlay         = WebcamOverlay;
            _mainWindow            = MainWindow;
            _previewWindow         = PreviewWindow;
            _videoSourcesViewModel = VideoSourcesViewModel;
            _videoWritersViewModel = VideoWritersViewModel;
            _audioSource           = AudioSource;
            _webcamModel           = WebcamModel;
            _keymap              = Keymap;
            _audioPlayer         = AudioPlayer;
            _recentList          = RecentList;
            _timerModel          = TimerModel;
            _messageProvider     = MessageProvider;
            _ffmpegViewsProvider = FFmpegViewsProvider;

            SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;

            TimerModel.CountdownElapsed += InternalStartRecording;
            TimerModel.DurationElapsed  += async() =>
            {
                if (_syncContext != null)
                {
                    _syncContext.Post(async State => await StopRecording(), null);
                }
                else
                {
                    await StopRecording();
                }
            };
        }
예제 #3
0
        public RecordingViewModel(RecordingModel RecordingModel,
                                  Settings Settings,
                                  TimerModel TimerModel,
                                  VideoSourcesViewModel VideoSourcesViewModel)
        {
            _recordingModel = RecordingModel;

            RecordCommand = new[]
            {
                Settings.Audio
                .ObserveProperty(M => M.Enabled),
                VideoSourcesViewModel
                .ObserveProperty(M => M.SelectedVideoSourceKind)
                .Select(M => !(M is NoVideoSourceProvider))
            }
            .CombineLatest(M => M[0] || M[1])
            .ToReactiveCommand()
            .WithSubscribe(RecordingModel.OnRecordExecute);

            PauseCommand = new[]
            {
                TimerModel
                .ObserveProperty(M => M.Waiting),
                RecordingModel
                .ObserveProperty(M => M.RecorderState)
                .Select(M => M != RecorderState.NotRecording)
            }
            .CombineLatest(M => !M[0] && M[1])
            .ToReactiveCommand()
            .WithSubscribe(RecordingModel.OnPauseExecute);

            RecordingModel.PropertyChanged += (S, E) =>
            {
                switch (E.PropertyName)
                {
                case "":
                case null:
                case nameof(RecorderState):
                    RaisePropertyChanged(nameof(RecorderState));
                    break;
                }
            };
        }
예제 #4
0
        public ScreenShotViewModel(VideoSourcesViewModel VideoSourcesViewModel,
                                   ISystemTray SystemTray,
                                   LanguageManager Loc,
                                   Settings Settings,
                                   IRegionProvider RegionProvider,
                                   IMainWindow MainWindow,
                                   DiskWriter DiskWriter,
                                   ClipboardWriter ClipboardWriter,
                                   ImageUploadWriter ImgurWriter,
                                   IVideoSourcePicker SourcePicker,
                                   IAudioPlayer AudioPlayer,
                                   IEnumerable <IImageWriterItem> ImageWriters) : base(Settings, Loc)
        {
            _videoSourcesViewModel = VideoSourcesViewModel;
            _systemTray            = SystemTray;
            _regionProvider        = RegionProvider;
            _mainWindow            = MainWindow;
            _sourcePicker          = SourcePicker;
            _audioPlayer           = AudioPlayer;
            this.DiskWriter        = DiskWriter;
            this.ClipboardWriter   = ClipboardWriter;
            this.ImgurWriter       = ImgurWriter;

            AvailableImageWriters = ImageWriters.ToList();

            if (!AvailableImageWriters.Any(M => M.Active))
            {
                AvailableImageWriters[0].Active = true;
            }

            ScreenShotCommand        = new DelegateCommand(() => CaptureScreenShot());
            ScreenShotActiveCommand  = new DelegateCommand(async() => await SaveScreenShot(ScreenShotWindow(Window.ForegroundWindow)));
            ScreenShotDesktopCommand = new DelegateCommand(async() => await SaveScreenShot(ScreenShotWindow(Window.DesktopWindow)));
            ScreenshotRegionCommand  = new DelegateCommand(async() => await ScreenshotRegion());
            ScreenshotWindowCommand  = new DelegateCommand(async() => await ScreenshotWindow());
            ScreenshotScreenCommand  = new DelegateCommand(async() => await ScreenshotScreen());
        }
예제 #5
0
        public RecordingViewModel(RecordingModel RecordingModel,
                                  Settings Settings,
                                  TimerModel TimerModel,
                                  WebcamModel WebcamModel,
                                  VideoSourcesViewModel VideoSourcesViewModel,
                                  VideoWritersViewModel VideoWritersViewModel,
                                  ISystemTray SystemTray,
                                  IMainWindow MainWindow,
                                  ILocalizationProvider Loc,
                                  IAudioPlayer AudioPlayer,
                                  IRecentList RecentList,
                                  IMessageProvider MessageProvider,
                                  AudioSourceViewModel AudioSourceViewModel,
                                  IFFmpegViewsProvider FFmpegViewsProvider) : base(Settings, Loc)
        {
            _recordingModel        = RecordingModel;
            _timerModel            = TimerModel;
            _videoSourcesViewModel = VideoSourcesViewModel;
            _videoWritersViewModel = VideoWritersViewModel;
            _systemTray            = SystemTray;
            _mainWindow            = MainWindow;
            _audioPlayer           = AudioPlayer;
            _recentList            = RecentList;
            _messageProvider       = MessageProvider;
            _audioSourceViewModel  = AudioSourceViewModel;
            _ffmpegViewsProvider   = FFmpegViewsProvider;

            var hasAudio = new[]
            {
                Settings
                .Audio
                .ObserveProperty(M => M.RecordMicrophone),
                Settings
                .Audio
                .ObserveProperty(M => M.RecordSpeaker)
            }
            .CombineLatest(M => M[0] || M[1]);

            RecordCommand = new[]
            {
                hasAudio,
                VideoSourcesViewModel
                .ObserveProperty(M => M.SelectedVideoSourceKind)
                .Select(M => M is NoVideoSourceProvider),
                VideoSourcesViewModel
                .ObserveProperty(M => M.SelectedVideoSourceKind)
                .Select(M => M is WebcamSourceProvider),
                WebcamModel
                .ObserveProperty(M => M.SelectedCam)
                .Select(M => M is NoWebcamItem),
                Settings
                .Video
                .ObserveProperty(M => M.RecorderMode)
                .Select(M => M == RecorderMode.Steps),
                VideoSourcesViewModel
                .ObserveProperty(M => M.SelectedVideoSourceKind)
                .Select(M => M.SupportsStepsMode),
            }
            .CombineLatest(M =>
            {
                var audioEnabled      = M[0];
                var audioOnlyMode     = M[1];
                var webcamMode        = M[2];
                var noWebcam          = M[3];
                var stepsMode         = M[4];
                var supportsStepsMode = M[5];

                if (stepsMode)
                {
                    return(supportsStepsMode);
                }

                if (audioOnlyMode)
                {
                    return(audioEnabled);
                }

                if (webcamMode)
                {
                    return(!noWebcam);
                }

                return(true);
            })
            .ToReactiveCommand()
            .WithSubscribe(OnRecordExecute);

            PauseCommand = new[]
            {
                TimerModel
                .ObserveProperty(M => M.Waiting),
                RecordingModel
                .ObserveProperty(M => M.RecorderState)
                .Select(M => M != Models.RecorderState.NotRecording)
            }
            .CombineLatest(M => !M[0] && M[1])
            .ToReactiveCommand()
            .WithSubscribe(() =>
            {
                _audioPlayer.Play(SoundKind.Pause);

                RecordingModel.OnPauseExecute();
            });

            RecorderState = RecordingModel
                            .ObserveProperty(M => M.RecorderState)
                            .ToReadOnlyReactivePropertySlim();

            TimerModel.DurationElapsed += () =>
            {
                _syncContext.Run(async() => await StopRecording(), true);
            };
        }
예제 #6
0
        public ViewConditionsModel(VideoSourcesViewModel VideoSourcesViewModel,
                                   VideoWritersViewModel VideoWritersViewModel,
                                   Settings Settings,
                                   RecordingModel RecordingModel,
                                   AudioSourceViewModel AudioSourceViewModel)
        {
            IsRegionMode = VideoSourcesViewModel
                           .ObserveProperty(M => M.SelectedVideoSourceKind)
                           .Select(M => M is RegionSourceProvider)
                           .ToReadOnlyReactivePropertySlim();

            IsAudioMode = VideoSourcesViewModel
                          .ObserveProperty(M => M.SelectedVideoSourceKind)
                          .Select(M => M is NoVideoSourceProvider)
                          .ToReadOnlyReactivePropertySlim();

            MultipleVideoWriters = VideoWritersViewModel.AvailableVideoWriters
                                   .ObserveProperty(M => M.Count)
                                   .Select(M => M > 1)
                                   .ToReadOnlyReactivePropertySlim();

            IsFFmpeg = VideoWritersViewModel
                       .ObserveProperty(M => M.SelectedVideoWriterKind)
                       .Select(M => M is FFmpegWriterProvider || M is StreamingWriterProvider)
                       .ToReadOnlyReactivePropertySlim();

            IsVideoQuality = VideoWritersViewModel
                             .ObserveProperty(M => M.SelectedVideoWriterKind)
                             .Select(M => M is DiscardWriterProvider)
                             .Select(M => !M)
                             .ToReadOnlyReactivePropertySlim();

            IsReplayMode = Settings
                           .Video
                           .ObserveProperty(M => M.RecorderMode)
                           .Select(M => M == RecorderMode.Replay)
                           .ToReadOnlyReactivePropertySlim();

            CanChangeWebcam = new[]
            {
                RecordingModel
                .ObserveProperty(M => M.RecorderState)
                .Select(M => M == RecorderState.NotRecording),
                Settings.WebcamOverlay
                .ObserveProperty(M => M.SeparateFile),
                VideoSourcesViewModel
                .ObserveProperty(M => M.SelectedVideoSourceKind)
                .Select(M => M is WebcamSourceProvider)
            }
            .CombineLatest(M =>
            {
                var notRecording = M[0];
                var separateFile = M[1];
                var webcamMode   = M[2];

                if (webcamMode)
                {
                    return(notRecording);
                }

                return(!separateFile || notRecording);
            })
            .ToReadOnlyReactivePropertySlim();

            IsEnabled = RecordingModel
                        .ObserveProperty(M => M.RecorderState)
                        .Select(M => M == RecorderState.NotRecording)
                        .ToReadOnlyReactivePropertySlim();

            CanWebcamSeparateFile = VideoSourcesViewModel
                                    .ObserveProperty(M => M.SelectedVideoSourceKind)
                                    .Select(M => M is WebcamSourceProvider)
                                    .Select(M => !M)
                                    .ToReadOnlyReactivePropertySlim();

            IsAroundMouseMode = VideoSourcesViewModel
                                .ObserveProperty(M => M.SelectedVideoSourceKind)
                                .Select(M => M is AroundMouseSourceProvider)
                                .ToReadOnlyReactivePropertySlim();

            ShowSourceNameBox = VideoSourcesViewModel
                                .ObserveProperty(M => M.SelectedVideoSourceKind)
                                .Select(M => M is RegionSourceProvider || M is AroundMouseSourceProvider)
                                .Select(M => !M)
                                .ToReadOnlyReactivePropertySlim();
        }
예제 #7
0
        public ScreenShotViewModel(ILocalizationProvider Loc,
                                   Settings Settings,
                                   DiskWriter DiskWriter,
                                   ClipboardWriter ClipboardWriter,
                                   ImageUploadWriter ImgurWriter,
                                   ScreenShotModel ScreenShotModel,
                                   VideoSourcesViewModel VideoSourcesViewModel,
                                   WebcamModel WebcamModel,
                                   IPlatformServices PlatformServices) : base(Settings, Loc)
        {
            this.DiskWriter      = DiskWriter;
            this.ClipboardWriter = ClipboardWriter;
            this.ImgurWriter     = ImgurWriter;

            ScreenShotCommand = new[]
            {
                VideoSourcesViewModel
                .ObserveProperty(M => M.SelectedVideoSourceKind)
                .Select(M => M is NoVideoSourceProvider),
                VideoSourcesViewModel
                .ObserveProperty(M => M.SelectedVideoSourceKind)
                .Select(M => M is WebcamSourceProvider),
                WebcamModel
                .ObserveProperty(M => M.SelectedCam)
                .Select(M => M is NoWebcamItem)
            }
            .CombineLatest(M =>
            {
                var noVideo    = M[0];
                var webcamMode = M[1];
                var noWebcam   = M[2];

                if (webcamMode)
                {
                    return(!noWebcam);
                }

                return(!noVideo);
            })
            .ToReactiveCommand()
            .WithSubscribe(async M =>
            {
                var bmp = await ScreenShotModel.GetScreenShot(VideoSourcesViewModel.SelectedVideoSourceKind);

                await ScreenShotModel.SaveScreenShot(bmp);
            });

            async Task ScreenShotWindow(IWindow Window)
            {
                var img = ScreenShotModel.ScreenShotWindow(Window);

                await ScreenShotModel.SaveScreenShot(img);
            }

            ScreenShotActiveCommand = new ReactiveCommand()
                                      .WithSubscribe(async() => await ScreenShotWindow(PlatformServices.ForegroundWindow));

            ScreenShotDesktopCommand = new ReactiveCommand()
                                       .WithSubscribe(async() => await ScreenShotWindow(PlatformServices.DesktopWindow));

            ScreenshotRegionCommand = new ReactiveCommand()
                                      .WithSubscribe(async() => await ScreenShotModel.ScreenshotRegion());

            ScreenshotWindowCommand = new ReactiveCommand()
                                      .WithSubscribe(async() => await ScreenShotModel.ScreenshotWindow());

            ScreenshotScreenCommand = new ReactiveCommand()
                                      .WithSubscribe(async() => await ScreenShotModel.ScreenshotScreen());
        }
예제 #8
0
        public ViewConditionsModel(VideoSourcesViewModel VideoSourcesViewModel,
                                   VideoWritersViewModel VideoWritersViewModel,
                                   Settings Settings,
                                   RecordingModel RecordingModel,
                                   AudioSourceViewModel AudioSourceViewModel)
        {
            IsRegionMode = VideoSourcesViewModel
                           .ObserveProperty(M => M.SelectedVideoSourceKind)
                           .Select(M => M is RegionSourceProvider)
                           .ToReadOnlyReactivePropertySlim();

            IsAudioMode = VideoSourcesViewModel
                          .ObserveProperty(M => M.SelectedVideoSourceKind)
                          .Select(M => M is NoVideoSourceProvider)
                          .ToReadOnlyReactivePropertySlim();

            IsStepsMode = Settings
                          .Video
                          .ObserveProperty(M => M.RecorderMode)
                          .Select(M => M == RecorderMode.Steps)
                          .ToReadOnlyReactivePropertySlim();

            IsNotAudioOrStepsMode = new[]
            {
                VideoSourcesViewModel
                .ObserveProperty(M => M.SelectedVideoSourceKind)
                .Select(M => M is NoVideoSourceProvider),
                IsStepsMode
            }
            .CombineLatest(M =>
            {
                var audioMode = M[0];
                var stepsMode = M[1];

                return(!audioMode && !stepsMode);
            })
            .ToReadOnlyReactivePropertySlim();

            MultipleVideoWriters = VideoWritersViewModel.AvailableVideoWriters
                                   .ObserveProperty(M => M.Count)
                                   .Select(M => M > 1)
                                   .ToReadOnlyReactivePropertySlim();

            IsFFmpeg = VideoWritersViewModel
                       .ObserveProperty(M => M.SelectedVideoWriterKind)
                       .Select(M => M is FFmpegWriterProvider || M is StreamingWriterProvider)
                       .ToReadOnlyReactivePropertySlim();

            IsVideoQuality = VideoWritersViewModel
                             .ObserveProperty(M => M.SelectedVideoWriterKind)
                             .Select(M => M is DiscardWriterProvider)
                             .Select(M => !M)
                             .ToReadOnlyReactivePropertySlim();

            IsReplayMode = Settings
                           .Video
                           .ObserveProperty(M => M.RecorderMode)
                           .Select(M => M == RecorderMode.Replay)
                           .ToReadOnlyReactivePropertySlim();

            CanChangeWebcam = new[]
            {
                RecordingModel
                .ObserveProperty(M => M.RecorderState)
                .Select(M => M == RecorderState.NotRecording),
                Settings.WebcamOverlay
                .ObserveProperty(M => M.SeparateFile),
                VideoSourcesViewModel
                .ObserveProperty(M => M.SelectedVideoSourceKind)
                .Select(M => M is WebcamSourceProvider)
            }
            .CombineLatest(M =>
            {
                var notRecording = M[0];
                var separateFile = M[1];
                var webcamMode   = M[2];

                if (webcamMode)
                {
                    return(notRecording);
                }

                return(!separateFile || notRecording);
            })
            .ToReadOnlyReactivePropertySlim();

            IsEnabled = RecordingModel
                        .ObserveProperty(M => M.RecorderState)
                        .Select(M => M == RecorderState.NotRecording)
                        .ToReadOnlyReactivePropertySlim();

            CanWebcamSeparateFile = VideoSourcesViewModel
                                    .ObserveProperty(M => M.SelectedVideoSourceKind)
                                    .Select(M => M is WebcamSourceProvider)
                                    .Select(M => !M)
                                    .ToReadOnlyReactivePropertySlim();

            IsAroundMouseMode = VideoSourcesViewModel
                                .ObserveProperty(M => M.SelectedVideoSourceKind)
                                .Select(M => M is AroundMouseSourceProvider)
                                .ToReadOnlyReactivePropertySlim();

            IsWebcamMode = VideoSourcesViewModel
                           .ObserveProperty(M => M.SelectedVideoSourceKind)
                           .Select(M => M is WebcamSourceProvider)
                           .ToReadOnlyReactivePropertySlim();

            ShowSourceNameBox = VideoSourcesViewModel
                                .ObserveProperty(M => M.SelectedVideoSourceKind)
                                .Select(M => M is RegionSourceProvider || M is AroundMouseSourceProvider)
                                .Select(M => !M)
                                .ToReadOnlyReactivePropertySlim();

            StepsBtnEnabled = new[]
            {
                IsEnabled,
                VideoSourcesViewModel
                .ObserveProperty(M => M.SelectedVideoSourceKind)
                .Select(M => M.SupportsStepsMode)
            }
            .CombineLatestValuesAreAllTrue()
            .ToReadOnlyReactivePropertySlim();

            FpsVisibility = RecordingModel.ObserveProperty(M => M.RecorderState)
                            .CombineLatest(IsNotAudioOrStepsMode,
                                           (RecorderState, IsNotAudioOrStepsMode) => RecorderState == RecorderState.Recording && IsNotAudioOrStepsMode)
                            .Select(M => M ? Visibility.Visible : Visibility.Hidden)
                            .ToReadOnlyReactivePropertySlim();
        }
예제 #9
0
        public MainViewModel(AudioSource AudioSource,
                             VideoSourcesViewModel VideoSourcesViewModel,
                             VideoWritersViewModel VideoWritersViewModel,
                             IWebCamProvider WebCamProvider,
                             Settings Settings,
                             LanguageManager LanguageManager,
                             HotKeyManager HotKeyManager,
                             IPreviewWindow PreviewWindow,
                             IDialogService DialogService,
                             RememberByName RememberByName,
                             ScreenShotViewModel ScreenShotViewModel,
                             RecordingViewModel RecordingViewModel,
                             HotkeyActionRegisterer HotkeyActionRegisterer,
                             IRecentList RecentList) : base(Settings, LanguageManager)
        {
            this.AudioSource           = AudioSource;
            this.VideoSourcesViewModel = VideoSourcesViewModel;
            this.VideoWritersViewModel = VideoWritersViewModel;
            this.WebCamProvider        = WebCamProvider;
            this.HotKeyManager         = HotKeyManager;
            _dialogService             = DialogService;
            _rememberByName            = RememberByName;
            this.ScreenShotViewModel   = ScreenShotViewModel;
            this.RecordingViewModel    = RecordingViewModel;
            _recentList = RecentList;

            ShowPreviewCommand = new DelegateCommand(PreviewWindow.Show);

            #region Commands
            RefreshCommand = new DelegateCommand(OnRefresh);

            OpenOutputFolderCommand = new DelegateCommand(OpenOutputFolder);

            SelectOutputFolderCommand = new DelegateCommand(SelectOutputFolder);

            ResetFFmpegFolderCommand = new DelegateCommand(() => Settings.FFmpeg.FolderPath = "");

            TrayLeftClickCommand = new DelegateCommand(() => HotKeyManager.FakeHotkey(Settings.Tray.LeftClickAction));
            #endregion

            Settings.Audio.PropertyChanged += (Sender, Args) =>
            {
                switch (Args.PropertyName)
                {
                case nameof(Settings.Audio.Enabled):
                case null:
                case "":
                    CheckFunctionalityAvailability();
                    break;
                }
            };

            VideoSourcesViewModel.PropertyChanged += (Sender, Args) =>
            {
                switch (Args.PropertyName)
                {
                case nameof(VideoSourcesViewModel.SelectedVideoSourceKind):
                case null:
                case "":
                    CheckFunctionalityAvailability();
                    break;
                }
            };

            RecordingViewModel.PropertyChanged += (Sender, Args) =>
            {
                switch (Args.PropertyName)
                {
                case nameof(RecordingViewModel.RecorderState):
                case null:
                case "":
                    RefreshCommand.RaiseCanExecuteChanged(RecordingViewModel.RecorderState == RecorderState.NotRecording);
                    break;
                }
            };

            // If Output Dircetory is not set. Set it to Documents\Captura\
            if (string.IsNullOrWhiteSpace(Settings.OutPath))
            {
                Settings.OutPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Captura");
            }

            // Create the Output Directory if it does not exist
            Settings.EnsureOutPath();

            // Handle Hoykeys
            HotkeyActionRegisterer.Register();
        }
예제 #10
0
        public ViewConditionsModel(VideoSourcesViewModel VideoSourcesViewModel,
                                   VideoWritersViewModel VideoWritersViewModel,
                                   Settings Settings,
                                   RecordingModel RecordingModel,
                                   AudioSource AudioSource)
        {
            IsRegionMode = VideoSourcesViewModel
                           .ObserveProperty(M => M.SelectedVideoSourceKind)
                           .Select(M => M is RegionSourceProvider)
                           .ToReadOnlyReactivePropertySlim();

            IsAudioMode = VideoSourcesViewModel
                          .ObserveProperty(M => M.SelectedVideoSourceKind)
                          .Select(M => M is NoVideoSourceProvider)
                          .ToReadOnlyReactivePropertySlim();

            MultipleVideoWriters = VideoWritersViewModel.AvailableVideoWriters
                                   .ObserveProperty(M => M.Count)
                                   .Select(M => M > 1)
                                   .ToReadOnlyReactivePropertySlim();

            IsFFmpeg = VideoWritersViewModel
                       .ObserveProperty(M => M.SelectedVideoWriterKind)
                       .Select(M => M is FFmpegWriterProvider || M is StreamingWriterProvider)
                       .ToReadOnlyReactivePropertySlim();

            IsGifMode = VideoWritersViewModel
                        .ObserveProperty(M => M.SelectedVideoWriterKind)
                        .Select(M => M is GifWriterProvider)
                        .ToReadOnlyReactivePropertySlim();

            CanSelectFrameRate = new[]
            {
                VideoWritersViewModel
                .ObserveProperty(M => M.SelectedVideoWriterKind)
                .Select(M => M is GifWriterProvider),
                Settings.Gif
                .ObserveProperty(M => M.VariableFrameRate)
            }
            .CombineLatestValuesAreAllTrue()
            .Select(M => !M)
            .ToReadOnlyReactivePropertySlim();

            IsVideoQuality = VideoWritersViewModel
                             .ObserveProperty(M => M.SelectedVideoWriterKind)
                             .Select(M => !(M is GifWriterProvider || M is DiscardWriterProvider))
                             .ToReadOnlyReactivePropertySlim();

            CanChangeWebcam = new[]
            {
                RecordingModel
                .ObserveProperty(M => M.RecorderState)
                .Select(M => M == RecorderState.NotRecording),
                Settings.WebcamOverlay
                .ObserveProperty(M => M.SeparateFile)
            }
            .CombineLatest(M => !M[1] || M[0])     // Not SeparateFile or NotRecording
            .ToReadOnlyReactivePropertySlim();

            CanChangeAudioSources = new[]
            {
                RecordingModel
                .ObserveProperty(M => M.RecorderState)
                .Select(M => M == RecorderState.NotRecording),
                Settings.Audio
                .ObserveProperty(M => M.SeparateFilePerSource)
            }
            .CombineLatest(M =>
                           AudioSource.CanChangeSourcesDuringRecording ||
                           !M[1] || M[0]) // Not SeparateFilePerSource or NotRecording
            .ToReadOnlyReactivePropertySlim();

            IsEnabled = RecordingModel
                        .ObserveProperty(M => M.RecorderState)
                        .Select(M => M == RecorderState.NotRecording)
                        .ToReadOnlyReactivePropertySlim();
        }
        public RecordingViewModel(RecordingModel RecordingModel,
                                  Settings Settings,
                                  TimerModel TimerModel,
                                  WebcamModel WebcamModel,
                                  VideoSourcesViewModel VideoSourcesViewModel)
        {
            _recordingModel = RecordingModel;

            RecordCommand = new[]
            {
                Settings.Audio
                .ObserveProperty(M => M.Enabled),
                VideoSourcesViewModel
                .ObserveProperty(M => M.SelectedVideoSourceKind)
                .Select(M => M is NoVideoSourceProvider),
                VideoSourcesViewModel
                .ObserveProperty(M => M.SelectedVideoSourceKind)
                .Select(M => M is WebcamSourceProvider),
                WebcamModel
                .ObserveProperty(M => M.SelectedCam)
                .Select(M => M is NoWebcamItem)
            }
            .CombineLatest(M =>
            {
                var audioEnabled  = M[0];
                var audioOnlyMode = M[1];
                var webcamMode    = M[2];
                var noWebcam      = M[3];

                if (audioOnlyMode)
                {
                    return(audioEnabled);
                }

                if (webcamMode)
                {
                    return(!noWebcam);
                }

                return(true);
            })
            .ToReactiveCommand()
            .WithSubscribe(RecordingModel.OnRecordExecute);

            PauseCommand = new[]
            {
                TimerModel
                .ObserveProperty(M => M.Waiting),
                RecordingModel
                .ObserveProperty(M => M.RecorderState)
                .Select(M => M != RecorderState.NotRecording)
            }
            .CombineLatest(M => !M[0] && M[1])
            .ToReactiveCommand()
            .WithSubscribe(RecordingModel.OnPauseExecute);

            RecordingModel.PropertyChanged += (S, E) =>
            {
                switch (E.PropertyName)
                {
                case "":
                case null:
                case nameof(RecorderState):
                    RaisePropertyChanged(nameof(RecorderState));
                    break;
                }
            };
        }
예제 #12
0
        public RecordingViewModel(RecordingModel RecordingModel,
                                  Settings Settings,
                                  TimerModel TimerModel,
                                  WebcamModel WebcamModel,
                                  VideoSourcesViewModel VideoSourcesViewModel,
                                  VideoWritersViewModel VideoWritersViewModel,
                                  ISystemTray SystemTray,
                                  IMainWindow MainWindow,
                                  ILocalizationProvider Loc,
                                  IAudioPlayer AudioPlayer,
                                  IRecentList RecentList,
                                  IMessageProvider MessageProvider) : base(Settings, Loc)
        {
            _recordingModel        = RecordingModel;
            _timerModel            = TimerModel;
            _videoSourcesViewModel = VideoSourcesViewModel;
            _videoWritersViewModel = VideoWritersViewModel;
            _systemTray            = SystemTray;
            _mainWindow            = MainWindow;
            _audioPlayer           = AudioPlayer;
            _recentList            = RecentList;
            _messageProvider       = MessageProvider;

            RecordCommand = new[]
            {
                Settings.Audio
                .ObserveProperty(M => M.Enabled),
                VideoSourcesViewModel
                .ObserveProperty(M => M.SelectedVideoSourceKind)
                .Select(M => M is NoVideoSourceProvider),
                VideoSourcesViewModel
                .ObserveProperty(M => M.SelectedVideoSourceKind)
                .Select(M => M is WebcamSourceProvider),
                WebcamModel
                .ObserveProperty(M => M.SelectedCam)
                .Select(M => M is NoWebcamItem)
            }
            .CombineLatest(M =>
            {
                var audioEnabled  = M[0];
                var audioOnlyMode = M[1];
                var webcamMode    = M[2];
                var noWebcam      = M[3];

                if (audioOnlyMode)
                {
                    return(audioEnabled);
                }

                if (webcamMode)
                {
                    return(!noWebcam);
                }

                return(true);
            })
            .ToReactiveCommand()
            .WithSubscribe(OnRecordExecute);

            PauseCommand = new[]
            {
                TimerModel
                .ObserveProperty(M => M.Waiting),
                RecordingModel
                .ObserveProperty(M => M.RecorderState)
                .Select(M => M != Models.RecorderState.NotRecording)
            }
            .CombineLatest(M => !M[0] && M[1])
            .ToReactiveCommand()
            .WithSubscribe(() =>
            {
                _audioPlayer.Play(SoundKind.Pause);

                RecordingModel.OnPauseExecute();
            });

            RecorderState = RecordingModel
                            .ObserveProperty(M => M.RecorderState)
                            .ToReadOnlyReactivePropertySlim();

            TimerModel.DurationElapsed += async() =>
            {
                if (_syncContext != null)
                {
                    _syncContext.Post(async State => await StopRecording(), null);
                }
                else
                {
                    await StopRecording();
                }
            };
        }
예제 #13
0
        public RecordingViewModel(RecordingModel RecordingModel,
                                  Settings Settings,
                                  TimerModel TimerModel,
                                  WebcamModel WebcamModel,
                                  VideoSourcesViewModel VideoSourcesViewModel,
                                  ISystemTray SystemTray,
                                  IMainWindow MainWindow,
                                  ILocalizationProvider Loc,
                                  IAudioPlayer AudioPlayer) : base(Settings, Loc)
        {
            _recordingModel = RecordingModel;
            _systemTray     = SystemTray;
            _mainWindow     = MainWindow;
            _audioPlayer    = AudioPlayer;

            RecordCommand = new[]
            {
                Settings.Audio
                .ObserveProperty(M => M.Enabled),
                VideoSourcesViewModel
                .ObserveProperty(M => M.SelectedVideoSourceKind)
                .Select(M => M is NoVideoSourceProvider),
                VideoSourcesViewModel
                .ObserveProperty(M => M.SelectedVideoSourceKind)
                .Select(M => M is WebcamSourceProvider),
                WebcamModel
                .ObserveProperty(M => M.SelectedCam)
                .Select(M => M is NoWebcamItem)
            }
            .CombineLatest(M =>
            {
                var audioEnabled  = M[0];
                var audioOnlyMode = M[1];
                var webcamMode    = M[2];
                var noWebcam      = M[3];

                if (audioOnlyMode)
                {
                    return(audioEnabled);
                }

                if (webcamMode)
                {
                    return(!noWebcam);
                }

                return(true);
            })
            .ToReactiveCommand()
            .WithSubscribe(OnRecordExecute);

            PauseCommand = new[]
            {
                TimerModel
                .ObserveProperty(M => M.Waiting),
                RecordingModel
                .ObserveProperty(M => M.RecorderState)
                .Select(M => M != Models.RecorderState.NotRecording)
            }
            .CombineLatest(M => !M[0] && M[1])
            .ToReactiveCommand()
            .WithSubscribe(() =>
            {
                _audioPlayer.Play(SoundKind.Pause);

                RecordingModel.OnPauseExecute();
            });

            RecorderState = RecordingModel
                            .ObserveProperty(M => M.RecorderState)
                            .ToReadOnlyReactivePropertySlim();
        }