func (l *LogView) Draw(cr *cairo.Context) { cr.Translate(0, float64(-l.scrollOffset)) y := 0 for _, e := range l.Entries { h := e.prompt.Height() if y+h >= l.scrollOffset { e.prompt.Draw(cr) } y += h cr.Translate(0, float64(h)) if e.term != nil { h = e.term.Height() if y+h >= l.scrollOffset { e.term.Draw(cr) } y += h cr.Translate(0, float64(h)) } } if y > l.height { scrollOffset := y - l.height if l.scrollOffset != scrollOffset { if l.scrollAnim != nil && l.scrollAnim.Done { l.scrollAnim = nil } if l.scrollAnim == nil { l.scrollAnim = ui.NewLerp(&l.scrollOffset, scrollOffset, 40*time.Millisecond) l.GetWindow().win.AddAnimation(l.scrollAnim) } else { // TODO adjust existing anim } } } }
func (t *TermView) Draw(cr *cairo.Context) { t.mf.Use(cr, false) t.termMu.Lock() defer t.termMu.Unlock() offset := t.term.Top * t.mf.ch offset = 0 if offset > 0 { cr.Save() defer cr.Restore() cr.Translate(0, float64(-offset)) } firstLine := offset / t.mf.ch if firstLine < 0 { firstLine = 0 } lastLine := t.term.Top + t.term.Height if lastLine > len(t.term.Lines) { lastLine = len(t.term.Lines) } for row := firstLine; row < lastLine; row++ { drawTerminalLine(cr, t.mf, row*t.mf.ch, t.term.Lines[row]) } if !t.term.HideCursor { ch := rune(0) if t.term.Row < len(t.term.Lines) && t.term.Col < len(t.term.Lines[t.term.Row]) { ch = t.term.Lines[t.term.Row][t.term.Col].Ch } drawCursor(cr, t.mf, t.term.Row, t.term.Col, ch) } }