Skip to content

Commit efa6e46

Browse files
committed
feature: add a button to open current revision file with default editor
Signed-off-by: leo <[email protected]>
1 parent e102e49 commit efa6e46

File tree

3 files changed

+48
-7
lines changed

3 files changed

+48
-7
lines changed

src/ViewModels/CommitDetail.cs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,12 @@ public List<string> RevisionFileSearchSuggestion
133133
private set => SetProperty(ref _revisionFileSearchSuggestion, value);
134134
}
135135

136+
public bool CanOpenRevisionFileWithDefaultEditor
137+
{
138+
get => _canOpenRevisionFileWithDefaultEditor;
139+
private set => SetProperty(ref _canOpenRevisionFileWithDefaultEditor, value);
140+
}
141+
136142
public CommitDetail(Repository repo)
137143
{
138144
_repo = repo;
@@ -197,6 +203,7 @@ public void ViewRevisionFile(Models.Object file)
197203
{
198204
ViewRevisionFilePath = string.Empty;
199205
ViewRevisionFileContent = null;
206+
CanOpenRevisionFileWithDefaultEditor = false;
200207
return;
201208
}
202209

@@ -205,6 +212,7 @@ public void ViewRevisionFile(Models.Object file)
205212
switch (file.Type)
206213
{
207214
case Models.ObjectType.Blob:
215+
CanOpenRevisionFileWithDefaultEditor = true;
208216
Task.Run(() =>
209217
{
210218
var isBinary = new Commands.IsBinary(_repo.FullPath, _commit.SHA, file.Path).Result();
@@ -252,6 +260,7 @@ public void ViewRevisionFile(Models.Object file)
252260
});
253261
break;
254262
case Models.ObjectType.Commit:
263+
CanOpenRevisionFileWithDefaultEditor = false;
255264
Task.Run(() =>
256265
{
257266
var submoduleRoot = Path.Combine(_repo.FullPath, file.Path).Replace('\\', '/').Trim('/');
@@ -267,11 +276,26 @@ public void ViewRevisionFile(Models.Object file)
267276
});
268277
break;
269278
default:
279+
CanOpenRevisionFileWithDefaultEditor = false;
270280
ViewRevisionFileContent = null;
271281
break;
272282
}
273283
}
274284

285+
public Task OpenRevisionFileWithDefaultEditor(string file)
286+
{
287+
return Task.Run(() =>
288+
{
289+
var fullPath = Native.OS.GetAbsPath(_repo.FullPath, file);
290+
var fileName = Path.GetFileNameWithoutExtension(fullPath) ?? "";
291+
var fileExt = Path.GetExtension(fullPath) ?? "";
292+
var tmpFile = Path.Combine(Path.GetTempPath(), $"{fileName}~{_commit.SHA.Substring(0, 10)}{fileExt}");
293+
294+
Commands.SaveRevisionFile.Run(_repo.FullPath, _commit.SHA, file, tmpFile);
295+
Native.OS.OpenWithDefaultEditor(tmpFile);
296+
});
297+
}
298+
275299
public ContextMenu CreateChangeContextMenu(Models.Change change)
276300
{
277301
var diffWithMerger = new MenuItem();
@@ -421,13 +445,10 @@ public ContextMenu CreateRevisionFileContextMenu(Models.Object file)
421445
var openWith = new MenuItem();
422446
openWith.Header = App.Text("OpenWith");
423447
openWith.Icon = App.CreateMenuIcon("Icons.OpenWith");
448+
openWith.IsEnabled = file.Type == Models.ObjectType.Blob;
424449
openWith.Click += async (_, ev) =>
425450
{
426-
var fileName = Path.GetFileNameWithoutExtension(fullPath) ?? "";
427-
var fileExt = Path.GetExtension(fullPath) ?? "";
428-
var tmpFile = Path.Combine(Path.GetTempPath(), $"{fileName}~{_commit.SHA.Substring(0, 10)}{fileExt}");
429-
await Task.Run(() => Commands.SaveRevisionFile.Run(_repo.FullPath, _commit.SHA, file.Path, tmpFile));
430-
Native.OS.OpenWithDefaultEditor(tmpFile);
451+
await OpenRevisionFileWithDefaultEditor(file.Path);
431452
ev.Handled = true;
432453
};
433454

@@ -887,5 +908,6 @@ private Task ResetToParentRevision(Models.Change change)
887908
private List<string> _revisionFiles = null;
888909
private string _revisionFileSearchFilter = string.Empty;
889910
private List<string> _revisionFileSearchSuggestion = null;
911+
private bool _canOpenRevisionFileWithDefaultEditor = false;
890912
}
891913
}

src/Views/RevisionFiles.axaml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@
119119
Height="26"
120120
BorderBrush="{DynamicResource Brush.Border2}" BorderThickness="0,0,0,1"
121121
IsVisible="{Binding ViewRevisionFilePath, Converter={x:Static StringConverters.IsNotNullOrEmpty}}">
122-
<Grid ColumnDefinitions="Auto,*,Auto">
122+
<Grid ColumnDefinitions="Auto,*,Auto,Auto">
123123
<Path Grid.Column="0" Width="12" Height="12" Data="{StaticResource Icons.File}" Margin="8,0,0,0"/>
124124
<TextBlock Grid.Column="1"
125125
Classes="primary"
@@ -140,8 +140,18 @@
140140
Converter="{x:Static c:ObjectConverters.IsTypeOf}"
141141
ConverterParameter="{x:Type m:RevisionTextFile}"/>
142142
</ToggleButton.IsVisible>
143-
<Path Width="13" Height="13" Data="{StaticResource Icons.SyntaxHighlight}" Margin="0,3,0,0"/>
143+
<Path Width="13" Height="13" Data="{StaticResource Icons.SyntaxHighlight}" Margin="0,2,0,0"/>
144144
</ToggleButton>
145+
146+
<Button Grid.Column="3"
147+
Classes="icon_button"
148+
Width="28"
149+
Background="Transparent"
150+
Click="OnOpenFileWithDefaultEditor"
151+
IsVisible="{Binding CanOpenRevisionFileWithDefaultEditor, Mode=OneWay}"
152+
ToolTip.Tip="{DynamicResource Text.OpenWith}">
153+
<Path Width="12" Height="12" Data="{StaticResource Icons.OpenWith}"/>
154+
</Button>
145155
</Grid>
146156
</Border>
147157

src/Views/RevisionFiles.axaml.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Avalonia.Controls;
22
using Avalonia.Input;
3+
using Avalonia.Interactivity;
34

45
namespace SourceGit.Views
56
{
@@ -80,5 +81,13 @@ private void OnSearchSuggestionDoubleTapped(object sender, TappedEventArgs e)
8081

8182
e.Handled = true;
8283
}
84+
85+
private async void OnOpenFileWithDefaultEditor(object sender, RoutedEventArgs e)
86+
{
87+
if (DataContext is ViewModels.CommitDetail { CanOpenRevisionFileWithDefaultEditor: true } vm)
88+
await vm.OpenRevisionFileWithDefaultEditor(vm.ViewRevisionFilePath);
89+
90+
e.Handled = true;
91+
}
8392
}
8493
}

0 commit comments

Comments
 (0)