summaryrefslogtreecommitdiffstats
path: root/pkg/gui
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2022-02-13 18:33:46 +1100
committerJesse Duffield <jessedduffield@gmail.com>2022-03-17 19:13:40 +1100
commitc685a413c94d06f154587015a86701ec82d2ee0c (patch)
treebd0e7f8a0cd9520ae5cf0d62acc663124875e5ef /pkg/gui
parenta643957f89c85fc304b78e3a6aad6e5c1a365d50 (diff)
stash controller
Diffstat (limited to 'pkg/gui')
-rw-r--r--pkg/gui/controllers/stash_controller.go141
-rw-r--r--pkg/gui/gui.go2
-rw-r--r--pkg/gui/keybindings.go24
-rw-r--r--pkg/gui/stash_panel.go107
4 files changed, 144 insertions, 130 deletions
diff --git a/pkg/gui/controllers/stash_controller.go b/pkg/gui/controllers/stash_controller.go
new file mode 100644
index 000000000..2ff9e1cfb
--- /dev/null
+++ b/pkg/gui/controllers/stash_controller.go
@@ -0,0 +1,141 @@
+package controllers
+
+import (
+ "github.com/jesseduffield/lazygit/pkg/commands/models"
+ "github.com/jesseduffield/lazygit/pkg/gui/context"
+ "github.com/jesseduffield/lazygit/pkg/gui/types"
+)
+
+type StashController struct {
+ baseController
+ *controllerCommon
+}
+
+var _ types.IController = &StashController{}
+
+func NewStashController(
+ common *controllerCommon,
+) *StashController {
+ return &StashController{
+ baseController: baseController{},
+ controllerCommon: common,
+ }
+}
+
+func (self *StashController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding {
+ bindings := []*types.Binding{
+ {
+ Key: opts.GetKey(opts.Config.Universal.Select),
+ Handler: self.checkSelected(self.handleStashApply),
+ Description: self.c.Tr.LcApply,
+ },
+ {
+ Key: opts.GetKey(opts.Config.Stash.PopStash),
+ Handler: self.checkSelected(self.handleStashPop),
+ Description: self.c.Tr.LcPop,
+ },
+ {
+ Key: opts.GetKey(opts.Config.Universal.Remove),
+ Handler: self.checkSelected(self.handleStashDrop),
+ Description: self.c.Tr.LcDrop,
+ },
+ {
+ Key: opts.GetKey(opts.Config.Universal.New),
+ Handler: self.checkSelected(self.handleNewBranchOffStashEntry),
+ Description: self.c.Tr.LcNewBranch,
+ },
+ }
+
+ return bindings
+}
+
+func (self *StashController) checkSelected(callback func(*models.StashEntry) error) func() error {
+ return func() error {
+ item := self.context().GetSelected()
+ if item == nil {
+ return nil
+ }
+
+ return callback(item)
+ }
+}
+
+func (self *StashController) Context() types.Context {
+ return self.context()
+}
+
+func (self *StashController) context() *context.StashContext {
+ return self.contexts.Stash
+}
+
+func (self *StashController) handleStashApply(stashEntry *models.StashEntry) error {
+ apply := func() error {
+ self.c.LogAction(self.c.Tr.Actions.Stash)
+ err := self.git.Stash.Apply(stashEntry.Index)
+ _ = self.postStashRefresh()
+ if err != nil {
+ return self.c.Error(err)
+ }
+ return nil
+ }
+
+ if self.c.UserConfig.Gui.SkipStashWarning {
+ return apply()
+ }
+
+ return self.c.Ask(types.AskOpts{
+ Title: self.c.Tr.StashApply,
+ Prompt: self.c.Tr.SureApplyStashEntry,
+ HandleConfirm: func() error {
+ return apply()
+ },
+ })
+}
+
+func (self *StashController) handleStashPop(stashEntry *models.StashEntry) error {
+ pop := func() error {
+ self.c.LogAction(self.c.Tr.Actions.Stash)
+ err := self.git.Stash.Pop(stashEntry.Index)
+ _ = self.postStashRefresh()
+ if err != nil {
+ return self.c.Error(err)
+ }
+ return nil
+ }
+
+ if self.c.UserConfig.Gui.SkipStashWarning {
+ return pop()
+ }
+
+ return self.c.Ask(types.AskOpts{
+ Title: self.c.Tr.StashPop,
+ Prompt: self.c.Tr.SurePopStashEntry,
+ HandleConfirm: func() error {
+ return pop()
+ },
+ })
+}
+
+func (self *StashController) handleStashDrop(stashEntry *models.StashEntry) error {
+ return self.c.Ask(types.AskOpts{
+ Title: self.c.Tr.StashDrop,
+ Prompt: self.c.Tr.SureDropStashEntry,
+ HandleConfirm: func() error {
+ self.c.LogAction(self.c.Tr.Actions.Stash)
+ err := self.git.Stash.Drop(stashEntry.Index)
+ _ = self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.STASH}})
+ if err != nil {
+ return self.c.Error(err)
+ }
+ return nil
+ },
+ })
+}
+
+func (self *StashController) postStashRefresh() error {
+ return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.STASH, types.FILES}})
+}
+
+func (self *StashController) handleNewBranchOffStashEntry(stashEntry *models.StashEntry) error {
+ return self.helpers.Refs.NewBranch(stashEntry.RefName(), stashEntry.Description(), "")
+}
diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go
index a31c781ed..982ecae1e 100644
--- a/pkg/gui/gui.go
+++ b/pkg/gui/gui.go
@@ -566,6 +566,7 @@ func (gui *Gui) resetControllers() {
branchesController := controllers.NewBranchesController(common)
gitFlowController := controllers.NewGitFlowController(common)
filesRemoveController := controllers.NewFilesRemoveController(common)
+ stashController := controllers.NewStashController(common)
switchToSubCommitsControllerFactory := controllers.NewSubCommitsSwitchControllerFactory(
common,
@@ -602,6 +603,7 @@ func (gui *Gui) resetControllers() {
controllers.AttachControllers(gui.State.Contexts.ReflogCommits, reflogController)
controllers.AttachControllers(gui.State.Contexts.SubCommits, subCommitsController)
controllers.AttachControllers(gui.State.Contexts.Remotes, gui.Controllers.Remotes)
+ controllers.AttachControllers(gui.State.Contexts.Stash, stashController)
controllers.AttachControllers(gui.State.Contexts.Menu, gui.Controllers.Menu)
controllers.AttachControllers(gui.State.Contexts.Global, gui.Controllers.Sync, gui.Controllers.Undo, gui.Controllers.Global)
diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go
index ba30bd407..dfff8c9e1 100644
--- a/pkg/gui/keybindings.go
+++ b/pkg/gui/keybindings.go
@@ -431,30 +431,6 @@ func (self *Gui) GetInitialKeybindings() ([]*types.Binding, []*gocui.ViewMouseBi
Description: self.c.Tr.LcCopyCommitShaToClipboard,
},
{
- ViewName: "stash",
- Key: opts.GetKey(opts.Config.Universal.Select),
- Handler: self.handleStashApply,
- Description: self.c.Tr.LcApply,
- },
- {
- ViewName: "stash",
- Key: opts.GetKey(opts.Config.Stash.PopStash),
- Handler: self.handleStashPop,
- Description: self.c.Tr.LcPop,
- },
- {
- ViewName: "stash",
- Key: opts.GetKey(opts.Config.Universal.Remove),
- Handler: self.handleStashDrop,
- Description: self.c.Tr.LcDrop,
- },
- {
- ViewName: "stash",
- Key: opts.GetKey(opts.Config.Universal.New),
- Handler: self.handleNewBranchOffStashEntry,
- Description: self.c.Tr.LcNewBranch,
- },
- {
ViewName: "commitMessage",
Key: opts.GetKey(opts.Config.Universal.SubmitEditorText),
Modifier: gocui.ModNone,
diff --git a/pkg/gui/stash_panel.go b/pkg/gui/stash_panel.go
index c0110f553..2c8df1177 100644
--- a/pkg/gui/stash_panel.go
+++ b/pkg/gui/stash_panel.go
@@ -1,19 +1,8 @@
package gui
-import (
- "github.com/jesseduffield/lazygit/pkg/commands/models"
- "github.com/jesseduffield/lazygit/pkg/gui/types"
-)
-
-// list panel functions
-
-func (gui *Gui) getSelectedStashEntry() *models.StashEntry {
- return gui.State.Contexts.Stash.GetSelected()
-}
-
func (gui *Gui) stashRenderToMain() error {
var task updateTask
- stashEntry := gui.getSelectedStashEntry()
+ stashEntry := gui.State.Contexts.Stash.GetSelected()
if stashEntry == nil {
task = NewRenderStringTask(gui.c.Tr.NoStashEntries)
} else {
@@ -27,97 +16,3 @@ func (gui *Gui) stashRenderToMain() error {
},
})
}
-
-// specific functions
-
-func (gui *Gui) handleStashApply() error {
- stashEntry := gui.getSelectedStashEntry()
- if stashEntry == nil {
- return nil
- }
-
- apply := func() error {
- gui.c.LogAction(gui.c.Tr.Actions.Stash)
- err := gui.git.Stash.Apply(stashEntry.Index)
- _ = gui.postStashRefresh()
- if err != nil {
- return gui.c.Error(err)
- }
- return nil
- }
-
- if gui.c.UserConfig.Gui.SkipStashWarning {
- return apply()
- }
-
- return gui.c.Ask(types.AskOpts{
- Title: gui.c.Tr.StashApply,
- Prompt: gui.c.Tr.SureApplyStashEntry,
- HandleConfirm: func() error {
- return apply()
- },
- })
-}
-
-func (gui *Gui) handleStashPop() error {
- stashEntry := gui.getSelectedStashEntry()
- if stashEntry == nil {
- return nil
- }
-
- pop := func() error {
- gui.c.LogAction(gui.c.Tr.Actions.Stash)
- err := gui.git.Stash.Pop(stashEntry.Index)
- _ = gui.postStashRefresh()
- if err != nil {
- return gui.c.Error(err)
- }
- return nil
- }
-
- if gui.c.UserConfig.Gui.SkipStashWarning {
- return pop()
- }
-
- return gui.c.Ask(types.AskOpts{
- Title: gui.c.Tr.StashPop,
- Prompt: gui.c.Tr.SurePopStashEntry,
- HandleConfirm: func() error {
- return pop()
- },
- })
-}
-
-func (gui *Gui) handleStashDrop() error {
- stashEntry := gui.getSelectedStashEntry()
- if stashEntry == nil {
- return nil
- }
-
- return gui.c.Ask(types.AskOpts{
- Title: gui.c.Tr.StashDrop,
- Prompt: gui.c.Tr.SureDropStashEntry,
- HandleConfirm: func() error {
- gui.c.LogAction(gui.c.Tr.Actions.Stash)
- err := gui.git.Stash.Drop(stashEntry.Index)
- _ = gui.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.STASH}})
- if err != nil {
- return gui.c.Error(err)
- }
- return nil
- },
- })
-}
-
-func (gui *Gui) postStashRefresh() error {
- return gui.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.STASH, types.FILES}})
-}
-
-func (gui *Gui) handleNewBranchOffStashEntry() error {
- stashEntry := gui.getSelectedStashEntry()
- if stashEntry == nil {
- return nil
- }
-
- return gui.helpers.Refs.NewBranch(stashEntry.RefName(), stashEntry.Description(), "")
-}