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);
}
}
}