using System; using System.Linq; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Data.Core; using Avalonia.Data.Core.Plugins; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Markup.Xaml; using MarkdownEditor.ViewModels; using MarkdownEditor.Views; namespace MarkdownEditor; /// /// Main application class. /// Handles application initialization and lifetime management. /// public partial class App : Application { /// public override void Initialize() { AvaloniaXamlLoader.Load(this); SetupNativeMenu(); } /// /// Sets up the native macOS menu with About dialog. /// private void SetupNativeMenu() { var appMenu = NativeMenu.GetMenu(this); if (appMenu != null) { // About Markus var aboutItem = new NativeMenuItem { Header = "About Markus" }; aboutItem.Click += AboutMarkus_Click; appMenu.Items.Add(aboutItem); // Separator appMenu.Items.Add(new NativeMenuItemSeparator()); // Services appMenu.Items.Add(new NativeMenuItem { Header = "Services" }); // Separator appMenu.Items.Add(new NativeMenuItemSeparator()); // Hide Ormentia Markus appMenu.Items.Add(new NativeMenuItem { Header = "Hide Ormentia Markus", Gesture = KeyGesture.Parse("Cmd+H") }); // Hide Others appMenu.Items.Add(new NativeMenuItem { Header = "Hide Others", Gesture = KeyGesture.Parse("Cmd+Alt+H") }); // Show All appMenu.Items.Add(new NativeMenuItem { Header = "Show All" }); // Separator appMenu.Items.Add(new NativeMenuItemSeparator()); // Quit appMenu.Items.Add(new NativeMenuItem { Header = "Quit Ormentia Markus", Gesture = KeyGesture.Parse("Cmd+Q") }); } } /// public override void OnFrameworkInitializationCompleted() { if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { // Avoid duplicate validations from both Avalonia and the CommunityToolkit. // More info: https://docs.avaloniaui.net/docs/guides/development-guides/data-validation#manage-validationplugins DisableAvaloniaDataAnnotationValidation(); // Check for file path in command line arguments string? initialFilePath = null; if (desktop.Args?.Length > 0) { // Get the first argument as potential file path var arg = desktop.Args[0]; // Ensure it's a valid file path (not a flag/option) if (!arg.StartsWith("-") && System.IO.File.Exists(arg)) { initialFilePath = arg; } } desktop.MainWindow = new MainWindow { DataContext = new MainWindowViewModel(initialFilePath: initialFilePath), }; } base.OnFrameworkInitializationCompleted(); } /// /// Disables Avalonia's built-in data annotation validation to prevent conflicts with CommunityToolkit. /// private void DisableAvaloniaDataAnnotationValidation() { // Get an array of plugins to remove var dataValidationPluginsToRemove = BindingPlugins.DataValidators.OfType().ToArray(); // remove each entry found foreach (var plugin in dataValidationPluginsToRemove) { BindingPlugins.DataValidators.Remove(plugin); } } /// /// Handles the About Markus menu item click event. /// private void AboutMarkus_Click(object? sender, EventArgs e) { if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow != null) { var aboutWindow = new AboutWindow(); aboutWindow.ShowDialog(desktop.MainWindow); } } }