|
1 | 1 | using Avalonia.Controls; |
2 | 2 | using System.ComponentModel; |
3 | 3 | using System.Diagnostics; |
| 4 | +using System.Diagnostics.CodeAnalysis; |
4 | 5 | using System.Reflection; |
5 | 6 | using System.Runtime.CompilerServices; |
6 | 7 | namespace ARM9Editor; |
| 8 | + |
7 | 9 | public sealed class MainWindowViewModel : INotifyPropertyChanged |
8 | 10 | { |
9 | 11 | private const string DefaultTitle = "Mario Kart DS ARM9 Editor"; |
10 | 12 | private const string RepoUrl = "https://github.com/LandonAndEmma/MKDS-ARM9-Editor"; |
11 | 13 | private string? _filePath; |
12 | 14 | public event PropertyChangedEventHandler? PropertyChanged; |
13 | 15 | public Window? Owner { get; set; } |
| 16 | + public Action? OnTabsNeedRefresh { get; set; } |
14 | 17 | public ARM9Data Data { get; } = new(); |
15 | 18 | public bool IsFileLoaded => Data.IsLoaded; |
16 | 19 | public string Status { get; private set => SetField(ref field, value); } = "Ready"; |
@@ -85,13 +88,66 @@ public async Task SaveFileAsAsync() |
85 | 88 | await DialogService.ShowErrorAsync(Owner, ex.Message); |
86 | 89 | } |
87 | 90 | } |
| 91 | + [RequiresUnreferencedCode("Calls ARM9Editor.FileService.ExportChangesAsync")] |
| 92 | + public async Task ExportChangesAsync() |
| 93 | + { |
| 94 | + if (!IsFileLoaded) |
| 95 | + { |
| 96 | + await DialogService.ShowErrorAsync(Owner, "No file loaded."); |
| 97 | + return; |
| 98 | + } |
| 99 | + if (!Data.HasChanges()) |
| 100 | + { |
| 101 | + await DialogService.ShowMessageAsync(Owner, "No Changes", "No changes have been made to export."); |
| 102 | + return; |
| 103 | + } |
| 104 | + try |
| 105 | + { |
| 106 | + ChangesExport changes = Data.ExportChanges(); |
| 107 | + string? path = await FileService.ExportChangesAsync(Owner, changes); |
| 108 | + if (!string.IsNullOrEmpty(path)) |
| 109 | + { |
| 110 | + Status = $"Exported {changes.Changes.Count} change(s) to: {Path.GetFileName(path)}"; |
| 111 | + await DialogService.ShowMessageAsync(Owner, "Success", $"Successfully exported {changes.Changes.Count} change(s) to JSON."); |
| 112 | + } |
| 113 | + } |
| 114 | + catch (Exception ex) |
| 115 | + { |
| 116 | + await DialogService.ShowErrorAsync(Owner, ex.Message); |
| 117 | + } |
| 118 | + } |
| 119 | + [RequiresUnreferencedCode("Calls ARM9Editor.FileService.ImportChangesAsync")] |
| 120 | + public async Task ImportChangesAsync() |
| 121 | + { |
| 122 | + if (!IsFileLoaded) |
| 123 | + { |
| 124 | + await DialogService.ShowErrorAsync(Owner, "No file loaded."); |
| 125 | + return; |
| 126 | + } |
| 127 | + try |
| 128 | + { |
| 129 | + ChangesExport? changes = await FileService.ImportChangesAsync(Owner); |
| 130 | + if (changes == null) |
| 131 | + { |
| 132 | + return; |
| 133 | + } |
| 134 | + Data.ImportChanges(changes); |
| 135 | + OnTabsNeedRefresh?.Invoke(); |
| 136 | + Status = $"Imported {changes.Changes.Count} change(s)"; |
| 137 | + await DialogService.ShowMessageAsync(Owner, "Success", $"Successfully imported {changes.Changes.Count} change(s)."); |
| 138 | + } |
| 139 | + catch (Exception ex) |
| 140 | + { |
| 141 | + await DialogService.ShowErrorAsync(Owner, ex.Message); |
| 142 | + } |
| 143 | + } |
88 | 144 | public async Task ShowInfoAsync() |
89 | 145 | { |
90 | 146 | Assembly assembly = Assembly.GetExecutingAssembly(); |
91 | 147 | Version? version = assembly.GetName().Version; |
92 | | - var versionStr = version != null ? $"{version.Major}.{version.Minor}.{version.Build}" : "Unknown"; |
| 148 | + string versionStr = version != null ? $"{version.Major}.{version.Minor}.{version.Build}" : "Unknown"; |
93 | 149 | AssemblyCompanyAttribute? companyAttr = assembly.GetCustomAttribute<AssemblyCompanyAttribute>(); |
94 | | - var message = $"Mario Kart DS ARM9 Editor\nVersion: {versionStr}\n\nEdit values in Mario Kart DS ARM9 files.\n\n"; |
| 150 | + string message = $"Mario Kart DS ARM9 Editor\nVersion: {versionStr}\n\nEdit values in Mario Kart DS ARM9 files.\n\n"; |
95 | 151 | if (companyAttr != null) |
96 | 152 | { |
97 | 153 | message += $"By: {companyAttr.Company}\n"; |
|
0 commit comments