Como obter o item único escolhido de um Menu ou Radiolist no Dialog
Já sabemos como fazer telas tipo Sim/Não. Mas e se precisarmos ampliar o leque de respostas possíveis do usuário, onde também poderíamos ter “Talvez” ou “Não sei” como respostas válidas? Ou ainda, se precisarmos que o usuário escolha um item de um menu para saber qual das opções ele quer executar?
Nesse caso o Sim/Não é insuficiente, e precisamos usar a caixa do tipo Menu, onde podemos especificar vários itens diferentes e o usuário escolhe um (e apenas um). Para começar, vamos fazer um exemplo bem bobo:
user=$( dialog --stdout --menu 'Bobice:' 0 0 0 1 um 2 dois 3 três ) echo Você escolheu o número $user
A primeira grande diferença a se notar é que a linha de comando do Dialog ficou gigante, cheia de parâmetros! Vamos destrinchá-la.
Até o ‘Bobice:’, nenhuma novidade. Mas seguido dele estão três zeros onde geralmente só tinha dois! Não, isso não é erro de digitação 🙂
Os dois primeiros zeros continuam sendo a altura e largura da caixa, isso nunca muda. Já o terceiro zero é uma propriedade especial do Menu, que indica quantos itens serão “visíveis” de uma vez na caixa. Veja a diferença de trocar este zero por um:
dialog --stdout --menu 'Bobice:' 0 0 1 1 um 2 dois 3 três
Agora apenas um item é visível por vez, diminuindo o tamanho da caixa. Isso pode ser útil quando o Menu tem muitas opções, mas para que a caixa fique num tamanho aceitável, mostra-se apenas parte delas por vez e deve-se fazer uma “rolagem” para ver o resto.
Logo após esta definição do número de itens, colocamos enfileirados todos os itens do Menu, no formato “<item> <descrição>“. Em nosso exemplo são três itens numéricos.
Este é o formato genérico da linha de comando da caixa Menu:
dialog --menu '<texto>' 0 0 <núm-itens> <item1> <desc1> ... <itemN> <descN>
- núm-itens
- O número máximo de itens do menu que serão mostrados na caixa. Os demais ficarão ocultos e podem ser acessados rolando a lista com as setas do teclado.
Caso especificado como zero, o Dialog mostra todos os itens, ou ajusta automaticamente o número ideal para que a caixa caiba na tela.
- item
- O item deve ser um nome único, diferente para cada item.
O item é o texto retornado pelo Dialog ao script, quando o usuário escolhe uma opção.
- descrição
- A descrição é um texto explicativo que serve para detalhar do que se trata o item.
A descrição pode ser omitida passando a string vazia ”. Exemplo:
dialog --menu 'texto' 0 0 0 item1 '' item2 '' item3 ''
Agora que sabemos compor esse monstro que é a linha de comando de um Menu, vamos fazer mais um exemplo, com nomes ao invés de números nos itens do menu:
cor=$( dialog --stdout --menu 'As cores:' 0 0 0 amarelo 'a cor do sol' verde 'a cor da grama' azul 'a cor do céu' ) echo Você escolheu a cor $cor
Não é tão difícil hein? A dica para não se confundir é enxergar a linha de comando como várias pequena partes, identificando e isolando cada uma delas:
dialog --stdout # usa o STDOUT --menu 'As cores:' # texto do menu 0 0 0 # altura, largura e núm. itens amarelo 'a cor do sol' # item 1 verde 'a cor da grama' # item 2 azul 'a cor do céu' # item 3
Por isso que geralmente os comandos Dialog são colocados em várias linhas, para fazer essa separação em partes e facilitar o entendimento. Para tal, basta “escapar” o final de cada linha do comando (exceto a última) com uma barra \. Veja como fica o exemplo anterior quebrado em várias linhas:
cor=$( dialog \ --stdout \ --menu 'As cores:' \ 0 0 0 \ amarelo 'a cor do sol' \ verde 'a cor da grama' \ azul 'a cor do céu' ) echo Você escolheu a cor $cor
Bem melhor não? Adicionalmente, pode-se alinhar os escapes e os itens para facilitar ainda mais a leitura:
cor=$( dialog \ --stdout \ --menu 'As cores:' \ 0 0 0 \ amarelo 'a cor do sol' \ verde 'a cor da grama' \ azul 'a cor do céu' ) echo Você escolheu a cor $cor
Esta será a notação utilizada nos exemplos, por ser a mais didática.
CUIDADO! Não coloque comentários ou espaços em branco após a barra de escape, ela deve ser o último caractere da linha.
dialog --stdout \ # Esse comando é inválido. Estes --yesno texto \ # comentários não podem estar aqui. 0 0
O primo próximo do Menu é o Radiolist. A única diferença entre os dois, é que no Radiolist é possível definir qual será o item que já iniciará selecionado. Para isso, cada item é composto por três parâmetros: nome, descrição, status. O status deve ser ON
ou OFF
, para informar se o item está “ligado” (marcado) ou não.
Como na Radiolist o usuário só pode escolher um único item, cuidado na hora de compor o comando, pois apenas um item pode ter o status ON, todos os outros devem ser OFF. Caso precise de uma lista de múltipla escolha, veja o Checklist no tópico seguinte.
Usando o exemplo anterior, podemos iniciar a caixa com a cor “verde” já selecionada:
dialog --radiolist 'As cores:' 0 0 0 \ amarelo 'a cor do sol' OFF \ verde 'a cor da grama' ON \ azul 'a cor do céu' OFF
Ah! A outra diferença do Radiolist para o Menu é que ele usa os parênteses (X)
para marcar o item.