diff --git a/src/UniGetUI.Avalonia/ViewModels/DialogPages/OperationViewModel.cs b/src/UniGetUI.Avalonia/ViewModels/DialogPages/OperationViewModel.cs index 2a3e9052a..84b6b7c12 100644 --- a/src/UniGetUI.Avalonia/ViewModels/DialogPages/OperationViewModel.cs +++ b/src/UniGetUI.Avalonia/ViewModels/DialogPages/OperationViewModel.cs @@ -328,12 +328,12 @@ private void ShowDetails() if (Operation.Status is OperationStatus.Failed) { var win = new OperationFailedDialog(Operation); - _ = win.ShowDialog(mainWindow); + win.Show(mainWindow); } else { var win = new OperationOutputWindow(Operation); - _ = win.ShowDialog(mainWindow); + win.Show(mainWindow); } } diff --git a/src/UniGetUI.Avalonia/Views/DialogPages/OperationFailedDialog.axaml b/src/UniGetUI.Avalonia/Views/DialogPages/OperationFailedDialog.axaml index 3a866590e..00cd0955e 100644 --- a/src/UniGetUI.Avalonia/Views/DialogPages/OperationFailedDialog.axaml +++ b/src/UniGetUI.Avalonia/Views/DialogPages/OperationFailedDialog.axaml @@ -1,11 +1,9 @@ - - - - - - - + diff --git a/src/UniGetUI.Avalonia/Views/DialogPages/OperationFailedDialog.axaml.cs b/src/UniGetUI.Avalonia/Views/DialogPages/OperationFailedDialog.axaml.cs index 40e08c98d..7ba469a43 100644 --- a/src/UniGetUI.Avalonia/Views/DialogPages/OperationFailedDialog.axaml.cs +++ b/src/UniGetUI.Avalonia/Views/DialogPages/OperationFailedDialog.axaml.cs @@ -1,5 +1,6 @@ using Avalonia; using Avalonia.Controls; +using Avalonia.Controls.Documents; using Avalonia.Layout; using Avalonia.Media; using Avalonia.Threading; @@ -28,7 +29,8 @@ public OperationFailedDialog(AbstractOperation operation) var normalBrush = Application.Current?.FindResource("SystemControlForegroundBaseHighBrush") as IBrush ?? Brushes.White; - var lines = new List(); + var inlines = OutputText.Inlines ??= new InlineCollection(); + bool first = true; foreach (var (text, type) in operation.GetOutput()) { IBrush brush = type switch @@ -37,9 +39,10 @@ public OperationFailedDialog(AbstractOperation operation) AbstractOperation.LineType.VerboseDetails => debugBrush, _ => normalBrush, }; - lines.Add(new OutputLineVm(text, brush)); + if (!first) inlines.Add(new LineBreak()); + inlines.Add(new Run(text) { Foreground = brush }); + first = false; } - OutputLines.ItemsSource = lines; var closeButton = new Button { @@ -132,10 +135,3 @@ private static MenuItem MenuItem(string header, Action action) return item; } } - -/// View model for a single colored output line in OperationFailedDialog. -public sealed class OutputLineVm(string text, IBrush foreground) -{ - public string Text { get; } = text; - public IBrush Foreground { get; } = foreground; -} diff --git a/src/UniGetUI.Avalonia/Views/DialogPages/OperationOutputWindow.axaml b/src/UniGetUI.Avalonia/Views/DialogPages/OperationOutputWindow.axaml index 4965582d6..4fc3e7443 100644 --- a/src/UniGetUI.Avalonia/Views/DialogPages/OperationOutputWindow.axaml +++ b/src/UniGetUI.Avalonia/Views/DialogPages/OperationOutputWindow.axaml @@ -2,7 +2,6 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:automation="clr-namespace:Avalonia.Automation;assembly=Avalonia.Controls" xmlns:vm="using:UniGetUI.Avalonia.ViewModels.DialogPages" - xmlns:logVm="using:UniGetUI.Avalonia.ViewModels.Pages.LogPages" x:Class="UniGetUI.Avalonia.Views.DialogPages.OperationOutputWindow" x:DataType="vm:OperationOutputViewModel" Width="700" MinWidth="400" @@ -19,20 +18,13 @@ VerticalScrollBarVisibility="Auto" Background="{DynamicResource AppDialogDarkBackground}" CornerRadius="6"> - - - - - - - + diff --git a/src/UniGetUI.Avalonia/Views/DialogPages/OperationOutputWindow.axaml.cs b/src/UniGetUI.Avalonia/Views/DialogPages/OperationOutputWindow.axaml.cs index 419c99c48..007c43732 100644 --- a/src/UniGetUI.Avalonia/Views/DialogPages/OperationOutputWindow.axaml.cs +++ b/src/UniGetUI.Avalonia/Views/DialogPages/OperationOutputWindow.axaml.cs @@ -1,6 +1,9 @@ +using System.Collections.Specialized; using Avalonia.Controls; +using Avalonia.Controls.Documents; using Avalonia.Threading; using UniGetUI.Avalonia.ViewModels.DialogPages; +using UniGetUI.Avalonia.ViewModels.Pages.LogPages; using UniGetUI.PackageOperations; namespace UniGetUI.Avalonia.Views.DialogPages; @@ -9,11 +12,39 @@ public partial class OperationOutputWindow : Window { public OperationOutputWindow(AbstractOperation operation) { - DataContext = new OperationOutputViewModel(operation); + var vm = new OperationOutputViewModel(operation); + DataContext = vm; InitializeComponent(); - ((OperationOutputViewModel)DataContext).OutputLines.CollectionChanged += - (_, _) => Dispatcher.UIThread.Post(OutputScroll.ScrollToEnd, DispatcherPriority.Background); + foreach (var line in vm.OutputLines) + AppendLine(line); + + vm.OutputLines.CollectionChanged += OnOutputLinesChanged; + } + + private void OnOutputLinesChanged(object? sender, NotifyCollectionChangedEventArgs e) + { + Dispatcher.UIThread.Post(() => + { + if (e.Action == NotifyCollectionChangedAction.Reset) + { + OutputText.Inlines?.Clear(); + } + else if (e.NewItems is not null) + { + foreach (LogLineItem item in e.NewItems) + AppendLine(item); + } + OutputScroll.ScrollToEnd(); + }, DispatcherPriority.Background); + } + + private void AppendLine(LogLineItem line) + { + var inlines = OutputText.Inlines ??= new InlineCollection(); + if (inlines.Count > 0) + inlines.Add(new LineBreak()); + inlines.Add(new Run(line.Text) { Foreground = line.Foreground }); } protected override void OnOpened(EventArgs e)