From 38ad2a0701d9d23ef192534a9b9228c0dde8dfc4 Mon Sep 17 00:00:00 2001 From: GabrielDuf Date: Mon, 11 May 2026 10:51:13 -0400 Subject: [PATCH 1/2] Improved operation input --- .../DialogPages/OperationViewModel.cs | 4 +- .../DialogPages/OperationFailedDialog.axaml | 20 +++------- .../OperationFailedDialog.axaml.cs | 16 +++----- .../DialogPages/OperationOutputWindow.axaml | 22 ++++------- .../OperationOutputWindow.axaml.cs | 37 +++++++++++++++++-- 5 files changed, 55 insertions(+), 44 deletions(-) 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..ebd4c589f 100644 --- a/src/UniGetUI.Avalonia/Views/DialogPages/OperationFailedDialog.axaml +++ b/src/UniGetUI.Avalonia/Views/DialogPages/OperationFailedDialog.axaml @@ -1,7 +1,6 @@ - - - - - - - + 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) From 4b6588fce3f0795dc5c2ab62d575a6f4af7377b8 Mon Sep 17 00:00:00 2001 From: GabrielDuf Date: Mon, 11 May 2026 11:02:32 -0400 Subject: [PATCH 2/2] remove max width --- .../Views/DialogPages/OperationFailedDialog.axaml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/UniGetUI.Avalonia/Views/DialogPages/OperationFailedDialog.axaml b/src/UniGetUI.Avalonia/Views/DialogPages/OperationFailedDialog.axaml index ebd4c589f..00cd0955e 100644 --- a/src/UniGetUI.Avalonia/Views/DialogPages/OperationFailedDialog.axaml +++ b/src/UniGetUI.Avalonia/Views/DialogPages/OperationFailedDialog.axaml @@ -4,7 +4,6 @@ x:Class="UniGetUI.Avalonia.Views.DialogPages.OperationFailedDialog" Width="800" MinWidth="500" Height="550" MinHeight="300" - MaxWidth="800" CanResize="True" ShowInTaskbar="False" Background="{DynamicResource AppDialogBackground}"