widgets: add dialog interface

Implement an interface for aerc's dialog implementation. Provide dialogs
the ability to set their own height and width of their drawing context.

Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
This commit is contained in:
Koni Marti 2022-08-08 22:04:02 +02:00 committed by Robin Jarry
parent 9cffc45f03
commit 00e908e2ae
2 changed files with 32 additions and 1 deletions

View file

@ -187,7 +187,14 @@ func (aerc *Aerc) Draw(ctx *ui.Context) {
aerc.grid.Draw(ctx)
if aerc.dialog != nil {
if w, h := ctx.Width(), ctx.Height(); w > 8 && h > 4 {
aerc.dialog.Draw(ctx.Subcontext(4, h/2-2, w-8, 4))
if d, ok := aerc.dialog.(Dialog); ok {
start, height := d.ContextHeight()
aerc.dialog.Draw(
ctx.Subcontext(4, start(h),
w-8, height(h)))
} else {
aerc.dialog.Draw(ctx.Subcontext(4, h/2-2, w-8, 4))
}
}
}
}

24
widgets/dialog.go Normal file
View file

@ -0,0 +1,24 @@
package widgets
import (
"git.sr.ht/~rjarry/aerc/lib/ui"
)
type Dialog interface {
ui.DrawableInteractive
ContextHeight() (func(int) int, func(int) int)
}
type dialog struct {
ui.DrawableInteractive
y func(int) int
h func(int) int
}
func (d *dialog) ContextHeight() (func(int) int, func(int) int) {
return d.y, d.h
}
func NewDialog(d ui.DrawableInteractive, y func(int) int, h func(int) int) Dialog {
return &dialog{DrawableInteractive: d, y: y, h: h}
}