mirror of
https://github.com/jesseduffield/lazydocker.git
synced 2026-02-20 01:00:22 +08:00
70 lines
2.0 KiB
Go
70 lines
2.0 KiB
Go
package panels
|
|
|
|
import (
|
|
"github.com/jesseduffield/lazydocker/pkg/tasks"
|
|
"github.com/samber/lo"
|
|
)
|
|
|
|
// A 'context' generally corresponds to an item and the tab in the main panel that we're
|
|
// displaying. So if we switch to a new item, or change the tab in the panel panel
|
|
// for the current item, we end up with a new context. When we have a new context,
|
|
// we render new content to the main panel.
|
|
type ContextState[T any] struct {
|
|
// index of the currently selected tab in the main view.
|
|
mainTabIdx int
|
|
// this function returns the tabs that we can display for an item (the tabs
|
|
// are shown on the main view)
|
|
GetMainTabs func() []MainTab[T]
|
|
// This tells us whether we need to re-render to the main panel for a given item.
|
|
// This should include the item's ID and if you want to invalidate the cache for
|
|
// some other reason, you can add that to the key as well (e.g. the container's state).
|
|
GetItemContextCacheKey func(item T) string
|
|
}
|
|
|
|
type MainTab[T any] struct {
|
|
// key used as part of the context cache key
|
|
Key string
|
|
// title of the tab, rendered in the main view
|
|
Title string
|
|
// function to render the content of the tab
|
|
Render func(item T) tasks.TaskFunc
|
|
}
|
|
|
|
func (self *ContextState[T]) GetMainTabTitles() []string {
|
|
return lo.Map(self.GetMainTabs(), func(tab MainTab[T], _ int) string {
|
|
return tab.Title
|
|
})
|
|
}
|
|
|
|
func (self *ContextState[T]) GetCurrentContextKey(item T) string {
|
|
return self.GetItemContextCacheKey(item) + "-" + self.GetCurrentMainTab().Key
|
|
}
|
|
|
|
func (self *ContextState[T]) GetCurrentMainTab() MainTab[T] {
|
|
return self.GetMainTabs()[self.mainTabIdx]
|
|
}
|
|
|
|
func (self *ContextState[T]) HandleNextMainTab() {
|
|
tabs := self.GetMainTabs()
|
|
|
|
if len(tabs) == 0 {
|
|
return
|
|
}
|
|
|
|
self.mainTabIdx = (self.mainTabIdx + 1) % len(tabs)
|
|
}
|
|
|
|
func (self *ContextState[T]) HandlePrevMainTab() {
|
|
tabs := self.GetMainTabs()
|
|
|
|
if len(tabs) == 0 {
|
|
return
|
|
}
|
|
|
|
self.mainTabIdx = (self.mainTabIdx - 1 + len(tabs)) % len(tabs)
|
|
}
|
|
|
|
func (self *ContextState[T]) SetMainTabIndex(index int) {
|
|
self.mainTabIdx = index
|
|
}
|