summaryrefslogtreecommitdiffstats
path: root/pkg/gui/controllers/patch_building_controller.go
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2022-06-13 11:01:26 +1000
committerJesse Duffield <jessedduffield@gmail.com>2022-08-06 13:49:11 +1000
commit524bf83a4a681408c3fb57818f6968cab632e0ae (patch)
tree8858b4ee8d4670dcdd1637fe5fedf00ff080c154 /pkg/gui/controllers/patch_building_controller.go
parent6dfef08efc5c7f262194c0af35fd777428f33a1a (diff)
refactor to only have one context per view
Diffstat (limited to 'pkg/gui/controllers/patch_building_controller.go')
-rw-r--r--pkg/gui/controllers/patch_building_controller.go138
1 files changed, 138 insertions, 0 deletions
diff --git a/pkg/gui/controllers/patch_building_controller.go b/pkg/gui/controllers/patch_building_controller.go
new file mode 100644
index 000000000..798472f7f
--- /dev/null
+++ b/pkg/gui/controllers/patch_building_controller.go
@@ -0,0 +1,138 @@
+package controllers
+
+import (
+ "github.com/jesseduffield/gocui"
+ "github.com/jesseduffield/lazygit/pkg/gui/types"
+ "github.com/samber/lo"
+)
+
+type PatchBuildingController struct {
+ baseController
+ *controllerCommon
+}
+
+var _ types.IController = &PatchBuildingController{}
+
+func NewPatchBuildingController(
+ common *controllerCommon,
+) *PatchBuildingController {
+ return &PatchBuildingController{
+ baseController: baseController{},
+ controllerCommon: common,
+ }
+}
+
+func (self *PatchBuildingController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding {
+ return []*types.Binding{
+ {
+ Key: opts.GetKey(opts.Config.Universal.OpenFile),
+ Handler: self.OpenFile,
+ Description: self.c.Tr.LcOpenFile,
+ },
+ {
+ Key: opts.GetKey(opts.Config.Universal.Edit),
+ Handler: self.EditFile,
+ Description: self.c.Tr.LcEditFile,
+ },
+ {
+ Key: opts.GetKey(opts.Config.Universal.Select),
+ Handler: self.ToggleSelectionAndRefresh,
+ Description: self.c.Tr.ToggleSelectionForPatch,
+ },
+ {
+ Key: opts.GetKey(opts.Config.Universal.Return),
+ Handler: self.Escape,
+ Description: self.c.Tr.ExitCustomPatchBuilder,
+ },
+ }
+}
+
+func (self *PatchBuildingController) Context() types.Context {
+ return self.contexts.CustomPatchBuilder
+}
+
+func (self *PatchBuildingController) context() types.IPatchExplorerContext {
+ return self.contexts.CustomPatchBuilder
+}
+
+func (self *PatchBuildingController) GetMouseKeybindings(opts types.KeybindingsOpts) []*gocui.ViewMouseBinding {
+ return []*gocui.ViewMouseBinding{}
+}
+
+func (self *PatchBuildingController) OpenFile() error {
+ self.context().GetMutex().Lock()
+ defer self.context().GetMutex().Unlock()
+
+ path := self.contexts.CommitFiles.GetSelectedPath()
+
+ if path == "" {
+ return nil
+ }
+
+ lineNumber := self.context().GetState().CurrentLineNumber()
+ return self.helpers.Files.OpenFileAtLine(path, lineNumber)
+}
+
+func (self *PatchBuildingController) EditFile() error {
+ self.context().GetMutex().Lock()
+ defer self.context().GetMutex().Unlock()
+
+ path := self.contexts.CommitFiles.GetSelectedPath()
+
+ if path == "" {
+ return nil
+ }
+
+ lineNumber := self.context().GetState().CurrentLineNumber()
+ return self.helpers.Files.EditFileAtLine(path, lineNumber)
+}
+
+func (self *PatchBuildingController) ToggleSelectionAndRefresh() error {
+ if err := self.toggleSelection(); err != nil {
+ return err
+ }
+
+ return self.c.Refresh(types.RefreshOptions{
+ Scope: []types.RefreshableView{types.PATCH_BUILDING, types.COMMIT_FILES},
+ })
+}
+
+func (self *PatchBuildingController) toggleSelection() error {
+ self.context().GetMutex().Lock()
+ defer self.context().GetMutex().Unlock()
+
+ toggleFunc := self.git.Patch.PatchManager.AddFileLineRange
+ filename := self.contexts.CommitFiles.GetSelectedPath()
+ if filename == "" {
+ return nil
+ }
+
+ state := self.context().GetState()
+
+ includedLineIndices, err := self.git.Patch.PatchManager.GetFileIncLineIndices(filename)
+ if err != nil {
+ return err
+ }
+ currentLineIsStaged := lo.Contains(includedLineIndices, state.GetSelectedLineIdx())
+ if currentLineIsStaged {
+ toggleFunc = self.git.Patch.PatchManager.RemoveFileLineRange
+ }
+
+ // add range of lines to those set for the file
+ firstLineIdx, lastLineIdx := state.SelectedRange()
+
+ if err := toggleFunc(filename, firstLineIdx, lastLineIdx); err != nil {
+ // might actually want to return an error here
+ self.c.Log.Error(err)
+ }
+
+ if state.SelectingRange() {
+ state.SetLineSelectMode()
+ }
+
+ return nil
+}
+
+func (self *PatchBuildingController) Escape() error {
+ return self.helpers.PatchBuilding.Escape()
+}