package gui import ( "math" "sync" "time" "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) 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) 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) } var ( mouseTimerMutex sync.Mutex mouseTimer *time.Timer mouseTicker *time.Ticker mouseTicksLeft int ) func (gui *Gui) handleToggleMouse() error { mouseTimerMutex.Lock() defer mouseTimerMutex.Unlock() if gui.g.Mouse { // Disable Mouse gui.g.Mouse = false gocui.Screen.DisableMouse() if mouseTimer != nil { mouseTimer.Stop() } if mouseTicker != nil { mouseTicker.Stop() } mouseTicksLeft = 15 mouseTimer = time.AfterFunc(15*time.Second, func() { gui.g.Update(func(g *gocui.Gui) error { mouseTimerMutex.Lock() defer mouseTimerMutex.Unlock() if !gui.g.Mouse { gui.g.Mouse = true gocui.Screen.EnableMouse() if mouseTicker != nil { mouseTicker.Stop() } _ = gui.renderString(gui.g, "information", gui.getInformationContent()) } return nil }) }) mouseTicker = time.NewTicker(1 * time.Second) go func() { for range mouseTicker.C { gui.g.Update(func(g *gocui.Gui) error { mouseTimerMutex.Lock() defer mouseTimerMutex.Unlock() if gui.g.Mouse { return nil } mouseTicksLeft-- if mouseTicksLeft <= 0 { if mouseTicker != nil { mouseTicker.Stop() } return nil } _ = gui.renderString(gui.g, "information", gui.getInformationContent()) return nil }) } }() } else { // Enable Mouse manually gui.g.Mouse = true gocui.Screen.EnableMouse() if mouseTimer != nil { mouseTimer.Stop() } if mouseTicker != nil { mouseTicker.Stop() } } _ = gui.renderString(gui.g, "information", gui.getInformationContent()) return nil }