style<Launcher>: supports two size rules for tabs in titlebar - fixed width or size to content

This commit is contained in:
leo 2024-03-01 14:09:39 +08:00
parent e3a7abe776
commit 7b70951c93
6 changed files with 40 additions and 10 deletions

View file

@ -381,6 +381,7 @@
<sys:String x:Key="Text.Preference.General.Theme">Theme</sys:String> <sys:String x:Key="Text.Preference.General.Theme">Theme</sys:String>
<sys:String x:Key="Text.Preference.General.MaxHistoryCommits">History Commits</sys:String> <sys:String x:Key="Text.Preference.General.MaxHistoryCommits">History Commits</sys:String>
<sys:String x:Key="Text.Preference.General.RestoreTabs">Restore windows</sys:String> <sys:String x:Key="Text.Preference.General.RestoreTabs">Restore windows</sys:String>
<sys:String x:Key="Text.Preference.General.UseFixedTabWidth">Use fixed tab width in titlebar</sys:String>
<sys:String x:Key="Text.Preference.General.UseMacOSStyle">Use macOS style titlebar</sys:String> <sys:String x:Key="Text.Preference.General.UseMacOSStyle">Use macOS style titlebar</sys:String>
<sys:String x:Key="Text.Preference.Git">GIT</sys:String> <sys:String x:Key="Text.Preference.Git">GIT</sys:String>
<sys:String x:Key="Text.Preference.Git.Path">Install Path</sys:String> <sys:String x:Key="Text.Preference.Git.Path">Install Path</sys:String>

View file

@ -380,6 +380,7 @@
<sys:String x:Key="Text.Preference.General.Theme">主题</sys:String> <sys:String x:Key="Text.Preference.General.Theme">主题</sys:String>
<sys:String x:Key="Text.Preference.General.MaxHistoryCommits">最大历史提交数</sys:String> <sys:String x:Key="Text.Preference.General.MaxHistoryCommits">最大历史提交数</sys:String>
<sys:String x:Key="Text.Preference.General.RestoreTabs">启动时恢复上次打开的仓库</sys:String> <sys:String x:Key="Text.Preference.General.RestoreTabs">启动时恢复上次打开的仓库</sys:String>
<sys:String x:Key="Text.Preference.General.UseFixedTabWidth">使用固定宽度的标题栏标签</sys:String>
<sys:String x:Key="Text.Preference.General.UseMacOSStyle">使用macOS风格的标题栏</sys:String> <sys:String x:Key="Text.Preference.General.UseMacOSStyle">使用macOS风格的标题栏</sys:String>
<sys:String x:Key="Text.Preference.Git">GIT配置</sys:String> <sys:String x:Key="Text.Preference.Git">GIT配置</sys:String>
<sys:String x:Key="Text.Preference.Git.Path">安装路径</sys:String> <sys:String x:Key="Text.Preference.Git.Path">安装路径</sys:String>

View file

@ -71,6 +71,11 @@ namespace SourceGit.ViewModels {
set => SetProperty(ref _restoreTabs, value); set => SetProperty(ref _restoreTabs, value);
} }
public bool UseFixedTabWidth {
get => _useFixedTabWidth;
set => SetProperty(ref _useFixedTabWidth, value);
}
public bool UseMacOSStyle { public bool UseMacOSStyle {
get => _useMacOSStyle; get => _useMacOSStyle;
set => SetProperty(ref _useMacOSStyle, value); set => SetProperty(ref _useMacOSStyle, value);
@ -274,6 +279,7 @@ namespace SourceGit.ViewModels {
private string _theme = "Default"; private string _theme = "Default";
private int _maxHistoryCommits = 20000; private int _maxHistoryCommits = 20000;
private bool _restoreTabs = false; private bool _restoreTabs = false;
private bool _useFixedTabWidth = true;
private bool _useMacOSStyle = OperatingSystem.IsMacOS(); private bool _useMacOSStyle = OperatingSystem.IsMacOS();
private bool _useTwoColumnsLayoutInHistories = false; private bool _useTwoColumnsLayoutInHistories = false;
private bool _useCombinedTextDiff = true; private bool _useCombinedTextDiff = true;

View file

@ -138,19 +138,17 @@
</ContextMenu> </ContextMenu>
</Border.ContextMenu> </Border.ContextMenu>
<Grid Classes="launcher_pagetab_container" Width="200" Height="30" ColumnDefinitions="Auto,*,Auto" VerticalAlignment="Center"> <v:LauncherTab UseFixedTabWidth="{Binding Source={x:Static vm:Preference.Instance}, Path=UseFixedTabWidth}" Height="30" ColumnDefinitions="Auto,*,Auto" VerticalAlignment="Center">
<Path Classes="launcher_pagetab_icon" <Path Grid.Column="0"
Grid.Column="0" Width="12" Height="12" Margin="12,0"
Width="12" Height="12" Margin="12,0,8,0"
Fill="{Binding Node.Bookmark, Converter={x:Static c:BookmarkConverters.ToBrush}}" Fill="{Binding Node.Bookmark, Converter={x:Static c:BookmarkConverters.ToBrush}}"
StrokeThickness="{Binding Node.Bookmark, Converter={x:Static c:BookmarkConverters.ToStrokeThickness}}" StrokeThickness="{Binding Node.Bookmark, Converter={x:Static c:BookmarkConverters.ToStrokeThickness}}"
Stroke="{DynamicResource Brush.FG1}" Stroke="{DynamicResource Brush.FG1}"
Data="{StaticResource Icons.Bookmark}" Data="{StaticResource Icons.Bookmark}"
IsVisible="{Binding Node.IsRepository}" IsVisible="{Binding Node.IsRepository}"
IsHitTestVisible="False"/> IsHitTestVisible="False"/>
<Path Classes="launcher_pagetab_icon" <Path Grid.Column="0"
Grid.Column="0" Width="12" Height="12" Margin="12,0"
Width="12" Height="12" Margin="12,0,8,0"
Fill="{DynamicResource Brush.FG1}" Fill="{DynamicResource Brush.FG1}"
Data="{StaticResource Icons.Repositories}" Data="{StaticResource Icons.Repositories}"
IsVisible="{Binding !Node.IsRepository}" IsVisible="{Binding !Node.IsRepository}"
@ -171,7 +169,7 @@
IsHitTestVisible="False"/> IsHitTestVisible="False"/>
<Button Grid.Column="2" <Button Grid.Column="2"
Classes="icon_button" Classes="icon_button"
Width="16" Height="16" Margin="8,0" Width="16" Height="16" Margin="12,0"
Command="{Binding #me.DataContext.(vm:Launcher).CloseTab}" Command="{Binding #me.DataContext.(vm:Launcher).CloseTab}"
CommandParameter="{Binding}" CommandParameter="{Binding}"
ToolTip.Tip="{DynamicResource Text.PageTabBar.Tab.Close}"> ToolTip.Tip="{DynamicResource Text.PageTabBar.Tab.Close}">
@ -186,7 +184,7 @@
</MultiBinding> </MultiBinding>
</Rectangle.IsVisible> </Rectangle.IsVisible>
</Rectangle> </Rectangle>
</Grid> </v:LauncherTab>
</Border> </Border>
</DataTemplate> </DataTemplate>
</ListBox.ItemTemplate> </ListBox.ItemTemplate>

View file

@ -2,8 +2,27 @@ using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Interactivity; using Avalonia.Interactivity;
using System;
namespace SourceGit.Views { namespace SourceGit.Views {
public class LauncherTab : Grid {
public static readonly StyledProperty<bool> UseFixedTabWidthProperty =
AvaloniaProperty.Register<LauncherTab, bool>(nameof(UseFixedTabWidth), false);
public bool UseFixedTabWidth {
get => GetValue(UseFixedTabWidthProperty);
set => SetValue(UseFixedTabWidthProperty, value);
}
protected override Type StyleKeyOverride => typeof(Grid);
static LauncherTab() {
UseFixedTabWidthProperty.Changed.AddClassHandler<LauncherTab>((tab, ev) => {
tab.Width = tab.UseFixedTabWidth ? 200.0 : double.NaN;
});
}
}
public partial class Launcher : Window, Models.INotificationReceiver { public partial class Launcher : Window, Models.INotificationReceiver {
public Launcher() { public Launcher() {
DataContext = new ViewModels.Launcher(); DataContext = new ViewModels.Launcher();

View file

@ -57,7 +57,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,Auto" ColumnDefinitions="Auto,*"> <Grid Margin="8" RowDefinitions="32,32,32,32,32,32,Auto" 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"
@ -135,6 +135,11 @@
IsChecked="{Binding RestoreTabs, Mode=TwoWay}"/> IsChecked="{Binding RestoreTabs, Mode=TwoWay}"/>
<CheckBox Grid.Row="5" Grid.Column="1" <CheckBox Grid.Row="5" Grid.Column="1"
Height="32"
Content="{DynamicResource Text.Preference.General.UseFixedTabWidth}"
IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=UseFixedTabWidth, Mode=TwoWay}"/>
<CheckBox Grid.Row="6" Grid.Column="1"
Height="32" Height="32"
Content="{DynamicResource Text.Preference.General.UseMacOSStyle}" Content="{DynamicResource Text.Preference.General.UseMacOSStyle}"
IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=UseMacOSStyle, Mode=TwoWay}" IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=UseMacOSStyle, Mode=TwoWay}"