public static void Save(string filename, VM vm) { XmlSerializer formatter = new XmlSerializer(typeof(ApplicationStateSerialized)); ApplicationStateSerialized sets = new ApplicationStateSerialized(vm, filename); using (FileStream fs = new FileStream(filename, FileMode.Create)) { formatter.Serialize(fs, sets); } }
private static void ValidateSets(ApplicationStateSerialized sets) { string ErrorsReport = ""; //удалим видео которые не найдены int c = sets.Players.Count; for (int i = 0; i < c; i++) { if (!File.Exists(sets.Players[i].filename)) { sets.Players.Remove(sets.Players[i]); ErrorsReport += @"Видео не найдено: " + sets.Players[i].filename + "\n"; c--; } } if (sets.IsExcelConnected && !File.Exists(sets.ExcelBookFilename)) { ErrorsReport += @"Excel-файл не найден: " + sets.ExcelBookFilename + "\n"; sets.IsExcelConnected = false; } double w = SystemParameters.PrimaryScreenWidth; double h = SystemParameters.PrimaryScreenHeight; if (sets.Position.Width < 100 || sets.Position.Height < 100 || (sets.Position.Left + sets.Position.Width < 0) || (sets.Position.Top + sets.Position.Height < 0) || (sets.Position.Top + sets.Position.Height < 0) || (sets.Position.Top + sets.Position.Height < 0) || (sets.Position.Left > w) || (sets.Position.Top > h) || (sets.Position.Top < 0)) { ErrorsReport += "Главное окно расположено некорректно (судя по сохраненному файлу - где-то за пределами экрана)\n"; sets.Position = new Rect(0, 0, w, h); } int PlayerId = 0; foreach (var v in sets.Players) { PlayerId++; if (v.Position.Width < 50 || v.Position.Height < 50 || (v.Position.Left + sets.Position.Width < 0) || (v.Position.Top + sets.Position.Height < 0) || (v.Position.Top + sets.Position.Height < 0) || (v.Position.Top + sets.Position.Height < 0) || (v.Position.Top < 0)) { ErrorsReport += "Окно проигрывателя файла " + Path.GetFileName(v.filename) + " расположено некорректно\n"; v.Position = new Rect(0 + PlayerId * 50, 0 + PlayerId * 50, 300, 400); } } foreach (var v in sets.Players) { if (v.CurTime < TimeSpan.Zero) { v.CurTime = TimeSpan.Zero; } if (v.CurTime + v.TimeShift > v.Duration) { v.CurTime = TimeSpan.Zero; } if (v.CurTime + v.TimeShift < TimeSpan.Zero) { v.TimeShift = TimeSpan.Zero; } } }
private static void RestoreViewModel(ApplicationStateSerialized sets, VM vm) { vm.MainWindow.Left = sets.Position.Left; vm.MainWindow.Top = sets.Position.Top; vm.MainWindow.Width = sets.Position.Width; vm.MainWindow.Height = sets.Position.Height; vm.MainWindow.WindowState = sets.WindowState; //готовим перечень файлов... string[] filenames = new string[sets.Players.Count]; for (int i = 0; i < sets.Players.Count; i++) { if (Settings.stateFilesRestorePathType == "Absolute") { filenames[i] = sets.Players[i].filename; } else { filenames[i] = Path.GetFullPath(Path.Combine(sets.TargetDirectory, sets.Players[i].relativeFilename)); //преобразование относительного пути в абсолютный } } //... и зон размещения проигрывателей для ... Rect[] areas = new Rect[sets.Players.Count]; for (int i = 0; i < sets.Players.Count; i++) { areas[i] = sets.Players[i].Position; } //... открытия vm.OpenVideos(filenames, areas); //Назначаем лидера синхронизации int SyncLeadId = 0; foreach (var v in sets.Players) { if (v.IsSyncLeader) { SyncLeadId = sets.Players.IndexOf(v); } } vm.SyncLeadPlayer = vm.videoPlayerVMs[SyncLeadId]; //Устанавливаем подрегулировку громкости vm.ShiftVolume = sets.ShiftVolume; ToolsTimer.Delay(() => { //переводим все видео на нужный момент foreach (VideoPlayerVM v in vm.videoPlayerVMs) { v.CurTime = sets.Players[vm.videoPlayerVMs.IndexOf(v)].CurTime; v.SyncronizationShiftVM.ShiftTime = sets.Players[vm.videoPlayerVMs.IndexOf(v)].TimeShift; } //Устанавливаем всем нужную громкость foreach (VideoPlayerVM v in vm.videoPlayerVMs) { v.SelfVolume = sets.Players[vm.videoPlayerVMs.IndexOf(v)].SelfVolume; } //Устанавливаем везде нужный зум foreach (VideoPlayerVM v in vm.videoPlayerVMs) { Rect ZoomedArea = sets.Players[vm.videoPlayerVMs.IndexOf(v)].ZoomedArea; if (ZoomedArea.Width > 10 && ZoomedArea.Height > 10 && ZoomedArea.Left + ZoomedArea.Width > 0 && ZoomedArea.Height + ZoomedArea.Top > 0) { v.SetZoom(ZoomedArea); } v.Body.VLC.OnResize(); } }, TimeSpan.FromSeconds(2)); }