using Avalonia.Controls; using Nonemm.Core; namespace Nonemm.App.Windows; /// Contacts, points and multipliers band by band. public sealed partial class ScoreWindow : RefreshableWindow { private readonly AppSession session; public ScoreWindow(AppSession session) { this.session = session; InitializeComponent(); Refresh(); } public override void Refresh() { Table.Children.Clear(); Table.ColumnDefinitions.Clear(); Table.RowDefinitions.Clear(); if (session.Logging is null) { TotalText.Text = "no contest is open"; return; } List bands = session.Logging.Log.Qsos .Select(q => q.Band) .OfType() .Distinct() .OrderBy(b => b.MegahertzLabel) .ToList(); foreach (string _ in new[] { "band", "qsos", "points", "mults" }) { Table.ColumnDefinitions.Add(new ColumnDefinition(GridLength.Star)); } AddRow(0, "Band", "QSOs", "Points", "Mults", header: true); int row = 1; foreach (Band band in bands) { IReadOnlyList onBand = session.Logging.Log.Qsos.Where(q => q.Band == band).ToList(); AddRow( row++, band.Name, onBand.Count.ToString(), onBand.Sum(q => q.Points).ToString(), onBand.Sum(MultiplierCount).ToString()); } AddRow( row, "Total", session.Logging.Log.Tally.Qsos.ToString(), session.Logging.Log.Tally.Points.ToString(), session.Logging.Log.Tally.TotalMultipliers.ToString(), header: true); TotalText.Text = $"Claimed score {session.Logging.Log.TotalScore:N0}"; } private static int MultiplierCount(Qso qso) => (qso.IsMultiplier1 ? 1 : 0) + (qso.IsMultiplier2 ? 1 : 0) + (qso.IsMultiplier3 ? 1 : 0); private void AddRow(int row, string band, string qsos, string points, string mults, bool header = false) { Table.RowDefinitions.Add(new RowDefinition(GridLength.Auto)); string[] cells = [band, qsos, points, mults]; for (int column = 0; column < cells.Length; column++) { TextBlock text = new() { Text = cells[column], FontFamily = new Avalonia.Media.FontFamily("monospace"), FontSize = 13, Opacity = header ? 1.0 : 0.85, Margin = new Avalonia.Thickness(0, 2, 8, 2), }; Grid.SetRow(text, row); Grid.SetColumn(text, column); Table.Children.Add(text); } } }