PBToolboxAI v5 ← Site

jsontree — u_pbt_jsontree #

← Referência dos componentes · Índice do guia

jsontree mostra um valor JSON como uma árvore recolhível, colorida por tipo: um ecrã de configuração, uma resposta de API, uma depuração de integração. Define o texto JSON em is_json, o componente mostra-o; um clique num nó reporta o seu caminho (ue_node_clicked), um JSON inválido levanta ue_error. Não modifica nada: é um VISUALIZADOR.

▶ Ver ao vivo — Aplicação de demonstração, mosaico JSON tree, com o código e esta página lado a lado.


Em resumo #

Userobjectu_pbt_jsontree
EntradaO texto JSON, em is_json (uma cadeia)
Dobrar / desdobrarCada contentor pelo seu marcador + / − na margem dos números, pelo seu caminho (of_expand_path, of_collapse_path), ou tudo de uma vez (of_expand_all, of_collapse_all)
RetornoUm clique num nó dá o seu caminho (ue_node_clicked), o de n_pbt_json: lines/1/sku; um JSON inválido levanta ue_error
FidelidadeCada número e cada chave mostram-se tal como recebidos: um identificador de 64 bits continua exato, 1.10 continua 1.10, uma chave duplicada mantém os dois membros

Início rápido #

// Show an API response as a tree
uo_json.is_json = inv_rest.of_response_text()

// Fold everything, then let the user open what interests them
uo_json.of_collapse_all()

// ue_node_clicked : the path of the node clicked ("lines/1/sku"), the path of
// n_pbt_json -> of_get_string(as_path) on the same text reads its value

Propriedades #

PropriedadeTipoPredefinidoDescrição
is_jsonstring""O texto JSON a mostrar. Um objeto, um array, um valor; lido e mostrado como uma árvore, cada número e cada chave tal como recebidos. Vazio limpa a árvore, sem erro; um JSON inválido levanta ue_error e não mostra nada. Relê-se exatamente como foi definido
ib_wrapbooleantrueAs linhas longas quebram (true, por omissão) ou ficam numa linha com barra horizontal (false) — um aspeto de editor de código
ib_search_enabledbooleantrueCtrl+F na árvore abre uma caixa de pesquisa — a mesma pesquisa que of_search: escrever realça, Enter ou F3 seguinte, Shift+Enter ou Shift+F3 anterior, Esc fecha. false deixa o atalho a uma aplicação que pesquisa a partir da sua própria caixa. A caixa tem três botões antes do contador, Aa (ib_find_match_case), ab (ib_find_whole_word) e & (ib_find_decoded); mudar uma opção relança a pesquisa em curso a partir da sua primeira ocorrência
ib_find_match_casebooleanfalseOpção de pesquisa: só encontra o texto com as mesmas maiúsculas e minúsculas. O botão Aa da caixa de pesquisa (Ctrl+F) é o mesmo interruptor; vale para of_search e para o que o utilizador escreve. Lida em direto; of_reset repõe-na a false
ib_find_whole_wordbooleanfalseOpção de pesquisa: só encontra o texto como palavra inteira (uma letra, um algarismo ou um _ ao lado faz parte da palavra: id não é encontrado nem em user_id nem em ids). O botão ab da caixa de pesquisa é o mesmo interruptor. Lida em direto; of_reset repõe-na a false
ib_find_decodedbooleanfalseOpção de pesquisa: pesquisa nos VALORES descodificados — uma chave e uma cadeia lidas como n_pbt_json as lê (say "hi" encontra as aspas escapadas, uma letra acentuada o seu escape \u, uma quebra de linha o seu \n); o realce cobre o escape inteiro, um número e a pontuação ficam tal como são mostrados. false pesquisa o texto tal como é mostrado. O botão & da caixa de pesquisa é o mesmo interruptor. Lida em direto; of_reset repõe-na a false
is_theme_stylestring""Estilo visual do componente (constantes THEME_STYLE_*); vazio = o da aplicação, seguido a cada mudança
is_theme_modestring""Variante clara ou escura (constantes THEME_MODE_*); vazio = a da aplicação, seguida a cada mudança
il_theme_accentlong-1Cor de destaque deste componente (-1 = destaque da aplicação, ou o do tema)
is_tooltipstring""Tooltip simples apresentado ao passar sobre o componente
is_super_tooltip_titlestring""Título do tooltip enriquecido (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto do tooltip enriquecido (aceita marcação enriquecida)
is_super_tooltip_imagestring""Imagem do tooltip enriquecido

Métodos #

MétodoDescrição
of_expand_all ( ) → longDesdobra todos os contentores. Nenhum ue_node_toggled: nenhum gesto abre a árvore inteira de uma vez. Devolve 0, -2 se o componente não estiver criado
of_collapse_all ( ) → longDobra todos os contentores aninhados (o nível de cima continua visível). Uma seleção escondida por uma dobra passa para o bloco dobrado, e ue_selection_changed indica-o. Nenhum ue_node_toggled: nenhum gesto dobra a árvore inteira de uma vez. Devolve 0, -2 se o componente não estiver criado
of_expand_path ( string as_path ) → longAbre UM bloco (objeto ou array) pelo seu caminho, e os blocos acima dele para que se veja. Como o seu marcador +, levanta ue_node_toggled para o bloco e para cada bloco dobrado acima dele aberto pelo caminho (nada para um bloco já aberto). Devolve 0, -5 se nenhum bloco tiver esse caminho (desconhecido, uma folha, ou um bloco vazio {} / []), -2 se o componente não estiver criado
of_collapse_path ( string as_path ) → longDobra UM bloco pelo seu caminho. Como o seu marcador −, levanta ue_node_toggled se o bloco estava aberto, e ue_selection_changed quando a seleção tem de passar para ele. Devolve 0, -5 se nenhum bloco tiver esse caminho (desconhecido, uma folha, ou um bloco vazio {} / []), -2 se o componente não estiver criado
of_is_expanded ( string as_path ) → booleantrue se o bloco desse caminho estiver aberto, lido EM DIRETO; false se estiver dobrado, e para uma folha ou um caminho desconhecido. O estado de todos os blocos de uma vez, para o guardar e restabelecer: of_get_layout
of_get_layout ( ) → stringA disposição da árvore, lida EM DIRETO, como texto JSON a guardar: os blocos dobrados (collapsed, ou expanded quando essa lista for mais curta — todo o bloco que ela não nomeia fica então dobrado), o caminho selecionado (selected, null sem seleção) e a linha no topo da vista (top, um caminho, nunca píxeis). A devolver a of_set_layout, também depois de um novo documento
of_set_layout ( string as_layout_json ) → longDevolve à árvore uma disposição dada por of_get_layout: as dobras (um caminho que o documento já não tem é ignorado, um bloco novo mantém o seu valor predefinido), a seleção (ue_selection_changed, como of_select_path) e a linha do topo. ue_layout_changed segue uma vez se as dobras mudaram. Devolve 0, -5 se o texto não for um objeto JSON, -2 se o componente não estiver criado
of_copy ( ) → longPõe a seleção na área de transferência, como Ctrl+C na árvore: uma folha dá o seu valor DESCODIFICADO (uma cadeia sem aspas nem escapes), um bloco o seu texto JSON indentado; um pedaço de texto realçado com o rato é o que Ctrl+C copia. Devolve 0, -4 se nada estiver selecionado, -2 se o componente não estiver criado
of_copy_path ( ) → longPõe o CAMINHO do nó selecionado na área de transferência (team/1/name, "" para a raiz), pronto para n_pbt_json. Devolve 0, -4 se nada estiver selecionado ou se o caminho ler outro nó (of_selected_addressable a false), -2 se o componente não estiver criado
of_clear ( ) → longEsvazia a árvore (como is_json = ""); ib_wrap, ib_search_enabled, ib_find_match_case e ib_find_whole_word mantêm o seu valor (é of_reset que repõe tudo). Devolve 0, -2 se o componente não estiver criado
of_expand_to_level ( long al_level ) → longMostra a árvore até al_level: os blocos a essa profundidade ou mais dobram-se (1 = os filhos diretos do bloco raiz, 0 dobra a raiz). Nenhum ue_node_toggled; uma seleção que ele desloca para um bloco dobrado levanta ue_selection_changed. Devolve 0, -2 se o componente não estiver criado
of_search ( string as_query ) → longRealça cada ocorrência (sem distinguir maiúsculas por omissão — ver ib_find_match_case —, só palavras inteiras com ib_find_whole_word; duas numa linha contam duas) e salta para a primeira; só se abrem os blocos que escondem a ocorrência ATUAL, e of_clear_search volta a dobrá-los. ue_search_result diz quantas. A pesquisa incide sobre o texto MOSTRADO: um carácter escapado procura-se escapado (C:\\Temp) — com ib_find_decoded, nos valores descodificados. Uma pesquisa vazia equivale a of_clear_search. A caixa de pesquisa abre-se com a pesquisa dentro e o foco nela (a mesma que Ctrl+F): Enter passa à seguinte; com ib_search_enabled a false, a árvore apenas realça. Devolve 0, ou um código negativo
of_search_next ( ) → longPassa à ocorrência SEGUINTE (volta à primeira depois da última); ue_search_result dá a nova posição. Devolve 0, ou um código negativo
of_search_prev ( ) → longPassa à ocorrência ANTERIOR (volta à última antes da primeira); ue_search_result dá a nova posição. Devolve 0, ou um código negativo
of_clear_search ( ) → longLimpa a pesquisa: deixa de haver realce e ocorrência atual (of_match_count devolve 0), a caixa de pesquisa esvazia-se e fecha-se, e os blocos que a pesquisa abrira voltam a dobrar-se como antes. Devolve 0, ou um código negativo
of_select_path ( string as_path ) → longSeleciona o nó em as_path e desloca-se até ele; como o teclado, levanta ue_selection_changed (nada se o nó já estiver selecionado); os blocos dobrados que o escondem abrem-se. as_path é um caminho de n_pbt_json (lines/1/sku, "" = a raiz). Devolve 0, -5 se nenhum nó tiver esse caminho (a seleção não se move), -2 se o componente não estiver criado
of_selected_path ( ) → stringO caminho do nó selecionado, lido EM DIRETO: o de n_pbt_json, níveis unidos por / e um índice de array contado a partir de 1 (lines/1/sku), para passar tal como está a of_get_string sobre o mesmo texto. Um / ou um ~ de uma chave escreve-se ~1 ou ~0, como em JSON Pointer: application~1json é a chave application/json. of_selected_addressable diz false para o raro nó cujo caminho lê outro. "" é a raiz, ou nada selecionado: of_has_selection distingue-os
of_selected_value ( ) → stringO valor JSON da linha selecionada quando é uma FOLHA (uma string mantém as aspas, pronta a colar), lido AO VIVO. Vazio para um contentor ou sem seleção
of_selected_text ( ) → stringO VALOR da folha selecionada, descodificado, lido EM DIRETO: uma cadeia sem as aspas nem os escapes, um número ou true/false/null tal como escritos. Vazio para um contentor ou sem seleção
of_has_selection ( ) → booleantrue quando um nó está selecionado, lido EM DIRETO — a raiz incluída, cujo caminho é ""
of_selected_addressable ( ) → booleantrue quando o caminho do nó selecionado, dado a n_pbt_json sobre o mesmo documento, lê ESSE nó — lido EM DIRETO. false sem seleção, e sob a SEGUNDA de duas chaves idênticas (o seu caminho lê a primeira). Uma chave VAZIA é um nível vazio do caminho (a//b, / para a da raiz): é endereçável
of_selected_type ( ) → stringO tipo JSON do nó selecionado, com as palavras de n_pbt_json.of_type: object, array, string, number, boolean ou null — lido EM DIRETO. "" sem seleção
of_selected_count ( ) → longO número de membros (um objeto) ou de elementos (um array) do nó selecionado, contados como n_pbt_json.of_count os conta — lido EM DIRETO. -1 para um valor que não seja um bloco, ou sem seleção, -2 se o componente não estiver criado
of_match_count ( ) → longDevolve o número de OCORRÊNCIAS da pesquisa atual (duas numa linha contam duas), lido EM DIRETO — o 12 de uma barra de estado 3 / 12. 0 sem pesquisa
of_match_index ( ) → longDevolve a posição (1-based) da correspondência atual, lida AO VIVO — o 3 de uma barra de estado 3 / 12. 0 sem correspondência

Eventos #

EventoQuando
ue_node_clicked (string as_path)O utilizador clicou num nó, ou premiu Enter numa folha selecionada: o seu caminho, o de n_pbt_json (lines/1/sku, "" para a raiz, um / ou um ~ de uma chave escrito ~1 ou ~0) — of_get_string(as_path) sobre o mesmo texto lê o seu valor. Enter num bloco dobra-o, e nunca chega ao botão predefinido da janela
ue_node_rclicked (string as_path, long al_x, long al_y)Clique direito num nó, ou tecla Menu (Shift+F10) na árvore: o nó é primeiro selecionado (ue_selection_changed se a seleção se moveu), as_path é o seu caminho, al_x / al_y o ponto no ECRÃ, em píxeis. Abra aí o seu próprio menu (um u_pbt_contextmenu): a árvore não tem
ue_node_toggled (string as_path, boolean ab_expanded)Um bloco foi dobrado (ab_expanded = false) ou aberto (true): pelo utilizador (o seu marcador + / −, as setas, Enter ou Espaço) ou por of_expand_path / of_collapse_path. of_expand_all, of_collapse_all e of_expand_to_level não o levantam: nenhum gesto dobra a árvore inteira
ue_layout_changed (string as_layout_json)As dobras mudaram — um gesto, uma ordem do seu código (of_collapse_all incluído), um novo documento, of_set_layout: as_layout_json é a disposição inteira, como of_get_layout a dá, pronta a guardar. Uma mudança de seleção ou de deslocamento não o levanta
ue_selection_changed (string as_path)A seleção moveu-se sem clique, pelo utilizador ou pelo seu código: setas, Home/End, Page Up/Down, of_select_path, ou uma dobra que esconde a linha selecionada (a seleção passa então para o bloco dobrado) — um clique do rato reporta ue_node_clicked
ue_search_result (long al_count, long al_index)Uma pesquisa começou ou avançou: al_count ocorrências no total, a atual é al_index (a partir de 1, 0 se nenhuma) — o suficiente para mostrar «3 / 12»; quando uma pesquisa se fecha (Esc na caixa, of_clear_search, of_reset, ib_search_enabled = false), (0, 0) uma vez
ue_error (string as_message)O texto em is_json não é um JSON válido: a mensagem diz porquê, com a linha e a coluna, na língua de apresentação; a árvore fica vazia. Levantado também para um documento demasiado grande para ser mostrado (mais de 1 500 000 linhas)

Exemplo #

Explorar a resposta de uma API #

// Fetch the order : the tree shows the response, or empties on a failure
if inv_rest.of_get(/*url*/ "https://api.example.com/orders/4152") = 200 then
	uo_json.is_json = inv_rest.of_response_text()
	uo_json.of_collapse_all()          // the reader opens what interests them
else
	uo_json.of_clear()
end if

Ler o valor de um nó clicado #

// Instance variable of the window : the response, parsed ONCE by n_pbt_json
n_pbt_json inv_doc

// When the response arrives : the tree shows it, n_pbt_json parses the same text once
uo_json.is_json = inv_rest.of_response_text()
inv_doc.of_load(/*json*/ inv_rest.of_response_text())

// ue_node_clicked of uo_json : the value at the clicked path, nothing parsed again
st_value.text = inv_doc.of_get_string(/*path*/ as_path)

// or, without a second parser : the value of the selected leaf, decoded
st_value.text = uo_json.of_selected_text()

Pesquisar palavras inteiras, com maiúsculas #

// Whole words only, with the same case : "id" is not found inside "user_id"
uo_json.ib_find_match_case = true
uo_json.ib_find_whole_word = true
uo_json.of_search(/*query*/ "id")

Manter as dobras quando a resposta é atualizada #

// Local variables
string ls_layout

// The folds, the selected node and the line at the top, kept before the new text
ls_layout = uo_json.of_get_layout()
uo_json.is_json = inv_rest.of_response_text()

// The same blocks fold again ; a path the new text no longer has is ignored
uo_json.of_set_layout(/*layout_json*/ ls_layout)

Um menu sobre um nó #

// ue_node_rclicked of uo_json : the node is selected, open YOUR menu at that point of the screen
uo_menu.of_show(/*x*/ al_x, /*y*/ al_y)

// ue_item_selected of uo_menu : copy the value, or the path for n_pbt_json
choose case as_keys
	case "copy"
		uo_json.of_copy()
	case "copypath"
		uo_json.of_copy_path()
end choose

Boas práticas #


Herdado da base comum #

Estes membros existem em todos os componentes visuais — não são próprios deste. São detalhados uma só vez, nos capítulos transversais; esta tabela apenas diz onde os ler.

MembrosFunçãoDetalhado em
of_resetRepor o componente a zero3.6 Repor um componente a zero: of_reset()
of_register_shortcut · of_clear_shortcutsAtalhos de teclado do componente3.5 Os atalhos de teclado
of_is_created · of_is_ready · of_get_last_errorSe nasceu, se está pronto, o que falhou3.7 Diagnóstico
of_save_as_png · of_save_as_jpgExportar a renderização como imagem3.8 Exportar a representação como imagem
of_set_redrawAgrupar as alterações num único repinte3.10 Boas práticas
of_preload_iconsÍcones mostrados sem atrasoApresentação instantânea: of_icon
of_set_translationTraduzir uma legenda do componente5.2 Adaptar uma etiqueta: of_set_translation
of_focus_webviewDar o foco ao componente6.4 Teclado e focus
of_print · of_print_to_pdfImprimir, ou escrever um PDF6.9 Imprimir
of_set_property · of_get_property · of_component_nameControlar uma propriedade pelo nome3.1 O motor de propriedades
is_accessible_name · is_accessible_descriptionO nome e a descrição que um leitor de ecrã diz3.4 Propriedades e eventos opcionais

← Referência dos componentes · Índice do guia