func drawWindow(ctx *nanovgo.Context, title string, x, y, w, h float32) { var cornerRadius float32 = 3.0 ctx.Save() defer ctx.Restore() // ctx.Reset(); // Window ctx.BeginPath() ctx.RoundedRect(x, y, w, h, cornerRadius) ctx.SetFillColor(nanovgo.RGBA(28, 30, 34, 192)) // ctx.FillColor(nanovgo.RGBA(0,0,0,128)); ctx.Fill() // Drop shadow shadowPaint := nanovgo.BoxGradient(x, y+2, w, h, cornerRadius*2, 10, nanovgo.RGBA(0, 0, 0, 128), nanovgo.RGBA(0, 0, 0, 0)) ctx.BeginPath() ctx.Rect(x-10, y-10, w+20, h+30) ctx.RoundedRect(x, y, w, h, cornerRadius) ctx.PathWinding(nanovgo.Hole) ctx.SetFillPaint(shadowPaint) ctx.Fill() // Header headerPaint := nanovgo.LinearGradient(x, y, x, y+15, nanovgo.RGBA(255, 255, 255, 8), nanovgo.RGBA(0, 0, 0, 16)) ctx.BeginPath() ctx.RoundedRect(x+1, y+1, w-2, 30, cornerRadius-1) ctx.SetFillPaint(headerPaint) ctx.Fill() ctx.BeginPath() ctx.MoveTo(x+0.5, y+0.5+30) ctx.LineTo(x+0.5+w-1, y+0.5+30) ctx.SetStrokeColor(nanovgo.RGBA(0, 0, 0, 32)) ctx.Stroke() ctx.SetFontSize(18.0) ctx.SetFontFace("sans-bold") ctx.SetTextAlign(nanovgo.AlignCenter | nanovgo.AlignMiddle) ctx.SetFontBlur(2) ctx.SetFillColor(nanovgo.RGBA(0, 0, 0, 128)) ctx.Text(x+w/2, y+16+1, title) ctx.SetFontBlur(0) ctx.SetFillColor(nanovgo.RGBA(220, 220, 220, 160)) ctx.Text(x+w/2, y+16, title) }
func (w *Window) Draw(self Widget, ctx *nanovgo.Context) { ds := float32(w.theme.WindowDropShadowSize) cr := float32(w.theme.WindowCornerRadius) hh := float32(w.theme.WindowHeaderHeight) // Draw window wx := float32(w.x) wy := float32(w.y) ww := float32(w.w) wh := float32(w.h) ctx.Save() ctx.BeginPath() ctx.RoundedRect(wx, wy, ww, wh, cr) if w.mouseFocus { ctx.SetFillColor(w.theme.WindowFillFocused) } else { ctx.SetFillColor(w.theme.WindowFillUnfocused) } ctx.Fill() // Draw a drop shadow shadowPaint := nanovgo.BoxGradient(wx, wy, ww, wh, cr*2, ds*2, w.theme.DropShadow, w.theme.Transparent) ctx.BeginPath() ctx.Rect(wx-ds, wy-ds, ww+ds*2, wh+ds*2) ctx.RoundedRect(wx, wy, ww, wh, cr) ctx.PathWinding(nanovgo.Hole) ctx.SetFillPaint(shadowPaint) ctx.Fill() if w.title != "" { headerPaint := nanovgo.LinearGradient(wx, wy, ww, wh+hh, w.theme.WindowHeaderGradientTop, w.theme.WindowHeaderGradientBot) ctx.BeginPath() ctx.RoundedRect(wx, wy, ww, hh, cr) ctx.SetFillPaint(headerPaint) ctx.Fill() ctx.BeginPath() ctx.RoundedRect(wx, wy, ww, wh, cr) ctx.SetStrokeColor(w.theme.WindowHeaderSepTop) ctx.Scissor(wx, wy, ww, 0.5) ctx.Stroke() ctx.ResetScissor() ctx.BeginPath() ctx.MoveTo(wx+0.5, wy+hh-1.5) ctx.LineTo(wx+ww-0.5, wy+hh-1.5) ctx.SetStrokeColor(w.theme.WindowHeaderSepTop) ctx.Stroke() ctx.SetFontSize(18.0) ctx.SetFontFace(w.theme.FontBold) ctx.SetTextAlign(nanovgo.AlignCenter | nanovgo.AlignMiddle) ctx.SetFontBlur(2.0) ctx.SetFillColor(w.theme.DropShadow) ctx.Text(wx+ww*0.5, wy+hh*0.5, w.title) ctx.SetFontBlur(0.0) if w.focused { ctx.SetFillColor(w.theme.WindowTitleFocused) } else { ctx.SetFillColor(w.theme.WindowTitleUnfocused) } ctx.Text(wx+ww*0.5, wy+hh*0.5-1, w.title) } ctx.Restore() w.WidgetImplement.Draw(self, ctx) }