feature: supports to view image diff when lfs object points to a image

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo 2025-06-04 20:53:42 +08:00
parent 06a77502bc
commit ed496a41fb
No known key found for this signature in database
6 changed files with 171 additions and 24 deletions

View file

@ -207,7 +207,10 @@ namespace SourceGit.ViewModels
}
else if (latest.IsLFS)
{
rs = latest.LFSDiff;
if (IMG_EXTS.Contains(Path.GetExtension(_option.Path) ?? ".invalid"))
rs = new LFSImageDiff(_repo, latest.LFSDiff);
else
rs = latest.LFSDiff;
}
else
{

View file

@ -0,0 +1,49 @@
using System.Threading.Tasks;
using Avalonia.Media.Imaging;
using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
namespace SourceGit.ViewModels
{
public class LFSImageDiff : ObservableObject
{
public Models.LFSDiff LFS
{
get;
}
public Models.ImageDiff Image
{
get => _image;
private set => SetProperty(ref _image, value);
}
public LFSImageDiff(string repo, Models.LFSDiff lfs)
{
LFS = lfs;
Task.Run(() =>
{
var img = new Models.ImageDiff();
(img.Old, img.OldFileSize) = BitmapFromLFSObject(repo, lfs.Old);
(img.New, img.NewFileSize) = BitmapFromLFSObject(repo, lfs.New);
Dispatcher.UIThread.Invoke(() => Image = img);
});
}
private (Bitmap, long) BitmapFromLFSObject(string repo, Models.LFSObject lfs)
{
if (string.IsNullOrEmpty(lfs.Oid) || lfs.Size == 0)
return (null, 0);
var stream = Commands.QueryFileContent.FromLFS(repo, lfs.Oid, lfs.Size);
var size = stream.Length;
return size > 0 ? (new Bitmap(stream), size) : (null, size);
}
private Models.ImageDiff _image;
}
}