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 #
| Userobject | u_pbt_radialmenu |
| Classe de itens | n_pbt_radialmenu_item (of_item(id)) |
| Serve para | Oferecer um punhado de comandos frequentes onde a mão já está |
| Princípio | Descreve 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 #
| Propriedade | Tipo | Predefinição | Papel |
|---|---|---|---|
ii_max_sectors | integer | 8 | Quantos ramos uma coroa pode levar (3 a 12). O que exceder passa sob um último ramo que abre como sub-roda |
is_theme_style | string | fluent | Estilo visual do componente (constantes THEME_STYLE_*) |
is_theme_mode | string | light | Variante clara ou escura (constantes THEME_MODE_*) |
il_theme_accent | long | -1 | Cor de acento deste componente (-1 = acento do tema) |
is_tooltip | string | "" | Dica simples mostrada ao passar sobre o componente |
is_super_tooltip_title | string | "" | Título da dica enriquecida (tem precedência sobre is_tooltip) |
is_super_tooltip_text | string | "" | Texto da dica enriquecida (marcação rica aceite) |
is_super_tooltip_image | string | "" | Imagem da dica enriquecida |
Métodos #
| Método | Papel |
|---|---|
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 #
| Evento | Disparado 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 #
| Propriedade | Tipo | Predefinição | Papel |
|---|---|---|---|
is_text | string | "" | Rótulo do ramo. Mantenha-o curto: um setor é uma fatia, não uma linha — o cubo escreve o resto |
ib_enabled | boolean | true | A falso, o ramo fica desativado e o seu setor ignora todos os cliques |
ib_visible | boolean | true | A falso, o ramo sai da roda — sub-roda incluída — sem ser eliminado; os setores fecham-se, e volta tal como estava |
ib_checked | boolean | false | A 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 #
- Abra ao LARGAR o clique direito do controlo, nunca ao premir. É o que separa abrir de escolher, e o utilizador precisa de ambos.
- Rótulos curtos. Uma ou duas palavras. O cubo está lá para o texto inteiro, o setor para a direção.
- Quatro a seis ramos valem mais que oito. Uma roda recorda-se pela posição; quantas menos posições, mais depressa se aprendem.
- Ponha os comandos mais frequentes em cima e em baixo. São as duas direções que a mão alcança sem pensar.
- Mantenha a ordem estável de uma abertura para a outra: todo o interesse de uma roda é que o gesto acabe por preceder a leitura.
- Um menu radial não substitui um menu de lista. Vinte comandos raros leem-se melhor numa lista; guarde a roda para o punhado que se usa a toda a hora.
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.
| Membros | Função | Detalhado em |
|---|---|---|
of_count · of_keys_at · of_has | Percorrer o que o componente contém | 3.2 Os items |
of_reset | Repor o componente a zero | 3.6 Repor um componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atalhos de teclado do componente | 3.5 Os atalhos de teclado |
of_is_created · of_is_ready · of_get_last_error | Se nasceu, se está pronto, o que falhou | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar a renderização como imagem | 3.8 Exportar a representação como imagem |
of_set_redraw | Agrupar as alterações num único repinte | 3.10 Boas práticas |
of_preload_icons | Ícones mostrados sem atraso | Apresentação instantânea: of_icon |
of_set_translation | Traduzir uma legenda do componente | 5.2 Adaptar uma etiqueta: of_set_translation |
of_focus_webview | Dar o foco ao componente | 6.4 Teclado e focus |
of_print · of_print_to_pdf | Imprimir, ou escrever um PDF | 6.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.