65 lines
1.6 KiB
Go
65 lines
1.6 KiB
Go
package ui
|
|
|
|
import (
|
|
"image/color"
|
|
|
|
"opslag.de/schobers/geom"
|
|
"opslag.de/schobers/zntg"
|
|
)
|
|
|
|
const tooltipBorderThickness = 1
|
|
const tooltipHorizontalPadding = 6
|
|
const tooltipVerticalPadding = 2
|
|
const tooltipMouseDistance = 12
|
|
const uiDefaultTooltipOverlay = "ui-default-tooltip"
|
|
|
|
type Tooltip struct {
|
|
OverlayBase
|
|
|
|
Text string
|
|
}
|
|
|
|
func (t *Tooltip) FontName(ctx Context) string {
|
|
var name = t.Font.Name
|
|
if len(name) == 0 {
|
|
name = ctx.Style().Fonts.Tooltip
|
|
}
|
|
return name
|
|
}
|
|
|
|
func (t *Tooltip) Handle(Context, Event) bool { return false }
|
|
|
|
func (t *Tooltip) Render(ctx Context) {
|
|
if len(t.Text) == 0 {
|
|
return
|
|
}
|
|
|
|
fontName := t.FontName(ctx)
|
|
size := ctx.Fonts().Font(fontName).Measure(t.Text)
|
|
|
|
offset := t.Offset()
|
|
mouse := ctx.MousePosition().Sub(offset)
|
|
width := size.Dx() + 2*tooltipBorderThickness + 2*tooltipHorizontalPadding
|
|
height := size.Dy() + 2*tooltipBorderThickness + 2*tooltipVerticalPadding
|
|
|
|
left := mouse.X + tooltipMouseDistance
|
|
top := mouse.Y + tooltipMouseDistance
|
|
if left+width > t.bounds.Max.X {
|
|
left = mouse.X - tooltipMouseDistance - width
|
|
}
|
|
if top+height > t.bounds.Max.Y {
|
|
top = mouse.Y - tooltipMouseDistance - height
|
|
}
|
|
|
|
bounds := geom.RectRelF32(left, top, width, height)
|
|
|
|
almostBlack := zntg.MustHexColor("#000000bf")
|
|
almostWhite := zntg.MustHexColor("ffffffbf")
|
|
|
|
ctx.Renderer().FillRectangle(bounds, almostBlack)
|
|
ctx.Renderer().Rectangle(bounds, almostWhite, 1)
|
|
|
|
bottomLeft := bounds.Min.Add2D(tooltipBorderThickness+tooltipHorizontalPadding, tooltipBorderThickness+tooltipVerticalPadding)
|
|
ctx.Fonts().Text(fontName, bottomLeft, color.White, t.Text)
|
|
}
|