From d52243ccd173cbc7e75c6f9d0db83b733ab5802e Mon Sep 17 00:00:00 2001 From: mika kuns Date: Fri, 5 Jun 2026 11:00:19 +0200 Subject: [PATCH] refactor(ui): render worktree modal diff via canonical DiffLinesView Co-Authored-By: Claude Sonnet 4.6 --- .../DiffLineKindToBrushConverter.cs | 30 ------------------- .../Modals/WorktreeModalViewModel.cs | 25 ++-------------- .../Views/Modals/WorktreeModalView.axaml | 17 ++--------- 3 files changed, 5 insertions(+), 67 deletions(-) delete mode 100644 src/ClaudeDo.Ui/Converters/DiffLineKindToBrushConverter.cs diff --git a/src/ClaudeDo.Ui/Converters/DiffLineKindToBrushConverter.cs b/src/ClaudeDo.Ui/Converters/DiffLineKindToBrushConverter.cs deleted file mode 100644 index 9f9a240..0000000 --- a/src/ClaudeDo.Ui/Converters/DiffLineKindToBrushConverter.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Globalization; -using Avalonia.Data.Converters; -using Avalonia.Media; -using ClaudeDo.Ui.ViewModels.Modals; - -namespace ClaudeDo.Ui.Converters; - -public sealed class DiffLineKindToBrushConverter : IValueConverter -{ - private static readonly ISolidColorBrush Added = new SolidColorBrush(Color.Parse("#66BB6A")); - private static readonly ISolidColorBrush Removed = new SolidColorBrush(Color.Parse("#EF5350")); - private static readonly ISolidColorBrush Hunk = new SolidColorBrush(Color.Parse("#42A5F5")); - private static readonly ISolidColorBrush Header = new SolidColorBrush(Color.Parse("#9E9E9E")); - private static readonly ISolidColorBrush Default = new SolidColorBrush(Color.Parse("#CFD8DC")); - - public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) => - value is WorktreeDiffLineKind kind - ? kind switch - { - WorktreeDiffLineKind.Added => Added, - WorktreeDiffLineKind.Removed => Removed, - WorktreeDiffLineKind.Hunk => Hunk, - WorktreeDiffLineKind.Header => Header, - _ => Default, - } - : Default; - - public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - => throw new NotSupportedException(); -} diff --git a/src/ClaudeDo.Ui/ViewModels/Modals/WorktreeModalViewModel.cs b/src/ClaudeDo.Ui/ViewModels/Modals/WorktreeModalViewModel.cs index de38b6d..eaccea7 100644 --- a/src/ClaudeDo.Ui/ViewModels/Modals/WorktreeModalViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/Modals/WorktreeModalViewModel.cs @@ -5,14 +5,6 @@ using ClaudeDo.Data.Git; namespace ClaudeDo.Ui.ViewModels.Modals; -public enum WorktreeDiffLineKind { Header, Hunk, Added, Removed, Context } - -public sealed partial class WorktreeDiffLineViewModel : ViewModelBase -{ - public required string Text { get; init; } - public required WorktreeDiffLineKind Kind { get; init; } -} - public sealed partial class WorktreeNodeViewModel : ViewModelBase { public required string Name { get; init; } @@ -28,7 +20,7 @@ public sealed partial class WorktreeModalViewModel : ViewModelBase private readonly GitService _git; public ObservableCollection Root { get; } = new(); - public ObservableCollection SelectedFileDiffLines { get; } = new(); + public ObservableCollection SelectedFileDiffLines { get; } = new(); [ObservableProperty] private string _worktreePath = ""; [ObservableProperty] private string? _baseCommit; @@ -64,19 +56,8 @@ public sealed partial class WorktreeModalViewModel : ViewModelBase return; } - foreach (var line in diff.Split('\n')) - { - var kind = line switch - { - _ when line.StartsWith("+++") || line.StartsWith("---") => WorktreeDiffLineKind.Header, - _ when line.StartsWith("@@") => WorktreeDiffLineKind.Hunk, - _ when line.StartsWith('+') => WorktreeDiffLineKind.Added, - _ when line.StartsWith('-') => WorktreeDiffLineKind.Removed, - _ when line.StartsWith("diff ") || line.StartsWith("index ") || line.StartsWith("\\ ") => WorktreeDiffLineKind.Header, - _ => WorktreeDiffLineKind.Context, - }; - SelectedFileDiffLines.Add(new WorktreeDiffLineViewModel { Text = line, Kind = kind }); - } + foreach (var line in UnifiedDiffParser.Flatten(UnifiedDiffParser.Parse(diff))) + SelectedFileDiffLines.Add(line); } [RelayCommand] diff --git a/src/ClaudeDo.Ui/Views/Modals/WorktreeModalView.axaml b/src/ClaudeDo.Ui/Views/Modals/WorktreeModalView.axaml index e79a9ca..d45d4fc 100644 --- a/src/ClaudeDo.Ui/Views/Modals/WorktreeModalView.axaml +++ b/src/ClaudeDo.Ui/Views/Modals/WorktreeModalView.axaml @@ -2,6 +2,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="using:ClaudeDo.Ui.ViewModels.Modals" xmlns:converters="using:ClaudeDo.Ui.Converters" + xmlns:ctl="using:ClaudeDo.Ui.Views.Controls" xmlns:loc="using:ClaudeDo.Ui.Localization" x:Class="ClaudeDo.Ui.Views.Modals.WorktreeModalView" x:DataType="vm:WorktreeModalViewModel" @@ -16,10 +17,6 @@ CanResize="True" TransparencyLevelHint="AcrylicBlur"> - - - - @@ -89,17 +86,7 @@ HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Margin="4,0,8,8"> - - - - - - - +