[#1223] lens/tui: Add page navigation component
Signed-off-by: Aleksey Savchuk <a.savchuk@yadro.com>
This commit is contained in:
parent
d31d52e8bb
commit
d4ce0adf11
1 changed files with 66 additions and 0 deletions
66
cmd/frostfs-lens/internal/tuiutil/navigation.go
Normal file
66
cmd/frostfs-lens/internal/tuiutil/navigation.go
Normal 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() {})
|
||||
}
|
Loading…
Reference in a new issue