Home > Blockchain >  Dialog --menu open another --menu bash
Dialog --menu open another --menu bash

Time:10-04

I just started to learn bash and create a GUI with Dialog, but I'm having a problem with my program, any help will be appreciate it. Thanks

I want to create a program which will display a dialog which will ls only directories from the current folder:

display_folders()
{
  while true;  do
    let count=0 #define counting variable
    w=() #define working array
    while read -r line; do #process file by file
      let count=$count 1
      w =("$line" "$line")
    done < <(ls -d */)
    file=$(dialog --title "List directory" --cancel-label "Exit" --no-tags --menu "Please choose one folder: " 10 40 0 "${w[@]}" 3>&2>
    #clear
    exit_status=$?
    echo $exit_status
    case $exit_status in
      1) echo "Program terminated"
      exit ;;
      255) echo "Program aborted"
      exit 1 ;;
    esac
    echo "this is $file"
    case "$file" in
      *)
      cd $file
      display_result "$file" ;;
    esac
  done
}

After selecting the specified dir (for example ANIMALS) I want to cd into it and make some actions (the code is just for the 1 selection)

display_result()
{
  while true; do
    selection=$(dialog --title "folder" \
      --cancel-label "Exit" \
      --menu "Choose an action: " 10 40 0 \
      "1" "List details about files" \
      "2" "Search for word" \
      "3" "Generate CSV" \
      "4" "More info CSV" \
      "5" "Search file" \
      3>&2 2>&1 1>&3)
    exit_status=$?
    case $exit_status in
      1) break ;;
      255) echo "Program aborted"
      exit 1 ;;
    esac
    case $selection in
      1 ) 
          result=$(ls -lt)
          display_file_details ;;
    esac
  done
}

display_file_details()
{
  dialog --title "file details" --no-collapse --msgbox "$result" 0 0
}

The problem is, in the selected folder (ANIMALS) I have another folder too (for example OTHERS), when I am ls all from the folder ANIMALS it will display me everything (which is good), but after I exit from the display --msgbox will display me another --menu only with OTHERS folder, and the display_result for it, if I exit from this too, the program will exit with 1 code.

What I want is to cd into ANIMALS, which is the dir from current folder, then list the options (1,2,3,4,5), and after exit from the options display I want to take me back to my current folder with ANIMALS in it.

CodePudding user response:

You don't need this 'while true; do' loops. Create first dialog:

dialog1(){
    list=( */ )
    folder=$( dialog --title "List directory" --cancel-label "Exit" \
                     --no-items --menu "Please choose one folder: " \
                     --output-fd 1 10 40 0 ${list[@]///} )
    echo $folder
    dialog2
}

And the second like this:

dialog2(){
    # another dialog here
    # some code here
    dialog1 # run first dialog again
}

And start first dialog:

dialog1

p.s. check out my projects sshto and kube-dialog created via dialog.

CodePudding user response:

Thank's @Ivan but this is not what I wanted.

I solved it by going back with a dir in the same case :

display_file_details()
{
  dialog --title "file details" --no-collapse --msgbox "$1" 0 0
}

dialog1(){
  list=( */ )
  folder=$( dialog --title "List directory" --cancel-label "Exit" \
                   --no-items --menu "Please choose one folder: " \
                   --output-fd 1 10 40 0 ${list[@]///} )
  exit_status=$?
  echo "$exit_status dialog1"
  case $exit_status in
    1 | 255)
      return 0
      ;;
    *)
      diag2_return=255
      while [ "$diag2_return" -ne "0" ]; do
        dialog2 $folder
        diag2_return=$?
      done
  esac
  return 1
}

dialog2(){
  echo "hereeeeeeeeee $1"
  selection=$(dialog --title "folder" --cancel-label "Exit" \
    --menu "Choose an action: " --output-fd 1 10 40 0 \
    "1" "List details about files" \
    "2" "Search for word" \
    "3" "Generate CSV" \
    "4" "More info CSV" \
    "5" "Search file" )
  exit_status=$?
  echo "$exit_status dialog2"
  case $exit_status in
    1 | 255)
      return 0
      ;;
  esac
  case $selection in
    1 )
      cd "$1"
      result=$(ls -lt)
      display_file_details "$result" 
      cd ..
    ;;
  esac
  return 1
}

diag_return=255
while [ "$diag_return" -ne "0" ]; do
  dialog1
  diag_return=$?
done
  • Related