feature: double tap specific branch (#1416)

* feature: double tap specific branch
* exactly match behavior of left sidebar
This commit is contained in:
Nathan Baulch 2025-06-19 12:27:31 +10:00 committed by GitHub
parent cadcf40d74
commit 88fd8f32f1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 61 additions and 2 deletions

View file

@ -209,8 +209,47 @@ namespace SourceGit.ViewModels
}
}
public void DoubleTapped(Models.Commit commit)
public void DoubleTapped(Models.Commit commit, Models.Decorator decorator = null)
{
if (decorator != null)
{
if (decorator.Type == Models.DecoratorType.LocalBranchHead)
{
var b = _repo.Branches.Find(x => x.FriendlyName == decorator.Name);
if (b != null)
{
_repo.CheckoutBranch(b);
return;
}
}
else if (decorator.Type == Models.DecoratorType.RemoteBranchHead)
{
var remoteBranch = _repo.Branches.Find(x => x.FriendlyName == decorator.Name);
if (remoteBranch != null)
{
var localBranch = _repo.Branches.Find(x => x.IsLocal && x.Upstream == remoteBranch.FullName);
if (localBranch != null)
{
if (localBranch.IsCurrent)
return;
if (localBranch.TrackStatus.Ahead.Count > 0)
{
if (_repo.CanCreatePopup())
_repo.ShowPopup(new CreateBranch(_repo, remoteBranch));
}
else if (localBranch.TrackStatus.Behind.Count > 0)
{
if (_repo.CanCreatePopup())
_repo.ShowPopup(new CheckoutAndFastForward(_repo, localBranch, remoteBranch));
}
else
_repo.CheckoutBranch(localBranch);
return;
}
}
}
}
if (commit == null || commit.IsCurrentHead)
return;

View file

@ -156,6 +156,22 @@ namespace SourceGit.Views
InvalidateMeasure();
}
public Models.Decorator DecoratorAt(Point point)
{
if (DataContext is not Models.Commit commit)
return null;
var x = 0.0;
for (var i = 0; i < _items.Count; i++)
{
x += _items[i].Width + 4;
if (point.X < x)
return commit.Decorators[i];
}
return null;
}
protected override Size MeasureOverride(Size availableSize)
{
_items.Clear();

View file

@ -173,10 +173,14 @@ namespace SourceGit.Views
{
if (DataContext is ViewModels.Histories histories && sender is ListBox { SelectedItems.Count: 1 })
{
Models.Decorator decorator = null;
if (e.Source is CommitRefsPresenter crp)
decorator = crp.DecoratorAt(e.GetPosition(crp));
var source = e.Source as Control;
var item = source.FindAncestorOfType<ListBoxItem>();
if (item is { DataContext: Models.Commit commit })
histories.DoubleTapped(commit);
histories.DoubleTapped(commit, decorator);
}
e.Handled = true;
}