ux: Add system default terminal option.

This commit is contained in:
walterlv 2024-04-08 19:25:17 +08:00
parent 467a39b2e9
commit 8a255cd260
5 changed files with 35 additions and 24 deletions

View file

@ -117,9 +117,9 @@ namespace SourceGit.Native
public IReadOnlyList<Models.ExternalTerminal> FindExternalTerminals() public IReadOnlyList<Models.ExternalTerminal> FindExternalTerminals()
{ {
var finder = new Models.ExternalTerminalFinder(); var finder = new Models.ExternalTerminalFinder();
finder.WindowsTerminal(() => FindExternalTerminal("wt"));
finder.WindowsGitBash(() => FindExternalTerminal("bash")); finder.WindowsGitBash(() => FindExternalTerminal("bash"));
finder.PowerShell(() => FindExternalTerminal("pwsh")); finder.PowerShell(() => FindExternalTerminal("pwsh"));
finder.WindowsTerminal(() => FindExternalTerminal("wt"));
return finder.Terminals; return finder.Terminals;
} }

View file

@ -255,6 +255,7 @@
<x:String x:Key="Text.Preference.General" xml:space="preserve">GENERAL</x:String> <x:String x:Key="Text.Preference.General" xml:space="preserve">GENERAL</x:String>
<x:String x:Key="Text.Preference.General.AvatarServer" xml:space="preserve">Avatar Server</x:String> <x:String x:Key="Text.Preference.General.AvatarServer" xml:space="preserve">Avatar Server</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminal" xml:space="preserve">Default Terminal/Shell</x:String> <x:String x:Key="Text.Preference.General.DefaultTerminal" xml:space="preserve">Default Terminal/Shell</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell" xml:space="preserve">System Default</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.wt" xml:space="preserve">Windows Terminal</x:String> <x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.wt" xml:space="preserve">Windows Terminal</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.git-bash" xml:space="preserve">Git Bash</x:String> <x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.git-bash" xml:space="preserve">Git Bash</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.pwsh" xml:space="preserve">PowerShell</x:String> <x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.pwsh" xml:space="preserve">PowerShell</x:String>

View file

@ -255,6 +255,7 @@
<x:String x:Key="Text.Preference.General" xml:space="preserve">通用配置</x:String> <x:String x:Key="Text.Preference.General" xml:space="preserve">通用配置</x:String>
<x:String x:Key="Text.Preference.General.AvatarServer" xml:space="preserve">头像服务</x:String> <x:String x:Key="Text.Preference.General.AvatarServer" xml:space="preserve">头像服务</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminal" xml:space="preserve">默认终端</x:String> <x:String x:Key="Text.Preference.General.DefaultTerminal" xml:space="preserve">默认终端</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell" xml:space="preserve">系统默认</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.wt" xml:space="preserve">终端 (Windows Terminal)</x:String> <x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.wt" xml:space="preserve">终端 (Windows Terminal)</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.git-bash" xml:space="preserve">Git Bash</x:String> <x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.git-bash" xml:space="preserve">Git Bash</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.pwsh" xml:space="preserve">PowerShell</x:String> <x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.pwsh" xml:space="preserve">PowerShell</x:String>

View file

@ -117,15 +117,8 @@ namespace SourceGit.ViewModels
public string DefaultTerminal public string DefaultTerminal
{ {
get => Models.AvatarManager.SelectedServer; get => _defaultTerminal ??= "";
set set => SetProperty(ref _defaultTerminal, value ?? "");
{
if (Models.AvatarManager.SelectedServer != value)
{
Models.AvatarManager.SelectedServer = value;
OnPropertyChanged(nameof(DefaultTerminal));
}
}
} }
public int MaxHistoryCommits public int MaxHistoryCommits
@ -442,6 +435,7 @@ namespace SourceGit.ViewModels
private string _locale = "en_US"; private string _locale = "en_US";
private string _theme = "Default"; private string _theme = "Default";
private string _defaultTerminal;
private FontFamily _defaultFont = null; private FontFamily _defaultFont = null;
private FontFamily _monospaceFont = null; private FontFamily _monospaceFont = null;
private double _defaultFontSize = 13; private double _defaultFontSize = 13;

View file

@ -128,7 +128,7 @@ namespace SourceGit.Views
Dispatcher.UIThread.Post(() => InstalledMonospaceFonts.AddRange(sysMonoFonts)); Dispatcher.UIThread.Post(() => InstalledMonospaceFonts.AddRange(sysMonoFonts));
}); });
ExternalTerminals = [..OS.ExternalTerminals.Select(x => x.Name)]; ExternalTerminals = ["", ..OS.ExternalTerminals.Select(x => x.Name)];
var ver = string.Empty; var ver = string.Empty;
if (pref.IsGitConfigured) if (pref.IsGitConfigured)
@ -261,32 +261,47 @@ namespace SourceGit.Views
{ {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{ {
if (value is string terminalName && !string.IsNullOrWhiteSpace(terminalName)) var iconKey = value is string terminalName && !string.IsNullOrWhiteSpace(terminalName) ?
{ terminalName :
var icon = AssetLoader.Open(new Uri($"avares://SourceGit/Resources/ExternalTerminalIcons/{terminalName}.png", UriKind.RelativeOrAbsolute)); GetSystemDefaultTerminalIconKey();
return new Bitmap(icon);
}
return null; var icon = AssetLoader.Open(new Uri($"avares://SourceGit/Resources/ExternalTerminalIcons/{iconKey}.png", UriKind.RelativeOrAbsolute));
return new Bitmap(icon);
} }
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{ {
throw new NotSupportedException(); throw new NotSupportedException();
} }
private string GetSystemDefaultTerminalIconKey()
{
if (OperatingSystem.IsWindows())
{
return "git-bash";
}
else if (OperatingSystem.IsMacOS())
{
return "osascript";
}
else if (OperatingSystem.IsLinux())
{
return "gnome-terminal";
}
else
{
throw new PlatformNotSupportedException();
}
}
} }
public sealed class TerminalOrShellNameToLocalizedNameConverter : IValueConverter public sealed class TerminalOrShellNameToLocalizedNameConverter : IValueConverter
{ {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{ {
if (value is string terminalName && !string.IsNullOrWhiteSpace(terminalName)) return value is string terminalName && !string.IsNullOrWhiteSpace(terminalName) ?
{ App.Text($"Preference.General.DefaultTerminalOrShell.{terminalName}") :
var name = App.Text($"Preference.General.DefaultTerminalOrShell.{terminalName}"); App.Text($"Preference.General.DefaultTerminalOrShell");
return name;
}
return null;
} }
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)