Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/Models/RepositoryUIStates.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,12 @@ public HistoryShowFlags HistoryShowFlags
set;
} = HistoryShowFlags.None;

public bool IsTreeColumnVisibleInHistory
{
get;
set;
} = false;

public bool IsAuthorColumnVisibleInHistory
{
get;
Expand Down
2 changes: 2 additions & 0 deletions src/Resources/Locales/en_US.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -526,6 +526,8 @@
<x:String x:Key="Text.Histories.Header.AuthorTime" xml:space="preserve">AUTHOR TIME</x:String>
<x:String x:Key="Text.Histories.Header.CommitTime" xml:space="preserve">COMMIT TIME</x:String>
<x:String x:Key="Text.Histories.Header.GraphAndSubject" xml:space="preserve">GRAPH &amp; SUBJECT</x:String>
<x:String x:Key="Text.Histories.Header.Subject" xml:space="preserve">SUBJECT</x:String>
<x:String x:Key="Text.Histories.Header.Tree" xml:space="preserve">TREE</x:String>
<x:String x:Key="Text.Histories.Header.SHA" xml:space="preserve">SHA</x:String>
<x:String x:Key="Text.Histories.HighlightsInGraph" xml:space="preserve">HIGHLIGHTS IN GRAPH</x:String>
<x:String x:Key="Text.Histories.HighlightsInGraph.All" xml:space="preserve">All</x:String>
Expand Down
14 changes: 14 additions & 0 deletions src/ViewModels/Histories.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,19 @@ public bool EnableTopoOrder
}
}

public bool IsTreeColumnVisible
{
get => _repo.UIStates.IsTreeColumnVisibleInHistory;
set
{
if (_repo.UIStates.IsTreeColumnVisibleInHistory != value)
{
_repo.UIStates.IsTreeColumnVisibleInHistory = value;
OnPropertyChanged();
}
}
}

public bool IsAuthorColumnVisible
{
get => _repo.UIStates.IsAuthorColumnVisibleInHistory;
Expand Down Expand Up @@ -575,6 +588,7 @@ private void GenerateGraph(List<Models.Commit> commits)
}

Graph = Models.CommitGraph.Generate(commits, firstParentOnly, highlighting, extraHeads);

}

private Repository _repo = null;
Expand Down
39 changes: 36 additions & 3 deletions src/Views/Histories.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,13 @@
</Style>
</Style>

<Style Selector="Border.history_message" x:DataType="m:Commit">
<Setter Property="Padding" Value="{Binding LeftMargin, Converter={x:Static c:DoubleConverters.ToLeftMargin}}"/>
</Style>
<Style Selector="Border.history_message.separate_tree">
<Setter Property="Padding" Value="0"/>
</Style>

<Style Selector="DataGridCell">
<Setter Property="Template">
<ControlTemplate>
Expand All @@ -103,16 +110,41 @@
</DataGrid.Styles>

<DataGrid.Columns>
<DataGridTemplateColumn Width="0" MinWidth="0"
IsReadOnly="True"
IsVisible="{Binding IsTreeColumnVisible, Mode=OneWay}">
<DataGridTemplateColumn.Header>
<Canvas Height="24" ClipToBounds="True">
<Border Width="{Binding $parent[Canvas].Bounds.Width}" Height="24">
<TextBlock Classes="table_header" Text="{DynamicResource Text.Histories.Header.Tree}"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</Canvas>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border Background="Transparent"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

<DataGridTemplateColumn Width="*" IsReadOnly="True">
<DataGridTemplateColumn.Header>
<Border Padding="48,0">
<TextBlock Classes="table_header" Text="{DynamicResource Text.Histories.Header.GraphAndSubject}" HorizontalAlignment="Center"/>
<Grid>
<TextBlock Classes="table_header" Text="{DynamicResource Text.Histories.Header.GraphAndSubject}" HorizontalAlignment="Center"
IsVisible="{Binding !IsTreeColumnVisible}"/>
<TextBlock Classes="table_header" Text="{DynamicResource Text.Histories.Header.Subject}" HorizontalAlignment="Center"
IsVisible="{Binding IsTreeColumnVisible}"/>
</Grid>
</Border>
</DataGridTemplateColumn.Header>

<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="m:Commit">
<Border Padding="{Binding LeftMargin, Converter={x:Static c:DoubleConverters.ToLeftMargin}}" ClipToBounds="True" Background="Transparent">
<Border Classes="history_message"
Classes.separate_tree="{Binding $parent[v:Histories].((vm:Histories)DataContext).IsTreeColumnVisible}"
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}"
Expand Down Expand Up @@ -247,7 +279,8 @@
HorizontalAlignment="Stretch" VerticalAlignment="Top"
PointerMoved="OnCommitListHeaderPointerMoved"
PointerPressed="OnCommitListHeaderPointerPressed"
PointerReleased="OnCommitListHeaderPointerReleased">
PointerReleased="OnCommitListHeaderPointerReleased"
PointerCaptureLost="OnCommitListHeaderPointerCaptureLost">
<StackPanel Orientation="Horizontal"
Height="18"
Margin="4,0,0,0"
Expand Down
61 changes: 48 additions & 13 deletions src/Views/Histories.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -460,36 +460,39 @@ public async Task GotoChild()
}
}

private double SubjectColumnRight => CommitListContainer.Columns[1].ActualWidth +
(CommitListContainer.Columns[0].IsVisible ? CommitListContainer.Columns[0].ActualWidth : 0);

protected override void OnDataContextChanged(EventArgs e)
{
base.OnDataContextChanged(e);

if (DataContext is ViewModels.Histories vm)
CommitListContainer.Columns[1].Width = new(vm.AuthorColumnWidth, DataGridLengthUnitType.Pixel);
CommitListContainer.Columns[2].Width = new(vm.AuthorColumnWidth, DataGridLengthUnitType.Pixel);
}

private void OnCommitListHeaderPointerMoved(object sender, PointerEventArgs e)
{
if (sender is not Border border)
return;

if (DataContext is not ViewModels.Histories { IsAuthorColumnVisible: true } vm)
if (DataContext is not ViewModels.Histories vm)
return;

var pos = e.GetPosition(border);
if (_resizingAuthorColumn)
{
var posX = CommitListContainer.Columns[0].ActualWidth;
var maxW = posX + CommitListContainer.Columns[1].ActualWidth - 100;
var posX = SubjectColumnRight;
var maxW = posX + CommitListContainer.Columns[2].ActualWidth - 100;
var delta = posX - pos.X;
var w = Math.Max(Math.Min(vm.AuthorColumnWidth + delta, maxW), 80);
CommitListContainer.Columns[1].Width = new(w, DataGridLengthUnitType.Pixel);
CommitListContainer.Columns[2].Width = new(w, DataGridLengthUnitType.Pixel);
vm.AuthorColumnWidth = w;
}
else
{
var dis = CommitListContainer.Columns[0].ActualWidth - 4 - pos.X;
if (dis < 4 && dis > -4)
var nearAuthorEdge = vm.IsAuthorColumnVisible && Math.Abs(SubjectColumnRight - 4 - pos.X) < 4;
if (nearAuthorEdge)
{
if (border.Cursor != _resizingCursor)
border.Cursor = _resizingCursor;
Expand All @@ -506,19 +509,30 @@ private void OnCommitListHeaderPointerPressed(object sender, PointerPressedEvent
if (sender is not Border border)
return;

var pos = e.GetPosition(border);
var dis = CommitListContainer.Columns[0].ActualWidth - 4 - pos.X;
if (dis > 4 || dis < -4)
if (DataContext is not ViewModels.Histories vm || !e.GetCurrentPoint(border).Properties.IsLeftButtonPressed)
return;

if (e.GetCurrentPoint(border).Properties.IsLeftButtonPressed)
var pos = e.GetPosition(border);
if (vm.IsAuthorColumnVisible && Math.Abs(SubjectColumnRight - 4 - pos.X) < 4)
{
_resizingAuthorColumn = true;
e.Handled = true;
}
else
{
return;
}

e.Pointer.Capture(border);
e.Handled = true;
}

private void OnCommitListHeaderPointerReleased(object sender, PointerReleasedEventArgs e)
{
_resizingAuthorColumn = false;
e.Pointer.Capture(null);
}

private void OnCommitListHeaderPointerCaptureLost(object sender, PointerCaptureLostEventArgs e)
{
_resizingAuthorColumn = false;
}
Expand Down Expand Up @@ -679,6 +693,16 @@ private void OnOpenAdvancedOptions(object sender, RoutedEventArgs e)
columnsHeader.Header = new TextBlock() { Text = App.Text("Histories.ShowColumns"), FontWeight = FontWeight.Bold };
columnsHeader.IsEnabled = false;

var treeColumn = new MenuItem();
treeColumn.Header = App.Text("Histories.Header.Tree");
if (histories.IsTreeColumnVisible)
treeColumn.Icon = this.CreateMenuIcon("Icons.Check");
treeColumn.Click += (_, ev) =>
{
histories.IsTreeColumnVisible = !histories.IsTreeColumnVisible;
ev.Handled = true;
};

var authorColumn = new MenuItem();
authorColumn.Header = App.Text("Histories.Header.Author");
if (histories.IsAuthorColumnVisible)
Expand Down Expand Up @@ -742,6 +766,7 @@ private void OnOpenAdvancedOptions(object sender, RoutedEventArgs e)
menu.Items.Add(currentBranchAndSelectedCommits);
menu.Items.Add(new MenuItem() { Header = "-" });
menu.Items.Add(columnsHeader);
menu.Items.Add(treeColumn);
menu.Items.Add(authorColumn);
menu.Items.Add(shaColumn);
menu.Items.Add(authorTimeColumn);
Expand All @@ -761,12 +786,18 @@ private void OnCommitListLayoutUpdated(object _1, EventArgs _2)

double rowHeight = dataGrid.RowHeight;
double startY = 0;
// The header must not add space beyond the visible graph lanes.
double treeWidth = 0;
foreach (var child in rowsPresenter.Children)
{
if (child is DataGridRow { IsVisible: true } row)
{
rowHeight = row.Bounds.Height;

if (row.Bounds.Bottom > 0 && row.Bounds.Top < rowsPresenter.Bounds.Height &&
row.DataContext is Models.Commit commit)
treeWidth = Math.Max(treeWidth, commit.LeftMargin + 4);

if (row.Bounds.Top <= 0 && row.Bounds.Top > -rowHeight)
{
var test = rowHeight * row.Index - row.Bounds.Top;
Expand All @@ -778,7 +809,11 @@ private void OnCommitListLayoutUpdated(object _1, EventArgs _2)

IsScrollToTopVisible = startY >= rowHeight;

var clipWidth = dataGrid.Columns[0].ActualWidth - 4;
var graphColumn = DataContext is ViewModels.Histories { IsTreeColumnVisible: true } ? 0 : 1;
if (graphColumn == 0 && Math.Abs(dataGrid.Columns[0].Width.Value - treeWidth) > 0.01)
dataGrid.Columns[0].Width = new(treeWidth, DataGridLengthUnitType.Pixel);

var clipWidth = Math.Max(0, dataGrid.Columns[graphColumn].ActualWidth - 4);
var lastLayout = CommitGraph.Layout;
if (lastLayout == null ||
Math.Abs(lastLayout.StartY - startY) > 0.01 ||
Expand Down