57 lines
1.4 KiB
Lua
57 lines
1.4 KiB
Lua
|
local core = require "core"
|
||
|
local config = require "core.config"
|
||
|
local style = require "core.style"
|
||
|
local Doc = require "core.doc"
|
||
|
local DocView = require "core.docview"
|
||
|
|
||
|
config.motiontrail_steps = config.motiontrail_steps or 50
|
||
|
|
||
|
local function doc()
|
||
|
return core.active_view.doc
|
||
|
end
|
||
|
|
||
|
local function lerp(a, b, t)
|
||
|
return a + (b - a) * t
|
||
|
end
|
||
|
|
||
|
|
||
|
local function get_caret_rect(dv, idx)
|
||
|
local line1, col1, line2, col2 = doc():get_selection_idx(idx)
|
||
|
local x1, y1 = dv:get_line_screen_position(line1)
|
||
|
x1 = x1 + dv:get_col_x_offset(line1, col1)
|
||
|
return x1, y1, style.caret_width, dv:get_line_height()
|
||
|
end
|
||
|
|
||
|
|
||
|
local last_x = {}
|
||
|
local last_y = {}
|
||
|
local last_view = {}
|
||
|
|
||
|
local draw = DocView.draw
|
||
|
|
||
|
function DocView:draw(...)
|
||
|
draw(self, ...)
|
||
|
if self ~= core.active_view then return end
|
||
|
|
||
|
for idx, line1, col1, line2, col2 in doc():get_selections(true, true) do
|
||
|
--if line1 == line2 and col1 == col2 then return false end
|
||
|
|
||
|
local x, y, w, h = get_caret_rect(self, idx)
|
||
|
|
||
|
if last_view[idx] == self and (x ~= last_x[idx] or y ~= last_y[idx]) then
|
||
|
local lx = x
|
||
|
for i = 0, 1, 1 / config.motiontrail_steps do
|
||
|
local ix = lerp(x, last_x[idx], i)
|
||
|
local iy = lerp(y, last_y[idx], i)
|
||
|
local iw = math.max(w, math.ceil(math.abs(ix - lx)))
|
||
|
renderer.draw_rect(ix, iy, iw, h, style.caret)
|
||
|
lx = ix
|
||
|
end
|
||
|
core.redraw = true
|
||
|
end
|
||
|
|
||
|
last_view[idx], last_x[idx], last_y[idx] = self, x, y
|
||
|
end
|
||
|
end
|
||
|
|