lazydocker/pkg/gui/main_panel.go

196 lines
4.1 KiB
Go

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
}