aboutsummaryrefslogtreecommitdiff
path: root/views.go
diff options
context:
space:
mode:
Diffstat (limited to 'views.go')
-rw-r--r--views.go50
1 files changed, 50 insertions, 0 deletions
diff --git a/views.go b/views.go
new file mode 100644
index 0000000..0e3d95e
--- /dev/null
+++ b/views.go
@@ -0,0 +1,50 @@
+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]
+}