diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2020-03-29 10:31:34 +1100 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2020-03-29 11:37:29 +1100 |
commit | a8db672ffbeba92a32ad34f475760c78aa73303e (patch) | |
tree | e941074a316d4e7df057552a05f9d873ed6fb47a /pkg/gui/global_handlers.go | |
parent | 76b66ae26f428c58b3b0993d8da4bf31d5933dc7 (diff) |
refactor gui.go
Diffstat (limited to 'pkg/gui/global_handlers.go')
-rw-r--r-- | pkg/gui/global_handlers.go | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/pkg/gui/global_handlers.go b/pkg/gui/global_handlers.go new file mode 100644 index 000000000..5f0752a6c --- /dev/null +++ b/pkg/gui/global_handlers.go @@ -0,0 +1,172 @@ +package gui + +import ( + "math" + "strings" + + "github.com/fatih/color" + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +func (gui *Gui) nextScreenMode(g *gocui.Gui, v *gocui.View) error { + gui.State.ScreenMode = utils.NextIntInCycle([]int{SCREEN_NORMAL, SCREEN_HALF, SCREEN_FULL}, gui.State.ScreenMode) + // commits render differently depending on whether we're in fullscreen more or not + if err := gui.refreshCommitsViewWithSelection(); err != nil { + return err + } + // same with branches + if err := gui.refreshBranchesViewWithSelection(); err != nil { + return err + } + + return nil +} + +func (gui *Gui) prevScreenMode(g *gocui.Gui, v *gocui.View) error { + gui.State.ScreenMode = utils.PrevIntInCycle([]int{SCREEN_NORMAL, SCREEN_HALF, SCREEN_FULL}, gui.State.ScreenMode) + // commits render differently depending on whether we're in fullscreen more or not + if err := gui.refreshCommitsViewWithSelection(); err != nil { + return err + } + // same with branches + if err := gui.refreshBranchesViewWithSelection(); err != nil { + return err + } + + return nil +} + +func (gui *Gui) scrollUpView(viewName string) error { + mainView, _ := gui.g.View(viewName) + ox, oy := mainView.Origin() + newOy := int(math.Max(0, float64(oy-gui.Config.GetUserConfig().GetInt("gui.scrollHeight")))) + return mainView.SetOrigin(ox, newOy) +} + +func (gui *Gui) scrollDownView(viewName string) error { + mainView, _ := gui.g.View(viewName) + ox, oy := mainView.Origin() + y := oy + if !gui.Config.GetUserConfig().GetBool("gui.scrollPastBottom") { + _, sy := mainView.Size() + y += sy + } + scrollHeight := gui.Config.GetUserConfig().GetInt("gui.scrollHeight") + if y < mainView.LinesHeight() { + if err := mainView.SetOrigin(ox, oy+scrollHeight); err != nil { + return err + } + } + if manager, ok := gui.viewBufferManagerMap[viewName]; ok { + manager.ReadLines(scrollHeight) + } + return nil +} + +func (gui *Gui) scrollUpMain(g *gocui.Gui, v *gocui.View) error { + return gui.scrollUpView("main") +} + +func (gui *Gui) scrollDownMain(g *gocui.Gui, v *gocui.View) error { + return gui.scrollDownView("main") +} + +func (gui *Gui) scrollUpSecondary(g *gocui.Gui, v *gocui.View) error { + return gui.scrollUpView("secondary") +} + +func (gui *Gui) scrollDownSecondary(g *gocui.Gui, v *gocui.View) error { + return gui.scrollDownView("secondary") +} + +func (gui *Gui) scrollUpConfirmationPanel(g *gocui.Gui, v *gocui.View) error { + if v.Editable { + return nil + } + return gui.scrollUpView("confirmation") +} + +func (gui *Gui) scrollDownConfirmationPanel(g *gocui.Gui, v *gocui.View) error { + if v.Editable { + return nil + } + return gui.scrollDownView("confirmation") +} + +func (gui *Gui) handleRefresh(g *gocui.Gui, v *gocui.View) error { + return gui.refreshSidePanels(refreshOptions{mode: ASYNC}) +} + +func (gui *Gui) handleMouseDownMain(g *gocui.Gui, v *gocui.View) error { + if gui.popupPanelFocused() { + return nil + } + + switch g.CurrentView().Name() { + case "files": + return gui.enterFile(false, v.SelectedLineIdx()) + case "commitFiles": + return gui.enterCommitFile(v.SelectedLineIdx()) + } + + return nil +} + +func (gui *Gui) handleMouseDownSecondary(g *gocui.Gui, v *gocui.View) error { + if gui.popupPanelFocused() { + return nil + } + + switch g.CurrentView().Name() { + case "files": + return gui.enterFile(true, v.SelectedLineIdx()) + } + + return nil +} + +func (gui *Gui) handleInfoClick(g *gocui.Gui, v *gocui.View) error { + if !gui.g.Mouse { + return nil + } + + cx, _ := v.Cursor() + width, _ := v.Size() + + // if we're in the normal context there will be a donate button here + // if we have ('reset') at the end then + if gui.inFilterMode() { + if width-cx <= len(gui.Tr.SLocalize("(reset)")) { + return gui.exitFilterMode() + } else { + return nil + } + } + + if cx <= len(gui.Tr.SLocalize("Donate")) { + return gui.OSCommand.OpenLink("https://github.com/sponsors/jesseduffield") + } + return nil +} + +func (gui *Gui) fetch(g *gocui.Gui, v *gocui.View, canAskForCredentials bool) (unamePassOpend bool, err error) { + unamePassOpend = false + err = gui.GitCommand.Fetch(func(passOrUname string) string { + unamePassOpend = true + return gui.waitForPassUname(gui.g, v, passOrUname) + }, canAskForCredentials) + + if canAskForCredentials && err != nil && strings.Contains(err.Error(), "exit status 128") { + colorFunction := color.New(color.FgRed).SprintFunc() + coloredMessage := colorFunction(strings.TrimSpace(gui.Tr.SLocalize("PassUnameWrong"))) + close := func(g *gocui.Gui, v *gocui.View) error { + return nil + } + _ = gui.createConfirmationPanel(g, v, true, gui.Tr.SLocalize("Error"), coloredMessage, close, close) + } + + gui.refreshSidePanels(refreshOptions{scope: []int{BRANCHES, COMMITS, REMOTES, TAGS}, mode: ASYNC}) + + return unamePassOpend, err +} |