diff options
| author | ruki <[email protected]> | 2020-12-06 21:47:27 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2020-12-06 21:48:12 +0800 |
| commit | 5a0f7be900e316e968886b91df31d053c4e7c2e8 (patch) | |
| tree | e861e5bf14f7ffd4db66fd0c3e4b7a1cb6adb245 | |
| parent | 327f2e8bda140d5cdb6562233316e44e52546c81 (diff) | |
support utf8 better for label/textedit
| -rw-r--r-- | xmake/core/ui/label.lua | 16 | ||||
| -rw-r--r-- | xmake/core/ui/textedit.lua | 15 |
2 files changed, 24 insertions, 7 deletions
diff --git a/xmake/core/ui/label.lua b/xmake/core/ui/label.lua index b1cd267b9..f6a65b0e9 100644 --- a/xmake/core/ui/label.lua +++ b/xmake/core/ui/label.lua @@ -127,8 +127,20 @@ function label:splitext(text, width) for idx = 1, #lines do local line = lines[idx] while #line > width do - table.insert(result, line:sub(1, width)) - line = line:sub(width + 1) + local size = 0 + for i = 1, #line do + if (line:byte(i) & 0xc0) ~= 0x80 then + size = size + 1 + if size > width then + table.insert(result, line:sub(1, i - 1)) + line = line:sub(i) + break + end + end + end + if size <= width then + break + end end table.insert(result, line) end diff --git a/xmake/core/ui/textedit.lua b/xmake/core/ui/textedit.lua index 7589c416d..54b295571 100644 --- a/xmake/core/ui/textedit.lua +++ b/xmake/core/ui/textedit.lua @@ -77,16 +77,18 @@ function textedit:on_event(e) -- update text if e.type == event.ev_keyboard then - if e.key_code > 0x1f and e.key_code < 0x7f then - self:text_set(self:text() .. e.key_name) - return true - elseif e.key_name == "Enter" and self:option("multiline") then + if e.key_name == "Enter" and self:option("multiline") then self:text_set(self:text() .. '\n') return true elseif e.key_name == "Backspace" then local text = self:text() if #text > 0 then - self:text_set(text:sub(1, #text - 1)) + local size = 1 + -- while continuation byte + while (text:byte(#text - size + 1) & 0xc0) == 0x80 do + size = size + 1 + end + self:text_set(text:sub(1, #text - size)) end return true elseif e.key_name == "CtrlV" then @@ -95,6 +97,9 @@ function textedit:on_event(e) self:text_set(self:text() .. pastetext) end return true + elseif e.key_code > 0x1f and e.key_code < 0xf8 then + self:text_set(self:text() .. string.char(e.key_code)) + return true end end |
