From ac55bed812282a6b31b213fcf04b6b950f5cb12a Mon Sep 17 00:00:00 2001 From: leo Date: Fri, 6 Jun 2025 10:07:58 +0800 Subject: [PATCH] enhance: revision file viewer - show current file path - add a toggle button to use global syntax highlighting setting (sometimes TextMateSharp will crash this app) Signed-off-by: leo --- src/ViewModels/CommitDetail.cs | 12 ++++++- src/Views/RevisionFileContentViewer.axaml | 1 + src/Views/RevisionFileContentViewer.axaml.cs | 34 ++++++++++++++++---- src/Views/RevisionFileTreeView.axaml.cs | 13 +++----- src/Views/RevisionFiles.axaml | 28 +++++++++++++++- 5 files changed, 71 insertions(+), 17 deletions(-) diff --git a/src/ViewModels/CommitDetail.cs b/src/ViewModels/CommitDetail.cs index 2fe85653..02db9b4f 100644 --- a/src/ViewModels/CommitDetail.cs +++ b/src/ViewModels/CommitDetail.cs @@ -105,10 +105,16 @@ namespace SourceGit.ViewModels } } + public string ViewRevisionFilePath + { + get => _viewRevisionFilePath; + private set => SetProperty(ref _viewRevisionFilePath, value); + } + public object ViewRevisionFileContent { get => _viewRevisionFileContent; - set => SetProperty(ref _viewRevisionFileContent, value); + private set => SetProperty(ref _viewRevisionFileContent, value); } public string RevisionFileSearchFilter @@ -189,10 +195,13 @@ namespace SourceGit.ViewModels { if (file == null) { + ViewRevisionFilePath = string.Empty; ViewRevisionFileContent = null; return; } + ViewRevisionFilePath = file.Path; + switch (file.Type) { case Models.ObjectType.Blob: @@ -893,6 +902,7 @@ namespace SourceGit.ViewModels private List _selectedChanges = null; private string _searchChangeFilter = string.Empty; private DiffContext _diffContext = null; + private string _viewRevisionFilePath = string.Empty; private object _viewRevisionFileContent = null; private CancellationTokenSource _cancellationSource = null; private bool _requestingRevisionFiles = false; diff --git a/src/Views/RevisionFileContentViewer.axaml b/src/Views/RevisionFileContentViewer.axaml index 8eaef3a3..422e9169 100644 --- a/src/Views/RevisionFileContentViewer.axaml +++ b/src/Views/RevisionFileContentViewer.axaml @@ -23,6 +23,7 @@ diff --git a/src/Views/RevisionFileContentViewer.axaml.cs b/src/Views/RevisionFileContentViewer.axaml.cs index 16f4fc83..59f2d33d 100644 --- a/src/Views/RevisionFileContentViewer.axaml.cs +++ b/src/Views/RevisionFileContentViewer.axaml.cs @@ -24,6 +24,15 @@ namespace SourceGit.Views set => SetValue(TabWidthProperty, value); } + public static readonly StyledProperty UseSyntaxHighlightingProperty = + AvaloniaProperty.Register(nameof(UseSyntaxHighlighting)); + + public bool UseSyntaxHighlighting + { + get => GetValue(UseSyntaxHighlightingProperty); + set => SetValue(UseSyntaxHighlightingProperty, value); + } + protected override Type StyleKeyOverride => typeof(TextEditor); public RevisionTextFileView() : base(new TextArea(), new TextDocument()) @@ -72,8 +81,8 @@ namespace SourceGit.Views if (DataContext is Models.RevisionTextFile source) { - UpdateTextMate(); Text = source.Content; + Models.TextMateHelper.SetGrammarByFileName(_textMate, source.FileName); } else { @@ -86,9 +95,9 @@ namespace SourceGit.Views base.OnPropertyChanged(change); if (change.Property == TabWidthProperty) - { Options.IndentationSize = TabWidth; - } + else if (change.Property == UseSyntaxHighlightingProperty) + UpdateTextMate(); } private void OnTextViewContextRequested(object sender, ContextRequestedEventArgs e) @@ -124,11 +133,22 @@ namespace SourceGit.Views private void UpdateTextMate() { - if (_textMate == null) - _textMate = Models.TextMateHelper.CreateForEditor(this); + if (UseSyntaxHighlighting) + { + if (_textMate == null) + _textMate = Models.TextMateHelper.CreateForEditor(this); - if (DataContext is Models.RevisionTextFile file) - Models.TextMateHelper.SetGrammarByFileName(_textMate, file.FileName); + if (DataContext is Models.RevisionTextFile file) + Models.TextMateHelper.SetGrammarByFileName(_textMate, file.FileName); + } + else if (_textMate != null) + { + _textMate.Dispose(); + _textMate = null; + GC.Collect(); + + TextArea.TextView.Redraw(); + } } private TextMate.Installation _textMate = null; diff --git a/src/Views/RevisionFileTreeView.axaml.cs b/src/Views/RevisionFileTreeView.axaml.cs index b671851c..410f747e 100644 --- a/src/Views/RevisionFileTreeView.axaml.cs +++ b/src/Views/RevisionFileTreeView.axaml.cs @@ -313,16 +313,13 @@ namespace SourceGit.Views private void OnRowsSelectionChanged(object sender, SelectionChangedEventArgs _) { - if (_disableSelectionChangingEvent) + if (_disableSelectionChangingEvent || DataContext is not ViewModels.CommitDetail vm) return; - if (sender is ListBox { SelectedItem: ViewModels.RevisionFileTreeNode node } && DataContext is ViewModels.CommitDetail vm) - { - if (!node.IsFolder) - vm.ViewRevisionFile(node.Backend); - else - vm.ViewRevisionFile(null); - } + if (sender is ListBox { SelectedItem: ViewModels.RevisionFileTreeNode { IsFolder: false } node }) + vm.ViewRevisionFile(node.Backend); + else + vm.ViewRevisionFile(null); } private List GetChildrenOfTreeNode(ViewModels.RevisionFileTreeNode node) diff --git a/src/Views/RevisionFiles.axaml b/src/Views/RevisionFiles.axaml index 6575dc66..cfc20198 100644 --- a/src/Views/RevisionFiles.axaml +++ b/src/Views/RevisionFiles.axaml @@ -113,7 +113,33 @@ - + + + + + + + + + + + + + +