/
vasiukoff
/
sg
Обзор
Документация
Войти
/
vasiukoff
/
sg
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/Views/DiffView.axaml
359 строк
20 KB
leo
ux: remove `Use monospace font only in text editor` option in `Preferences` and make it default (also the only)
15 окт 2025, 12:39
15 окт 2025, 12:39
28344a7
Код
Авторство
О чём код?
<UserControl xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="using:SourceGit.Models" xmlns:vm="using:SourceGit.ViewModels" xmlns:v="using:SourceGit.Views" xmlns:c="using:SourceGit.Converters" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="SourceGit.Views.DiffView" x:DataType="vm:DiffContext"> <Border BorderThickness="1" BorderBrush="{DynamicResource Brush.Border2}" Background="{DynamicResource Brush.Window}"> <Grid RowDefinitions="26,*"> <!-- Toolbar --> <Border Grid.Row="0" BorderThickness="0,0,0,1" BorderBrush="{DynamicResource Brush.Border2}"> <Grid ColumnDefinitions="Auto,Auto,*,Auto"> <!-- File Icon --> <Path Grid.Column="0" Width="12" Height="12" Data="{StaticResource Icons.File}" Margin="8,0,0,0"/> <!-- File Mode Change --> <Border Grid.Column="1" Margin="4,0,0,0" Height="18" CornerRadius="4" VerticalAlignment="Center" Background="{DynamicResource Brush.Badge}" IsVisible="{Binding FileModeChange, Converter={x:Static StringConverters.IsNotNullOrEmpty}}" ToolTip.Tip="{DynamicResource Text.Diff.FileModeChanged}"> <TextBlock FontSize="10" HorizontalAlignment="Center" Margin="4,0" Text="{Binding FileModeChange}" Foreground="{DynamicResource Brush.BadgeFG}"/> </Border> <!-- Title --> <TextBlock Grid.Column="2" Margin="4,0,0,0" Text="{Binding Title}" ToolTip.Tip="{Binding Title}" FontSize="11" TextTrimming="CharacterEllipsis"/> <!-- Toolbar Buttons --> <StackPanel Grid.Column="3" Margin="8,0,0,0" Orientation="Horizontal" VerticalAlignment="Center"> <Button Classes="icon_button" Width="28" Click="OnGotoFirstChange" IsVisible="{Binding IsTextDiff}" HotKey="{OnPlatform Ctrl+Alt+Home, macOS=⌘+Alt+Home}"> <ToolTip.Tip> <TextBlock> <Run Text="{DynamicResource Text.Diff.First}"/> <Run Text=" "/> <Run Text="{OnPlatform Ctrl+Alt+Home, macOS=⌘+⌥+Home}" FontSize="11" Foreground="{DynamicResource MenuFlyoutItemKeyboardAcceleratorTextForeground}"/> </TextBlock> </ToolTip.Tip> <Path Width="12" Height="12" Stretch="Uniform" Margin="0,6,0,0" Data="{StaticResource Icons.Top}"/> </Button> <Button Classes="icon_button" Width="28" Click="OnGotoPrevChange" IsVisible="{Binding IsTextDiff}" HotKey="{OnPlatform Ctrl+Alt+Up, macOS=⌘+Alt+Up}"> <ToolTip.Tip> <TextBlock> <Run Text="{DynamicResource Text.Diff.Prev}"/> <Run Text=" "/> <Run Text="{OnPlatform Ctrl+Alt+Up, macOS=⌘+⌥+Up}" FontSize="11" Foreground="{DynamicResource MenuFlyoutItemKeyboardAcceleratorTextForeground}"/> </TextBlock> </ToolTip.Tip> <Path Width="12" Height="12" Stretch="Uniform" Margin="0,6,0,0" Data="{StaticResource Icons.Up}"/> </Button> <ContentControl Content="{Binding Content, Mode=OneWay}" IsVisible="{Binding IsTextDiff}"> <ContentControl.DataTemplates> <DataTemplate DataType="vm:TextDiffContext"> <TextBlock Margin="0,0,0,0" FontSize="11" Text="{Binding BlockNavigation.Indicator}"/> </DataTemplate> </ContentControl.DataTemplates> </ContentControl> <Button Classes="icon_button" Width="28" Click="OnGotoNextChange" IsVisible="{Binding IsTextDiff}" HotKey="{OnPlatform Ctrl+Alt+Down, macOS=⌘+Alt+Down}"> <ToolTip.Tip> <TextBlock> <Run Text="{DynamicResource Text.Diff.Next}"/> <Run Text=" "/> <Run Text="{OnPlatform Ctrl+Alt+Down, macOS=⌘+⌥+Down}" FontSize="11" Foreground="{DynamicResource MenuFlyoutItemKeyboardAcceleratorTextForeground}"/> </TextBlock> </ToolTip.Tip> <Path Width="12" Height="12" Stretch="Uniform" Margin="0,6,0,0" Data="{StaticResource Icons.Down}"/> </Button> <Button Classes="icon_button" Width="28" Click="OnGotoLastChange" IsVisible="{Binding IsTextDiff}" HotKey="{OnPlatform Ctrl+Alt+End, macOS=⌘+Alt+End}"> <ToolTip.Tip> <TextBlock> <Run Text="{DynamicResource Text.Diff.Last}"/> <Run Text=" "/> <Run Text="{OnPlatform Ctrl+Alt+End, macOS=⌘+⌥+End}" FontSize="11" Foreground="{DynamicResource MenuFlyoutItemKeyboardAcceleratorTextForeground}"/> </TextBlock> </ToolTip.Tip> <Path Width="12" Height="12" Stretch="Uniform" Margin="0,6,0,0" Data="{StaticResource Icons.Bottom}"/> </Button> <Button Classes="icon_button" Width="28" Command="{Binding IncrUnified}" IsVisible="{Binding IsTextDiff}" IsEnabled="{Binding ShowEntireFile, Mode=OneWay, Converter={x:Static BoolConverters.Not}}" ToolTip.Tip="{DynamicResource Text.Diff.VisualLines.Incr}"> <Path Width="12" Height="12" Stretch="Uniform" Margin="0,6,0,0" Data="{StaticResource Icons.Lines.Incr}"/> </Button> <Button Classes="icon_button" Width="28" Command="{Binding DecrUnified}" IsVisible="{Binding IsTextDiff}" ToolTip.Tip="{DynamicResource Text.Diff.VisualLines.Decr}"> <Button.IsEnabled> <MultiBinding Converter="{x:Static BoolConverters.And}"> <Binding Path="UnifiedLines" Mode="OneWay" Converter="{x:Static c:IntConverters.IsGreaterThanFour}"/> <Binding Path="ShowEntireFile" Mode="OneWay" Converter="{x:Static BoolConverters.Not}"/> </MultiBinding> </Button.IsEnabled> <Path Width="12" Height="12" Stretch="Uniform" Margin="0,6,0,0" Data="{StaticResource Icons.Lines.Decr}"/> </Button> <ToggleButton Classes="line_path" Width="28" IsChecked="{Binding ShowEntireFile, Mode=TwoWay}" IsVisible="{Binding IsTextDiff}" ToolTip.Tip="{DynamicResource Text.Diff.VisualLines.All}"> <Path Width="13" Height="13" Data="{StaticResource Icons.Lines.All}" Margin="0,3,0,0"/> </ToggleButton> <ToggleButton Classes="line_path" Width="28" Background="Transparent" IsChecked="{Binding Source={x:Static vm:Preferences.Instance}, Path=UseSyntaxHighlighting, Mode=TwoWay}" IsVisible="{Binding IsTextDiff}" ToolTip.Tip="{DynamicResource Text.Diff.SyntaxHighlight}"> <Path Width="13" Height="13" Data="{StaticResource Icons.SyntaxHighlight}" Margin="0,3,0,0"/> </ToggleButton> <ToggleButton Classes="line_path" Width="28" IsChecked="{Binding Source={x:Static vm:Preferences.Instance}, Path=EnableDiffViewWordWrap, Mode=TwoWay}" ToolTip.Tip="{DynamicResource Text.Diff.ToggleWordWrap}"> <ToggleButton.IsVisible> <MultiBinding Converter="{x:Static BoolConverters.And}"> <Binding Path="IsTextDiff" Mode="OneWay"/> <Binding Path="UseSideBySide" Mode="OneWay" Converter="{x:Static BoolConverters.Not}"/> </MultiBinding> </ToggleButton.IsVisible> <Path Width="12" Height="12" Data="{StaticResource Icons.WordWrap}" Margin="0,2,0,0"/> </ToggleButton> <ToggleButton Classes="line_path" Width="28" IsChecked="{Binding IgnoreWhitespace, Mode=TwoWay}" ToolTip.Tip="{DynamicResource Text.Diff.IgnoreWhitespace}"> <Path Width="14" Height="14" Stretch="Uniform" Data="{StaticResource Icons.Whitespace}"/> </ToggleButton> <ToggleButton Classes="line_path" Width="28" IsChecked="{Binding Source={x:Static vm:Preferences.Instance}, Path=ShowHiddenSymbolsInDiffView, Mode=TwoWay}" IsVisible="{Binding IsTextDiff}" ToolTip.Tip="{DynamicResource Text.Diff.ShowHiddenSymbols}"> <Path Width="11" Height="11" Stretch="Uniform" Data="{StaticResource Icons.HiddenSymbol}" Margin="0,1,0,0"/> </ToggleButton> <ToggleButton Classes="line_path" Width="28" Height="18" IsChecked="{Binding UseSideBySide, Mode=TwoWay}" IsVisible="{Binding IsTextDiff}" ToolTip.Tip="{DynamicResource Text.Diff.SideBySide}"> <Path Width="12" Height="12" Data="{StaticResource Icons.Layout}" Margin="0,2,0,0"/> </ToggleButton> <Button Classes="icon_button" Width="28" Command="{Binding OpenExternalMergeTool}" HotKey="{OnPlatform Ctrl+Shift+D, macOS=⌘+Shift+D}"> <ToolTip.Tip> <TextBlock> <Run Text="{DynamicResource Text.Diff.UseMerger}"/> <Run Text=" "/> <Run Text="{OnPlatform Ctrl+Shift+D, macOS=⌘+⇧+D}" FontSize="11" Foreground="{DynamicResource MenuFlyoutItemKeyboardAcceleratorTextForeground}"/> </TextBlock> </ToolTip.Tip> <Path Width="12" Height="12" Stretch="Uniform" Data="{StaticResource Icons.OpenWith}"/> </Button> </StackPanel> </Grid> </Border> <!-- Diff Contents --> <ContentControl Grid.Row="1" Content="{Binding Content}"> <ContentControl.DataTemplates> <!-- Binary Diff --> <DataTemplate DataType="m:BinaryDiff"> <StackPanel Orientation="Vertical" VerticalAlignment="Center"> <TextBlock Text="{DynamicResource Text.Diff.Binary}" Margin="0,0,0,32" FontSize="18" FontWeight="Bold" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Center"/> <Path Width="64" Height="64" Data="{StaticResource Icons.Binary}" Fill="{DynamicResource Brush.FG2}"/> <Grid Margin="0,16,0,0" HorizontalAlignment="Center" RowDefinitions="32,32" ColumnDefinitions="Auto,Auto"> <Border Grid.Row="0" Grid.Column="0" Height="16" Background="{DynamicResource Brush.Badge}" CornerRadius="8" VerticalAlignment="Center"> <TextBlock Text="{DynamicResource Text.Diff.Old}" Margin="8,0" FontSize="10" Foreground="{DynamicResource Brush.BadgeFG}"/> </Border> <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding OldSize, Converter={x:Static c:LongConverters.ToFileSize}}" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Right" FontSize="16" Margin="8,0"/> <Border Grid.Row="1" Grid.Column="0" Height="16" Background="Green" CornerRadius="8" VerticalAlignment="Center"> <TextBlock Text="{DynamicResource Text.Diff.New}" Margin="8,0" FontSize="10" Foreground="White"/> </Border> <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding NewSize, Converter={x:Static c:LongConverters.ToFileSize}}" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Right" FontSize="16" Margin="8,0"/> </Grid> </StackPanel> </DataTemplate> <!-- LFS Diff --> <DataTemplate DataType="m:LFSDiff"> <StackPanel Orientation="Vertical" VerticalAlignment="Center"> <TextBlock Text="{DynamicResource Text.Diff.LFS}" Margin="0,0,0,32" FontSize="18" FontWeight="Bold" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Center"/> <Path Width="64" Height="64" Data="{StaticResource Icons.LFS}" Fill="{DynamicResource Brush.FG2}"/> <Grid Margin="0,16,0,0" HorizontalAlignment="Center" RowDefinitions="32,32" ColumnDefinitions="Auto,Auto"> <Border Grid.Row="0" Grid.Column="0" Height="16" Background="{DynamicResource Brush.Badge}" CornerRadius="8" VerticalAlignment="Center"> <TextBlock Text="{DynamicResource Text.Diff.Old}" Margin="8,0" FontSize="10" Foreground="{DynamicResource Brush.BadgeFG}"/> </Border> <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Old.Size, Converter={x:Static c:LongConverters.ToFileSize}}" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Right" FontSize="16" Margin="8,0"/> <Border Grid.Row="1" Grid.Column="0" Height="16" Background="Green" CornerRadius="8" VerticalAlignment="Center"> <TextBlock Text="{DynamicResource Text.Diff.New}" Margin="8,0" FontSize="10" Foreground="White"/> </Border> <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding New.Size, Converter={x:Static c:LongConverters.ToFileSize}}" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Right" FontSize="16" Margin="8,0"/> </Grid> </StackPanel> </DataTemplate> <!-- Submodule Diff --> <DataTemplate DataType="m:SubmoduleDiff"> <Grid Background="{DynamicResource Brush.Contents}" RowDefinitions="Auto,*"> <TextBlock Grid.Row="0" Text="{DynamicResource Text.Diff.Submodule}" Margin="8,8,8,8" FontSize="18" FontWeight="Bold" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Center"/> <ScrollViewer Grid.Row="1" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto"> <StackPanel Orientation="Vertical" Margin="8,0"> <Border Height="16" HorizontalAlignment="Center" Background="Red" CornerRadius="8" IsVisible="{Binding New, Converter={x:Static ObjectConverters.IsNull}}"> <TextBlock Text="{DynamicResource Text.Diff.Submodule.Deleted}" Margin="8,0" FontSize="10" Foreground="White"/> </Border> <Border Margin="0,8,0,0" IsVisible="{Binding Old, Converter={x:Static ObjectConverters.IsNotNull}}"> <ContentControl Content="{Binding Old}"> <ContentControl.DataTemplates> <DataTemplate DataType="m:RevisionSubmodule"> <Border Margin="0,0,0,8" BorderThickness="1" BorderBrush="{DynamicResource Brush.Border1}" Background="{DynamicResource Brush.Window}"> <v:CommitBaseInfo MaxHeight="256" Margin="0,0,0,4" Content="{Binding Commit}" FullMessage="{Binding FullMessage}"/> </Border> </DataTemplate> </ContentControl.DataTemplates> </ContentControl> </Border> <Path Width="16" Height="16" Data="{StaticResource Icons.DoubleDown}" HorizontalAlignment="Center"> <Path.IsVisible> <MultiBinding Converter="{x:Static BoolConverters.And}"> <Binding Path="Old" Converter="{x:Static ObjectConverters.IsNotNull}"/> <Binding Path="New" Converter="{x:Static ObjectConverters.IsNotNull}"/> </MultiBinding> </Path.IsVisible> </Path> <Border Height="16" HorizontalAlignment="Center" Background="Green" CornerRadius="8" IsVisible="{Binding Old, Converter={x:Static ObjectConverters.IsNull}}"> <TextBlock Text="{DynamicResource Text.Diff.Submodule.New}" Margin="8,0" FontSize="10" Foreground="White"/> </Border> <Border Margin="0,8,0,0" BorderThickness="1" BorderBrush="Green" Background="{DynamicResource Brush.Window}" IsVisible="{Binding New, Converter={x:Static ObjectConverters.IsNotNull}}"> <ContentControl Content="{Binding New}"> <ContentControl.DataTemplates> <DataTemplate DataType="m:RevisionSubmodule"> <v:CommitBaseInfo MaxHeight="256" Margin="0,0,0,4" Content="{Binding Commit}" FullMessage="{Binding FullMessage}"/> </DataTemplate> </ContentControl.DataTemplates> </ContentControl> </Border> </StackPanel> </ScrollViewer> </Grid> </DataTemplate> <!-- Image Diff --> <DataTemplate DataType="m:ImageDiff"> <v:ImageDiffView/> </DataTemplate> <!-- LFS Image Diff --> <DataTemplate DataType="vm:LFSImageDiff"> <TabControl Margin="0,8,0,0" SelectedIndex="{Binding Source={x:Static vm:Preferences.Instance}, Path=LFSImageActiveIdx, Mode=TwoWay}"> <TabControl.Styles> <Style Selector="TabControl /template/ ItemsPresenter#PART_ItemsPresenter > WrapPanel"> <Setter Property="HorizontalAlignment" Value="Center"/> </Style> </TabControl.Styles> <TabItem> <TabItem.Header> <TextBlock Text="LFS" FontWeight="Bold"/> </TabItem.Header> <ContentControl Content="{Binding LFS}"/> </TabItem> <TabItem> <TabItem.Header> <TextBlock Text="IMAGE" FontWeight="Bold"/> </TabItem.Header> <ContentControl Content="{Binding Image}"/> </TabItem> </TabControl> </DataTemplate> <!-- Text Diff --> <DataTemplate DataType="vm:TextDiffContext"> <v:TextDiffView SelectedChunk="{Binding SelectedChunk, Mode=OneWay}"/> </DataTemplate> <!-- Empty or only EOL changes --> <DataTemplate DataType="m:NoOrEOLChange"> <StackPanel Orientation="Vertical" VerticalAlignment="Center"> <Path Width="64" Height="64" Data="{StaticResource Icons.Check}" Fill="{DynamicResource Brush.FG2}"/> <TextBlock Margin="0,16,0,0" Text="{DynamicResource Text.Diff.NoChange}" FontSize="18" FontWeight="Bold" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Center"/> </StackPanel> </DataTemplate> </ContentControl.DataTemplates> </ContentControl> </Grid> </Border> </UserControl>