文本框无法重定位光标,删除中文字符报错
Opened this issue · 1 comments
openbu-owner commented
文本框无法重定位光标,删除中文字符报错
sharebophar commented
function UIEditText:getLineInfoAt(x, y)
-- returns the wrap, line, and byteoffset
-- of specified line
local wraps = self.label:getWrap()
local line = wraps[y] or ""
local byteoffset = x
-- 原代码
-- local line = wraps[self.cursorCoords.y] or ""
-- local byteoffset = utf8.offset(line, self.cursorCoords.x) or 0
return wraps, line, byteoffset
end
function UIEditText:wedgeLineAt(x, y, xo, yo)
-- return line info + both parts of line
-- split by the current position of cursor
local wraps, line, byteoffset = self:getLineInfo(x, y)
left = utf8.sub(line,1, byteoffset + xo)
right = utf8.sub(line,byteoffset + yo, -1)
-- 原代码
-- left = line:sub(1, byteoffset + xo)
-- right = line:sub(byteoffset + yo, -1)
return wraps, line, byteoffset, left, right
end
function UIEditText:insertCharAt(char, x, y)
local wraps, line, byteoffset, left, right =
self:wedgeLineAt(x, y, 0, 1)
local newLine = left..char..right
if x == 0 then
newLine = char..left..right
end
-- some future wrapping :)
-- if char ~= '\f' and #newLine % 20 == 0 then
-- print('inserting f')
-- self:insertCharAt('\f', x+1, y)
-- end
table.remove(wraps, y)
table.insert(wraps, y, newLine)
self.label:setText(table.concat(wraps, '\n'))
self.events:dispatch(UI_TEXT_CHANGE, self.label:getText())
self:moveCursor(utf8.len(char), 0)
-- 原代码
-- self:moveCursor(#char, 0)
end
-------------------------------------
-- (callback)
-- on key down
-------------------------------------
function UIEditText:onKeyDown(key, scancode, isrepeat)
local wraps, line, byteoffset = self:getLineInfo()
if key == "backspace" and byteoffset then
self:backspace()
elseif key == "return" then
self:newline()
elseif key == "tab" then
self:insertChar(' ')
elseif key == "up" then
if self.cursorCoords.y > 1 then
self:moveCursor(0, -1)
end
elseif key == "down" then
if self.cursorCoords.y < self.rows then
self:moveCursor(0, 1)
end
elseif key == "left" then
if self.cursorCoords.x > 0 then
self:moveCursor(-1, 0)
elseif self.cursorCoords.y > 1 then
self:moveCursor(#(wraps[self.cursorCoords.y-1] or {}), -1)
end
elseif key == "right" then
if self.cursorCoords.x < utf8.len(line) then
-- 原代码
-- if self.cursorCoords.x < #line then
self:moveCursor(1, 0)
elseif self.cursorCoords.y < self.rows then
self:moveCursor(-self.cursorCoords.x, 1)
end
end
self.showCursorDt = 0
self.showCursor = true
end
function UIEditText:moveCursor(xo, yo)
self.cursorCoords.y = self.cursorCoords.y + yo
if xo == 0 then
local wraps = self.label:getWrap()
local width = utf8.len(wraps[self.cursorCoords.y])
-- 原代码
-- local width = #wraps[self.cursorCoords.y]
if self.cursorCoords.x > width then
self.cursorCoords.x = width
end
else
self.cursorCoords.x = self.cursorCoords.x + xo
end
end
-------------------------------------
-- draw cursor
-------------------------------------
function UIEditText:drawCursor()
if not self.showCursor then
return
end
local wraps = self.label:getWrap()
local length = #wraps == 0 and 1 or #wraps
local chars = utf8.sub((wraps[self.cursorCoords.y] or ""), 1, self.cursorCoords.x)
-- 原代码
-- local chars = (wraps[self.cursorCoords.y] or ""):sub(
-- 1, self.cursorCoords.x
-- )
local width = self.label:measureWidth(chars)
local maxX = self.label:getBoundingBox():getX()
local maxY = self.label:getBoundingBox():getY()
maxX = maxX + width + 1
maxY = maxY + self.cursorCoords.y * self.label:getFont():getHeight()
local r, g, b, a = love.graphics.getColor()
local color = self.cursorColor
love.graphics.setColor(color[1], color[2], color[3], color[4])
love.graphics.setLineWidth(2)
love.graphics.line(maxX, maxY, maxX, maxY - self.label:getFont():getHeight())
love.graphics.setColor(r, g, b, a)
end