You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
719 B
Go
51 lines
719 B
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
|
|
"github.com/aarzilli/nucular"
|
|
)
|
|
|
|
type ViewFunc func(ctx *ntcontext, w *nucular.Window)
|
|
|
|
type ViewStack struct {
|
|
stack [100]ViewFunc
|
|
sp int8
|
|
mu sync.Mutex
|
|
}
|
|
|
|
func NewViewStack() *ViewStack {
|
|
return &ViewStack{sp: -1}
|
|
}
|
|
|
|
func (v *ViewStack) Push(f ViewFunc) {
|
|
v.mu.Lock()
|
|
defer v.mu.Unlock()
|
|
|
|
v.stack[v.sp+1] = f
|
|
v.sp++
|
|
}
|
|
|
|
func (v *ViewStack) Pop() (ViewFunc, error) {
|
|
v.mu.Lock()
|
|
|
|
if v.sp <= 0 {
|
|
return nil, fmt.Errorf("Cannot pop root element from ViewStack")
|
|
}
|
|
|
|
defer (func() {
|
|
v.stack[v.sp] = nil
|
|
v.sp--
|
|
v.mu.Unlock()
|
|
})()
|
|
|
|
return v.stack[v.sp], nil
|
|
}
|
|
|
|
func (v *ViewStack) Peek() ViewFunc {
|
|
v.mu.Lock()
|
|
defer v.mu.Unlock()
|
|
return v.stack[v.sp]
|
|
}
|