Skip to content

Commit ca06ce6

Browse files
authored
Collapse selection after deleting a range of branches or stashes (#4661)
- **PR Description** Fixes selection state persistence after deletion by resetting selection mode. Resolves [#4612](#4612)
2 parents 61ff8a4 + bc0cddf commit ca06ce6

File tree

5 files changed

+19
-8
lines changed

5 files changed

+19
-8
lines changed

pkg/gui/context/traits/list_cursor.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,19 @@ func (self *ListCursor) GetRangeStartIdx() (int, bool) {
133133
return 0, false
134134
}
135135

136+
// Cancel range select mode, but keep the "moving end" of the range selected.
137+
// Used when pressing 'v' or escape to toggle range select mode, for example.
136138
func (self *ListCursor) CancelRangeSelect() {
137139
self.rangeSelectMode = RangeSelectModeNone
138140
}
139141

142+
// Cancel range select mode, but keep the top of the range selected. Note that
143+
// this is different from CancelRangeSelect. Useful after deleting a range of items.
144+
func (self *ListCursor) CollapseRangeSelectionToTop() {
145+
start, _ := self.GetSelectionRange()
146+
self.SetSelection(start)
147+
}
148+
140149
// Returns true if we are in range select mode. Note that we may be in range select
141150
// mode and still only selecting a single item. See AreMultipleItemsSelected below.
142151
func (self *ListCursor) IsSelectingRange() bool {

pkg/gui/controllers/branches_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@ func (self *BranchesController) remoteDelete(branches []*models.Branch) error {
535535
remoteBranches := lo.Map(branches, func(branch *models.Branch, _ int) *models.RemoteBranch {
536536
return &models.RemoteBranch{Name: branch.UpstreamBranch, RemoteName: branch.UpstreamRemote}
537537
})
538-
return self.c.Helpers().BranchesHelper.ConfirmDeleteRemote(remoteBranches)
538+
return self.c.Helpers().BranchesHelper.ConfirmDeleteRemote(remoteBranches, false)
539539
}
540540

541541
func (self *BranchesController) localAndRemoteDelete(branches []*models.Branch) error {

pkg/gui/controllers/helpers/branches_helper.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ func (self *BranchesHelper) ConfirmLocalDelete(branches []*models.Branch) error
4747
if err := self.c.Git().Branch.LocalDelete(branchNames, true); err != nil {
4848
return err
4949
}
50-
selectionStart, _ := self.c.Contexts().Branches.GetSelectionRange()
51-
self.c.Contexts().Branches.SetSelectedLineIdx(selectionStart)
50+
51+
self.c.Contexts().Branches.CollapseRangeSelectionToTop()
5252
self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES}})
5353
return nil
5454
})
@@ -82,7 +82,7 @@ func (self *BranchesHelper) ConfirmLocalDelete(branches []*models.Branch) error
8282
return nil
8383
}
8484

85-
func (self *BranchesHelper) ConfirmDeleteRemote(remoteBranches []*models.RemoteBranch) error {
85+
func (self *BranchesHelper) ConfirmDeleteRemote(remoteBranches []*models.RemoteBranch, resetRemoteBranchesSelection bool) error {
8686
var title string
8787
if len(remoteBranches) == 1 {
8888
title = utils.ResolvePlaceholderString(
@@ -115,6 +115,9 @@ func (self *BranchesHelper) ConfirmDeleteRemote(remoteBranches []*models.RemoteB
115115
return err
116116
}
117117
self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES, types.REMOTES}})
118+
if resetRemoteBranchesSelection {
119+
self.c.Contexts().RemoteBranches.CollapseRangeSelectionToTop()
120+
}
118121
return nil
119122
})
120123
},
@@ -180,9 +183,7 @@ func (self *BranchesHelper) ConfirmLocalAndRemoteDelete(branches []*models.Branc
180183
return err
181184
}
182185

183-
selectionStart, _ := self.c.Contexts().Branches.GetSelectionRange()
184-
self.c.Contexts().Branches.SetSelectedLineIdx(selectionStart)
185-
186+
self.c.Contexts().Branches.CollapseRangeSelectionToTop()
186187
self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES, types.REMOTES}})
187188
return nil
188189
})

pkg/gui/controllers/remote_branches_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ func (self *RemoteBranchesController) context() *context.RemoteBranchesContext {
133133
}
134134

135135
func (self *RemoteBranchesController) delete(selectedBranches []*models.RemoteBranch) error {
136-
return self.c.Helpers().BranchesHelper.ConfirmDeleteRemote(selectedBranches)
136+
return self.c.Helpers().BranchesHelper.ConfirmDeleteRemote(selectedBranches, true)
137137
}
138138

139139
func (self *RemoteBranchesController) merge(selectedBranch *models.RemoteBranch) error {

pkg/gui/controllers/stash_controller.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ func (self *StashController) handleStashDrop(stashEntries []*models.StashEntry)
178178
return err
179179
}
180180
}
181+
self.context().CollapseRangeSelectionToTop()
181182
return nil
182183
},
183184
})

0 commit comments

Comments
 (0)