This commit is contained in:
@@ -13,15 +13,32 @@ public partial class MainWindow : Window
|
||||
{
|
||||
private readonly DesignerViewModel _viewModel = new();
|
||||
private readonly StarterTemplateLibrary _starterTemplates = new();
|
||||
private string? _currentPackagePath;
|
||||
|
||||
public MainWindow()
|
||||
{
|
||||
InitializeComponent(); DataContext = _viewModel;
|
||||
RefreshStarterTemplates();
|
||||
UpdateDocumentTitle();
|
||||
}
|
||||
|
||||
private void OnNew(object? sender, RoutedEventArgs e) => _viewModel.Reset();
|
||||
private void OnNew(object? sender, RoutedEventArgs e)
|
||||
{
|
||||
_viewModel.Reset(); _currentPackagePath = null; UpdateDocumentTitle();
|
||||
}
|
||||
private void OnExit(object? sender, RoutedEventArgs e) => Close();
|
||||
private void OnAddPlaceholder(object? sender, RoutedEventArgs e) =>
|
||||
_viewModel.Placeholders.Add(new($"Feld{_viewModel.Placeholders.Count + 1}", PlaceholderType.Text, false, "Beispiel"));
|
||||
private void OnAddMetadata(object? sender, RoutedEventArgs e)
|
||||
{
|
||||
var item = new DesignerMetadata($"custom-{_viewModel.MetadataItems.Count + 1}", "");
|
||||
_viewModel.MetadataItems.Add(item); _viewModel.SelectedMetadata = item; _viewModel.CanExport = false;
|
||||
}
|
||||
private void OnRemoveMetadata(object? sender, RoutedEventArgs e)
|
||||
{
|
||||
if (_viewModel.SelectedMetadata is not { } selected) return;
|
||||
_viewModel.MetadataItems.Remove(selected); _viewModel.SelectedMetadata = null; _viewModel.CanExport = false;
|
||||
}
|
||||
private void OnRemovePlaceholder(object? sender, RoutedEventArgs e)
|
||||
{
|
||||
if (this.FindControl<DataGrid>("PlaceholderGrid")?.SelectedItem is DesignerPlaceholder selected)
|
||||
@@ -104,7 +121,7 @@ public partial class MainWindow : Window
|
||||
try
|
||||
{
|
||||
var (template, layout) = _starterTemplates.Load(selected);
|
||||
_viewModel.Load(template, layout); OnPreview(sender, e);
|
||||
_viewModel.Load(template, layout); _currentPackagePath = null; UpdateDocumentTitle(); OnPreview(sender, e);
|
||||
}
|
||||
catch (Exception ex) { _viewModel.SetStatus($"Öffnen fehlgeschlagen: {ex.Message}", true); }
|
||||
}
|
||||
@@ -117,7 +134,8 @@ public partial class MainWindow : Window
|
||||
{
|
||||
var (template, layout) = _starterTemplates.Load(selected);
|
||||
var projectId = _starterTemplates.CreateUniqueId(template.Manifest.Id + "-neu");
|
||||
_viewModel.LoadAsNewProject(template, layout, projectId); OnPreview(sender, e);
|
||||
_viewModel.LoadAsNewProject(template, layout, projectId);
|
||||
_currentPackagePath = null; UpdateDocumentTitle(); OnPreview(sender, e);
|
||||
}
|
||||
catch (Exception ex) { _viewModel.SetStatus($"Klonen fehlgeschlagen: {ex.Message}", true); }
|
||||
}
|
||||
@@ -198,25 +216,47 @@ public partial class MainWindow : Window
|
||||
{
|
||||
var path = files[0].Path.LocalPath; var loaded = new TemplateLoader().LoadFromPackage(path);
|
||||
using var archive = ZipFile.OpenRead(path); using var reader = new StreamReader(archive.GetEntry(loaded.Manifest.LayoutFile)!.Open());
|
||||
_viewModel.Load(loaded, reader.ReadToEnd()); OnPreview(sender, e);
|
||||
_viewModel.Load(loaded, reader.ReadToEnd()); _currentPackagePath = Path.GetFullPath(path);
|
||||
UpdateDocumentTitle(); OnPreview(sender, e);
|
||||
}
|
||||
catch (Exception ex) { _viewModel.SetStatus($"Import fehlgeschlagen: {ex.Message}", true); }
|
||||
catch (Exception ex) { _viewModel.SetStatus($"Öffnen fehlgeschlagen: {ex.Message}", true); }
|
||||
}
|
||||
|
||||
private async void OnExport(object? sender, RoutedEventArgs e)
|
||||
private async void OnSave(object? sender, RoutedEventArgs e)
|
||||
{
|
||||
if (_currentPackagePath is null) { await SaveAsAsync(); return; }
|
||||
SaveTo(_currentPackagePath);
|
||||
}
|
||||
|
||||
private async void OnSaveAs(object? sender, RoutedEventArgs e) => await SaveAsAsync();
|
||||
|
||||
private async Task SaveAsAsync()
|
||||
{
|
||||
try { _viewModel.BuildLoaded(); }
|
||||
catch (Exception ex) { _viewModel.SetStatus(ex.Message, true); return; }
|
||||
var file = await StorageProvider.SaveFilePickerAsync(new()
|
||||
{ Title = "Vorlagenpaket exportieren", SuggestedFileName = _viewModel.TemplateId + TemplatePackage.Extension,
|
||||
{ Title = "Vorlagenpaket speichern unter", SuggestedFileName = _viewModel.TemplateId + TemplatePackage.Extension,
|
||||
DefaultExtension = TemplatePackage.Extension[1..], FileTypeChoices = [PackageType()] });
|
||||
if (file is null) return;
|
||||
var destination = EnsurePackageExtension(file.Path.LocalPath);
|
||||
if (SaveTo(destination))
|
||||
{
|
||||
_currentPackagePath = Path.GetFullPath(destination);
|
||||
UpdateDocumentTitle();
|
||||
}
|
||||
}
|
||||
|
||||
private bool SaveTo(string path)
|
||||
{
|
||||
try
|
||||
{
|
||||
TemplatePackage.Create(file.Path.LocalPath, _viewModel.BuildManifest(), _viewModel.LayoutSource, _viewModel.Assets);
|
||||
_viewModel.SetStatus($"Paket exportiert: {file.Name}", false);
|
||||
_viewModel.BuildLoaded();
|
||||
TemplatePackage.Create(path, _viewModel.BuildManifest(), _viewModel.LayoutSource, _viewModel.Assets);
|
||||
_viewModel.CanExport = true;
|
||||
_viewModel.SetStatus($"Gespeichert: {Path.GetFileName(path)}", false);
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex) { _viewModel.SetStatus($"Export fehlgeschlagen: {ex.Message}", true); }
|
||||
catch (Exception ex) { _viewModel.SetStatus($"Speichern fehlgeschlagen: {ex.Message}", true); return false; }
|
||||
}
|
||||
|
||||
private async void OnImportBackground(object? sender, RoutedEventArgs e)
|
||||
@@ -251,6 +291,17 @@ public partial class MainWindow : Window
|
||||
|
||||
private static FilePickerFileType ImageType() => new("PNG/JPEG-Bilder") { Patterns = ["*.png", "*.jpg", "*.jpeg"] };
|
||||
private static FilePickerFileType PackageType() => new("LehrerApp-Vorlagen") { Patterns = ["*.lavorlage"] };
|
||||
private static string EnsurePackageExtension(string path) =>
|
||||
string.Equals(Path.GetExtension(path), TemplatePackage.Extension, StringComparison.OrdinalIgnoreCase)
|
||||
? path : path + TemplatePackage.Extension;
|
||||
private void RefreshStarterTemplates(string? selectedId = null) =>
|
||||
_viewModel.SetStarterTemplates(_starterTemplates.GetAll(), selectedId);
|
||||
|
||||
private void UpdateDocumentTitle()
|
||||
{
|
||||
var fileName = _currentPackagePath is null ? "Unbenannt" : Path.GetFileName(_currentPackagePath);
|
||||
Title = $"{fileName} – LehrerApp Vorlagen-Designer";
|
||||
DocumentNameText.Text = fileName;
|
||||
DocumentPathText.Text = _currentPackagePath ?? "Noch nicht gespeichert";
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user