about summary refs log blame commit diff stats
path: root/text.lua
blob: a9cfcbdc49f87754b6b4132246e13c68f0d49e49 (plain) (tree)





















































                                                                                                                                             
-- primitives for editing text
Text = {}

function Text.draw(line, line_index, cursor_line, y, cursor_pos)
  love.graphics.setColor(0,0,0)
  local love_text = love.graphics.newText(love.graphics.getFont(), line.data)
  love.graphics.draw(love_text, 25,y, 0, Zoom)
  if line_index == cursor_line then
    -- cursor
    love.graphics.print('_', Text.cursor_x(line.data, cursor_pos), y+6)  -- drop the cursor down a bit to account for the increased font size
  end
end

function Text.nearest_cursor_pos(line, x, hint)
  if x == 0 then
    return 1
  end
  local max_x = Text.cursor_x(line, #line+1)
  if x > max_x then
    return #line+1
  end
  local currx = Text.cursor_x(line, hint)
  if currx > x-2 and currx < x+2 then
    return hint
  end
  local left, right = 1, #line+1
  if currx > x then
    right = hint
  else
    left = hint
  end
  while left < right-1 do
    local curr = math.floor((left+right)/2)
    local currxmin = Text.cursor_x(line, curr)
    local currxmax = Text.cursor_x(line, curr+1)
    if currxmin <= x and x < currxmax then
      return curr
    end
    if currxmin > x then
      right = curr
    else
      left = curr
    end
  end
  return right
end

function Text.cursor_x(line_data, cursor_pos)
  local line_before_cursor = line_data:sub(1, cursor_pos-1)
  local text_before_cursor = love.graphics.newText(love.graphics.getFont(), line_before_cursor)
  return 25+text_before_cursor:getWidth()*Zoom
end

return Text