refactor: use DataGrid instead of ListBox displaying history commits

Sometimes, `Grid.IsSharedSizeScope` does not work when navigating to the first commit

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo
2025-06-30 15:01:18 +08:00
parent db77c61dd5
commit 93ffbdd21d
8 changed files with 236 additions and 223 deletions

View File

@@ -28,6 +28,7 @@
<Application.Styles>
<FluentTheme />
<StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml"/>
<StyleInclude Source="avares://AvaloniaEdit/Themes/Fluent/AvaloniaEdit.xaml" />
<StyleInclude Source="/Resources/Styles.axaml"/>
</Application.Styles>

View File

@@ -40,6 +40,7 @@
<ItemGroup>
<PackageReference Include="Avalonia" Version="11.2.8" />
<PackageReference Include="Avalonia.Controls.DataGrid" Version="11.2.8" />
<PackageReference Include="Avalonia.Desktop" Version="11.2.8" />
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.2.8" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.2.8" />

View File

@@ -300,7 +300,7 @@ namespace SourceGit.ViewModels
}
}
public ContextMenu MakeContextMenu(ListBox list)
public ContextMenu MakeContextMenu(DataGrid list)
{
var current = _repo.CurrentBranch;
if (current == null || list.SelectedItems == null)

View File

@@ -41,12 +41,6 @@ namespace SourceGit.ViewModels
set => SetProperty(ref _repositorySidebarWidth, value);
}
public GridLength HistoriesAuthorColumnWidth
{
get => _historiesAuthorColumnWidth;
set => SetProperty(ref _historiesAuthorColumnWidth, value);
}
public GridLength WorkingCopyLeftWidth
{
get => _workingCopyLeftWidth;
@@ -72,7 +66,6 @@ namespace SourceGit.ViewModels
}
private GridLength _repositorySidebarWidth = new GridLength(250, GridUnitType.Pixel);
private GridLength _historiesAuthorColumnWidth = new GridLength(120, GridUnitType.Pixel);
private GridLength _workingCopyLeftWidth = new GridLength(300, GridUnitType.Pixel);
private GridLength _stashesLeftWidth = new GridLength(300, GridUnitType.Pixel);
private GridLength _commitDetailChangesLeftWidth = new GridLength(256, GridUnitType.Pixel);

View File

@@ -871,7 +871,7 @@ namespace SourceGit.ViewModels
Task.Run(() =>
{
List<Models.Commit> visible = [];
var visible = new List<Models.Commit>();
var method = (Models.CommitSearchMethod)_searchCommitFilterType;
if (method == Models.CommitSearchMethod.BySHA)
@@ -880,8 +880,8 @@ namespace SourceGit.ViewModels
if (isCommitSHA)
{
var commit = new Commands.QuerySingleCommit(_fullpath, _searchCommitFilter).Result();
visible = [commit];
}
visible.Add(commit);
}
}
else
{

View File

@@ -1,5 +1,6 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
using Avalonia.Media;
using Avalonia.VisualTree;
@@ -51,26 +52,40 @@ namespace SourceGit.Views
if (histories == null)
return;
var list = histories.CommitListContainer;
if (list == null)
var grid = histories.CommitListContainer;
if (grid == null)
return;
var container = list.ItemsPanelRoot as VirtualizingStackPanel;
if (container == null)
var rowsPresenter = grid.FindDescendantOfType<DataGridRowsPresenter>();
if (rowsPresenter == null)
return;
var item = list.ContainerFromIndex(container.FirstRealizedIndex);
if (item == null)
return;
double rowHeight = grid.RowHeight;
double startY = 0;
foreach (var child in rowsPresenter.Children)
{
var row = child as DataGridRow;
if (row.IsVisible)
{
if (rowHeight != row.Bounds.Height)
rowHeight = row.Bounds.Height;
var width = histories.CommitListHeader.ColumnDefinitions[0].ActualWidth;
var height = Bounds.Height;
var rowHeight = item.Bounds.Height;
var startY = container.FirstRealizedIndex * rowHeight - item.TranslatePoint(new Point(0, 0), list).Value!.Y;
if (row.Bounds.Top <= 0 && row.Bounds.Top > -rowHeight)
{
var test = rowHeight * row.Index - row.Bounds.Top;
if (startY < test)
startY = test;
}
}
}
var headersHeight = grid.ColumnHeaderHeight;
var width = histories.CommitListContainer.Columns[0].ActualWidth;
var height = Bounds.Height - headersHeight;
var endY = startY + height + 28;
using (context.PushClip(new Rect(0, 0, width, height)))
using (context.PushTransform(Matrix.CreateTranslation(0, -startY)))
using (context.PushClip(new Rect(0, headersHeight, width, height)))
using (context.PushTransform(Matrix.CreateTranslation(0, headersHeight - startY)))
{
DrawCurves(context, graph, startY, endY, rowHeight);
DrawAnchors(context, graph, startY, endY, rowHeight);

View File

@@ -24,202 +24,213 @@
</v:HistoriesLayout.ColumnDefinitions>
<Grid Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3">
<Grid RowDefinitions="24,*" Grid.IsSharedSizeScope="True" ClipToBounds="True">
<!-- Headers -->
<Border Grid.Row="0"
Background="{DynamicResource Brush.Window}"
BorderThickness="0,0,0,1"
BorderBrush="{DynamicResource Brush.Border0}">
<Grid x:Name="CommitListHeader">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="3"/>
<ColumnDefinition SharedSizeGroup="AuthorName" Width="{Binding Source={x:Static vm:Preferences.Instance}, Path=Layout.HistoriesAuthorColumnWidth, Mode=TwoWay}" MinWidth="80"/>
<ColumnDefinition SharedSizeGroup="SHA" MinWidth="100"/>
<ColumnDefinition SharedSizeGroup="Time" MinWidth="160"/>
</Grid.ColumnDefinitions>
<DataGrid x:Name="CommitListContainer"
Background="{DynamicResource Brush.Contents}"
SelectionMode="Extended"
ItemsSource="{Binding Commits, Mode=OneWay}"
SelectedItem="{Binding AutoSelectedCommit, Mode=OneWay}"
CanUserReorderColumns="False"
CanUserResizeColumns="True"
CanUserSortColumns="False"
AutoGenerateColumns="False"
IsReadOnly="True"
HeadersVisibility="Column"
ColumnHeaderHeight="24"
Focusable="False"
RowHeight="26"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto"
LayoutUpdated="OnCommitListLayoutUpdated"
SelectionChanged="OnCommitListSelectionChanged"
ContextRequested="OnCommitListContextRequested"
DoubleTapped="OnCommitListDoubleTapped">
<DataGrid.Resources>
<SolidColorBrush x:Key="DataGridGridLinesBrush" Color="{DynamicResource Color.Border0}" />
</DataGrid.Resources>
<DataGrid.Styles>
<Style Selector="DataGridColumnHeader">
<Setter Property="MinHeight" Value="24"/>
<Setter Property="Background" Value="{DynamicResource Brush.Window}" />
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="Template">
<ControlTemplate>
<Border x:Name="HeaderBorder"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding CornerRadius}">
<Grid ColumnDefinitions="*,Auto">
<ContentPresenter x:Name="PART_ContentPresenter"
Grid.Column="0"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}" />
<TextBlock Grid.Column="0" Classes="table_header" Text="{DynamicResource Text.Histories.Header.GraphAndSubject}" HorizontalAlignment="Center"/>
<GridSplitter Grid.Column="1" Background="Transparent" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
<Border Grid.Column="2" BorderThickness="1,0,0,0" BorderBrush="{DynamicResource Brush.Border0}" ClipToBounds="True">
<TextBlock Classes="table_header" Text="{DynamicResource Text.Histories.Header.Author}" HorizontalAlignment="Center"/>
</Border>
<Border Grid.Column="3" BorderThickness="1,0" BorderBrush="{DynamicResource Brush.Border0}" ClipToBounds="True">
<TextBlock Classes="table_header" Text="{DynamicResource Text.Histories.Header.SHA}" HorizontalAlignment="Center"/>
</Border>
<StackPanel Grid.Column="4" Orientation="Horizontal" HorizontalAlignment="Center">
<TextBlock Classes="table_header"
Margin="6,0,0,0"
Text="{DynamicResource Text.Histories.Header.Time}"
IsVisible="{Binding Source={x:Static vm:Preferences.Instance}, Path=ShowAuthorTimeInGraph, Converter={x:Static BoolConverters.Not}, Mode=OneWay}"/>
<TextBlock Classes="table_header"
Margin="6,0,0,0"
Text="{DynamicResource Text.Histories.Header.AuthorTime}"
IsVisible="{Binding Source={x:Static vm:Preferences.Instance}, Path=ShowAuthorTimeInGraph, Mode=OneWay}"/>
</StackPanel>
</Grid>
</Border>
<Rectangle Name="VerticalSeparator"
Grid.Column="1"
Width="1.1"
VerticalAlignment="Stretch"
Fill="{DynamicResource Brush.Border0}"
IsVisible="{TemplateBinding AreSeparatorsVisible}" />
</Grid>
</Border>
</ControlTemplate>
</Setter>
</Style>
<!-- Commit Lists & Graph -->
<Grid Grid.Row="1">
<ListBox x:Name="CommitListContainer"
Background="{DynamicResource Brush.Contents}"
ItemsSource="{Binding Commits}"
SelectionMode="Multiple"
SelectedItem="{Binding AutoSelectedCommit, Mode=OneWay}"
LayoutUpdated="OnCommitListLayoutUpdated"
SelectionChanged="OnCommitListSelectionChanged"
ContextRequested="OnCommitListContextRequested"
KeyDown="OnCommitListKeyDown">
<ListBox.Styles>
<Style Selector="ListBoxItem">
<Setter Property="Margin" Value="0"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="Height" Value="26"/>
<Setter Property="Template">
<ControlTemplate>
<Grid>
<Border Name="PART_Background"
Background="Transparent"
CornerRadius="{TemplateBinding CornerRadius}"
Opacity="0"/>
<ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Padding="{TemplateBinding Padding}"
VerticalContentAlignment="Center"
HorizontalContentAlignment="Stretch" />
</Grid>
</ControlTemplate>
</Setter>
<Style Selector="^:pointerover /template/ Border#PART_Background">
<Setter Property="Background" Value="{DynamicResource Brush.AccentHovered}" />
<Setter Property="Opacity" Value=".5"/>
</Style>
<Style Selector="^:selected /template/ Border#PART_Background">
<Setter Property="Background" Value="{DynamicResource Brush.Accent}" />
<Setter Property="Opacity" Value=".65"/>
</Style>
<Style Selector="^:selected:pointerover /template/ Border#PART_Background">
<Setter Property="Background" Value="{DynamicResource Brush.Accent}" />
<Setter Property="Opacity" Value=".8"/>
</Style>
</Style>
</ListBox.Styles>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<Style Selector="DataGridCell">
<Setter Property="Template">
<ControlTemplate>
<Grid x:Name="PART_CellRoot">
<ContentPresenter Margin="0"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Foreground="{TemplateBinding Foreground}" />
</Grid>
</ControlTemplate>
</Setter>
</Style>
</DataGrid.Styles>
<DataGrid.Columns>
<DataGridTemplateColumn Width="*">
<DataGridTemplateColumn.Header>
<TextBlock Classes="table_header" Text="{DynamicResource Text.Histories.Header.GraphAndSubject}" HorizontalAlignment="Center"/>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="m:Commit">
<Grid Height="26" Background="Transparent" DoubleTapped="OnCommitListItemDoubleTapped">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition SharedSizeGroup="AuthorName" Width="Auto"/>
<ColumnDefinition SharedSizeGroup="SHA" Width="Auto"/>
<ColumnDefinition SharedSizeGroup="Time" Width="Auto"/>
</Grid.ColumnDefinitions>
<Border Padding="{Binding Margin}" ClipToBounds="True" Background="Transparent">
<Grid ColumnDefinitions="Auto,Auto,Auto,*" Margin="2,0,4,0" ClipToBounds="True">
<v:CommitStatusIndicator Grid.Column="0"
CurrentBranch="{Binding $parent[v:Histories].CurrentBranch}"
AheadBrush="{DynamicResource Brush.Accent}"
BehindBrush="{DynamicResource Brush.FG1}"
VerticalAlignment="Center"/>
<!-- Subject & REFS -->
<Border Grid.Column="0" Padding="{Binding Margin}" ClipToBounds="True" Background="Transparent">
<Grid ColumnDefinitions="Auto,Auto,Auto,*" Margin="2,0,4,0" ClipToBounds="True">
<v:CommitStatusIndicator Grid.Column="0"
CurrentBranch="{Binding $parent[v:Histories].CurrentBranch}"
AheadBrush="{DynamicResource Brush.Accent}"
BehindBrush="{DynamicResource Brush.FG1}"
VerticalAlignment="Center"/>
<v:BisectStateIndicator Grid.Column="1"
Background="{DynamicResource Brush.Contents}"
Foreground="{DynamicResource Brush.FG1}"
Bisect="{Binding $parent[v:Histories].Bisect}"
VerticalAlignment="Center"/>
<v:BisectStateIndicator Grid.Column="1"
Background="{DynamicResource Brush.Contents}"
<v:CommitRefsPresenter Grid.Column="2"
Background="{DynamicResource Brush.Contents}"
Foreground="{DynamicResource Brush.FG1}"
FontFamily="{DynamicResource Fonts.Primary}"
ShowTags="{Binding Source={x:Static vm:Preferences.Instance}, Path=ShowTagsInGraph}"
FontSize="12"
VerticalAlignment="Center">
<v:CommitRefsPresenter.UseGraphColor>
<MultiBinding Converter="{x:Static BoolConverters.Or}">
<Binding Path="IsMerged"/>
<Binding Path="$parent[v:Histories].OnlyHighlightCurrentBranch" Converter="{x:Static BoolConverters.Not}"/>
</MultiBinding>
</v:CommitRefsPresenter.UseGraphColor>
</v:CommitRefsPresenter>
<v:CommitSubjectPresenter Grid.Column="3"
FontFamily="{DynamicResource Fonts.Primary}"
CodeFontFamily="{DynamicResource Fonts.Monospace}"
InlineCodeBackground="{DynamicResource Brush.InlineCode}"
Foreground="{DynamicResource Brush.FG1}"
Bisect="{Binding $parent[v:Histories].Bisect}"
VerticalAlignment="Center"/>
<v:CommitRefsPresenter Grid.Column="2"
Background="{DynamicResource Brush.Contents}"
Foreground="{DynamicResource Brush.FG1}"
FontFamily="{DynamicResource Fonts.Primary}"
ShowTags="{Binding Source={x:Static vm:Preferences.Instance}, Path=ShowTagsInGraph}"
FontSize="12"
VerticalAlignment="Center">
<v:CommitRefsPresenter.UseGraphColor>
<MultiBinding Converter="{x:Static BoolConverters.Or}">
<Binding Path="IsMerged"/>
<Binding Path="$parent[v:Histories].OnlyHighlightCurrentBranch" Converter="{x:Static BoolConverters.Not}"/>
</MultiBinding>
</v:CommitRefsPresenter.UseGraphColor>
</v:CommitRefsPresenter>
<v:CommitSubjectPresenter Grid.Column="3"
FontFamily="{DynamicResource Fonts.Primary}"
CodeFontFamily="{DynamicResource Fonts.Monospace}"
InlineCodeBackground="{DynamicResource Brush.InlineCode}"
Foreground="{DynamicResource Brush.FG1}"
LinkForeground="{DynamicResource Brush.Link}"
Subject="{Binding Subject}"
IssueTrackerRules="{Binding $parent[v:Histories].IssueTrackerRules}"
FontWeight="{Binding FontWeight}"
Opacity="{Binding Opacity}"/>
</Grid>
</Border>
<!-- Author -->
<Grid Grid.Column="1" ColumnDefinitions="20,*" Background="Transparent">
<v:Avatar Grid.Column="0"
Width="16" Height="16"
Margin="4,0,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
IsHitTestVisible="False"
User="{Binding Author}"
Opacity="{Binding Opacity}"/>
<Border Grid.Column="1" Padding="8,0,4,0" ClipToBounds="True">
<TextBlock Classes="primary"
Text="{Binding Author.Name}"
FontWeight="{Binding FontWeight}"
HorizontalAlignment="Left"
Opacity="{Binding Opacity}"/>
</Border>
LinkForeground="{DynamicResource Brush.Link}"
Subject="{Binding Subject}"
IssueTrackerRules="{Binding $parent[v:Histories].IssueTrackerRules}"
FontWeight="{Binding FontWeight}"
Opacity="{Binding Opacity}"/>
</Grid>
</Border>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!-- SHA -->
<Border Grid.Column="2" Padding="8,0,0,0" IsHitTestVisible="False" ClipToBounds="True">
<DataGridTemplateColumn MinWidth="80" Width="100" CanUserResize="True">
<DataGridTemplateColumn.Header>
<TextBlock Classes="table_header" Text="{DynamicResource Text.Histories.Header.Author}" HorizontalAlignment="Center"/>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="m:Commit">
<Grid ColumnDefinitions="20,*" Background="Transparent">
<v:Avatar Grid.Column="0"
Width="16" Height="16"
Margin="4,0,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
IsHitTestVisible="False"
User="{Binding Author}"
Opacity="{Binding Opacity}"/>
<Border Grid.Column="1" Padding="8,0,4,0" ClipToBounds="True">
<TextBlock Classes="primary"
Text="{Binding SHA, Converter={x:Static c:StringConverters.ToShortSHA}}"
Text="{Binding Author.Name}"
FontWeight="{Binding FontWeight}"
HorizontalAlignment="Left"
Opacity="{Binding Opacity}"/>
</Border>
<!-- TIME -->
<Border Grid.Column="3" Padding="8,0" ClipToBounds="True" IsHitTestVisible="False">
<v:CommitTimeTextBlock Classes="primary"
FontWeight="{Binding FontWeight}"
Opacity="{Binding Opacity}"
UseAuthorTime="{Binding Source={x:Static vm:Preferences.Instance}, Path=ShowAuthorTimeInGraph, Mode=OneWay}"
ShowAsDateTime="{Binding Source={x:Static vm:Preferences.Instance}, Path=!DisplayTimeAsPeriodInHistories}"
DateTimeFormat="{Binding Source={x:Static vm:Preferences.Instance}, Path=DateTimeFormat}"/>
</Border>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<v:CommitGraph x:Name="CommitGraph"
Graph="{Binding Graph}"
DotBrush="{DynamicResource Brush.Contents}"
OnlyHighlightCurrentBranch="{Binding $parent[v:Histories].OnlyHighlightCurrentBranch}"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
IsHitTestVisible="False"
ClipToBounds="True"/>
</Grid>
</Grid>
<DataGridTemplateColumn MinWidth="100" CanUserResize="False">
<DataGridTemplateColumn.Header>
<TextBlock Classes="table_header" Text="{DynamicResource Text.Histories.Header.SHA}" HorizontalAlignment="Center"/>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="m:Commit">
<Border Padding="8,0,0,0" IsHitTestVisible="False" ClipToBounds="True">
<TextBlock Classes="primary"
Text="{Binding SHA, Converter={x:Static c:StringConverters.ToShortSHA}}"
FontWeight="{Binding FontWeight}"
Opacity="{Binding Opacity}"/>
</Border>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn MinWidth="160" CanUserResize="False">
<DataGridTemplateColumn.Header>
<Grid HorizontalAlignment="Center">
<TextBlock Classes="table_header"
Margin="6,0,0,0"
Text="{DynamicResource Text.Histories.Header.Time}"
IsVisible="{Binding Source={x:Static vm:Preferences.Instance}, Path=ShowAuthorTimeInGraph, Converter={x:Static BoolConverters.Not}, Mode=OneWay}"/>
<TextBlock Classes="table_header"
Margin="6,0,0,0"
Text="{DynamicResource Text.Histories.Header.AuthorTime}"
IsVisible="{Binding Source={x:Static vm:Preferences.Instance}, Path=ShowAuthorTimeInGraph, Mode=OneWay}"/>
</Grid>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="m:Commit">
<Border Padding="8,0" ClipToBounds="True" IsHitTestVisible="False">
<v:CommitTimeTextBlock Classes="primary"
FontWeight="{Binding FontWeight}"
Opacity="{Binding Opacity}"
UseAuthorTime="{Binding Source={x:Static vm:Preferences.Instance}, Path=ShowAuthorTimeInGraph, Mode=OneWay}"
ShowAsDateTime="{Binding Source={x:Static vm:Preferences.Instance}, Path=!DisplayTimeAsPeriodInHistories}"
DateTimeFormat="{Binding Source={x:Static vm:Preferences.Instance}, Path=DateTimeFormat}"/>
</Border>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<v:CommitGraph x:Name="CommitGraph"
Graph="{Binding Graph}"
DotBrush="{DynamicResource Brush.Contents}"
OnlyHighlightCurrentBranch="{Binding $parent[v:Histories].OnlyHighlightCurrentBranch}"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
IsHitTestVisible="False"
ClipToBounds="True"/>
<!-- Fix memory leak -->
<v:LoadingIcon Width="48" Height="48" HorizontalAlignment="Center" VerticalAlignment="Center" IsVisible="{Binding IsLoading}"/>
</Grid>

View File

@@ -129,23 +129,16 @@ namespace SourceGit.Views
if (change.Property == NavigationIdProperty)
{
if (DataContext is ViewModels.Histories)
{
var list = CommitListContainer;
if (list is { SelectedItems.Count: 1 })
list.ScrollIntoView(list.SelectedIndex);
}
var list = CommitListContainer;
if (list is { SelectedItems.Count: 1 })
list.ScrollIntoView(list.SelectedItem, null);
}
}
private void OnCommitListLayoutUpdated(object _1, EventArgs _2)
{
var y = CommitListContainer.Scroll?.Offset.Y ?? 0;
var authorNameColumnWidth = ViewModels.Preferences.Instance.Layout.HistoriesAuthorColumnWidth.Value;
if (y != _lastScrollY || authorNameColumnWidth != _lastAuthorNameColumnWidth)
if (IsLoaded)
{
_lastScrollY = y;
_lastAuthorNameColumnWidth = authorNameColumnWidth;
CommitGraph.InvalidateVisual();
}
}
@@ -161,7 +154,7 @@ namespace SourceGit.Views
private void OnCommitListContextRequested(object sender, ContextRequestedEventArgs e)
{
if (DataContext is ViewModels.Histories histories && sender is ListBox { SelectedItems.Count: > 0 } list)
if (DataContext is ViewModels.Histories histories && sender is DataGrid { SelectedItems.Count: > 0 } list)
{
var menu = histories.MakeContextMenu(list);
menu?.Open(list);
@@ -175,7 +168,7 @@ namespace SourceGit.Views
return;
// These shortcuts are not mentioned in the Shortcut Reference window. Is this expected?
if (sender is ListBox { SelectedItems: { Count: > 0 } selected })
if (sender is DataGrid { SelectedItems: { Count: > 0 } selected })
{
// CTRL/COMMAND + C -> Copy selected commit SHA and subject.
if (e.Key == Key.C)
@@ -212,13 +205,14 @@ namespace SourceGit.Views
}
}
private void OnCommitListItemDoubleTapped(object sender, TappedEventArgs e)
private void OnCommitListDoubleTapped(object sender, TappedEventArgs e)
{
e.Handled = true;
if (DataContext is ViewModels.Histories histories &&
CommitListContainer.SelectedItems is { Count: 1 } &&
sender is Grid { DataContext: Models.Commit commit })
sender is DataGrid grid &&
e.Source != grid)
{
if (e.Source is CommitRefsPresenter crp)
{
@@ -227,11 +221,9 @@ namespace SourceGit.Views
return;
}
histories.CheckoutBranchByCommit(commit);
if (e.Source is Control { DataContext: Models.Commit c })
histories.CheckoutBranchByCommit(c);
}
}
private double _lastScrollY = 0;
private double _lastAuthorNameColumnWidth = 0;
}
}