using System; using Avalonia; using Avalonia.Controls; using Avalonia.Media; namespace SourceGit.Views { public class CommitStatusIndicator : Control { public static readonly StyledProperty CurrentBranchProperty = AvaloniaProperty.Register(nameof(CurrentBranch)); public Models.Branch CurrentBranch { get => GetValue(CurrentBranchProperty); set => SetValue(CurrentBranchProperty, value); } public static readonly StyledProperty AheadBrushProperty = AvaloniaProperty.Register(nameof(AheadBrush)); public IBrush AheadBrush { get => GetValue(AheadBrushProperty); set => SetValue(AheadBrushProperty, value); } public static readonly StyledProperty BehindBrushProperty = AvaloniaProperty.Register(nameof(BehindBrush)); public IBrush BehindBrush { get => GetValue(BehindBrushProperty); set => SetValue(BehindBrushProperty, value); } enum Status { Normal, Ahead, Behind, } public override void Render(DrawingContext context) { if (_status == Status.Normal) return; context.DrawEllipse(_status == Status.Ahead ? AheadBrush : BehindBrush, null, new Rect(0, 0, 5, 5)); } protected override Size MeasureOverride(Size availableSize) { if (DataContext is Models.Commit commit && CurrentBranch is not null) { var sha = commit.SHA; var track = CurrentBranch.TrackStatus; if (track.Ahead.Contains(sha)) _status = Status.Ahead; else if (track.Behind.Contains(sha)) _status = Status.Behind; else _status = Status.Normal; } else { _status = Status.Normal; } return _status == Status.Normal ? new Size(0, 0) : new Size(9, 5); } protected override void OnDataContextChanged(EventArgs e) { base.OnDataContextChanged(e); InvalidateMeasure(); } protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { base.OnPropertyChanged(change); if (change.Property == CurrentBranchProperty) InvalidateMeasure(); } private Status _status = Status.Normal; } }