mirror of
https://github.com/sourcegit-scm/sourcegit.git
synced 2024-11-01 13:13:21 -07:00
feature: add buttons to increase/decrease visible lines in text diff view (#145)
This commit is contained in:
parent
8d27690473
commit
1040bbe4d2
8 changed files with 77 additions and 30 deletions
|
@ -12,11 +12,11 @@ namespace SourceGit.Commands
|
||||||
private const string PREFIX_LFS_DEL = "-version https://git-lfs.github.com/spec/";
|
private const string PREFIX_LFS_DEL = "-version https://git-lfs.github.com/spec/";
|
||||||
private const string PREFIX_LFS_MODIFY = " version https://git-lfs.github.com/spec/";
|
private const string PREFIX_LFS_MODIFY = " version https://git-lfs.github.com/spec/";
|
||||||
|
|
||||||
public Diff(string repo, Models.DiffOption opt)
|
public Diff(string repo, Models.DiffOption opt, int unified)
|
||||||
{
|
{
|
||||||
WorkingDirectory = repo;
|
WorkingDirectory = repo;
|
||||||
Context = repo;
|
Context = repo;
|
||||||
Args = $"diff --ignore-cr-at-eol --unified=4 {opt}";
|
Args = $"diff --ignore-cr-at-eol --unified={unified} {opt}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public Models.DiffResult Result()
|
public Models.DiffResult Result()
|
||||||
|
|
|
@ -7,6 +7,9 @@ namespace SourceGit.Converters
|
||||||
public static readonly FuncValueConverter<int, bool> IsGreaterThanZero =
|
public static readonly FuncValueConverter<int, bool> IsGreaterThanZero =
|
||||||
new FuncValueConverter<int, bool>(v => v > 0);
|
new FuncValueConverter<int, bool>(v => v > 0);
|
||||||
|
|
||||||
|
public static readonly FuncValueConverter<int, bool> IsGreaterThanFour =
|
||||||
|
new FuncValueConverter<int, bool>(v => v > 4);
|
||||||
|
|
||||||
public static readonly FuncValueConverter<int, bool> IsZero =
|
public static readonly FuncValueConverter<int, bool> IsZero =
|
||||||
new FuncValueConverter<int, bool>(v => v == 0);
|
new FuncValueConverter<int, bool>(v => v == 0);
|
||||||
|
|
||||||
|
|
|
@ -95,4 +95,6 @@
|
||||||
<StreamGeometry x:Key="Icons.GitFlow.Feature">M939 94v710L512 998 85 805V94h-64A21 21 0 010 73v-0C0 61 10 51 21 51h981c12 0 21 10 21 21v0c0 12-10 21-21 21h-64zm-536 588L512 624l109 58c6 3 13 4 20 3a32 32 0 0026-37l-21-122 88-87c5-5 8-11 9-18a32 32 0 00-27-37l-122-18-54-111a32 32 0 00-57 0l-54 111-122 18c-7 1-13 4-18 9a33 33 0 001 46l88 87-21 122c-1 7-0 14 3 20a32 32 0 0043 14z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.GitFlow.Feature">M939 94v710L512 998 85 805V94h-64A21 21 0 010 73v-0C0 61 10 51 21 51h981c12 0 21 10 21 21v0c0 12-10 21-21 21h-64zm-536 588L512 624l109 58c6 3 13 4 20 3a32 32 0 0026-37l-21-122 88-87c5-5 8-11 9-18a32 32 0 00-27-37l-122-18-54-111a32 32 0 00-57 0l-54 111-122 18c-7 1-13 4-18 9a33 33 0 001 46l88 87-21 122c-1 7-0 14 3 20a32 32 0 0043 14z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.GitFlow.Hotfix">M236 542a32 32 0 109 63l86-12a180 180 0 0022 78l-71 47a32 32 0 1035 53l75-50a176 176 0 00166 40L326 529zM512 16C238 16 16 238 16 512s222 496 496 496 496-222 496-496S786 16 512 16zm0 896c-221 0-400-179-400-400a398 398 0 0186-247l561 561A398 398 0 01512 912zm314-154L690 622a179 179 0 004-29l85 12a32 32 0 109-63l-94-13v-49l94-13a32 32 0 10-9-63l-87 12a180 180 0 00-20-62l71-47A32 32 0 10708 252l-75 50a181 181 0 00-252 10l-115-115A398 398 0 01512 112c221 0 400 179 400 400a398 398 0 01-86 247z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.GitFlow.Hotfix">M236 542a32 32 0 109 63l86-12a180 180 0 0022 78l-71 47a32 32 0 1035 53l75-50a176 176 0 00166 40L326 529zM512 16C238 16 16 238 16 512s222 496 496 496 496-222 496-496S786 16 512 16zm0 896c-221 0-400-179-400-400a398 398 0 0186-247l561 561A398 398 0 01512 912zm314-154L690 622a179 179 0 004-29l85 12a32 32 0 109-63l-94-13v-49l94-13a32 32 0 10-9-63l-87 12a180 180 0 00-20-62l71-47A32 32 0 10708 252l-75 50a181 181 0 00-252 10l-115-115A398 398 0 01512 112c221 0 400 179 400 400a398 398 0 01-86 247z</StreamGeometry>
|
||||||
<StreamGeometry x:Key="Icons.GitFlow.Release">M884 159l-18-18a43 43 0 00-38-12l-235 43a166 166 0 00-101 60L400 349a128 128 0 00-148 47l-120 171a21 21 0 005 29l17 12a128 128 0 00178-32l27-38 124 124-38 27a128 128 0 00-32 178l12 17a21 21 0 0029 5l171-120a128 128 0 0047-148l117-92A166 166 0 00853 431l43-235a43 43 0 00-12-38zm-177 249a64 64 0 110-90 64 64 0 010 90zm-373 312a21 21 0 010 30l-139 139a21 21 0 01-30 0l-30-30a21 21 0 010-30l139-139a21 21 0 0130 0z</StreamGeometry>
|
<StreamGeometry x:Key="Icons.GitFlow.Release">M884 159l-18-18a43 43 0 00-38-12l-235 43a166 166 0 00-101 60L400 349a128 128 0 00-148 47l-120 171a21 21 0 005 29l17 12a128 128 0 00178-32l27-38 124 124-38 27a128 128 0 00-32 178l12 17a21 21 0 0029 5l171-120a128 128 0 0047-148l117-92A166 166 0 00853 431l43-235a43 43 0 00-12-38zm-177 249a64 64 0 110-90 64 64 0 010 90zm-373 312a21 21 0 010 30l-139 139a21 21 0 01-30 0l-30-30a21 21 0 010-30l139-139a21 21 0 0130 0z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Lines.Incr">M408 232C408 210 426 192 448 192h416a40 40 0 110 80H448a40 40 0 01-40-40zM408 512c0-22 18-40 40-40h416a40 40 0 110 80H448A40 40 0 01408 512zM448 752A40 40 0 00448 832h416a40 40 0 100-80H448zM32 480l132 0 0-128 64 0 0 128 132 0 0 64-132 0 0 128-64 0 0-128-132 0Z</StreamGeometry>
|
||||||
|
<StreamGeometry x:Key="Icons.Lines.Decr">M408 232C408 210 426 192 448 192h416a40 40 0 110 80H448a40 40 0 01-40-40zM408 512c0-22 18-40 40-40h416a40 40 0 110 80H448A40 40 0 01408 512zM448 752A40 40 0 00448 832h416a40 40 0 100-80H448zM32 480l328 0 0 64-328 0Z</StreamGeometry>
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
|
|
|
@ -159,6 +159,8 @@
|
||||||
<x:String x:Key="Text.Diff.SideBySide" xml:space="preserve">Side-By-Side Diff</x:String>
|
<x:String x:Key="Text.Diff.SideBySide" xml:space="preserve">Side-By-Side Diff</x:String>
|
||||||
<x:String x:Key="Text.Diff.SyntaxHighlight" xml:space="preserve">Syntax Highlighting</x:String>
|
<x:String x:Key="Text.Diff.SyntaxHighlight" xml:space="preserve">Syntax Highlighting</x:String>
|
||||||
<x:String x:Key="Text.Diff.UseMerger" xml:space="preserve">Open In Merge Tool</x:String>
|
<x:String x:Key="Text.Diff.UseMerger" xml:space="preserve">Open In Merge Tool</x:String>
|
||||||
|
<x:String x:Key="Text.Diff.VisualLines.Decr" xml:space="preserve">Decrease Number of Visible Lines</x:String>
|
||||||
|
<x:String x:Key="Text.Diff.VisualLines.Incr" xml:space="preserve">Increase Number of Visible Lines</x:String>
|
||||||
<x:String x:Key="Text.Diff.Welcome" xml:space="preserve">SELECT FILE TO VIEW CHANGES</x:String>
|
<x:String x:Key="Text.Diff.Welcome" xml:space="preserve">SELECT FILE TO VIEW CHANGES</x:String>
|
||||||
<x:String x:Key="Text.DiffWithMerger" xml:space="preserve">Open In Merge Tool</x:String>
|
<x:String x:Key="Text.DiffWithMerger" xml:space="preserve">Open In Merge Tool</x:String>
|
||||||
<x:String x:Key="Text.Discard" xml:space="preserve">Discard Changes</x:String>
|
<x:String x:Key="Text.Discard" xml:space="preserve">Discard Changes</x:String>
|
||||||
|
|
|
@ -159,6 +159,8 @@
|
||||||
<x:String x:Key="Text.Diff.SideBySide" xml:space="preserve">分列对比</x:String>
|
<x:String x:Key="Text.Diff.SideBySide" xml:space="preserve">分列对比</x:String>
|
||||||
<x:String x:Key="Text.Diff.SyntaxHighlight" xml:space="preserve">语法高亮</x:String>
|
<x:String x:Key="Text.Diff.SyntaxHighlight" xml:space="preserve">语法高亮</x:String>
|
||||||
<x:String x:Key="Text.Diff.UseMerger" xml:space="preserve">使用外部合并工具查看</x:String>
|
<x:String x:Key="Text.Diff.UseMerger" xml:space="preserve">使用外部合并工具查看</x:String>
|
||||||
|
<x:String x:Key="Text.Diff.VisualLines.Decr" xml:space="preserve">减少可见的行数</x:String>
|
||||||
|
<x:String x:Key="Text.Diff.VisualLines.Incr" xml:space="preserve">增加可见的行数</x:String>
|
||||||
<x:String x:Key="Text.Diff.Welcome" xml:space="preserve">请选择需要对比的文件</x:String>
|
<x:String x:Key="Text.Diff.Welcome" xml:space="preserve">请选择需要对比的文件</x:String>
|
||||||
<x:String x:Key="Text.DiffWithMerger" xml:space="preserve">使用外部比对工具查看</x:String>
|
<x:String x:Key="Text.DiffWithMerger" xml:space="preserve">使用外部比对工具查看</x:String>
|
||||||
<x:String x:Key="Text.Discard" xml:space="preserve">放弃更改确认</x:String>
|
<x:String x:Key="Text.Discard" xml:space="preserve">放弃更改确认</x:String>
|
||||||
|
|
|
@ -245,6 +245,9 @@
|
||||||
<Style Selector="Button.icon_button:pointerover /template/ ContentPresenter#PART_ContentPresenter, RepeatButton.icon_button:pointerover /template/ ContentPresenter#PART_ContentPresenter">
|
<Style Selector="Button.icon_button:pointerover /template/ ContentPresenter#PART_ContentPresenter, RepeatButton.icon_button:pointerover /template/ ContentPresenter#PART_ContentPresenter">
|
||||||
<Setter Property="Opacity" Value="1"/>
|
<Setter Property="Opacity" Value="1"/>
|
||||||
</Style>
|
</Style>
|
||||||
|
<Style Selector="Button.icon_button:disabled Path">
|
||||||
|
<Setter Property="Fill" Value="{DynamicResource Brush.FG2}"/>
|
||||||
|
</Style>
|
||||||
|
|
||||||
<Style Selector="Button.flat">
|
<Style Selector="Button.flat">
|
||||||
<Setter Property="BorderThickness" Value="0"/>
|
<Setter Property="BorderThickness" Value="0"/>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
@ -63,6 +64,16 @@ namespace SourceGit.ViewModels
|
||||||
set => SetProperty(ref _syncScrollOffset, value);
|
set => SetProperty(ref _syncScrollOffset, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int Unified
|
||||||
|
{
|
||||||
|
get => _unified;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (SetProperty(ref _unified, value))
|
||||||
|
LoadDiffContent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public DiffContext(string repo, Models.DiffOption option, DiffContext previous = null)
|
public DiffContext(string repo, Models.DiffOption option, DiffContext previous = null)
|
||||||
{
|
{
|
||||||
_repo = repo;
|
_repo = repo;
|
||||||
|
@ -74,9 +85,40 @@ namespace SourceGit.ViewModels
|
||||||
_content = previous._content;
|
_content = previous._content;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LoadDiffContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void IncrUnified()
|
||||||
|
{
|
||||||
|
Unified = _unified + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DecrUnified()
|
||||||
|
{
|
||||||
|
Unified = Math.Max(4, _unified - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OpenExternalMergeTool()
|
||||||
|
{
|
||||||
|
var type = Preference.Instance.ExternalMergeToolType;
|
||||||
|
var exec = Preference.Instance.ExternalMergeToolPath;
|
||||||
|
|
||||||
|
var tool = Models.ExternalMerger.Supported.Find(x => x.Type == type);
|
||||||
|
if (tool == null || !File.Exists(exec))
|
||||||
|
{
|
||||||
|
App.RaiseException(_repo, "Invalid merge tool in preference setting!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var args = tool.Type != 0 ? tool.DiffCmd : Preference.Instance.ExternalMergeToolDiffCmd;
|
||||||
|
Task.Run(() => Commands.MergeTool.OpenForDiff(_repo, exec, args, _option));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LoadDiffContent()
|
||||||
|
{
|
||||||
Task.Run(() =>
|
Task.Run(() =>
|
||||||
{
|
{
|
||||||
var latest = new Commands.Diff(repo, option).Result();
|
var latest = new Commands.Diff(_repo, _option, _unified).Result();
|
||||||
var rs = null as object;
|
var rs = null as object;
|
||||||
|
|
||||||
if (latest.TextDiff != null)
|
if (latest.TextDiff != null)
|
||||||
|
@ -92,15 +134,15 @@ namespace SourceGit.ViewModels
|
||||||
if (IMG_EXTS.Contains(ext))
|
if (IMG_EXTS.Contains(ext))
|
||||||
{
|
{
|
||||||
var imgDiff = new Models.ImageDiff();
|
var imgDiff = new Models.ImageDiff();
|
||||||
if (option.Revisions.Count == 2)
|
if (_option.Revisions.Count == 2)
|
||||||
{
|
{
|
||||||
imgDiff.Old = BitmapFromRevisionFile(repo, option.Revisions[0], oldPath);
|
imgDiff.Old = BitmapFromRevisionFile(_repo, _option.Revisions[0], oldPath);
|
||||||
imgDiff.New = BitmapFromRevisionFile(repo, option.Revisions[1], oldPath);
|
imgDiff.New = BitmapFromRevisionFile(_repo, _option.Revisions[1], oldPath);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var fullPath = Path.Combine(repo, _option.Path);
|
var fullPath = Path.Combine(_repo, _option.Path);
|
||||||
imgDiff.Old = BitmapFromRevisionFile(repo, "HEAD", oldPath);
|
imgDiff.Old = BitmapFromRevisionFile(_repo, "HEAD", oldPath);
|
||||||
imgDiff.New = File.Exists(fullPath) ? new Bitmap(fullPath) : null;
|
imgDiff.New = File.Exists(fullPath) ? new Bitmap(fullPath) : null;
|
||||||
}
|
}
|
||||||
rs = imgDiff;
|
rs = imgDiff;
|
||||||
|
@ -108,15 +150,15 @@ namespace SourceGit.ViewModels
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var binaryDiff = new Models.BinaryDiff();
|
var binaryDiff = new Models.BinaryDiff();
|
||||||
if (option.Revisions.Count == 2)
|
if (_option.Revisions.Count == 2)
|
||||||
{
|
{
|
||||||
binaryDiff.OldSize = new Commands.QueryFileSize(repo, oldPath, option.Revisions[0]).Result();
|
binaryDiff.OldSize = new Commands.QueryFileSize(_repo, oldPath, _option.Revisions[0]).Result();
|
||||||
binaryDiff.NewSize = new Commands.QueryFileSize(repo, _option.Path, option.Revisions[1]).Result();
|
binaryDiff.NewSize = new Commands.QueryFileSize(_repo, _option.Path, _option.Revisions[1]).Result();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var fullPath = Path.Combine(repo, _option.Path);
|
var fullPath = Path.Combine(_repo, _option.Path);
|
||||||
binaryDiff.OldSize = new Commands.QueryFileSize(repo, oldPath, "HEAD").Result();
|
binaryDiff.OldSize = new Commands.QueryFileSize(_repo, oldPath, "HEAD").Result();
|
||||||
binaryDiff.NewSize = File.Exists(fullPath) ? new FileInfo(fullPath).Length : 0;
|
binaryDiff.NewSize = File.Exists(fullPath) ? new FileInfo(fullPath).Length : 0;
|
||||||
}
|
}
|
||||||
rs = binaryDiff;
|
rs = binaryDiff;
|
||||||
|
@ -146,22 +188,6 @@ namespace SourceGit.ViewModels
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OpenExternalMergeTool()
|
|
||||||
{
|
|
||||||
var type = Preference.Instance.ExternalMergeToolType;
|
|
||||||
var exec = Preference.Instance.ExternalMergeToolPath;
|
|
||||||
|
|
||||||
var tool = Models.ExternalMerger.Supported.Find(x => x.Type == type);
|
|
||||||
if (tool == null || !File.Exists(exec))
|
|
||||||
{
|
|
||||||
App.RaiseException(_repo, "Invalid merge tool in preference setting!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var args = tool.Type != 0 ? tool.DiffCmd : Preference.Instance.ExternalMergeToolDiffCmd;
|
|
||||||
Task.Run(() => Commands.MergeTool.OpenForDiff(_repo, exec, args, _option));
|
|
||||||
}
|
|
||||||
|
|
||||||
private Bitmap BitmapFromRevisionFile(string repo, string revision, string file)
|
private Bitmap BitmapFromRevisionFile(string repo, string revision, string file)
|
||||||
{
|
{
|
||||||
var stream = Commands.QueryFileContent.Run(repo, revision, file);
|
var stream = Commands.QueryFileContent.Run(repo, revision, file);
|
||||||
|
@ -181,5 +207,6 @@ namespace SourceGit.ViewModels
|
||||||
private bool _isTextDiff = false;
|
private bool _isTextDiff = false;
|
||||||
private object _content = null;
|
private object _content = null;
|
||||||
private Vector _syncScrollOffset = Vector.Zero;
|
private Vector _syncScrollOffset = Vector.Zero;
|
||||||
|
private int _unified = 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,14 @@
|
||||||
|
|
||||||
<!-- Toolbar Buttons -->
|
<!-- Toolbar Buttons -->
|
||||||
<StackPanel Grid.Column="3" Margin="8,0,0,0" Orientation="Horizontal" VerticalAlignment="Center">
|
<StackPanel Grid.Column="3" Margin="8,0,0,0" Orientation="Horizontal" VerticalAlignment="Center">
|
||||||
|
<Button Classes="icon_button" Width="32" Command="{Binding IncrUnified}" IsVisible="{Binding IsTextDiff}" 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="32" Command="{Binding DecrUnified}" IsVisible="{Binding IsTextDiff}" ToolTip.Tip="{DynamicResource Text.Diff.VisualLines.Decr}" IsEnabled="{Binding Unified, Converter={x:Static c:IntConverters.IsGreaterThanFour}}">
|
||||||
|
<Path Width="12" Height="12" Stretch="Uniform" Margin="0,6,0,0" Data="{StaticResource Icons.Lines.Decr}"/>
|
||||||
|
</Button>
|
||||||
|
|
||||||
<ToggleButton Classes="line_path"
|
<ToggleButton Classes="line_path"
|
||||||
Width="32" Height="18"
|
Width="32" Height="18"
|
||||||
Background="Transparent"
|
Background="Transparent"
|
||||||
|
|
Loading…
Reference in a new issue