Sander Schobers
9641719579
Refactored event handling to be able to "handle" events so no other controls will handle the same event again.
96 lines
1.9 KiB
Go
96 lines
1.9 KiB
Go
package tins2020
|
|
|
|
import "github.com/veandco/go-sdl2/sdl"
|
|
|
|
type DialogBase struct {
|
|
Container
|
|
|
|
content Proxy
|
|
close EventFn
|
|
}
|
|
|
|
type Dialog interface {
|
|
CloseDialog()
|
|
ShowDialog(EventFn)
|
|
}
|
|
|
|
func (d *DialogBase) CloseDialog() {
|
|
close := d.close
|
|
if close != nil {
|
|
close()
|
|
}
|
|
}
|
|
|
|
func (d *DialogBase) SetContent(control Control) {
|
|
d.content.Proxied = control
|
|
}
|
|
|
|
func (d *DialogBase) ShowDialog(close EventFn) {
|
|
d.close = close
|
|
}
|
|
|
|
func (d *DialogBase) Init(ctx *Context) error {
|
|
d.AddChild(&d.content)
|
|
return d.Container.Init(ctx)
|
|
}
|
|
|
|
type LargeDialog struct {
|
|
DialogBase
|
|
|
|
title Label
|
|
close IconButton
|
|
}
|
|
|
|
func (d *LargeDialog) Arrange(ctx *Context, bounds Rectangle) {
|
|
const titleHeight = 64
|
|
d.ControlBase.Arrange(ctx, bounds)
|
|
d.title.Arrange(ctx, RectSize(bounds.X, bounds.Y, bounds.W, titleHeight))
|
|
d.close.Arrange(ctx, RectSize(bounds.W-64, 0, 64, 64))
|
|
d.content.Arrange(ctx, RectSize(bounds.X+titleHeight, 96, bounds.W-2*titleHeight, bounds.H-titleHeight))
|
|
}
|
|
|
|
func (d *LargeDialog) Init(ctx *Context) error {
|
|
d.title = Label{
|
|
Text: "Botanim",
|
|
FontName: "title",
|
|
Alignment: TextAlignmentCenter,
|
|
}
|
|
d.close = IconButton{
|
|
Icon: "control-cancel",
|
|
IconHover: HoverEffectColor,
|
|
IconWidth: 32,
|
|
}
|
|
d.close.OnLeftMouseButtonClick = EmptyEvent(d.CloseDialog)
|
|
d.AddChild(&d.title)
|
|
d.AddChild(&d.close)
|
|
return d.DialogBase.Init(ctx)
|
|
}
|
|
|
|
func (d *LargeDialog) Handle(ctx *Context, event sdl.Event) bool {
|
|
if d.DialogBase.Handle(ctx, event) {
|
|
return true
|
|
}
|
|
|
|
switch e := event.(type) {
|
|
case *sdl.KeyboardEvent:
|
|
if e.Type == sdl.KEYDOWN {
|
|
switch e.Keysym.Sym {
|
|
case sdl.K_ESCAPE:
|
|
d.CloseDialog()
|
|
return true
|
|
case sdl.K_RETURN:
|
|
d.CloseDialog()
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (d *LargeDialog) Render(ctx *Context) {
|
|
SetDrawColor(ctx.Renderer, MustHexColor("#356DAD"))
|
|
ctx.Renderer.FillRect(d.Bounds.SDLPtr())
|
|
|
|
d.DialogBase.Render(ctx)
|
|
}
|