Skip to content

Commit 6888a44

Browse files
committed
feature: support to collapse commit details panel (only vertical layout)
Signed-off-by: leo <longshuang@msn.cn>
1 parent d85f709 commit 6888a44

7 files changed

Lines changed: 172 additions & 55 deletions

File tree

src/Resources/Icons.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
<StreamGeometry x:Key="Icons.Clone">M1280 704c0 141-115 256-256 256H288C129 960 0 831 0 672c0-126 80-232 192-272A327 327 0 01192 384c0-177 143-320 320-320 119 0 222 64 277 160C820 204 857 192 896 192c106 0 192 86 192 192 0 24-5 48-13 69C1192 477 1280 580 1280 704zm-493-128H656V352c0-18-14-32-32-32h-96c-18 0-32 14-32 32v224h-131c-29 0-43 34-23 55l211 211c12 12 33 12 45 0l211-211c20-20 6-55-23-55z</StreamGeometry>
2424
<StreamGeometry x:Key="Icons.Close">M523 398 918 3l113 113-396 396 397 397-113 113-397-397-397 397-113-113 397-397L14 116l113-113 396 396z</StreamGeometry>
2525
<StreamGeometry x:Key="Icons.Code">M853 102H171C133 102 102 133 102 171v683C102 891 133 922 171 922h683C891 922 922 891 922 853V171C922 133 891 102 853 102zM390 600l-48 48L205 512l137-137 48 48L301 512l88 88zM465 819l-66-18L559 205l66 18L465 819zm218-171L634 600 723 512l-88-88 48-48L819 512 683 649z</StreamGeometry>
26+
<StreamGeometry x:Key="Icons.CollapseToBottom">M213 896h597c47 0 85-38 85-85V213c0-47-38-85-85-85H213c-47 0-85 38-85 85v597c0 47 38 85 85 85zM811 213l0 384H213V213h597z</StreamGeometry>
2627
<StreamGeometry x:Key="Icons.ColorPicker">M128 854h768v86H128zM390 797c13 13 29 19 48 19s35-6 45-19l291-288c26-22 26-64 0-90L435 83l-61 61L426 192l-272 269c-22 22-22 64 0 90l237 246zm93-544 211 211-32 32H240l243-243zM707 694c0 48 38 86 86 86 48 0 86-38 86-86 0-22-10-45-26-61L794 576l-61 61c-13 13-26 35-26 58z</StreamGeometry>
2728
<StreamGeometry x:Key="Icons.Command">M325 312l-60 60L404 513 265 652l60 60 200-200L325 312zm194 345h236v97h-236v-97zM29 77v870h968V77H29zm870 774H125V173h774v678z</StreamGeometry>
2829
<StreamGeometry x:Key="Icons.Commit">M0 512M1024 512M512 0M512 1024M796 471A292 292 0 00512 256a293 293 0 00-284 215H0v144h228A293 293 0 00512 832a291 291 0 00284-217H1024V471h-228M512 688A146 146 0 01366 544A145 145 0 01512 400c80 0 146 63 146 144A146 146 0 01512 688</StreamGeometry>

src/Resources/Styles.axaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1385,11 +1385,14 @@
13851385
<Setter Property="Foreground" Value="{DynamicResource Brush.FG1}"/>
13861386
<Setter Property="Opacity" Value="1"/>
13871387
</Style>
1388-
13891388
<Style Selector="TabItem:selected TextBlock.tab_header">
13901389
<Setter Property="Foreground" Value="{DynamicResource Brush.Accent}"/>
13911390
<Setter Property="Opacity" Value="1"/>
13921391
</Style>
1392+
<Style Selector="TabItem:disabled TextBlock.tab_header">
1393+
<Setter Property="Foreground" Value="{DynamicResource Brush.FG1}"/>
1394+
<Setter Property="Opacity" Value="0.35"/>
1395+
</Style>
13931396

13941397
<Style Selector="NumericUpDown">
13951398
<Style Selector="^ /template/ ButtonSpinner#PART_Spinner">

src/ViewModels/Histories.cs

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -118,28 +118,30 @@ public AvaloniaList<Models.IssueTracker> IssueTrackers
118118
get => _repo.IssueTrackers;
119119
}
120120

121-
public GridLength LeftArea
121+
public GridLength DetailsWidth
122122
{
123-
get => _leftArea;
124-
set => SetProperty(ref _leftArea, value);
123+
get => _detailsWidth;
124+
set => SetProperty(ref _detailsWidth, value);
125125
}
126126

127-
public GridLength RightArea
127+
public GridLength DetailsHeight
128128
{
129-
get => _rightArea;
130-
set => SetProperty(ref _rightArea, value);
131-
}
132-
133-
public GridLength TopArea
134-
{
135-
get => _topArea;
136-
set => SetProperty(ref _topArea, value);
129+
get => _isCollapseDetails ? new GridLength(28, GridUnitType.Pixel) : _detailsHeight;
130+
set
131+
{
132+
if (!Preferences.Instance.UseTwoColumnsLayoutInHistories && !_isCollapseDetails)
133+
SetProperty(ref _detailsHeight, value);
134+
}
137135
}
138136

139-
public GridLength BottomArea
137+
public bool IsCollapseDetails
140138
{
141-
get => _bottomArea;
142-
set => SetProperty(ref _bottomArea, value);
139+
get => _isCollapseDetails;
140+
set
141+
{
142+
if (!Preferences.Instance.UseTwoColumnsLayoutInHistories && SetProperty(ref _isCollapseDetails, value))
143+
OnPropertyChanged(nameof(DetailsHeight));
144+
}
143145
}
144146

145147
public Histories(Repository repo)
@@ -489,9 +491,8 @@ private void PostSelectedCommitsChanged()
489491
private object _detailContext = null;
490492
private bool _ignoreSelectionChange = false;
491493

492-
private GridLength _leftArea = new GridLength(1, GridUnitType.Star);
493-
private GridLength _rightArea = new GridLength(1, GridUnitType.Star);
494-
private GridLength _topArea = new GridLength(1, GridUnitType.Star);
495-
private GridLength _bottomArea = new GridLength(1, GridUnitType.Star);
494+
private GridLength _detailsWidth = new GridLength(1, GridUnitType.Star);
495+
private GridLength _detailsHeight = new GridLength(1, GridUnitType.Star);
496+
private bool _isCollapseDetails = false;
496497
}
497498
}

src/Views/CommitDetail.axaml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
<!-- Information Page -->
1414
<TabItem>
1515
<TabItem.Header>
16-
<TextBlock Classes="tab_header" Text="{DynamicResource Text.CommitDetail.Info}"/>
16+
<Border Background="Transparent" PointerPressed="OnTabHeaderPointerPressed">
17+
<TextBlock Classes="tab_header" Text="{DynamicResource Text.CommitDetail.Info}"/>
18+
</Border>
1719
</TabItem.Header>
1820

1921
<ScrollViewer Margin="4,0,0,0" Offset="{Binding ScrollOffset, Mode=TwoWay}" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
@@ -83,14 +85,18 @@
8385

8486
<TabItem>
8587
<TabItem.Header>
86-
<TextBlock Classes="tab_header" Text="{DynamicResource Text.CommitDetail.Changes}"/>
88+
<Border Background="Transparent" PointerPressed="OnTabHeaderPointerPressed">
89+
<TextBlock Classes="tab_header" Text="{DynamicResource Text.CommitDetail.Changes}"/>
90+
</Border>
8791
</TabItem.Header>
8892
<v:CommitChanges Margin="4,0"/>
8993
</TabItem>
9094

9195
<TabItem>
9296
<TabItem.Header>
93-
<TextBlock Classes="tab_header" Text="{DynamicResource Text.CommitDetail.Files}"/>
97+
<Border Background="Transparent" PointerPressed="OnTabHeaderPointerPressed">
98+
<TextBlock Classes="tab_header" Text="{DynamicResource Text.CommitDetail.Files}"/>
99+
</Border>
94100
</TabItem.Header>
95101
<v:RevisionFiles Margin="4,0"/>
96102
</TabItem>

src/Views/CommitDetail.axaml.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Avalonia.Input;
88
using Avalonia.LogicalTree;
99
using Avalonia.Platform.Storage;
10+
using Avalonia.VisualTree;
1011

1112
namespace SourceGit.Views
1213
{
@@ -472,6 +473,19 @@ public ContextMenu CreateChangeContextMenu(Models.Change change)
472473
return menu;
473474
}
474475

476+
private void OnTabHeaderPointerPressed(object sender, PointerPressedEventArgs e)
477+
{
478+
if (ViewModels.Preferences.Instance.UseTwoColumnsLayoutInHistories)
479+
return;
480+
481+
var historiesView = this.FindAncestorOfType<Histories>();
482+
if (historiesView is not { DataContext: ViewModels.Histories vm })
483+
return;
484+
485+
if (vm.IsCollapseDetails)
486+
vm.IsCollapseDetails = false;
487+
}
488+
475489
private async void OnCommitListKeyDown(object sender, KeyEventArgs e)
476490
{
477491
if (DataContext is not ViewModels.CommitDetail vm)

src/Views/Histories.axaml

Lines changed: 112 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@
1212
x:Name="ThisControl">
1313
<v:HistoriesLayout UseHorizontal="{Binding Source={x:Static vm:Preferences.Instance}, Path=UseTwoColumnsLayoutInHistories}">
1414
<v:HistoriesLayout.RowDefinitions>
15-
<RowDefinition Height="{Binding TopArea, Mode=TwoWay}" MinHeight="100"/>
15+
<RowDefinition Height="*" MinHeight="100"/>
1616
<RowDefinition Height="3"/>
17-
<RowDefinition Height="{Binding BottomArea, Mode=TwoWay}" MinHeight="200"/>
17+
<RowDefinition Height="{Binding DetailsHeight, Mode=TwoWay}" MinHeight="28"/>
1818
</v:HistoriesLayout.RowDefinitions>
1919

2020
<v:HistoriesLayout.ColumnDefinitions>
21-
<ColumnDefinition Width="{Binding LeftArea, Mode=TwoWay}" MinWidth="100"/>
21+
<ColumnDefinition Width="*" MinWidth="100"/>
2222
<ColumnDefinition Width="3"/>
23-
<ColumnDefinition Width="{Binding RightArea, Mode=TwoWay}" MinWidth="100"/>
23+
<ColumnDefinition Width="{Binding DetailsWidth, Mode=TwoWay}" MinWidth="100"/>
2424
</v:HistoriesLayout.ColumnDefinitions>
2525

2626
<Grid Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3">
@@ -271,46 +271,126 @@
271271
Focusable="False"/>
272272

273273
<Grid Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3">
274-
<Grid IsVisible="{Binding DetailContext, Converter={x:Static ObjectConverters.IsNull}}">
275-
<Path Width="128" Height="128"
276-
Data="{StaticResource Icons.Detail}"
277-
HorizontalAlignment="Center"
278-
Fill="{DynamicResource Brush.FG2}"/>
279-
280-
<StackPanel Margin="0,8" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Bottom">
281-
<Path Width="12" Height="12" VerticalAlignment="Center" Data="{StaticResource Icons.Info}" Fill="{DynamicResource Brush.FG2}"/>
282-
<TextBlock Margin="4,0" Text="{DynamicResource Text.Histories.Tips.Prefix}" FontWeight="Bold" Foreground="{DynamicResource Brush.FG2}"/>
283-
<TextBlock Text="{DynamicResource Text.Histories.Tips}" Foreground="{DynamicResource Brush.FG2}" IsVisible="{OnPlatform True, macOS=False}"/>
284-
<TextBlock Text="{DynamicResource Text.Histories.Tips.MacOS}" Foreground="{DynamicResource Brush.FG2}" IsVisible="{OnPlatform False, macOS=True}"/>
285-
</StackPanel>
286-
</Grid>
287-
288-
<ContentControl Content="{Binding DetailContext}">
274+
<ContentControl>
275+
<ContentControl.Content>
276+
<Binding Path="DetailContext">
277+
<Binding.TargetNullValue>
278+
<TabControl Padding="0,4">
279+
<TabItem>
280+
<TabItem.Header>
281+
<Border Background="Transparent" PointerPressed="OnTabHeaderPointerPressed">
282+
<TextBlock Classes="tab_header" Text="{DynamicResource Text.CommitDetail.Info}"/>
283+
</Border>
284+
</TabItem.Header>
285+
286+
<Grid Margin="0,32,0,0" ClipToBounds="True">
287+
<Path Width="128" Height="128"
288+
Data="{StaticResource Icons.Detail}"
289+
HorizontalAlignment="Center"
290+
Fill="{DynamicResource Brush.FG2}"/>
291+
292+
<StackPanel Margin="0,8" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Bottom">
293+
<Path Width="12" Height="12" VerticalAlignment="Center" Data="{StaticResource Icons.Info}" Fill="{DynamicResource Brush.FG2}"/>
294+
<TextBlock Margin="4,0" Text="{DynamicResource Text.Histories.Tips.Prefix}" FontWeight="Bold" Foreground="{DynamicResource Brush.FG2}"/>
295+
<TextBlock Text="{DynamicResource Text.Histories.Tips}" Foreground="{DynamicResource Brush.FG2}" IsVisible="{OnPlatform True, macOS=False}"/>
296+
<TextBlock Text="{DynamicResource Text.Histories.Tips.MacOS}" Foreground="{DynamicResource Brush.FG2}" IsVisible="{OnPlatform False, macOS=True}"/>
297+
</StackPanel>
298+
</Grid>
299+
</TabItem>
300+
301+
<TabItem IsEnabled="False">
302+
<TabItem.Header>
303+
<TextBlock Classes="tab_header" Text="{DynamicResource Text.CommitDetail.Changes}"/>
304+
</TabItem.Header>
305+
</TabItem>
306+
307+
<TabItem IsEnabled="False">
308+
<TabItem.Header>
309+
<TextBlock Classes="tab_header" Text="{DynamicResource Text.CommitDetail.Files}"/>
310+
</TabItem.Header>
311+
</TabItem>
312+
</TabControl>
313+
</Binding.TargetNullValue>
314+
</Binding>
315+
</ContentControl.Content>
316+
289317
<ContentControl.DataTemplates>
290318
<DataTemplate DataType="vm:CommitDetail">
291319
<v:CommitDetail/>
292320
</DataTemplate>
293321

294322
<DataTemplate DataType="vm:RevisionCompare">
295-
<v:RevisionCompare/>
323+
<TabControl SelectedIndex="1" Padding="0">
324+
<TabItem IsEnabled="False">
325+
<TabItem.Header>
326+
<TextBlock Classes="tab_header" Text="{DynamicResource Text.CommitDetail.Info}"/>
327+
</TabItem.Header>
328+
</TabItem>
329+
330+
<TabItem>
331+
<TabItem.Header>
332+
<Border Background="Transparent" PointerPressed="OnTabHeaderPointerPressed">
333+
<TextBlock Classes="tab_header" Text="{DynamicResource Text.CommitDetail.Changes}"/>
334+
</Border>
335+
</TabItem.Header>
336+
337+
<v:RevisionCompare/>
338+
</TabItem>
339+
340+
<TabItem IsEnabled="False">
341+
<TabItem.Header>
342+
<TextBlock Classes="tab_header" Text="{DynamicResource Text.CommitDetail.Files}"/>
343+
</TabItem.Header>
344+
</TabItem>
345+
</TabControl>
296346
</DataTemplate>
297347

298348
<DataTemplate DataType="m:Count">
299-
<StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center">
300-
<Path Width="128" Height="128"
301-
Data="{StaticResource Icons.Detail}"
302-
HorizontalAlignment="Center"
303-
Fill="{DynamicResource Brush.FG2}"/>
304-
305-
<TextBlock HorizontalAlignment="Center"
306-
Margin="0,16"
307-
FontSize="24" FontWeight="Bold"
308-
Foreground="{DynamicResource Brush.FG2}"
309-
Text="{Binding Value, Converter={x:Static c:StringConverters.FormatByResourceKey}, ConverterParameter='Histories.Selected'}"/>
310-
</StackPanel>
349+
<TabControl Padding="0,4">
350+
<TabItem>
351+
<TabItem.Header>
352+
<Border Background="Transparent" PointerPressed="OnTabHeaderPointerPressed">
353+
<TextBlock Classes="tab_header" Text="{DynamicResource Text.CommitDetail.Info}"/>
354+
</Border>
355+
</TabItem.Header>
356+
357+
<StackPanel ClipToBounds="True" Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center">
358+
<Path Width="128" Height="128"
359+
Data="{StaticResource Icons.Detail}"
360+
HorizontalAlignment="Center"
361+
Fill="{DynamicResource Brush.FG2}"/>
362+
363+
<TextBlock HorizontalAlignment="Center"
364+
Margin="0,16"
365+
FontSize="24" FontWeight="Bold"
366+
Foreground="{DynamicResource Brush.FG2}"
367+
Text="{Binding Value, Converter={x:Static c:StringConverters.FormatByResourceKey}, ConverterParameter='Histories.Selected'}"/>
368+
</StackPanel>
369+
</TabItem>
370+
371+
<TabItem IsEnabled="False">
372+
<TabItem.Header>
373+
<TextBlock Classes="tab_header" Text="{DynamicResource Text.CommitDetail.Changes}"/>
374+
</TabItem.Header>
375+
</TabItem>
376+
377+
<TabItem IsEnabled="False">
378+
<TabItem.Header>
379+
<TextBlock Classes="tab_header" Text="{DynamicResource Text.CommitDetail.Files}"/>
380+
</TabItem.Header>
381+
</TabItem>
382+
</TabControl>
311383
</DataTemplate>
312384
</ContentControl.DataTemplates>
313385
</ContentControl>
386+
387+
<ToggleButton Classes="line_path"
388+
HorizontalAlignment="Right" VerticalAlignment="Top"
389+
Margin="0,2,8,0"
390+
IsChecked="{Binding IsCollapseDetails, Mode=TwoWay}"
391+
IsVisible="{Binding Source={x:Static vm:Preferences.Instance}, Path=UseTwoColumnsLayoutInHistories, Mode=OneWay, Converter={x:Static BoolConverters.Not}}">
392+
<Path Width="14" Height="14" Data="{StaticResource Icons.CollapseToBottom}" Margin="0,3,0,0"/>
393+
</ToggleButton>
314394
</Grid>
315395
</v:HistoriesLayout>
316396
</UserControl>

src/Views/Histories.axaml.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,18 @@ sender is DataGrid grid &&
595595
}
596596
}
597597

598+
private void OnTabHeaderPointerPressed(object sender, PointerPressedEventArgs e)
599+
{
600+
if (ViewModels.Preferences.Instance.UseTwoColumnsLayoutInHistories)
601+
return;
602+
603+
if (DataContext is not ViewModels.Histories vm)
604+
return;
605+
606+
if (vm.IsCollapseDetails)
607+
vm.IsCollapseDetails = false;
608+
}
609+
598610
private ContextMenu CreateContextMenuForMultipleCommits(ViewModels.Repository repo, List<Models.Commit> selected)
599611
{
600612
var canCherryPick = true;

0 commit comments

Comments
 (0)