diff --git a/src/Native/Windows.cs b/src/Native/Windows.cs index 3c1c5194..ba7aa7ff 100644 --- a/src/Native/Windows.cs +++ b/src/Native/Windows.cs @@ -117,9 +117,9 @@ namespace SourceGit.Native public IReadOnlyList FindExternalTerminals() { var finder = new Models.ExternalTerminalFinder(); + finder.WindowsTerminal(() => FindExternalTerminal("wt")); finder.WindowsGitBash(() => FindExternalTerminal("bash")); finder.PowerShell(() => FindExternalTerminal("pwsh")); - finder.WindowsTerminal(() => FindExternalTerminal("wt")); return finder.Terminals; } diff --git a/src/Resources/Locales/en_US.axaml b/src/Resources/Locales/en_US.axaml index 795a8843..7fd58b15 100644 --- a/src/Resources/Locales/en_US.axaml +++ b/src/Resources/Locales/en_US.axaml @@ -255,6 +255,7 @@ GENERAL Avatar Server Default Terminal/Shell + System Default Windows Terminal Git Bash PowerShell diff --git a/src/Resources/Locales/zh_CN.axaml b/src/Resources/Locales/zh_CN.axaml index 9ae65cf3..2c4189de 100644 --- a/src/Resources/Locales/zh_CN.axaml +++ b/src/Resources/Locales/zh_CN.axaml @@ -255,6 +255,7 @@ 通用配置 头像服务 默认终端 + 系统默认 终端 (Windows Terminal) Git Bash PowerShell diff --git a/src/ViewModels/Preference.cs b/src/ViewModels/Preference.cs index 1d5670b8..f07dc364 100644 --- a/src/ViewModels/Preference.cs +++ b/src/ViewModels/Preference.cs @@ -117,15 +117,8 @@ namespace SourceGit.ViewModels public string DefaultTerminal { - get => Models.AvatarManager.SelectedServer; - set - { - if (Models.AvatarManager.SelectedServer != value) - { - Models.AvatarManager.SelectedServer = value; - OnPropertyChanged(nameof(DefaultTerminal)); - } - } + get => _defaultTerminal ??= ""; + set => SetProperty(ref _defaultTerminal, value ?? ""); } public int MaxHistoryCommits @@ -442,6 +435,7 @@ namespace SourceGit.ViewModels private string _locale = "en_US"; private string _theme = "Default"; + private string _defaultTerminal; private FontFamily _defaultFont = null; private FontFamily _monospaceFont = null; private double _defaultFontSize = 13; diff --git a/src/Views/Preference.axaml.cs b/src/Views/Preference.axaml.cs index 6cd36f0c..b72d3baa 100644 --- a/src/Views/Preference.axaml.cs +++ b/src/Views/Preference.axaml.cs @@ -128,7 +128,7 @@ namespace SourceGit.Views Dispatcher.UIThread.Post(() => InstalledMonospaceFonts.AddRange(sysMonoFonts)); }); - ExternalTerminals = [..OS.ExternalTerminals.Select(x => x.Name)]; + ExternalTerminals = ["", ..OS.ExternalTerminals.Select(x => x.Name)]; var ver = string.Empty; if (pref.IsGitConfigured) @@ -261,32 +261,47 @@ namespace SourceGit.Views { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - if (value is string terminalName && !string.IsNullOrWhiteSpace(terminalName)) - { - var icon = AssetLoader.Open(new Uri($"avares://SourceGit/Resources/ExternalTerminalIcons/{terminalName}.png", UriKind.RelativeOrAbsolute)); - return new Bitmap(icon); - } + var iconKey = value is string terminalName && !string.IsNullOrWhiteSpace(terminalName) ? + terminalName : + GetSystemDefaultTerminalIconKey(); - 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) { 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 object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - if (value is string terminalName && !string.IsNullOrWhiteSpace(terminalName)) - { - var name = App.Text($"Preference.General.DefaultTerminalOrShell.{terminalName}"); - return name; - } - - return null; + return value is string terminalName && !string.IsNullOrWhiteSpace(terminalName) ? + App.Text($"Preference.General.DefaultTerminalOrShell.{terminalName}") : + App.Text($"Preference.General.DefaultTerminalOrShell"); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)