mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-07 12:01:50 +00:00
Add textbox selection and layout API for custom rendering
This commit is contained in:
parent
bb6bd27b94
commit
61b3f8f973
7 changed files with 393 additions and 5 deletions
|
|
@ -99,6 +99,9 @@ document["worlds-panel"]:clear()
|
|||
| textColor | vec4 | да | да | цвет текста |
|
||||
| syntax | string | да | да | подсветка синтаксиса ("lua" - Lua) |
|
||||
| markup | string | да | да | язык разметки текста ("md" - Markdown) |
|
||||
| selection | ivec2 | да | да | закреплённый конец выделения и каретка; см. ниже |
|
||||
| externalRendering | bool | да | да | внешняя отрисовка текста (по умолчанию false) |
|
||||
| textLayout | table | да | нет | снимок видимой раскладки текста; см. ниже |
|
||||
|
||||
\* - только false
|
||||
|
||||
|
|
@ -110,6 +113,58 @@ document["worlds-panel"]:clear()
|
|||
| lineAt(pos: int) -> int | определяет номер строки по позиции в тексте |
|
||||
| linePos(line: int) -> int | определяет позицию начала строки в тексте |
|
||||
|
||||
### Выделение и внешняя отрисовка
|
||||
|
||||
- `selection` (чтение/запись): `{anchor, caret}` - направленное выделение.
|
||||
Индексы с нуля в единицах нативного `caret`, не байтах UTF-8. Допускаются
|
||||
только конечные целые числа; значения ограничиваются длиной текста.
|
||||
Установка прокручивает поле к каретке, в том числе сразу после замены текста,
|
||||
не меняет текст и не сбрасывает undo.
|
||||
- `externalRendering` (boolean, чтение/запись, по умолчанию `false`): скрывает
|
||||
текст, каретку, выделение и подсветку текущей строки. Ввод, hit testing,
|
||||
раскладка, прокрутка, фон, номера строк и скроллбар остаются нативными.
|
||||
`false` возвращает нативную отрисовку без пересоздания поля. Совмещение с
|
||||
`markup` запрещено в обоих направлениях и вызывает ошибку.
|
||||
- `textLayout` (таблица, только чтение): снимок видимой раскладки.
|
||||
`ready=false`, если шрифт недоступен либо используется markup. Иначе:
|
||||
- `text` - значение `textbox.text`, включая `placeholder` при пустом вводе;
|
||||
`font` - имя шрифта;
|
||||
- `lineHeight` - шаг строки, `textHeight` - высота label для отрисовки строки;
|
||||
- `caretRect={x,y,cellWidth,rowHeight}` - геометрия каретки, без учёта фокуса,
|
||||
editable и мигания; на конце строки ширина ячейки равна ширине пробела;
|
||||
- `selectionRects` - прямоугольники `{x, y, width, height}` для видимых
|
||||
выделенных строк, включая ячейки переводов строк;
|
||||
- `lines` - видимые строки `{start,text,pos={x,y},advances={...}}`: нативный
|
||||
индекс начала, текст без завершающего перевода строки, позиция и ширины
|
||||
отдельных символов. Для пустого ввода строки могут содержать hint,
|
||||
при этом hint не подменяет поле `text` в снимке.
|
||||
|
||||
Координаты локальны textbox, учитывают выравнивание и прокрутку, могут выходить
|
||||
за его границы. Внешняя отрисовка должна обрезаться областью поля. Снимок -
|
||||
независимая Lua-таблица; её изменение не меняет textbox. После ввода, изменения
|
||||
размеров и прокрутки нужно читать новый снимок. Цвета syntax не экспортируются:
|
||||
внешний рендерер задаёт их самостоятельно. Индексация и ввод текста
|
||||
следуют существующему поведению textbox.
|
||||
|
||||
```lua
|
||||
local field = document.input
|
||||
field.text = "abcdef"
|
||||
field.selection = {5, 2}
|
||||
local anchor, caret = unpack(field.selection)
|
||||
|
||||
field.externalRendering = true
|
||||
local layout = field.textLayout
|
||||
if layout.ready then
|
||||
for _, line in ipairs(layout.lines) do
|
||||
print(line.start, line.text, line.pos[1], line.pos[2])
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
В примере каретка находится на позиции 2, закреплённый конец выделения - на
|
||||
позиции 5. Отрицательный индекс выделения ограничивается нулём; в отличие
|
||||
от `caret`, он не задаёт позицию относительно конца текста.
|
||||
|
||||
## Ползунок (trackbar)
|
||||
|
||||
Свойства:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue