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

bobice1

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

bobice2

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

cor1

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

cor2

Ah! A outra diferença do Radiolist para o Menu é que ele usa os parênteses (X) para marcar o item.