60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
|
package tins2020
|
||
|
|
||
|
import "github.com/veandco/go-sdl2/sdl"
|
||
|
|
||
|
type Tooltip struct {
|
||
|
ControlBase
|
||
|
|
||
|
Text string
|
||
|
}
|
||
|
|
||
|
const tooltipBorderThickness = 1
|
||
|
const tooltipHorizontalPadding = 4
|
||
|
const tooltipMouseDistance = 12
|
||
|
|
||
|
func (t *Tooltip) Handle(ctx *Context, event sdl.Event) bool {
|
||
|
if len(t.Text) == 0 {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
font := ctx.Fonts.Font(t.ActualFontName())
|
||
|
windowW, windowH, err := ctx.Renderer.GetOutputSize()
|
||
|
if err != nil {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
labelW, labelH, err := font.SizeUTF8(t.Text)
|
||
|
if err != nil {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
mouse := ctx.MousePosition
|
||
|
width := int32(labelW) + 2*tooltipBorderThickness + 2*tooltipHorizontalPadding
|
||
|
height := int32(labelH) + 2*tooltipBorderThickness
|
||
|
|
||
|
left := mouse.X + tooltipMouseDistance
|
||
|
top := mouse.Y + tooltipMouseDistance
|
||
|
if left+width > windowW {
|
||
|
left = mouse.X - tooltipMouseDistance - width
|
||
|
}
|
||
|
if top+height > windowH {
|
||
|
top = mouse.Y - tooltipMouseDistance - height
|
||
|
}
|
||
|
|
||
|
t.Bounds = Rect(left, top, width, height)
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
func (t *Tooltip) Render(ctx *Context) {
|
||
|
SetDrawColor(ctx.Renderer, Black)
|
||
|
ctx.Renderer.FillRect(t.Bounds.SDLPtr())
|
||
|
|
||
|
SetDrawColor(ctx.Renderer, White)
|
||
|
ctx.Renderer.DrawRect(t.Bounds.SDLPtr())
|
||
|
|
||
|
font := t.ActualFont(ctx)
|
||
|
|
||
|
bottomLeft := Pt(t.Bounds.X+tooltipBorderThickness+tooltipHorizontalPadding, t.Bounds.Y+t.Bounds.H-tooltipBorderThickness)
|
||
|
font.RenderCopy(ctx.Renderer, t.Text, bottomLeft, White)
|
||
|
}
|