2024-06-27 06:43:15 -07:00
|
|
|
using System;
|
2024-03-17 18:37:06 -07:00
|
|
|
|
2024-03-02 06:45:14 -08:00
|
|
|
using Avalonia;
|
2024-02-05 23:08:37 -08:00
|
|
|
using Avalonia.Controls;
|
|
|
|
using Avalonia.Controls.Primitives;
|
|
|
|
using Avalonia.Input;
|
|
|
|
using Avalonia.Interactivity;
|
2024-03-17 18:37:06 -07:00
|
|
|
|
|
|
|
namespace SourceGit.Views
|
|
|
|
{
|
|
|
|
public partial class Repository : UserControl
|
|
|
|
{
|
|
|
|
public Repository()
|
|
|
|
{
|
2024-02-05 23:08:37 -08:00
|
|
|
InitializeComponent();
|
|
|
|
}
|
|
|
|
|
2024-07-04 04:12:22 -07:00
|
|
|
protected override void OnLoaded(RoutedEventArgs e)
|
|
|
|
{
|
|
|
|
base.OnLoaded(e);
|
2024-07-06 08:50:54 -07:00
|
|
|
UpdateLeftSidebarLayout();
|
2024-07-04 04:12:22 -07:00
|
|
|
}
|
|
|
|
|
2024-03-17 18:37:06 -07:00
|
|
|
private void OnSearchCommitPanelPropertyChanged(object sender, AvaloniaPropertyChangedEventArgs e)
|
|
|
|
{
|
2024-07-09 21:11:51 -07:00
|
|
|
if (e.Property == IsVisibleProperty && sender is Grid { IsVisible: true })
|
2024-07-14 00:55:15 -07:00
|
|
|
TxtSearchCommitsBox.Focus();
|
2024-03-07 00:18:51 -08:00
|
|
|
}
|
|
|
|
|
2024-07-06 05:46:26 -07:00
|
|
|
private void OnSearchKeyDown(object _, KeyEventArgs e)
|
2024-03-17 18:37:06 -07:00
|
|
|
{
|
|
|
|
if (e.Key == Key.Enter)
|
|
|
|
{
|
2024-07-13 07:36:59 -07:00
|
|
|
if (DataContext is ViewModels.Repository repo && !string.IsNullOrWhiteSpace(repo.SearchCommitFilter))
|
2024-02-05 23:08:37 -08:00
|
|
|
repo.StartSearchCommits();
|
2024-05-24 04:15:12 -07:00
|
|
|
|
2024-02-05 23:08:37 -08:00
|
|
|
e.Handled = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-17 18:37:06 -07:00
|
|
|
private void OnSearchResultDataGridSelectionChanged(object sender, SelectionChangedEventArgs e)
|
|
|
|
{
|
2024-07-06 05:46:26 -07:00
|
|
|
if (sender is DataGrid { SelectedItem: Models.Commit commit } && DataContext is ViewModels.Repository repo)
|
2024-03-17 18:37:06 -07:00
|
|
|
{
|
2024-07-06 02:17:41 -07:00
|
|
|
repo.NavigateToCommit(commit.SHA);
|
2024-02-05 23:08:37 -08:00
|
|
|
}
|
2024-07-09 21:11:51 -07:00
|
|
|
|
2024-02-05 23:08:37 -08:00
|
|
|
e.Handled = true;
|
|
|
|
}
|
2024-07-06 08:50:54 -07:00
|
|
|
|
|
|
|
private void OnBranchTreeRowsChanged(object _, RoutedEventArgs e)
|
|
|
|
{
|
|
|
|
UpdateLeftSidebarLayout();
|
|
|
|
e.Handled = true;
|
|
|
|
}
|
|
|
|
|
2024-07-06 05:46:26 -07:00
|
|
|
private void OnLocalBranchTreeSelectionChanged(object _1, RoutedEventArgs _2)
|
2024-03-17 18:37:06 -07:00
|
|
|
{
|
2024-07-14 00:55:15 -07:00
|
|
|
RemoteBranchTree.UnselectAll();
|
|
|
|
TagsList.SelectedItem = null;
|
2024-05-29 01:42:47 -07:00
|
|
|
}
|
2024-07-09 21:11:51 -07:00
|
|
|
|
2024-07-06 05:46:26 -07:00
|
|
|
private void OnRemoteBranchTreeSelectionChanged(object _1, RoutedEventArgs _2)
|
2024-05-29 01:42:47 -07:00
|
|
|
{
|
2024-07-14 00:55:15 -07:00
|
|
|
LocalBranchTree.UnselectAll();
|
|
|
|
TagsList.SelectedItem = null;
|
2024-05-29 01:42:47 -07:00
|
|
|
}
|
|
|
|
|
2024-07-06 05:46:26 -07:00
|
|
|
private void OnTagDataGridSelectionChanged(object sender, SelectionChangedEventArgs _)
|
2024-05-29 01:42:47 -07:00
|
|
|
{
|
2024-07-06 05:46:26 -07:00
|
|
|
if (sender is DataGrid { SelectedItem: Models.Tag tag })
|
2024-05-29 01:42:47 -07:00
|
|
|
{
|
2024-07-14 00:55:15 -07:00
|
|
|
LocalBranchTree.UnselectAll();
|
|
|
|
RemoteBranchTree.UnselectAll();
|
2024-05-29 01:42:47 -07:00
|
|
|
|
|
|
|
if (DataContext is ViewModels.Repository repo)
|
|
|
|
repo.NavigateToCommit(tag.SHA);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-17 18:37:06 -07:00
|
|
|
private void OnTagContextRequested(object sender, ContextRequestedEventArgs e)
|
|
|
|
{
|
2024-07-14 00:55:15 -07:00
|
|
|
if (sender is DataGrid { SelectedItem: Models.Tag tag } grid && DataContext is ViewModels.Repository repo)
|
2024-03-17 18:37:06 -07:00
|
|
|
{
|
2024-02-05 23:08:37 -08:00
|
|
|
var menu = repo.CreateContextMenuForTag(tag);
|
2024-07-14 00:55:15 -07:00
|
|
|
grid.OpenContextMenu(menu);
|
2024-02-05 23:08:37 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
e.Handled = true;
|
|
|
|
}
|
|
|
|
|
2024-07-14 00:55:15 -07:00
|
|
|
private void OnTagFilterIsCheckedChanged(object sender, RoutedEventArgs e)
|
2024-03-17 18:37:06 -07:00
|
|
|
{
|
2024-07-06 05:46:26 -07:00
|
|
|
if (sender is ToggleButton { DataContext: Models.Tag tag } toggle && DataContext is ViewModels.Repository repo)
|
2024-03-17 18:37:06 -07:00
|
|
|
{
|
2024-07-06 05:46:26 -07:00
|
|
|
repo.UpdateFilter(tag.Name, toggle.IsChecked == true);
|
2024-02-05 23:08:37 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
e.Handled = true;
|
|
|
|
}
|
|
|
|
|
2024-05-29 01:42:47 -07:00
|
|
|
private void OnSubmoduleContextRequested(object sender, ContextRequestedEventArgs e)
|
2024-03-17 18:37:06 -07:00
|
|
|
{
|
2024-07-14 00:55:15 -07:00
|
|
|
if (sender is DataGrid { SelectedItem: string submodule } grid && DataContext is ViewModels.Repository repo)
|
2024-03-17 18:37:06 -07:00
|
|
|
{
|
2024-05-29 01:42:47 -07:00
|
|
|
var menu = repo.CreateContextMenuForSubmodule(submodule);
|
2024-07-14 00:55:15 -07:00
|
|
|
grid.OpenContextMenu(menu);
|
2024-02-05 23:08:37 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
e.Handled = true;
|
|
|
|
}
|
2024-06-06 00:31:02 -07:00
|
|
|
|
2024-06-27 03:25:16 -07:00
|
|
|
private void OnDoubleTappedSubmodule(object sender, TappedEventArgs e)
|
|
|
|
{
|
2024-07-14 00:55:15 -07:00
|
|
|
if (sender is DataGrid { SelectedItem: string submodule } && DataContext is ViewModels.Repository repo)
|
2024-06-27 03:25:16 -07:00
|
|
|
{
|
2024-07-06 02:17:41 -07:00
|
|
|
repo.OpenSubmodule(submodule);
|
2024-06-27 03:25:16 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
e.Handled = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void OnWorktreeContextRequested(object sender, ContextRequestedEventArgs e)
|
|
|
|
{
|
2024-07-14 00:55:15 -07:00
|
|
|
if (sender is DataGrid { SelectedItem: Models.Worktree worktree } grid && DataContext is ViewModels.Repository repo)
|
2024-06-27 03:25:16 -07:00
|
|
|
{
|
|
|
|
var menu = repo.CreateContextMenuForWorktree(worktree);
|
2024-07-06 02:17:41 -07:00
|
|
|
grid.OpenContextMenu(menu);
|
2024-06-27 03:25:16 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
e.Handled = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void OnDoubleTappedWorktree(object sender, TappedEventArgs e)
|
|
|
|
{
|
2024-07-14 00:55:15 -07:00
|
|
|
if (sender is DataGrid { SelectedItem: Models.Worktree worktree } && DataContext is ViewModels.Repository repo)
|
2024-06-27 03:25:16 -07:00
|
|
|
{
|
2024-07-06 02:17:41 -07:00
|
|
|
repo.OpenWorktree(worktree);
|
2024-06-27 03:25:16 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
e.Handled = true;
|
|
|
|
}
|
|
|
|
|
2024-07-06 05:46:26 -07:00
|
|
|
private void OnLeftSidebarDataGridPropertyChanged(object _, AvaloniaPropertyChangedEventArgs e)
|
2024-07-04 04:12:22 -07:00
|
|
|
{
|
|
|
|
if (e.Property == DataGrid.ItemsSourceProperty || e.Property == DataGrid.IsVisibleProperty)
|
2024-07-04 04:41:38 -07:00
|
|
|
UpdateLeftSidebarLayout();
|
2024-07-26 01:32:48 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
private void OnLeftSidebarSizeChanged(object _, SizeChangedEventArgs e)
|
|
|
|
{
|
|
|
|
if (e.HeightChanged)
|
|
|
|
UpdateLeftSidebarLayout();
|
2024-07-04 04:12:22 -07:00
|
|
|
}
|
2024-07-06 08:50:54 -07:00
|
|
|
|
|
|
|
private void UpdateLeftSidebarLayout()
|
|
|
|
{
|
|
|
|
var vm = DataContext as ViewModels.Repository;
|
|
|
|
if (vm == null || vm.Settings == null)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (!IsLoaded)
|
|
|
|
return;
|
|
|
|
|
2024-07-14 00:55:15 -07:00
|
|
|
var leftHeight = LeftSidebarGroups.Bounds.Height - 28.0 * 5;
|
|
|
|
var localBranchRows = vm.IsLocalBranchGroupExpanded ? LocalBranchTree.Rows.Count : 0;
|
|
|
|
var remoteBranchRows = vm.IsRemoteGroupExpanded ? RemoteBranchTree.Rows.Count : 0;
|
2024-07-06 08:50:54 -07:00
|
|
|
var desiredBranches = (localBranchRows + remoteBranchRows) * 24.0;
|
2024-07-14 00:55:15 -07:00
|
|
|
var desiredTag = vm.IsTagGroupExpanded ? TagsList.RowHeight * vm.VisibleTags.Count : 0;
|
|
|
|
var desiredSubmodule = vm.IsSubmoduleGroupExpanded ? SubmoduleList.RowHeight * vm.Submodules.Count : 0;
|
|
|
|
var desiredWorktree = vm.IsWorktreeGroupExpanded ? WorktreeList.RowHeight * vm.Worktrees.Count : 0;
|
2024-07-06 08:50:54 -07:00
|
|
|
var desiredOthers = desiredTag + desiredSubmodule + desiredWorktree;
|
|
|
|
var hasOverflow = (desiredBranches + desiredOthers > leftHeight);
|
|
|
|
|
|
|
|
if (vm.IsTagGroupExpanded)
|
|
|
|
{
|
|
|
|
var height = desiredTag;
|
|
|
|
if (hasOverflow)
|
|
|
|
{
|
|
|
|
var test = leftHeight - desiredBranches - desiredSubmodule - desiredWorktree;
|
|
|
|
if (test < 0)
|
|
|
|
height = Math.Min(200, height);
|
|
|
|
else
|
|
|
|
height = Math.Max(200, test);
|
|
|
|
}
|
|
|
|
|
|
|
|
leftHeight -= height;
|
2024-07-14 00:55:15 -07:00
|
|
|
TagsList.Height = height;
|
2024-07-06 08:50:54 -07:00
|
|
|
hasOverflow = (desiredBranches + desiredSubmodule + desiredWorktree) > leftHeight;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (vm.IsSubmoduleGroupExpanded)
|
|
|
|
{
|
|
|
|
var height = desiredSubmodule;
|
|
|
|
if (hasOverflow)
|
|
|
|
{
|
|
|
|
var test = leftHeight - desiredBranches - desiredWorktree;
|
|
|
|
if (test < 0)
|
|
|
|
height = Math.Min(200, height);
|
|
|
|
else
|
|
|
|
height = Math.Max(200, test);
|
|
|
|
}
|
|
|
|
|
|
|
|
leftHeight -= height;
|
2024-07-14 00:55:15 -07:00
|
|
|
SubmoduleList.Height = height;
|
2024-07-06 08:50:54 -07:00
|
|
|
hasOverflow = (desiredBranches + desiredWorktree) > leftHeight;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (vm.IsWorktreeGroupExpanded)
|
|
|
|
{
|
|
|
|
var height = desiredWorktree;
|
|
|
|
if (hasOverflow)
|
|
|
|
{
|
|
|
|
var test = leftHeight - desiredBranches;
|
|
|
|
if (test < 0)
|
|
|
|
height = Math.Min(200, height);
|
|
|
|
else
|
|
|
|
height = Math.Max(200, test);
|
|
|
|
}
|
|
|
|
|
|
|
|
leftHeight -= height;
|
2024-07-14 00:55:15 -07:00
|
|
|
WorktreeList.Height = height;
|
2024-07-06 08:50:54 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (desiredBranches > leftHeight)
|
|
|
|
{
|
|
|
|
var local = localBranchRows * 24.0;
|
|
|
|
var remote = remoteBranchRows * 24.0;
|
|
|
|
var half = leftHeight / 2;
|
|
|
|
if (vm.IsLocalBranchGroupExpanded)
|
|
|
|
{
|
|
|
|
if (vm.IsRemoteGroupExpanded)
|
|
|
|
{
|
|
|
|
if (local < half)
|
|
|
|
{
|
2024-07-14 00:55:15 -07:00
|
|
|
LocalBranchTree.Height = local;
|
|
|
|
RemoteBranchTree.Height = leftHeight - local;
|
2024-07-06 08:50:54 -07:00
|
|
|
}
|
|
|
|
else if (remote < half)
|
|
|
|
{
|
2024-07-14 00:55:15 -07:00
|
|
|
RemoteBranchTree.Height = remote;
|
|
|
|
LocalBranchTree.Height = leftHeight - remote;
|
2024-07-06 08:50:54 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2024-07-14 00:55:15 -07:00
|
|
|
LocalBranchTree.Height = half;
|
|
|
|
RemoteBranchTree.Height = half;
|
2024-07-06 08:50:54 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2024-07-14 00:55:15 -07:00
|
|
|
LocalBranchTree.Height = leftHeight;
|
2024-07-06 08:50:54 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (vm.IsRemoteGroupExpanded)
|
|
|
|
{
|
2024-07-14 00:55:15 -07:00
|
|
|
RemoteBranchTree.Height = leftHeight;
|
2024-07-06 08:50:54 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (vm.IsLocalBranchGroupExpanded)
|
|
|
|
{
|
|
|
|
var height = localBranchRows * 24;
|
2024-07-14 00:55:15 -07:00
|
|
|
LocalBranchTree.Height = height;
|
2024-07-06 08:50:54 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (vm.IsRemoteGroupExpanded)
|
|
|
|
{
|
|
|
|
var height = remoteBranchRows * 24;
|
2024-07-14 00:55:15 -07:00
|
|
|
RemoteBranchTree.Height = height;
|
2024-07-06 08:50:54 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-02-05 23:08:37 -08:00
|
|
|
}
|
2024-03-31 01:54:29 -07:00
|
|
|
}
|