aboutsummaryrefslogtreecommitdiff
path: root/plugins/motiontrail.lua
blob: 6f448bbd7e39d17e9b80fd0a4e79be42b569c7a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
-- mod-version:1 -- lite-xl 1.16
local core = require "core"
local config = require "core.config"
local style = require "core.style"
local DocView = require "core.docview"

config.motiontrail_steps = 50


local function lerp(a, b, t)
  return a + (b - a) * t
end


local function get_caret_rect(dv)
  local line, col = dv.doc:get_selection()
  local x, y = dv:get_line_screen_position(line)
  x = x + dv:get_col_x_offset(line, col)
  return x, y, style.caret_width, dv:get_line_height()
end


local last_x, last_y, last_view

local draw = DocView.draw

function DocView:draw(...)
  draw(self, ...)
  if self ~= core.active_view then return end

  local x, y, w, h = get_caret_rect(self)

  if last_view == self and (x ~= last_x or y ~= last_y) then
    local lx = x
    for i = 0, 1, 1 / config.motiontrail_steps do
      local ix = lerp(x, last_x, i)
      local iy = lerp(y, last_y, 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, last_x, last_y = self, x, y
end