[#1223] lens/tui: Add page navigation component

Signed-off-by: Aleksey Savchuk <a.savchuk@yadro.com>
This commit is contained in:
Aleksey Savchuk 2024-07-25 12:14:03 +03:00
parent d31d52e8bb
commit d4ce0adf11
No known key found for this signature in database

View file

@ -0,0 +1,66 @@
package tuiutil
import (
"context"
"github.com/rivo/tview"
)
type Navigation struct {
app *tview.Application
current tview.Primitive
pages []tview.Primitive
cancels []context.CancelFunc
}
func NewNavigation(app *tview.Application) *Navigation {
return &Navigation{
app: app,
}
}
func (n *Navigation) Push(
ctx context.Context,
init func(context.Context) (tview.Primitive, error),
) error {
ctx, cancel := context.WithCancel(ctx)
page, err := init(ctx)
if err != nil {
cancel()
return err
}
n.cancels = append(n.cancels, cancel)
n.pages = append(n.pages, n.current)
n.current = page
n.app.
SetRoot(n.current, true).
SetFocus(n.current)
go n.app.QueueUpdateDraw(func() {})
return nil
}
func (n *Navigation) Pop() {
if len(n.pages) == 0 {
return
}
cancel := n.cancels[len(n.cancels)-1]
n.cancels = n.cancels[:len(n.cancels)-1]
cancel()
n.current = n.pages[len(n.pages)-1]
n.pages = n.pages[:len(n.pages)-1]
n.app.
SetRoot(n.current, true).
SetFocus(n.current)
go n.app.QueueUpdateDraw(func() {})
}