// Move cursor to the 'boffset' position in the 'line'. Obviously 'line' must be // from the attached buffer. If 'boffset' < 0, use 'last_cursor_voffset'. Keep // in mind that there is no need to maintain connections between lines (e.g. for // moving from a deleted line to another line). func (v *View) MoveCursorTo(c buffer.Cursor) { v.dirty |= dirtyStatus if c.Boffset < 0 { bo, co, vo := c.Line.FindClosestOffsets(v.lastCursorVoffset) v.cursor.Boffset = bo v.cursorCoffset = co v.cursorVoffset = vo } else { vo, co := c.VoffsetCoffset() v.cursor.Boffset = c.Boffset v.cursorCoffset = co v.cursorVoffset = vo } if c.Boffset >= 0 { v.lastCursorVoffset = v.cursorVoffset } if c.Line != v.cursor.Line { if v.lineVoffset != 0 { v.dirty = dirtyEverything } v.lineVoffset = 0 } v.cursor.Line = c.Line v.cursor.LineNum = c.LineNum v.adjustLineVoffset() v.adjustTopLine() if v.selection.Type != SelectionNone { v.dirty |= dirtyContents v.selection.End = v.Cursor() } }
func (v *view) cursorPositionFor(cursor buffer.Cursor) (int, int) { y := cursor.LineNum - v.topLineNum vo, _ := cursor.VoffsetCoffset() x := vo - v.lineVoffset return x, y }