API TUI
As utilidades de interface de terminal estão disponíveis em ptool.tui e p.tui.
A primeira versão se concentra em telas interativas pequenas dirigidas por um loop de eventos em Lua.
ptool.tui.run
Unreleased- Introduced.
ptool.tui.run(options) inicia uma sessão TUI, executa os callbacks do ciclo de vida em Lua e retorna o valor passado para app:quit(value). Se app:quit() for chamado sem valor, a função retorna nil.
Campos de options:
tick_ms(integer, opcional): Intervalo de tick em milissegundos. O padrão é100.init(function, opcional): É chamado uma vez antes de desenhar o primeiro frame. O valor retornado se torna ostateinicial.update(function, obrigatório): É chamado comoupdate(state, event, app)após cada evento de entrada ou tick. Se retornar um valor diferente denil, esse valor se torna o próximostate. Retornarnilmantém ostateatual.view(function, obrigatório): É chamado comoview(state, app)para montar o nó raiz do próximo frame.
Comportamento:
- Requer um TTY interativo.
- Roda dentro da alternate screen do terminal com raw mode ativado.
- Restaura o terminal ao sair, inclusive em caminhos de erro.
Eventos:
{ type = "tick" }{ type = "resize", width = <integer>, height = <integer> }{ type = "key", key = <string>, ctrl = <boolean>, alt = <boolean>, shift = <boolean> }
Nomes de tecla comuns incluem up, down, left, right, enter, esc, tab, backspace, delete, home, end, pageup e pagedown. Teclas de caractere usam o próprio caractere, como "q" ou "j".
Exemplo:
local result = p.tui.run({
tick_ms = 200,
init = function()
return {
items = {"alpha", "beta", "gamma"},
selected = 1,
}
end,
update = function(state, event, app)
if event.type == "key" then
if event.key == "q" then
app:quit(state.items[state.selected])
elseif event.key == "down" then
state.selected = math.min(#state.items, state.selected + 1)
elseif event.key == "up" then
state.selected = math.max(1, state.selected - 1)
end
end
end,
view = function(state)
return p.tui.column({
title = "Demo",
border = true,
padding = 1,
children = {
p.tui.text("Press q to quit", {
align = "center",
}),
p.tui.list(state.items, {
selected = state.selected,
highlight_style = {
reversed = true,
},
}),
},
})
end,
})
print("selected:", result)
App
Unreleased- Introduced.
app é passado para update(...) e view(...).
quit
Canonical API name: ptool.tui.App:quit.
app:quit(value?) solicita que a sessão TUI pare depois que o callback atual terminar.
value(valor Lua, opcional): O valor retornado porptool.tui.run(...).
Construtores de nó
Unreleased- Introduced.
Os construtores abaixo retornam tabelas de nó comuns. view(...) deve retornar um desses nós como a árvore de visualização raiz.
Campos comuns de nó:
title(string, opcional): Desenha um bloco com título ao redor do nó.border(boolean, opcional): Desenha uma borda ao redor do nó. O padrão éfalse.padding(integer, opcional): Espaçamento interno uniforme. O padrão é0.grow(integer, opcional): Tamanho relativo quando o nó está dentro de um row ou column. O padrão é1.style(table, opcional): Campos de estilo compartilhados:fg/bg: Um deblack,red,green,yellow,blue,magenta,cyan,white,grayoudark_gray.bold,dim,italic,underlined,reversed: Flags booleanas de estilo.
ptool.tui.text
Unreleased- Introduced.
ptool.tui.text(text[, options]) cria um nó de texto.
text(string, obrigatório): O texto a renderizar.options.align(string, opcional):left,centerouright. O padrão éleft.
ptool.tui.list
Unreleased- Introduced.
ptool.tui.list(items[, options]) cria um nó de lista vertical.
items(table, obrigatório): Uma tabela de lista densa. Os valores dos itens podem ser strings, números ou booleanos.options.selected(integer, opcional): A linha selecionada usando a indexação base 1 do Lua. Valores maiores que a quantidade de itens são ignorados.options.highlight_style(table, opcional): Estilo aplicado à linha selecionada. Usa as mesmas chaves destyle.
Notas:
- A seleção só fica visualmente distinta quando
highlight_stylemuda o estilo renderizado.
ptool.tui.row
Unreleased- Introduced.
ptool.tui.row(options) cria um contêiner horizontal.
options.children(table, obrigatório): Uma tabela de lista densa com nós filhos.
ptool.tui.column
Unreleased- Introduced.
ptool.tui.column(options) cria um contêiner vertical.
options.children(table, obrigatório): Uma tabela de lista densa com nós filhos.
Limites atuais
ptool.tui atualmente suporta:
- Eventos
tick,resizee de teclado. - Nós text, list, row e column.
- Decoração básica de bloco e opções de estilo.
Ainda não oferece campos de texto, popups, tabelas, widgets dirigidos por mouse nem bindings arbitrários de widgets do ratatui.