Files
crosslangdevstudio/Views/MainWindow.axaml.cs
2025-10-22 17:31:32 -05:00

93 lines
3.3 KiB
C#

using System.Threading;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Platform.Storage;
using Avalonia.Threading;
using CommunityToolkit.Mvvm.Messaging;
using CrossLangDevStudio.Messages;
using CrossLangDevStudio.ViewModels;
using MsBox.Avalonia;
using MsBox.Avalonia.Enums;
using Tabalonia.Controls;
namespace CrossLangDevStudio.Views;
public partial class MainWindow : Window
{
private async Task CloseWindowAsync(WindowClosingEventArgs e, MainWindowViewModel vm)
{
var box = MessageBoxManager
.GetMessageBoxStandard("Save?", $"You have unsaved work do you want to save?",
ButtonEnum.YesNoCancel, MsBox.Avalonia.Enums.Icon.Question);
switch (await box.ShowWindowDialogAsync(this))
{
case ButtonResult.Yes:
vm.SaveAll();
break;
case ButtonResult.Cancel:
e.Cancel = true;
break;
}
}
public MainWindow()
{
InitializeComponent();
if (Design.IsDesignMode)
return;
this.Closing += (sender, e) =>
{
if (this.DataContext is MainWindowViewModel vm)
{
if (vm.HasUnsaved)
{
//thanks https://github.com/AvaloniaUI/Avalonia/issues/4810#issuecomment-704372304
using (var source = new CancellationTokenSource())
{
CloseWindowAsync(e, vm).ContinueWith(e => source.Cancel(), TaskScheduler.FromCurrentSynchronizationContext());
Dispatcher.UIThread.MainLoop(source.Token);
}
}
}
};
// Whenever 'Send(new PurchaseAlbumMessage())' is called, invoke this callback on the MainWindow instance:
WeakReferenceMessenger.Default.Register<MainWindow, NewProjectMessage>(this, static (w, m) =>
{
// Create an instance of MusicStoreWindow and set MusicStoreViewModel as its DataContext.
var dialog = new NewProjectDialog
{
DataContext = new NewProjectDialogViewModel()
};
// Show dialog window and reply with returned AlbumViewModel or null when the dialog is closed.
m.Reply(dialog.ShowDialog<string?>(w));
});
WeakReferenceMessenger.Default.Register<MainWindow, InstallPackageMessage>(this, static (w, m) =>
{
var dialog = new InstallPackageDialog
{
DataContext = new InstallPackageDialogViewModel(m)
};
m.Reply(dialog.ShowDialog<CrossLangVersion?>(w));
});
WeakReferenceMessenger.Default.Register<MainWindow, GetWindowMessage>(this, static (w, m) =>
{
m.Reply(w);
}
);
WeakReferenceMessenger.Default.Register<MainWindow, PublishMessage>(this, static (w, m) =>
{
var dialog = new PublishDialogView
{
DataContext = new PublishDialogViewModel(m.Path)
};
m.Reply(dialog.ShowDialog(w));
});
}
}