Draw draws the SegmentDisplay widget onto the canvas. Implements widgetapi.Widget.Draw.
(cvs *canvas.Canvas, meta *widgetapi.Meta)
| 205 | // Draw draws the SegmentDisplay widget onto the canvas. |
| 206 | // Implements widgetapi.Widget.Draw. |
| 207 | func (sd *SegmentDisplay) Draw(cvs *canvas.Canvas, meta *widgetapi.Meta) error { |
| 208 | sd.mu.Lock() |
| 209 | defer sd.mu.Unlock() |
| 210 | |
| 211 | segAr, err := sd.preprocess(cvs.Area()) |
| 212 | if err != nil { |
| 213 | return err |
| 214 | } |
| 215 | |
| 216 | sd.lastCanFit = segAr.canFit |
| 217 | if sd.buff.Len() == 0 { |
| 218 | return nil |
| 219 | } |
| 220 | |
| 221 | text := sd.buff.String() |
| 222 | aligned, err := alignfor.Rectangle(cvs.Area(), segAr.needArea(), sd.opts.hAlign, sd.opts.vAlign) |
| 223 | if err != nil { |
| 224 | return fmt.Errorf("alignfor.Rectangle => %v", err) |
| 225 | } |
| 226 | |
| 227 | optRange, err := sd.wOptsTracker.ForPosition(0) // Text options for the current byte. |
| 228 | if err != nil { |
| 229 | return err |
| 230 | } |
| 231 | |
| 232 | gaps := segAr.gaps |
| 233 | startX := aligned.Min.X |
| 234 | for i, c := range text { |
| 235 | if i >= segAr.canFit { |
| 236 | break |
| 237 | } |
| 238 | |
| 239 | endX := startX + segAr.segment.Dx() |
| 240 | ar := image.Rect(startX, aligned.Min.Y, endX, aligned.Max.Y) |
| 241 | startX = endX |
| 242 | if gaps > 0 { |
| 243 | startX += segAr.gapPixels |
| 244 | gaps-- |
| 245 | } |
| 246 | |
| 247 | dCvs, err := canvas.New(ar) |
| 248 | if err != nil { |
| 249 | return fmt.Errorf("canvas.New => %v", err) |
| 250 | } |
| 251 | |
| 252 | if i >= optRange.High { // Get the next write options. |
| 253 | or, err := sd.wOptsTracker.ForPosition(i) |
| 254 | if err != nil { |
| 255 | return err |
| 256 | } |
| 257 | optRange = or |
| 258 | } |
| 259 | wOpts := sd.givenWOpts[optRange.AttrIdx] |
| 260 | if err := sd.drawChar(dCvs, c, wOpts); err != nil { |
| 261 | return err |
| 262 | } |
| 263 | |
| 264 | if err := dCvs.CopyTo(cvs); err != nil { |
nothing calls this directly
no test coverage detected