25 lines
989 B
Plaintext
25 lines
989 B
Plaintext
|
schema1_of_y = function(editor, y)
|
||
|
-- return line/pos of screen line starting near a given y offset,
|
||
|
-- and the (negative) offset remaining after the calculation
|
||
|
-- invariants:
|
||
|
-- - 0 >= y_offset >= -Line_height
|
||
|
-- - let loc, y_offset = schema1_of_y(pane, y)
|
||
|
-- y + y_offset == y_of_schema1(pane, loc)
|
||
|
assert(y >= 0)
|
||
|
local y_offset = y
|
||
|
for i=1,#editor.lines do
|
||
|
Text.populate_screen_line_starting_pos(editor, i)
|
||
|
local height = line_height(editor, i)
|
||
|
if y_offset < height then
|
||
|
local line = editor.lines[i]
|
||
|
local nlines = math.floor(y_offset/editor.line_height)
|
||
|
assert(nlines >= 0 and nlines < #editor.line_cache[i].screen_line_starting_pos)
|
||
|
local pos = editor.line_cache[i].screen_line_starting_pos[nlines+1] -- switch to 1-indexing
|
||
|
y_offset = y_offset - nlines*editor.line_height
|
||
|
return {line=i, pos=pos}, -y_offset
|
||
|
end
|
||
|
y_offset = y_offset - height
|
||
|
end
|
||
|
-- y is below the pane
|
||
|
return {line=#editor.lines+1, pos=1}, y_offset -- positive value
|
||
|
end
|