package gui import ( "math" "github.com/jesseduffield/gocui" ) func (gui *Gui) scrollUpMain() error { mainView := gui.Views.Main mainView.Autoscroll = false ox, oy := mainView.Origin() newOy := int(math.Max(0, float64(oy-gui.Config.UserConfig.Gui.ScrollHeight))) return mainView.SetOrigin(ox, newOy) } func (gui *Gui) scrollUpPageMain() error { mainView := gui.Views.Main mainView.Autoscroll = false ox, oy := mainView.Origin() // Scroll up by half a page, capping at the top _, sizeY := mainView.Size() deltaY := sizeY / 2 newOy := max(0, oy-deltaY) return mainView.SetOrigin(ox, newOy) } func (gui *Gui) scrollDownMain() error { mainView := gui.Views.Main mainView.Autoscroll = false ox, oy := mainView.Origin() reservedLines := 0 if !gui.Config.UserConfig.Gui.ScrollPastBottom { _, sizeY := mainView.Size() reservedLines = sizeY } totalLines := mainView.ViewLinesHeight() if oy+reservedLines >= totalLines { return nil } return mainView.SetOrigin(ox, oy+gui.Config.UserConfig.Gui.ScrollHeight) } func (gui *Gui) scrollDownPageMain() error { mainView := gui.Views.Main mainView.Autoscroll = false ox, oy := mainView.Origin() // Scroll down by half a page _, sizeY := mainView.Size() totalLines := mainView.ViewLinesHeight() deltaY := sizeY / 2 reservedLines := 0 if !gui.Config.UserConfig.Gui.ScrollPastBottom { _, sizeY := mainView.Size() reservedLines = sizeY } // Clamp to maximum scroll position if we'd scroll too far maxScroll := totalLines - reservedLines newOy := min(oy+deltaY, maxScroll) return mainView.SetOrigin(ox, newOy) } func (gui *Gui) scrollLeftMain(g *gocui.Gui, v *gocui.View) error { mainView := gui.Views.Main ox, oy := mainView.Origin() newOx := int(math.Max(0, float64(ox-gui.Config.UserConfig.Gui.ScrollHeight))) return mainView.SetOrigin(newOx, oy) } func (gui *Gui) scrollRightMain(g *gocui.Gui, v *gocui.View) error { mainView := gui.Views.Main ox, oy := mainView.Origin() content := mainView.ViewBufferLines() var largestNumberOfCharacters int for _, txt := range content { if len(txt) > largestNumberOfCharacters { largestNumberOfCharacters = len(txt) } } sizeX, _ := mainView.Size() if ox+sizeX >= largestNumberOfCharacters { return nil } return mainView.SetOrigin(ox+gui.Config.UserConfig.Gui.ScrollHeight, oy) } func (gui *Gui) autoScrollMain(g *gocui.Gui, v *gocui.View) error { gui.Views.Main.Autoscroll = true return nil } func (gui *Gui) jumpToTopMain(g *gocui.Gui, v *gocui.View) error { gui.Views.Main.Autoscroll = false _ = gui.Views.Main.SetOrigin(0, 0) _ = gui.Views.Main.SetCursor(0, 0) return nil } func (gui *Gui) onMainTabClick(tabIndex int) error { gui.Log.Warn(tabIndex) currentSidePanel, ok := gui.currentSidePanel() if !ok { return nil } currentSidePanel.SetMainTabIndex(tabIndex) return currentSidePanel.HandleSelect() } func (gui *Gui) handleEnterMain(g *gocui.Gui, v *gocui.View) error { mainView := gui.Views.Main mainView.ParentView = v return gui.switchFocus(mainView) } func (gui *Gui) handleExitMain(g *gocui.Gui, v *gocui.View) error { v.ParentView = nil return gui.returnFocus() } func (gui *Gui) handleMainClick() error { if gui.popupPanelFocused() { return nil } currentView := gui.g.CurrentView() if currentView.Name() != "main" { gui.Views.Main.ParentView = currentView } return gui.switchFocus(gui.Views.Main) }