ux: Add default terminal settings UI.

This commit is contained in:
walterlv 2024-04-08 18:49:47 +08:00
parent acbf3605fd
commit 41f7aa84ac
5 changed files with 101 additions and 6 deletions

View file

@ -254,6 +254,14 @@
<x:String x:Key="Text.Preference.Appearance.Theme" xml:space="preserve">Theme</x:String> <x:String x:Key="Text.Preference.Appearance.Theme" xml:space="preserve">Theme</x:String>
<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.DefaultTerminalOrShell.wt" xml:space="preserve">Windows Terminal</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.git-bash" xml:space="preserve">Git Bash (Shell)</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.pwsh" xml:space="preserve">PowerShell (Shell)</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.gnome" xml:space="preserve">Gnome</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.konsole" xml:space="preserve">Konsole</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.osascript" xml:space="preserve">AppleScript</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.xfce4" xml:space="preserve">xfce4</x:String>
<x:String x:Key="Text.Preference.General.Check4UpdatesOnStartup" xml:space="preserve">Check for updates on startup</x:String> <x:String x:Key="Text.Preference.General.Check4UpdatesOnStartup" xml:space="preserve">Check for updates on startup</x:String>
<x:String x:Key="Text.Preference.General.Locale" xml:space="preserve">Language</x:String> <x:String x:Key="Text.Preference.General.Locale" xml:space="preserve">Language</x:String>
<x:String x:Key="Text.Preference.General.MaxHistoryCommits" xml:space="preserve">History Commits</x:String> <x:String x:Key="Text.Preference.General.MaxHistoryCommits" xml:space="preserve">History Commits</x:String>

View file

@ -254,6 +254,14 @@
<x:String x:Key="Text.Preference.Appearance.Theme" xml:space="preserve">主题</x:String> <x:String x:Key="Text.Preference.Appearance.Theme" xml:space="preserve">主题</x:String>
<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.DefaultTerminalOrShell.wt" xml:space="preserve">终端</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.git-bash" xml:space="preserve">Git Bash (Shell)</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.pwsh" xml:space="preserve">PowerShell (Shell)</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.gnome" xml:space="preserve">Gnome</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.konsole" xml:space="preserve">Konsole</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.osascript" xml:space="preserve">AppleScript</x:String>
<x:String x:Key="Text.Preference.General.DefaultTerminalOrShell.xfce4" xml:space="preserve">xfce4</x:String>
<x:String x:Key="Text.Preference.General.Check4UpdatesOnStartup" xml:space="preserve">启动时检测软件更新</x:String> <x:String x:Key="Text.Preference.General.Check4UpdatesOnStartup" xml:space="preserve">启动时检测软件更新</x:String>
<x:String x:Key="Text.Preference.General.Locale" xml:space="preserve">显示语言</x:String> <x:String x:Key="Text.Preference.General.Locale" xml:space="preserve">显示语言</x:String>
<x:String x:Key="Text.Preference.General.MaxHistoryCommits" xml:space="preserve">最大历史提交数</x:String> <x:String x:Key="Text.Preference.General.MaxHistoryCommits" xml:space="preserve">最大历史提交数</x:String>

View file

@ -115,6 +115,19 @@ namespace SourceGit.ViewModels
} }
} }
public string DefaultTerminal
{
get => Models.AvatarManager.SelectedServer;
set
{
if (Models.AvatarManager.SelectedServer != value)
{
Models.AvatarManager.SelectedServer = value;
OnPropertyChanged(nameof(DefaultTerminal));
}
}
}
public int MaxHistoryCommits public int MaxHistoryCommits
{ {
get => _maxHistoryCommits; get => _maxHistoryCommits;

View file

@ -20,6 +20,12 @@
ExtendClientAreaToDecorationsHint="True" ExtendClientAreaToDecorationsHint="True"
ExtendClientAreaChromeHints="NoChrome" ExtendClientAreaChromeHints="NoChrome"
SystemDecorations="{OnPlatform Full, Linux=None}"> SystemDecorations="{OnPlatform Full, Linux=None}">
<Window.Resources>
<v:TerminalOrShellNameToBitmapConverter x:Key="TerminalOrShellNameToBitmapConverter" />
<v:TerminalOrShellNameToLocalizedNameConverter x:Key="TerminalOrShellNameToLocalizedNameConverter" />
</Window.Resources>
<Grid RowDefinitions="Auto,Auto" Margin="{OnPlatform 0, Linux=6}"> <Grid RowDefinitions="Auto,Auto" Margin="{OnPlatform 0, Linux=6}">
<!-- Custom window shadow for Linux --> <!-- Custom window shadow for Linux -->
<Border Grid.Row="0" Grid.RowSpan="2" <Border Grid.Row="0" Grid.RowSpan="2"
@ -67,7 +73,7 @@
<TabItem.Header> <TabItem.Header>
<TextBlock Classes="tab_header" Text="{DynamicResource Text.Preference.General}"/> <TextBlock Classes="tab_header" Text="{DynamicResource Text.Preference.General}"/>
</TabItem.Header> </TabItem.Header>
<Grid Margin="8" RowDefinitions="32,32,32,32,32,32" ColumnDefinitions="Auto,*"> <Grid Margin="8" RowDefinitions="32,32,32,32,32,32,32" ColumnDefinitions="Auto,*">
<TextBlock Grid.Row="0" Grid.Column="0" <TextBlock Grid.Row="0" Grid.Column="0"
Text="{DynamicResource Text.Preference.General.Locale}" Text="{DynamicResource Text.Preference.General.Locale}"
HorizontalAlignment="Right" HorizontalAlignment="Right"
@ -96,10 +102,29 @@
</ComboBox> </ComboBox>
<TextBlock Grid.Row="2" Grid.Column="0" <TextBlock Grid.Row="2" Grid.Column="0"
Text="{DynamicResource Text.Preference.General.DefaultTerminal}"
HorizontalAlignment="Right"
Margin="0,0,16,0"/>
<ComboBox Grid.Row="2" Grid.Column="1"
MinHeight="28"
Padding="8,0"
HorizontalAlignment="Stretch"
SelectedItem="{Binding DefaultTerminal, Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate DataType="x:String">
<StackPanel Orientation="Horizontal">
<Image Width="16" Height="16" Source="{Binding Converter={StaticResource TerminalOrShellNameToBitmapConverter}}" />
<TextBlock Text="{Binding Converter={StaticResource TerminalOrShellNameToLocalizedNameConverter}}" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<TextBlock Grid.Row="3" Grid.Column="0"
Text="{DynamicResource Text.Preference.General.MaxHistoryCommits}" Text="{DynamicResource Text.Preference.General.MaxHistoryCommits}"
HorizontalAlignment="Right" HorizontalAlignment="Right"
Margin="0,0,16,0"/> Margin="0,0,16,0"/>
<Grid Grid.Row="2" Grid.Column="1" ColumnDefinitions="*,64"> <Grid Grid.Row="3" Grid.Column="1" ColumnDefinitions="*,64">
<Slider Grid.Column="0" <Slider Grid.Column="0"
Minimum="20000" Maximum="100000" Minimum="20000" Maximum="100000"
TickPlacement="BottomRight" TickFrequency="5000" TickPlacement="BottomRight" TickFrequency="5000"
@ -123,16 +148,16 @@
Text="{Binding MaxHistoryCommits}"/> Text="{Binding MaxHistoryCommits}"/>
</Grid> </Grid>
<CheckBox Grid.Row="3" Grid.Column="1" <CheckBox Grid.Row="4" Grid.Column="1"
Content="{DynamicResource Text.Preference.General.RestoreTabs}" Content="{DynamicResource Text.Preference.General.RestoreTabs}"
IsChecked="{Binding RestoreTabs, Mode=TwoWay}"/> IsChecked="{Binding RestoreTabs, Mode=TwoWay}"/>
<CheckBox Grid.Row="4" Grid.Column="1" <CheckBox Grid.Row="5" Grid.Column="1"
Height="32" Height="32"
Content="{DynamicResource Text.Preference.General.UseFixedTabWidth}" Content="{DynamicResource Text.Preference.General.UseFixedTabWidth}"
IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=UseFixedTabWidth, Mode=TwoWay}"/> IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=UseFixedTabWidth, Mode=TwoWay}"/>
<CheckBox Grid.Row="5" Grid.Column="1" <CheckBox Grid.Row="6" Grid.Column="1"
Height="32" Height="32"
Content="{DynamicResource Text.Preference.General.Check4UpdatesOnStartup}" Content="{DynamicResource Text.Preference.General.Check4UpdatesOnStartup}"
IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=Check4UpdatesOnStartup, Mode=TwoWay}"/> IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=Check4UpdatesOnStartup, Mode=TwoWay}"/>

View file

@ -6,9 +6,12 @@ using System.Threading.Tasks;
using Avalonia.Collections; using Avalonia.Collections;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Data.Converters;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Interactivity; using Avalonia.Interactivity;
using Avalonia.Media; using Avalonia.Media;
using Avalonia.Media.Imaging;
using Avalonia.Platform;
using Avalonia.Platform.Storage; using Avalonia.Platform.Storage;
using Avalonia.Threading; using Avalonia.Threading;
@ -242,4 +245,42 @@ namespace SourceGit.Views
} }
} }
} }
public sealed class TerminalOrShellNameToBitmapConverter : IValueConverter
{
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);
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
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($"Text.Preference.General.DefaultTerminalOrShell.{terminalName}");
return name;
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
} }