using System.Linq; using Avalonia.Controls; using Avalonia.Layout; using Avalonia.Media; using LANCommander.Launcher.Plugins.Extensions; using Microsoft.Extensions.DependencyInjection; namespace LANCommander.Launcher.Views; public partial class SettingsView : UserControl { public SettingsView() { InitializeComponent(); AppendPluginSections(); } /// /// Appends any plugin settings sections beneath the built-in sections, styled to /// match the surrounding cards so extensions look native. /// private void AppendPluginSections() { var extensions = App.Services? .GetServices() .OrderBy(c => c.Order) .ToList(); if (extensions == null || extensions.Count == 0) return; foreach (var extension in extensions) { Control content; try { content = extension.BuildContent(); } catch { // A misbehaving plugin must not break the settings page. continue; } var header = new TextBlock { Text = extension.Title, FontWeight = FontWeight.SemiBold, FontSize = 16, }; var stack = new StackPanel { Spacing = 12 }; stack.Children.Add(header); stack.Children.Add(content); var card = new Border { Padding = new Avalonia.Thickness(16), CornerRadius = new Avalonia.CornerRadius(8), Child = stack, HorizontalAlignment = HorizontalAlignment.Stretch, }; if (this.TryFindResource("SystemControlBackgroundChromeMediumLowBrush", out var brush) && brush is IBrush background) card.Background = background; SectionsPanel.Children.Add(card); } } }