diff --git a/src/ViewModels/Histories.cs b/src/ViewModels/Histories.cs index db368d80..68703521 100644 --- a/src/ViewModels/Histories.cs +++ b/src/ViewModels/Histories.cs @@ -214,8 +214,47 @@ public void Select(IList commits) } } - 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; diff --git a/src/Views/CommitRefsPresenter.cs b/src/Views/CommitRefsPresenter.cs index 507da1c2..e8fa4517 100644 --- a/src/Views/CommitRefsPresenter.cs +++ b/src/Views/CommitRefsPresenter.cs @@ -156,6 +156,22 @@ protected override void OnDataContextChanged(EventArgs e) 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(); diff --git a/src/Views/Histories.axaml.cs b/src/Views/Histories.axaml.cs index 18630e4c..995e8c1a 100644 --- a/src/Views/Histories.axaml.cs +++ b/src/Views/Histories.axaml.cs @@ -182,10 +182,14 @@ private void OnCommitListDoubleTapped(object sender, TappedEventArgs e) { 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(); if (item is { DataContext: Models.Commit commit }) - histories.DoubleTapped(commit); + histories.DoubleTapped(commit, decorator); } e.Handled = true; }