diff --git a/docs/dev/Codebase_Guide.md b/docs/dev/Codebase_Guide.md index 307482e2a..7f9752f5d 100644 --- a/docs/dev/Codebase_Guide.md +++ b/docs/dev/Codebase_Guide.md @@ -58,6 +58,7 @@ * `pkg/gui/gui_common.go`: defines gui-specific methods that all controllers and helpers have access to * `pkg/i18n/english.go`: defines the set of i18n strings and their English values * `pkg/gui/controllers/helpers/refresh_helper.go`: manages refreshing of models. The refresh helper is typically invoked at the end of an action to re-load affected models from git (e.g. re-load branches after doing a git pull) +* `pkg/gui/controllers/quit_actions.go`: contains code that runs when you hit 'escape' on a view (assuming the view doesn't define its own escape handler) * `vendor/github.com/jesseduffield/gocui/gui.go`: defines the gocui gui struct * `vendor/github.com/jesseduffield/gocui/view.go`: defines the gocui view struct diff --git a/pkg/gui/controllers/patch_building_controller.go b/pkg/gui/controllers/patch_building_controller.go index 68179d158..ff5bd777b 100644 --- a/pkg/gui/controllers/patch_building_controller.go +++ b/pkg/gui/controllers/patch_building_controller.go @@ -154,5 +154,13 @@ func (self *PatchBuildingController) toggleSelection() error { } func (self *PatchBuildingController) Escape() error { + context := self.c.Contexts().CustomPatchBuilder + state := context.GetState() + + if state.SelectingRange() || state.SelectingHunk() { + state.SetLineSelectMode() + return self.c.PostRefreshUpdate(context) + } + return self.c.Helpers().PatchBuilding.Escape() } diff --git a/pkg/gui/controllers/quit_actions.go b/pkg/gui/controllers/quit_actions.go index dd23448ec..7b1ba4c2d 100644 --- a/pkg/gui/controllers/quit_actions.go +++ b/pkg/gui/controllers/quit_actions.go @@ -51,6 +51,13 @@ func (self *QuitActions) confirmQuitDuringUpdate() error { func (self *QuitActions) Escape() error { currentContext := self.c.CurrentContext() + if listContext, ok := currentContext.(types.IListContext); ok { + if listContext.GetList().IsSelectingRange() { + listContext.GetList().CancelRangeSelect() + return self.c.PostRefreshUpdate(listContext) + } + } + switch ctx := currentContext.(type) { case types.IFilterableContext: if ctx.IsFiltering() { diff --git a/pkg/gui/controllers/staging_controller.go b/pkg/gui/controllers/staging_controller.go index 46cd6cb69..31432fa68 100644 --- a/pkg/gui/controllers/staging_controller.go +++ b/pkg/gui/controllers/staging_controller.go @@ -151,6 +151,11 @@ func (self *StagingController) EditFile() error { } func (self *StagingController) Escape() error { + if self.context.GetState().SelectingRange() || self.context.GetState().SelectingHunk() { + self.context.GetState().SetLineSelectMode() + return self.c.PostRefreshUpdate(self.context) + } + return self.c.PopContext() } diff --git a/pkg/integration/tests/patch_building/specific_selection.go b/pkg/integration/tests/patch_building/specific_selection.go index b9c9da8a6..a9dbf9f11 100644 --- a/pkg/integration/tests/patch_building/specific_selection.go +++ b/pkg/integration/tests/patch_building/specific_selection.go @@ -88,6 +88,9 @@ var SpecificSelection = NewIntegrationTest(NewIntegrationTestArgs{ Contains(" 1f"), ) }). + // Cancel hunk select + PressEscape(). + // Escape the view PressEscape() t.Views().CommitFiles(). @@ -97,11 +100,6 @@ var SpecificSelection = NewIntegrationTest(NewIntegrationTestArgs{ t.Views().PatchBuilding(). IsFocused(). - // hunk is selected because selection mode persists across files - ContainsLines( - Contains("@@ -0,0 +1,26 @@").IsSelected(), - ). - Press(keys.Main.ToggleSelectHunk). SelectedLines( Contains("+2a"), ). diff --git a/pkg/integration/tests/ui/range_select.go b/pkg/integration/tests/ui/range_select.go index 84441701c..4885c7cb4 100644 --- a/pkg/integration/tests/ui/range_select.go +++ b/pkg/integration/tests/ui/range_select.go @@ -12,9 +12,11 @@ import ( // (no range, press arrow) -> no range // (no range, press shift+arrow) -> nonsticky range // (sticky range, press 'v') -> no range +// (sticky range, press 'escape') -> no range // (sticky range, press arrow) -> sticky range // (sticky range, press shift+arrow) -> nonsticky range // (nonsticky range, press 'v') -> no range +// (nonsticky range, press 'escape') -> no range // (nonsticky range, press arrow) -> no range // (nonsticky range, press shift+arrow) -> nonsticky range @@ -125,6 +127,30 @@ var RangeSelect = NewIntegrationTest(NewIntegrationTestArgs{ Press(keys.Universal.ToggleRangeSelect). SelectedLines( Contains("line 7"), + ). + Press(keys.Universal.RangeSelectDown). + SelectedLines( + Contains("line 7"), + Contains("line 8"), + ). + // (nonsticky range, press 'escape') -> no range + PressEscape(). + SelectedLines( + Contains("line 8"), + ). + Press(keys.Universal.ToggleRangeSelect). + SelectedLines( + Contains("line 8"), + ). + SelectNextItem(). + SelectedLines( + Contains("line 8"), + Contains("line 9"), + ). + // (sticky range, press 'escape') -> no range + PressEscape(). + SelectedLines( + Contains("line 9"), ) }