public QueueTitlesWindowViewModel() { this.main = Ioc.Get <MainViewModel>(); this.PickersService = Ioc.Get <PickersService>(); this.windowManager = Ioc.Get <IWindowManager>(); this.selectedTitles = new ReactiveList <TitleSelectionViewModel>(); this.titleStartOverrideEnabled = Config.QueueTitlesUseTitleOverride; this.titleStartOverride = Config.QueueTitlesTitleOverride; this.nameOverrideEnabled = Config.QueueTitlesUseNameOverride; this.nameOverride = Config.QueueTitlesNameOverride; this.titles = new ReactiveList <TitleSelectionViewModel>(); this.RefreshTitles(); this.Play = ReactiveCommand.Create(MvvmUtilities.CreateConstantObservable(Players.Installed.Count > 0)); this.Play.Subscribe(_ => this.PlayImpl()); this.AddToQueue = ReactiveCommand.Create(); this.AddToQueue.Subscribe(_ => this.AddToQueueImpl()); this.main.WhenAnyValue(x => x.SourceData) .Skip(1) .Subscribe(_ => { this.RefreshTitles(); }); this.PickersService.WhenAnyValue(x => x.SelectedPicker.Picker.TitleRangeSelectEnabled) .Skip(1) .Subscribe(_ => { this.SetSelectedFromRange(); }); this.PickersService.WhenAnyValue(x => x.SelectedPicker.Picker.TitleRangeSelectStartMinutes) .Skip(1) .Subscribe(_ => { this.SetSelectedFromRange(); }); this.PickersService.WhenAnyValue(x => x.SelectedPicker.Picker.TitleRangeSelectEndMinutes) .Skip(1) .Subscribe(_ => { this.SetSelectedFromRange(); }); this.selectedTitles.CountChanged .Select(count => count == 1) .ToProperty(this, x => x.TitleDetailsVisible, out this.titleDetailsVisible, initialValue: false); this.selectedTitles.CollectionChanged += (sender, args) => { if (this.selectedTitles.Count == 1) { SourceTitle title = this.selectedTitles[0].Title; // Do preview var previewProfile = new VCProfile { CustomCropping = true, Cropping = new VCCropping(), VideoEncoder = "x264", AudioEncodings = new List <AudioEncoding>() }; var previewJob = new VCJob { RangeType = VideoRangeType.All, Title = title.Index, EncodingProfile = previewProfile }; this.PreviewImage = this.main.ScanInstance.GetPreview(previewProfile.CreatePreviewSettings(title), 2); this.RaisePropertyChanged(nameof(this.TitleText)); } }; }
public OptionsDialogViewModel(IUpdater updateService) { this.updater = updateService; this.Tabs = new List <string> { OptionsRes.GeneralTab, // 0 OptionsRes.FileNamingTab, // 1 OptionsRes.ProcessTab, // 2 OptionsRes.AdvancedTab, // 3 }; if (Utilities.SupportsUpdates) { this.Tabs.Add(OptionsRes.UpdatesTab); // 4 } // UpdateStatus this.updater .WhenAnyValue(x => x.State) .Select(state => { switch (state) { case UpdateState.NotStarted: return(string.Empty); case UpdateState.DownloadingInfo: return(OptionsRes.DownloadingInfoStatus); case UpdateState.DownloadingInstaller: return(string.Format(OptionsRes.DownloadingStatus, this.updater.LatestVersion)); case UpdateState.UpToDate: return(OptionsRes.UpToDateStatus); case UpdateState.InstallerReady: return(string.Format(OptionsRes.UpdateReadyStatus, this.updater.LatestVersion)); case UpdateState.Failed: return(OptionsRes.UpdateFailedStatus); default: throw new ArgumentOutOfRangeException(); } }) .ToProperty(this, x => x.UpdateStatus, out this.updateStatus); // UpdateDownloading this.updater .WhenAnyValue(x => x.State) .Select(state => state == UpdateState.DownloadingInstaller) .ToProperty(this, x => x.UpdateDownloading, out this.updateDownloading); // UpdateProgressPercent this.updater .WhenAnyValue(x => x.UpdateDownloadProgressFraction) .Select(downloadFraction => downloadFraction * 100) .ToProperty(this, x => x.UpdateProgressPercent, out this.updateProgressPercent); // CpuThrottlingDisplay this.WhenAnyValue(x => x.CpuThrottlingCores, x => x.CpuThrottlingMaxCores, (cores, maxCores) => { double currentFraction = (double)cores / maxCores; return(currentFraction.ToString("p0")); }).ToProperty(this, x => x.CpuThrottlingDisplay, out this.cpuThrottlingDisplay); this.SaveSettings = ReactiveCommand.Create(); this.SaveSettings.Subscribe(_ => this.SaveSettingsImpl()); this.BrowseVideoPlayer = ReactiveCommand.Create(this.WhenAnyValue(x => x.UseCustomVideoPlayer)); this.BrowseVideoPlayer.Subscribe(_ => this.BrowseVideoPlayerImpl()); this.BrowseCompletionSound = ReactiveCommand.Create(this.WhenAnyValue(x => x.UseCustomCompletionSound)); this.BrowseCompletionSound.Subscribe(_ => this.BrowseCompletionSoundImpl()); this.BrowsePath = ReactiveCommand.Create(); this.BrowsePath.Subscribe(_ => this.BrowsePathImpl()); this.BrowsePreviewFolder = ReactiveCommand.Create(); this.BrowsePreviewFolder.Subscribe(_ => this.BrowsePreviewFolderImpl()); this.OpenAddProcessDialog = ReactiveCommand.Create(); this.OpenAddProcessDialog.Subscribe(_ => this.OpenAddProcessDialogImpl()); this.RemoveProcess = ReactiveCommand.Create(this.WhenAnyValue(x => x.SelectedProcess).Select(selectedProcess => selectedProcess != null)); this.RemoveProcess.Subscribe(_ => this.RemoveProcessImpl()); bool logFolderExists = Directory.Exists(Utilities.LogsFolder); this.OpenLogFolder = ReactiveCommand.Create(MvvmUtilities.CreateConstantObservable(logFolderExists)); this.OpenLogFolder.Subscribe(_ => this.OpenLogFolderImpl()); this.CheckUpdate = ReactiveCommand.Create(this.updater.WhenAnyValue(x => x.State).Select(state => { return(Config.UpdatesEnabled && (state == UpdateState.Failed || state == UpdateState.NotStarted || state == UpdateState.UpToDate)); })); this.CheckUpdate.Subscribe(_ => this.CheckUpdateImpl()); this.updatesEnabledConfig = Config.UpdatesEnabled; this.defaultPath = Config.AutoNameOutputFolder; this.customFormat = Config.AutoNameCustomFormat; this.customFormatString = Config.AutoNameCustomFormatString; this.outputToSourceDirectory = Config.OutputToSourceDirectory; this.preserveFolderStructureInBatch = Config.PreserveFolderStructureInBatch; this.useCustomPreviewFolder = Config.UseCustomPreviewFolder; this.previewOutputFolder = Config.PreviewOutputFolder; this.whenFileExists = CustomConfig.WhenFileExists; this.whenFileExistsBatch = CustomConfig.WhenFileExistsBatch; this.minimizeToTray = Config.MinimizeToTray; this.useCustomVideoPlayer = Config.UseCustomVideoPlayer; this.customVideoPlayer = Config.CustomVideoPlayer; this.useBuiltInPlayerForPreviews = Config.UseBuiltInPlayerForPreviews; this.playSoundOnCompletion = Config.PlaySoundOnCompletion; this.useCustomCompletionSound = Config.UseCustomCompletionSound; this.customCompletionSound = Config.CustomCompletionSound; this.workerProcessPriority = Config.WorkerProcessPriority; this.logVerbosity = Config.LogVerbosity; this.copyLogToOutputFolder = Config.CopyLogToOutputFolder; this.previewCount = Config.PreviewCount; this.rememberPreviousFiles = Config.RememberPreviousFiles; this.showAudioTrackNameField = Config.ShowAudioTrackNameField; this.enableLibDvdNav = Config.EnableLibDvdNav; this.deleteSourceFilesOnClearingCompleted = Config.DeleteSourceFilesOnClearingCompleted; this.preserveModifyTimeFiles = Config.PreserveModifyTimeFiles; this.resumeEncodingOnRestart = Config.ResumeEncodingOnRestart; this.useWorkerProcess = Config.UseWorkerProcess; this.minimumTitleLengthSeconds = Config.MinimumTitleLengthSeconds; this.autoPauseProcesses = new ObservableCollection <string>(); this.videoFileExtensions = Config.VideoFileExtensions; this.cpuThrottlingCores = (int)Math.Round(this.CpuThrottlingMaxCores * Config.CpuThrottlingFraction); if (this.cpuThrottlingCores < 1) { this.cpuThrottlingCores = 1; } if (this.cpuThrottlingCores > this.CpuThrottlingMaxCores) { this.cpuThrottlingCores = this.CpuThrottlingMaxCores; } List <string> autoPauseList = CustomConfig.AutoPauseProcesses; if (autoPauseList != null) { foreach (string process in autoPauseList) { this.autoPauseProcesses.Add(process); } } // List of language codes and names: http://msdn.microsoft.com/en-us/goglobal/bb896001.aspx this.languageChoices = new List <InterfaceLanguage> { new InterfaceLanguage { CultureCode = string.Empty, Display = OptionsRes.UseOSLanguage }, new InterfaceLanguage { CultureCode = "en-US", Display = "English" }, new InterfaceLanguage { CultureCode = "id-ID", Display = "Bahasa Indonesia / Indonesian" }, new InterfaceLanguage { CultureCode = "bs-Latn-BA", Display = "bosanski (Bosna i Hercegovina) / Bosnian (Latin)" }, new InterfaceLanguage { CultureCode = "cs-CZ", Display = "čeština / Czech" }, new InterfaceLanguage { CultureCode = "de-DE", Display = "Deutsch / German" }, new InterfaceLanguage { CultureCode = "es-ES", Display = "Español / Spanish" }, new InterfaceLanguage { CultureCode = "eu-ES", Display = "Euskara / Basque" }, new InterfaceLanguage { CultureCode = "fr-FR", Display = "Français / French" }, new InterfaceLanguage { CultureCode = "it-IT", Display = "italiano / Italian" }, new InterfaceLanguage { CultureCode = "hu-HU", Display = "Magyar / Hungarian" }, new InterfaceLanguage { CultureCode = "nl-BE", Display = "Nederlands / Dutch" }, new InterfaceLanguage { CultureCode = "pl-PL", Display = "polski / Polish" }, new InterfaceLanguage { CultureCode = "pt-PT", Display = "Português / Portuguese" }, new InterfaceLanguage { CultureCode = "pt-BR", Display = "Português (Brasil) / Portuguese (Brazil)" }, new InterfaceLanguage { CultureCode = "tr-TR", Display = "Türkçe / Turkish" }, new InterfaceLanguage { CultureCode = "ka-GE", Display = "ქართული / Georgian" }, new InterfaceLanguage { CultureCode = "ru-RU", Display = "русский / Russian" }, new InterfaceLanguage { CultureCode = "ko-KO", Display = "한국어 / Korean" }, new InterfaceLanguage { CultureCode = "zh-Hans", Display = "中文(简体) / Chinese (Simplified)" }, new InterfaceLanguage { CultureCode = "zh-Hant", Display = "中文(繁體) / Chinese (Traditional)" }, new InterfaceLanguage { CultureCode = "ja-JP", Display = "日本語 / Japanese" }, }; this.priorityChoices = new List <ComboChoice> { new ComboChoice("High", OptionsRes.Priority_High), new ComboChoice("AboveNormal", OptionsRes.Priority_AboveNormal), new ComboChoice("Normal", OptionsRes.Priority_Normal), new ComboChoice("BelowNormal", OptionsRes.Priority_BelowNormal), new ComboChoice("Idle", OptionsRes.Priority_Idle), }; this.interfaceLanguage = this.languageChoices.FirstOrDefault(l => l.CultureCode == Config.InterfaceLanguageCode); if (this.interfaceLanguage == null) { this.interfaceLanguage = this.languageChoices[0]; } this.playerChoices = Players.All; if (this.playerChoices.Count > 0) { this.selectedPlayer = this.playerChoices[0]; foreach (IVideoPlayer player in this.playerChoices) { if (player.Id == Config.PreferredPlayer) { this.selectedPlayer = player; break; } } } if (!CommonUtilities.Beta) { Task.Run(async() => { this.betaInfo = await Updater.GetUpdateInfoAsync(beta: true); this.betaInfoAvailable = false; if (this.betaInfo != null) { if (this.betaInfo.LatestVersion.FillInWithZeroes() > Utilities.CurrentVersion) { this.betaInfoAvailable = true; } await DispatchUtilities.InvokeAsync(() => { this.RaisePropertyChanged(nameof(this.BetaChangelogUrl)); this.RaisePropertyChanged(nameof(this.BetaSectionVisible)); }); } }); } int tabIndex = Config.OptionsDialogLastTab; if (tabIndex >= this.Tabs.Count) { tabIndex = 0; } this.SelectedTabIndex = tabIndex; }