Pular para o conteúdo

Os componentes

Vinte e dois, e o que cada um devolve para o programa.

Cada chamada põe um componente e devolve o valor dele. É o que faz a tela ser um programa comum, de cima para baixo.

Entradas#

dataforge
adopt Arcane.Janela as J

action tela(t):
    nome := t.entrada("Nome", "")
    senha := t.senha("Senha")
    idade := t.numero("Idade", 18, 0, 120)
    obs := t.area("Observações", "", 4)
    cor := t.escolha("Cor", ["azul", "verde"], "verde")
    ativo := t.caixa("Ativo", yes)
    nivel := t.deslizante("Nível", 0, 10, 5)
    quando := t.data("Quando", "2026-09-22")
    onde := t.arquivo("Arquivo", "", ["csv"])

    t.texto($"{nome}|{idade}|{cor}|{ativo}|{nivel}")

s := J.testar(tela)
assert s.campos() is ["Arquivo", "Ativo", "Cor", "Idade", "Nome", "Nível", "Observações", "Quando", "Senha"]
s.digitar("Nome", "Ana")
s.digitar("Idade", 30)
assert s.tem("Ana|30|verde|yes|5")
out s.texto()
ComponenteDevolveNota
entradatextouma linha
senhatextoesconde o que se digita
numeroInteger ou Floatdigitado ele chega como texto, e n + 1 daria concatenação
areatextovárias linhas
escolhaa opçãouma de uma lista
caixayes/no
deslizantenúmerocom mínimo e máximo
datatextosem seletor nativo — é um campo com formato
arquivoo caminhosem display, é um campo de texto

Mostrar#

dataforge
adopt Arcane.Janela as J

action tela(t):
    t.titulo("Relatório")
    t.texto("uma linha de texto comum")
    t.aviso("deu certo")
    t.erro("não deu")
    t.separador()
    t.tabela(["produto", "preço"], [
        {"produto": "café", "preço": "32,90"},
        {"produto": "filtro", "preço": "8,50"},
    ])
    t.lista(["primeiro", "segundo"])
    t.progresso(0.72, "carregando")

s := J.testar(tela)
assert s.tem("Relatório") and s.tem("deu certo")
assert s.tabelas()[0]["linhas"] is [["café", "32,90"], ["filtro", "8,50"]]
out s.texto()

A tabela aceita vault ou lista: com vault, as colunas casam pelo nome; com lista, pela posição. Os dois são comuns — Database.query devolve vaults, e um CSV lido devolve listas.

O botão vale para UMA execução#

dataforge
adopt Arcane.Janela as J

salvos := []

action tela(t):
    t.entrada("Nome", "")
    given t.botao("Salvar", yes):
        salvos.append(1)

s := J.testar(tela)
s.clicar("Salvar")
assert len(salvos) is 1

// Reexecutar NÃO salva de novo: o clique é um evento, e não estado.
s.digitar("Nome", "x")
assert len(salvos) is 1
out "um clique, um salvamento"

Se o clique ficasse guardado, a próxima reexecução salvaria o formulário de novo — e esse é o defeito clássico de quem monta isto à mão.

Agrupar#

dataforge
adopt Arcane.Janela as J

action tela(t):
    t.grupo("Identificação")
    t.entrada("Nome")
    t.entrada("E-mail")
    t.fim()

    t.grupo("Endereço")
    t.entrada("Rua")
    t.fim()

s := J.testar(tela)
assert s.tem("Identificação") and s.tem("Endereço")
assert len(s.campos()) is 3
out s.texto()