aboutsummaryrefslogtreecommitdiff
path: root/lib/ui/context.go
diff options
context:
space:
mode:
authorBen Burwell <ben@benburwell.com>2019-12-20 13:21:32 -0500
committerDrew DeVault <sir@cmpwn.com>2019-12-21 09:23:20 -0500
commitbcd03c4c4a94e73b2545bf5dfc404082a674c76e (patch)
tree8366af84dfd9011d20794f2a7556e7d6fc71b7db /lib/ui/context.go
parentef4c2f61d8c599ac25b4f465ffa3bea9ca6ce1a3 (diff)
Add popovers
A popover is a special UI element which can be layered over the rest of the UI (i.e. it is painted last) and can fall anywhere on the screen, not just with the bounds of its parent's viewport/context. With these special abilities comes the restriction that only one popover may be visible on screen at once. Popovers are requested from the UI context passed to Draw calls and specify the anchor point and the desired dimensions. The popover is then fit to the available space and placed relative to the anchor point.
Diffstat (limited to 'lib/ui/context.go')
-rw-r--r--lib/ui/context.go23
1 files changed, 17 insertions, 6 deletions
diff --git a/lib/ui/context.go b/lib/ui/context.go
index d450fd8..6bdf76a 100644
--- a/lib/ui/context.go
+++ b/lib/ui/context.go
@@ -10,9 +10,10 @@ import (
// A context allows you to draw in a sub-region of the terminal
type Context struct {
- screen tcell.Screen
- viewport *views.ViewPort
- x, y int
+ screen tcell.Screen
+ viewport *views.ViewPort
+ x, y int
+ onPopover func(*Popover)
}
func (ctx *Context) X() int {
@@ -35,9 +36,9 @@ func (ctx *Context) Height() int {
return height
}
-func NewContext(width, height int, screen tcell.Screen) *Context {
+func NewContext(width, height int, screen tcell.Screen, p func(*Popover)) *Context {
vp := views.NewViewPort(screen, 0, 0, width, height)
- return &Context{screen, vp, 0, 0}
+ return &Context{screen, vp, 0, 0, p}
}
func (ctx *Context) Subcontext(x, y, width, height int) *Context {
@@ -49,7 +50,7 @@ func (ctx *Context) Subcontext(x, y, width, height int) *Context {
panic(fmt.Errorf("Attempted to create context larger than parent"))
}
vp := views.NewViewPort(ctx.viewport, x, y, width, height)
- return &Context{ctx.screen, vp, ctx.x + x, ctx.y + y}
+ return &Context{ctx.screen, vp, ctx.x + x, ctx.y + y, ctx.onPopover}
}
func (ctx *Context) SetCell(x, y int, ch rune, style tcell.Style) {
@@ -113,3 +114,13 @@ func (ctx *Context) SetCursor(x, y int) {
func (ctx *Context) HideCursor() {
ctx.screen.HideCursor()
}
+
+func (ctx *Context) Popover(x, y, width, height int, d Drawable) {
+ ctx.onPopover(&Popover{
+ x: ctx.x + x,
+ y: ctx.y + y,
+ width: width,
+ height: height,
+ content: d,
+ })
+}