From e7105a3138cebf767e15f6f5fd00d816f971609b Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Tue, 7 Jul 2026 10:17:33 +0200 Subject: [PATCH] Collapse the branch range selection on the UI thread after a delete The three branch-delete handlers and the two worktree-removal continuations collapsed the Branches/RemoteBranches range selection from their worker goroutine, racing the UI thread. Wrap each collapse in OnUIThread, keeping it in the same spot relative to the refresh (FIFO preserves the collapse-then-refresh order the name-restore depends on). --- .../controllers/helpers/branches_helper.go | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/pkg/gui/controllers/helpers/branches_helper.go b/pkg/gui/controllers/helpers/branches_helper.go index 683d26db3..5c72bacfd 100644 --- a/pkg/gui/controllers/helpers/branches_helper.go +++ b/pkg/gui/controllers/helpers/branches_helper.go @@ -45,7 +45,10 @@ func (self *BranchesHelper) ConfirmLocalDelete(branches []*models.Branch) error return err } - self.c.Contexts().Branches.CollapseRangeSelectionToTop() + self.c.OnUIThread(func() error { + self.c.Contexts().Branches.CollapseRangeSelectionToTop() + return nil + }) self.c.RefreshFromWorker(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES}}) return nil }) @@ -86,7 +89,10 @@ func (self *BranchesHelper) ConfirmDeleteRemote(remoteBranches []*models.RemoteB } self.c.RefreshFromWorker(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES, types.REMOTES}}) if resetRemoteBranchesSelection { - self.c.Contexts().RemoteBranches.CollapseRangeSelectionToTop() + self.c.OnUIThread(func() error { + self.c.Contexts().RemoteBranches.CollapseRangeSelectionToTop() + return nil + }) } return nil }) @@ -151,7 +157,10 @@ func (self *BranchesHelper) ConfirmLocalAndRemoteDelete(branches []*models.Branc return err } - self.c.Contexts().Branches.CollapseRangeSelectionToTop() + self.c.OnUIThread(func() error { + self.c.Contexts().Branches.CollapseRangeSelectionToTop() + return nil + }) self.c.RefreshFromWorker(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES, types.REMOTES}}) return nil }) @@ -311,7 +320,10 @@ func (self *BranchesHelper) deleteLocalBranchesContinuation(branches []*models.B return err } - self.c.Contexts().Branches.CollapseRangeSelectionToTop() + self.c.OnUIThread(func() error { + self.c.Contexts().Branches.CollapseRangeSelectionToTop() + return nil + }) self.c.RefreshFromWorker(types.RefreshOptions{ Mode: types.ASYNC, Scope: []types.RefreshableView{types.WORKTREES, types.BRANCHES, types.FILES}, @@ -329,7 +341,10 @@ func (self *BranchesHelper) deleteLocalAndRemoteBranchesContinuation(branches [] return err } - self.c.Contexts().Branches.CollapseRangeSelectionToTop() + self.c.OnUIThread(func() error { + self.c.Contexts().Branches.CollapseRangeSelectionToTop() + return nil + }) self.c.RefreshFromWorker(types.RefreshOptions{ Mode: types.ASYNC, Scope: []types.RefreshableView{types.WORKTREES, types.BRANCHES, types.REMOTES, types.FILES},