PBToolboxAI v2 ← Site

radialmenu — u_pbt_radialmenu #

← Referência dos componentes · Índice do guia

Menu de contexto radial: os comandos em coroa à volta do cursor, escolhidos pela direção em vez de lidos numa lista.

▶ Ver ao vivo — Aplicação de demonstração, mosaico Radial menu: a pré-visualização, o código que o produz e esta página, lado a lado.


Em resumo #

Userobjectu_pbt_radialmenu
Classe de itensn_pbt_radialmenu_item (of_item(id))
Serve paraOferecer um punhado de comandos frequentes onde a mão já está
PrincípioDescreve os ramos; a roda, a forma e a navegação são connosco

Arranque rápido #

// A wheel built for whatever is under the cursor
uo_wheel.of_add_item(/*keys*/ "cut",    /*text*/ "Cut")
uo_wheel.of_add_item(/*keys*/ "copy",   /*text*/ "Copy")
uo_wheel.of_add_item(/*keys*/ "paste",  /*text*/ "Paste")
uo_wheel.of_add_item(/*keys*/ "delete", /*text*/ "Delete")
// It opens when the right button is released: see ue_rclicked

Abrir e depois escolher #

A roda abre-se ao largar o botão direito, e é preciso um segundo clique para escolher. Não é um detalhe de implementação: se abrisse ao premir, o largar desse mesmo clique selecionaria de imediato o setor caído sob o cursor, e o utilizador lançaria um comando sem o ter visto.

É por isso que of_show() é chamado a partir do evento de clique direito do controlo sobre o qual o utilizador faz o gesto (um statictext, um button, uma grelha…): nesse instante o botão já está em cima, e o clique seguinte é mesmo o que escolhe. O menu radial, esse, não tem superfície nenhuma — logo, nenhum evento de rato próprio.

O componente em si é invisível: não ocupa lugar na janela. Coloque-o onde quiser, com largura e altura nulas — só existe enquanto a roda está aberta.

O cubo central escreve por extenso o ramo apontado, e é isso que permite a um setor levar um rótulo curto sem mentir sobre o que faz. Clicar no cubo fecha a roda; dentro de uma sub-roda, sobe um nível.

// It opens when the right button is released: see ue_rclicked
uo_wheel.of_show()

As sub-rodas #

Um endereço pendura ramos sob outro: export/pdf. Escolher o ramo pai não escolhe nada: a roda é substituída pela dos seus filhos, e o cubo passa a ser o caminho de volta.

Porquê substituir em vez de acrescentar uma segunda coroa? Porque um anel exterior dividiria os setores por dois em cada nível. Oito ramos já é o máximo legível; não há espaço para mostrar dois níveis ao mesmo tempo.

O evento ue_item_selected comunica o caminho completo (export/pdf), não o identificador da folha sozinho. Duas sub-rodas podem portanto nomear os seus ramos da mesma forma.

uo_wheel.of_add_item(/*keys*/ "export", /*text*/ "Export")
uo_wheel.of_add_item(/*keys*/ "export/pdf", /*text*/ "PDF")
uo_wheel.of_add_item(/*keys*/ "export/csv", /*text*/ "CSV")

Quando há ramos a mais #

Uma roda lê-se pela direção, e para além de oito setores as fatias deixam de se distinguir. ii_max_sectors fixa esse teto (de 3 a 12, 8 por predefinição).

Os ramos a mais não se perdem: o último lugar da coroa passa a ser um ramo que os contém a todos e que abre como sub-roda. Um menu que deixasse cair a cauda seria um menu que mente sobre o que oferece.

Apertar a coroa é muitas vezes um ganho: quatro ramos largos apontam-se mais depressa do que oito estreitos.


Propriedades #

PropriedadeTipoPredefiniçãoPapel
ii_max_sectorsinteger8Quantos ramos uma coroa pode levar (3 a 12). O que exceder passa sob um último ramo que abre como sub-roda
is_theme_stylestringfluentEstilo visual do componente (constantes THEME_STYLE_*)
is_theme_modestringlightVariante clara ou escura (constantes THEME_MODE_*)
il_theme_accentlong-1Cor de acento deste componente (-1 = acento do tema)
is_tooltipstring""Dica simples mostrada ao passar sobre o componente
is_super_tooltip_titlestring""Título da dica enriquecida (tem precedência sobre is_tooltip)
is_super_tooltip_textstring""Texto da dica enriquecida (marcação rica aceite)
is_super_tooltip_imagestring""Imagem da dica enriquecida

Métodos #

MétodoPapel
of_add_item (string as_keys, string as_text)Acrescenta um ramo à roda; o identificador volta quando é escolhido. Devolve 0 depois de aplicado, -2 se o componente não estiver criado
of_add_item (string as_keys, string as_text, string as_image, boolean ab_checked)O mesmo, com o ícone e a marca — o ícone como terceiro argumento, como em todo o resto da biblioteca. Um ramo desativa-se através do seu manípulo: of_item(keys).ib_enabled = false. Devolve 0 depois de aplicado, -2 se o componente não estiver criado
of_clear ( )Esvazia a roda. Devolve 0 depois de aplicado, -2 se o componente não estiver criado
of_show ( )Abre a roda centrada no cursor. Chame-o a partir do clique direito do controlo que recebe o gesto
of_show (long al_x, long al_y)O mesmo, centrada numa posição de ecrã em píxeis
of_item (string as_keys)Devolve a pega de um ramo para o alterar depois (rótulo, ativo, marcado)
of_reset ( )Esvazia a roda e repõe todas as propriedades no valor de origem. Devolve 0 depois de aplicado, -2 se o componente não estiver criado

Eventos #

EventoDisparado quando
ue_item_selected (string as_keys)O utilizador escolheu um ramo. as_keys é o caminho completo (export/pdf), não o identificador da folha sozinho
ue_dismissed ( )A roda fechou sem que nenhum ramo fosse escolhido: clique no cubo, clique fora, ou tecla Escape

A janela da roda é redonda: os cantos deixam passar os cliques para a aplicação que está atrás, em vez de os engolir num quadrado invisível.


Propriedades de item #

PropriedadeTipoPredefiniçãoPapel
is_textstring""Rótulo do ramo. Mantenha-o curto: um setor é uma fatia, não uma linha — o cubo escreve o resto
ib_enabledbooleantrueA falso, o ramo fica desativado e o seu setor ignora todos os cliques
ib_visiblebooleantrueA falso, o ramo sai da roda — sub-roda incluída — sem ser eliminado; os setores fecham-se, e volta tal como estava
ib_checkedbooleanfalseA verdadeiro, um ponto marca o ramo como ativo

Exemplos #

Uma roda por contexto #

// A wheel built for whatever is under the cursor
uo_wheel.of_clear()
uo_wheel.of_add_item(/*keys*/ "bold", /*text*/ "Bold", /*image*/ "mono:img\packimages.dll:svg/samples/bold", /*checked*/ true)
uo_wheel.of_add_item(/*keys*/ "find", /*text*/ "Find", /*image*/ "mono:img\packimages.dll:svg/samples/find", /*checked*/ false)

Reagir ao caminho escolhido #

// ue_item_selected event of the radial menu
// as_keys carries the full path, e.g. "export/pdf"
choose case as_keys
	case "export/pdf"
		of_exporter_pdf()
	case "delete"
		of_supprimer()
end choose

Marcar, desativar, apertar #

// Mark a branch as being on
uo_wheel.of_item(/*key*/ "bold").ib_checked = true
// Grey out the one that makes no sense here
uo_wheel.of_item(/*key*/ "paste").ib_enabled = false
uo_wheel.ii_max_sectors = 4

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_count · of_keys_at · of_hasPercorrer o que o componente contém3.2 Os items
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

Duas ajudas não são herdadas: of_icon e of_escape_markup vivem em n_pbt_utils. Declare um — n_pbt_utils lnv_utils, nada a criar — e chame-as nele.


← Referência dos componentes · Índice do guia