first commit
This commit is contained in:
87
Nitrox.Launcher/ViewModels/BackupRestoreViewModel.cs
Normal file
87
Nitrox.Launcher/ViewModels/BackupRestoreViewModel.cs
Normal file
@@ -0,0 +1,87 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Avalonia.Collections;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using Nitrox.Launcher.Models.Design;
|
||||
using Nitrox.Launcher.Models.Validators;
|
||||
using Nitrox.Launcher.ViewModels.Abstract;
|
||||
using NitroxServer.Serialization.World;
|
||||
|
||||
namespace Nitrox.Launcher.ViewModels;
|
||||
|
||||
public partial class BackupRestoreViewModel : ModalViewModelBase
|
||||
{
|
||||
[ObservableProperty]
|
||||
private AvaloniaList<BackupItem> backups = [];
|
||||
|
||||
[ObservableProperty]
|
||||
private string saveFolderDirectory;
|
||||
|
||||
[ObservableProperty]
|
||||
[NotifyCanExecuteChangedFor(nameof(RestoreBackupCommand))]
|
||||
[NotifyDataErrorInfo]
|
||||
[Backup]
|
||||
private BackupItem selectedBackup;
|
||||
|
||||
[ObservableProperty]
|
||||
private string title;
|
||||
|
||||
protected override void OnPropertyChanged(PropertyChangedEventArgs e)
|
||||
{
|
||||
base.OnPropertyChanged(e);
|
||||
switch (e.PropertyName)
|
||||
{
|
||||
case nameof(SaveFolderDirectory) when !string.IsNullOrWhiteSpace(SaveFolderDirectory) && Directory.Exists(SaveFolderDirectory):
|
||||
Backups.Clear();
|
||||
Backups.AddRange(GetBackups(SaveFolderDirectory));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
[RelayCommand(CanExecute = nameof(CanRestoreBackup))]
|
||||
public void RestoreBackup() => Close(ButtonOptions.Ok);
|
||||
|
||||
public bool CanRestoreBackup() => !HasErrors;
|
||||
|
||||
private static IEnumerable<BackupItem> GetBackups(string saveDirectory)
|
||||
{
|
||||
IEnumerable<string> GetBackupFilePaths(string backupRootDir) =>
|
||||
Directory.EnumerateFiles(backupRootDir, "*.zip")
|
||||
.Where(file =>
|
||||
{
|
||||
// Verify file name format of "Backup - {DateTime:BACKUP_DATE_TIME_FORMAT}.zip"
|
||||
string fileName = Path.GetFileNameWithoutExtension(file);
|
||||
if (!fileName.StartsWith("Backup - "))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
string dateTimePart = fileName["Backup - ".Length..];
|
||||
return DateTime.TryParseExact(dateTimePart, WorldPersistence.BACKUP_DATE_TIME_FORMAT, CultureInfo.InvariantCulture, DateTimeStyles.None, out _);
|
||||
});
|
||||
|
||||
if (saveDirectory == null)
|
||||
{
|
||||
yield break;
|
||||
}
|
||||
string backupDir = Path.Combine(saveDirectory, "Backups");
|
||||
if (!Directory.Exists(backupDir))
|
||||
{
|
||||
yield break;
|
||||
}
|
||||
|
||||
foreach (string backupPath in GetBackupFilePaths(backupDir))
|
||||
{
|
||||
if (!DateTime.TryParseExact(Path.GetFileNameWithoutExtension(backupPath)["Backup - ".Length..], WorldPersistence.BACKUP_DATE_TIME_FORMAT, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime backupDate))
|
||||
{
|
||||
backupDate = File.GetCreationTime(backupPath);
|
||||
}
|
||||
yield return new BackupItem(backupDate, backupPath);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user