diff --git a/ui/label.go b/ui/label.go index ee6ccce..66a7df1 100644 --- a/ui/label.go +++ b/ui/label.go @@ -1,13 +1,16 @@ package ui import ( + "image/color" + "opslag.de/schobers/geom" ) type Label struct { ControlBase - Text string + Text string + DropShadow color.Color desired CachedValue } @@ -37,18 +40,26 @@ func (l *Label) DesiredSize(ctx Context, _ geom.PointF32) geom.PointF32 { return l.desired.GetContext(ctx, l.desiredSize, l.hashDesiredSize).(geom.PointF32) } +func (l *Label) getLabelTopLeft(ctx Context) geom.PointF32 { + pad := ctx.Style().Dimensions.TextPadding + bounds := l.bounds.Inset(pad) + switch l.TextAlignment { + case AlignRight: + return geom.PtF32(bounds.Max.X, bounds.Min.Y) + case AlignCenter: + return geom.PtF32(.5*(bounds.Min.X+bounds.Max.X), bounds.Min.Y) + default: + return bounds.Min + } +} + func (l *Label) Render(ctx Context) { l.RenderBackground(ctx) fontColor := l.TextColor(ctx) fontName := l.FontName(ctx) - pad := ctx.Style().Dimensions.TextPadding - bounds := l.bounds.Inset(pad) - switch l.TextAlignment { - case AlignLeft: - ctx.Fonts().TextAlign(fontName, bounds.Min, fontColor, l.Text, l.TextAlignment) - case AlignRight: - ctx.Fonts().TextAlign(fontName, geom.PtF32(bounds.Max.X, bounds.Min.Y), fontColor, l.Text, l.TextAlignment) - case AlignCenter: - ctx.Fonts().TextAlign(fontName, geom.PtF32(.5*(bounds.Min.X+bounds.Max.X), bounds.Min.Y), fontColor, l.Text, l.TextAlignment) + topLeft := l.getLabelTopLeft(ctx) + if l.DropShadow != nil { + ctx.Fonts().TextAlign(fontName, topLeft.Add2D(1, 1), l.DropShadow, l.Text, l.TextAlignment) } + ctx.Fonts().TextAlign(fontName, topLeft, fontColor, l.Text, l.TextAlignment) }