summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2024-01-14 13:28:30 +1100
committerJesse Duffield <jessedduffield@gmail.com>2024-01-19 10:47:21 +1100
commitd08fafb1c446572c40151e88f8025e28a62bd819 (patch)
treee601682b8b74e4cf577ac77d660c4044f6da5632
parentf3eb180f75496637719895902abf76af10b8425f (diff)
Clear range select upon pressing 'escape'
This is the highest priority of the escape actions because it's the thing you're most likely to want to do upon hitting escape if you have a range selected. Applying this to the staging/patch-building views is tricky: if we want this logic for when a range of lines is selected, we'll also need to apply it when a hunk is selected too. I still think it's worth it though: I've often accidentally escaped from the staging view when trying to cancel a range selection.
-rw-r--r--docs/dev/Codebase_Guide.md1
-rw-r--r--pkg/gui/controllers/patch_building_controller.go8
-rw-r--r--pkg/gui/controllers/quit_actions.go7
-rw-r--r--pkg/gui/controllers/staging_controller.go5
-rw-r--r--pkg/integration/tests/patch_building/specific_selection.go8
-rw-r--r--pkg/integration/tests/ui/range_select.go26
6 files changed, 50 insertions, 5 deletions
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"),
)
}