fix: bounds not updated after left side bar layout updated

This commit is contained in:
leo 2024-07-06 23:50:54 +08:00
parent b03ee19e54
commit 294f856150
4 changed files with 174 additions and 153 deletions

View file

@ -10,13 +10,11 @@
x:Name="ThisControl"> x:Name="ThisControl">
<DataGrid x:Name="BranchesPresenter" <DataGrid x:Name="BranchesPresenter"
ItemsSource="{Binding #ThisControl.Rows}" ItemsSource="{Binding #ThisControl.Rows}"
Height="{Binding #ThisControl.Height}"
Background="Transparent" Background="Transparent"
RowHeight="24" RowHeight="24"
CanUserReorderColumns="False" CanUserReorderColumns="False"
CanUserResizeColumns="False" CanUserResizeColumns="False"
CanUserSortColumns="False" CanUserSortColumns="False"
HorizontalAlignment="Stretch"
HorizontalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
HeadersVisibility="None" HeadersVisibility="None"

View file

@ -113,6 +113,15 @@ namespace SourceGit.Views
remove { RemoveHandler(SelectionChangedEvent, value); } remove { RemoveHandler(SelectionChangedEvent, value); }
} }
public static readonly RoutedEvent<RoutedEventArgs> RowsChangedEvent =
RoutedEvent.Register<BranchTree, RoutedEventArgs>(nameof(RowsChanged), RoutingStrategies.Tunnel | RoutingStrategies.Bubble);
public event EventHandler<RoutedEventArgs> RowsChanged
{
add { AddHandler(RowsChangedEvent, value); }
remove { RemoveHandler(RowsChangedEvent, value); }
}
public BranchTree() public BranchTree()
{ {
InitializeComponent(); InitializeComponent();
@ -123,6 +132,14 @@ namespace SourceGit.Views
BranchesPresenter.SelectedItem = null; BranchesPresenter.SelectedItem = null;
} }
protected override void OnSizeChanged(SizeChangedEventArgs e)
{
base.OnSizeChanged(e);
if (Bounds.Height >= 23.0)
BranchesPresenter.Height = Bounds.Height;
}
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
{ {
base.OnPropertyChanged(change); base.OnPropertyChanged(change);
@ -138,18 +155,20 @@ namespace SourceGit.Views
Rows.AddRange(rows); Rows.AddRange(rows);
} }
var repo = this.FindAncestorOfType<Repository>(); RaiseEvent(new RoutedEventArgs(RowsChangedEvent));
repo?.UpdateLeftSidebarLayout();
} }
else if (change.Property == IsVisibleProperty) else if (change.Property == IsVisibleProperty)
{ {
var repo = this.FindAncestorOfType<Repository>(); RaiseEvent(new RoutedEventArgs(RowsChangedEvent));
repo?.UpdateLeftSidebarLayout();
} }
} }
private void OnNodesSelectionChanged(object _, SelectionChangedEventArgs e) private void OnNodesSelectionChanged(object _, SelectionChangedEventArgs e)
{ {
var repo = DataContext as ViewModels.Repository;
if (repo?.Settings == null)
return;
foreach (var item in e.AddedItems) foreach (var item in e.AddedItems)
{ {
if (item is ViewModels.BranchTreeNode node) if (item is ViewModels.BranchTreeNode node)
@ -167,10 +186,7 @@ namespace SourceGit.Views
return; return;
if (selected.Count == 1 && selected[0] is ViewModels.BranchTreeNode { Backend: Models.Branch branch }) if (selected.Count == 1 && selected[0] is ViewModels.BranchTreeNode { Backend: Models.Branch branch })
{ repo.NavigateToCommit(branch.Head);
var repo = DataContext as ViewModels.Repository;
repo?.NavigateToCommit(branch.Head);
}
var prev = null as ViewModels.BranchTreeNode; var prev = null as ViewModels.BranchTreeNode;
foreach (var row in Rows) foreach (var row in Rows)
@ -285,8 +301,7 @@ namespace SourceGit.Views
rows.RemoveRange(idx + 1, removeCount); rows.RemoveRange(idx + 1, removeCount);
} }
var repo = this.FindAncestorOfType<Repository>(); RaiseEvent(new RoutedEventArgs(RowsChangedEvent));
repo?.UpdateLeftSidebarLayout();
} }
} }
} }

View file

@ -241,7 +241,8 @@
Margin="8,0,4,0" Margin="8,0,4,0"
Nodes="{Binding LocalBranchTrees}" Nodes="{Binding LocalBranchTrees}"
IsVisible="{Binding IsLocalBranchGroupExpanded}" IsVisible="{Binding IsLocalBranchGroupExpanded}"
SelectionChanged="OnLocalBranchTreeSelectionChanged"/> SelectionChanged="OnLocalBranchTreeSelectionChanged"
RowsChanged="OnBranchTreeRowsChanged"/>
<!-- Remotes --> <!-- Remotes -->
<ToggleButton Grid.Row="2" Classes="group_expander" IsChecked="{Binding IsRemoteGroupExpanded, Mode=TwoWay}"> <ToggleButton Grid.Row="2" Classes="group_expander" IsChecked="{Binding IsRemoteGroupExpanded, Mode=TwoWay}">
@ -257,7 +258,8 @@
Margin="8,0,4,0" Margin="8,0,4,0"
Nodes="{Binding RemoteBranchTrees}" Nodes="{Binding RemoteBranchTrees}"
IsVisible="{Binding IsRemoteGroupExpanded}" IsVisible="{Binding IsRemoteGroupExpanded}"
SelectionChanged="OnRemoteBranchTreeSelectionChanged"/> SelectionChanged="OnRemoteBranchTreeSelectionChanged"
RowsChanged="OnBranchTreeRowsChanged"/>
<!-- Tags --> <!-- Tags -->
<ToggleButton Grid.Row="4" Classes="group_expander" IsChecked="{Binding IsTagGroupExpanded, Mode=TwoWay}"> <ToggleButton Grid.Row="4" Classes="group_expander" IsChecked="{Binding IsTagGroupExpanded, Mode=TwoWay}">

View file

@ -15,7 +15,188 @@ namespace SourceGit.Views
InitializeComponent(); InitializeComponent();
} }
public void UpdateLeftSidebarLayout() protected override void OnLoaded(RoutedEventArgs e)
{
base.OnLoaded(e);
UpdateLeftSidebarLayout();
}
private void OpenWithExternalTools(object sender, RoutedEventArgs e)
{
if (sender is Button button && DataContext is ViewModels.Repository repo)
{
var menu = repo.CreateContextMenuForExternalTools();
button.OpenContextMenu(menu);
e.Handled = true;
}
}
private void OpenGitFlowMenu(object sender, RoutedEventArgs e)
{
if (DataContext is ViewModels.Repository repo)
{
var menu = repo.CreateContextMenuForGitFlow();
(sender as Control)?.OpenContextMenu(menu);
}
e.Handled = true;
}
private void OpenGitLFSMenu(object sender, RoutedEventArgs e)
{
if (DataContext is ViewModels.Repository repo)
{
var menu = repo.CreateContextMenuForGitLFS();
(sender as Control)?.OpenContextMenu(menu);
}
e.Handled = true;
}
private async void OpenStatistics(object _, RoutedEventArgs e)
{
if (DataContext is ViewModels.Repository repo && TopLevel.GetTopLevel(this) is Window owner)
{
var dialog = new Statistics() { DataContext = new ViewModels.Statistics(repo.FullPath) };
await dialog.ShowDialog(owner);
e.Handled = true;
}
}
private void OnSearchCommitPanelPropertyChanged(object sender, AvaloniaPropertyChangedEventArgs e)
{
if (e.Property == IsVisibleProperty && sender is Grid { IsVisible: true})
txtSearchCommitsBox.Focus();
}
private void OnSearchKeyDown(object _, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
if (DataContext is ViewModels.Repository repo)
repo.StartSearchCommits();
e.Handled = true;
}
}
private void OnSearchResultDataGridSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (sender is DataGrid { SelectedItem: Models.Commit commit } && DataContext is ViewModels.Repository repo)
{
repo.NavigateToCommit(commit.SHA);
}
e.Handled = true;
}
private void OnBranchTreeRowsChanged(object _, RoutedEventArgs e)
{
UpdateLeftSidebarLayout();
e.Handled = true;
}
private void OnLocalBranchTreeSelectionChanged(object _1, RoutedEventArgs _2)
{
remoteBranchTree.UnselectAll();
tagsList.SelectedItem = null;
}
private void OnRemoteBranchTreeSelectionChanged(object _1, RoutedEventArgs _2)
{
localBranchTree.UnselectAll();
tagsList.SelectedItem = null;
}
private void OnTagDataGridSelectionChanged(object sender, SelectionChangedEventArgs _)
{
if (sender is DataGrid { SelectedItem: Models.Tag tag })
{
localBranchTree.UnselectAll();
remoteBranchTree.UnselectAll();
if (DataContext is ViewModels.Repository repo)
repo.NavigateToCommit(tag.SHA);
}
}
private void OnTagContextRequested(object sender, ContextRequestedEventArgs e)
{
if (sender is DataGrid datagrid && datagrid.SelectedItem != null && DataContext is ViewModels.Repository repo)
{
var tag = datagrid.SelectedItem as Models.Tag;
var menu = repo.CreateContextMenuForTag(tag);
datagrid.OpenContextMenu(menu);
}
e.Handled = true;
}
private void OnToggleTagFilter(object sender, RoutedEventArgs e)
{
if (sender is ToggleButton { DataContext: Models.Tag tag } toggle && DataContext is ViewModels.Repository repo)
{
repo.UpdateFilter(tag.Name, toggle.IsChecked == true);
}
e.Handled = true;
}
private void OnSubmoduleContextRequested(object sender, ContextRequestedEventArgs e)
{
if (sender is DataGrid datagrid && datagrid.SelectedItem != null && DataContext is ViewModels.Repository repo)
{
var submodule = datagrid.SelectedItem as string;
var menu = repo.CreateContextMenuForSubmodule(submodule);
datagrid.OpenContextMenu(menu);
}
e.Handled = true;
}
private void OnDoubleTappedSubmodule(object sender, TappedEventArgs e)
{
if (sender is DataGrid { SelectedItem: not null } grid && DataContext is ViewModels.Repository repo)
{
var submodule = grid.SelectedItem as string;
repo.OpenSubmodule(submodule);
}
e.Handled = true;
}
private void OnWorktreeContextRequested(object sender, ContextRequestedEventArgs e)
{
if (sender is DataGrid { SelectedItem: not null } grid && DataContext is ViewModels.Repository repo)
{
var worktree = grid.SelectedItem as Models.Worktree;
var menu = repo.CreateContextMenuForWorktree(worktree);
grid.OpenContextMenu(menu);
}
e.Handled = true;
}
private void OnDoubleTappedWorktree(object sender, TappedEventArgs e)
{
if (sender is DataGrid { SelectedItem: not null } grid && DataContext is ViewModels.Repository repo)
{
var worktree = grid.SelectedItem as Models.Worktree;
repo.OpenWorktree(worktree);
}
e.Handled = true;
}
private void OnLeftSidebarDataGridPropertyChanged(object _, AvaloniaPropertyChangedEventArgs e)
{
if (e.Property == DataGrid.ItemsSourceProperty || e.Property == DataGrid.IsVisibleProperty)
{
UpdateLeftSidebarLayout();
}
}
private void UpdateLeftSidebarLayout()
{ {
var vm = DataContext as ViewModels.Repository; var vm = DataContext as ViewModels.Repository;
if (vm == null || vm.Settings == null) if (vm == null || vm.Settings == null)
@ -133,183 +314,8 @@ namespace SourceGit.Views
remoteBranchTree.Height = height; remoteBranchTree.Height = height;
} }
} }
}
protected override void OnLoaded(RoutedEventArgs e) leftSidebarGroups.InvalidateMeasure();
{
base.OnLoaded(e);
if (DataContext is ViewModels.Repository { IsSearching: false })
UpdateLeftSidebarLayout();
}
private void OpenWithExternalTools(object sender, RoutedEventArgs e)
{
if (sender is Button button && DataContext is ViewModels.Repository repo)
{
var menu = repo.CreateContextMenuForExternalTools();
button.OpenContextMenu(menu);
e.Handled = true;
}
}
private void OpenGitFlowMenu(object sender, RoutedEventArgs e)
{
if (DataContext is ViewModels.Repository repo)
{
var menu = repo.CreateContextMenuForGitFlow();
(sender as Control)?.OpenContextMenu(menu);
}
e.Handled = true;
}
private void OpenGitLFSMenu(object sender, RoutedEventArgs e)
{
if (DataContext is ViewModels.Repository repo)
{
var menu = repo.CreateContextMenuForGitLFS();
(sender as Control)?.OpenContextMenu(menu);
}
e.Handled = true;
}
private async void OpenStatistics(object _, RoutedEventArgs e)
{
if (DataContext is ViewModels.Repository repo && TopLevel.GetTopLevel(this) is Window owner)
{
var dialog = new Statistics() { DataContext = new ViewModels.Statistics(repo.FullPath) };
await dialog.ShowDialog(owner);
e.Handled = true;
}
}
private void OnSearchCommitPanelPropertyChanged(object sender, AvaloniaPropertyChangedEventArgs e)
{
if (e.Property == IsVisibleProperty && sender is Grid { IsVisible: true})
txtSearchCommitsBox.Focus();
}
private void OnSearchKeyDown(object _, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
if (DataContext is ViewModels.Repository repo)
repo.StartSearchCommits();
e.Handled = true;
}
}
private void OnSearchResultDataGridSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (sender is DataGrid { SelectedItem: Models.Commit commit } && DataContext is ViewModels.Repository repo)
{
repo.NavigateToCommit(commit.SHA);
}
e.Handled = true;
}
private void OnLocalBranchTreeSelectionChanged(object _1, RoutedEventArgs _2)
{
remoteBranchTree.UnselectAll();
tagsList.SelectedItem = null;
}
private void OnRemoteBranchTreeSelectionChanged(object _1, RoutedEventArgs _2)
{
localBranchTree.UnselectAll();
tagsList.SelectedItem = null;
}
private void OnTagDataGridSelectionChanged(object sender, SelectionChangedEventArgs _)
{
if (sender is DataGrid { SelectedItem: Models.Tag tag })
{
localBranchTree.UnselectAll();
remoteBranchTree.UnselectAll();
if (DataContext is ViewModels.Repository repo)
repo.NavigateToCommit(tag.SHA);
}
}
private void OnTagContextRequested(object sender, ContextRequestedEventArgs e)
{
if (sender is DataGrid datagrid && datagrid.SelectedItem != null && DataContext is ViewModels.Repository repo)
{
var tag = datagrid.SelectedItem as Models.Tag;
var menu = repo.CreateContextMenuForTag(tag);
datagrid.OpenContextMenu(menu);
}
e.Handled = true;
}
private void OnToggleTagFilter(object sender, RoutedEventArgs e)
{
if (sender is ToggleButton { DataContext: Models.Tag tag } toggle && DataContext is ViewModels.Repository repo)
{
repo.UpdateFilter(tag.Name, toggle.IsChecked == true);
}
e.Handled = true;
}
private void OnSubmoduleContextRequested(object sender, ContextRequestedEventArgs e)
{
if (sender is DataGrid datagrid && datagrid.SelectedItem != null && DataContext is ViewModels.Repository repo)
{
var submodule = datagrid.SelectedItem as string;
var menu = repo.CreateContextMenuForSubmodule(submodule);
datagrid.OpenContextMenu(menu);
}
e.Handled = true;
}
private void OnDoubleTappedSubmodule(object sender, TappedEventArgs e)
{
if (sender is DataGrid { SelectedItem: not null } grid && DataContext is ViewModels.Repository repo)
{
var submodule = grid.SelectedItem as string;
repo.OpenSubmodule(submodule);
}
e.Handled = true;
}
private void OnWorktreeContextRequested(object sender, ContextRequestedEventArgs e)
{
if (sender is DataGrid { SelectedItem: not null } grid && DataContext is ViewModels.Repository repo)
{
var worktree = grid.SelectedItem as Models.Worktree;
var menu = repo.CreateContextMenuForWorktree(worktree);
grid.OpenContextMenu(menu);
}
e.Handled = true;
}
private void OnDoubleTappedWorktree(object sender, TappedEventArgs e)
{
if (sender is DataGrid { SelectedItem: not null } grid && DataContext is ViewModels.Repository repo)
{
var worktree = grid.SelectedItem as Models.Worktree;
repo.OpenWorktree(worktree);
}
e.Handled = true;
}
private void OnLeftSidebarDataGridPropertyChanged(object _, AvaloniaPropertyChangedEventArgs e)
{
if (e.Property == DataGrid.ItemsSourceProperty || e.Property == DataGrid.IsVisibleProperty)
{
UpdateLeftSidebarLayout();
}
} }
} }
} }