Advertisement
Guest User

help im dum

a guest
Jan 26th, 2020
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 3.67 KB | None | 0 0
  1. menuselect() {
  2.     local -n ref_choice=$1
  3.     local -a arr=( "${@:2}" )
  4.     local ht=$MENUHT
  5.     local ct=${#arr[@]}
  6.     if [[ "$ht" == '' ]]; then
  7.         ht=$(($TERM_HEIGHT - 10))
  8.     fi
  9.     if [[ $ht -gt $ct ]]; then
  10.         ht=$ct
  11.     fi
  12.     for i in $(seq $(($ht - 1))); do
  13.         echo -en "${arr[$i]}\e[${#arr[$i]}D\e[B"
  14.     done
  15.     echo -en "\e[${ht}A\e[47m\e[30m${arr[0]}\e[0m"`
  16.         `"\e[${#arr[0]}D"
  17.     local n=0
  18.     local scroll=0
  19.     local key
  20.     local str
  21.     local m
  22.     local scroll_up
  23.     readv scroll_up << 'EOT'
  24.         if [[ $amt -gt $n ]]; then amt=$n; fi
  25.         m=$(($n - $amt))
  26.         if [[ $n -le 0 ]]; then :
  27.         elif [[ $m -ge $scroll ]]; then
  28.             echo -en "${arr[$n]}\e[${#arr[$n]}D"`
  29.                 `"\e[${amt}A\e[47m\e[30m${arr[$m]}\e[0m"`
  30.                 `"\e[${#arr[$m]}D"
  31.             n=$m
  32.         else
  33.             for i in $(seq $scroll $(($scroll + $ht - 1))); do
  34.                 printf "%${#arr[$i]}s" ''
  35.                 echo -en "\e[${#arr[$i]}D\e[B"
  36.             done
  37.             echo -en "\e[${ht}A"
  38.             scramt=$amt
  39.             if [[ $(($scroll - $scramt)) -lt 0 ]]; then
  40.                 scramt=$scroll
  41.             fi
  42.             for i in $(seq $(($scroll - $scramt)) $(($scroll + $ht - 1 - $scramt))); do
  43.                 printf "%${#arr[$(($i+$scramt))]}s" ''
  44.                 echo -en "\e[${#arr[$(($i+$scramt))]}D"`
  45.                     `"${arr[$i]}\e[${#arr[$i]}D\e[B"
  46.             done
  47.             scroll=$(($scroll - $scramt))
  48.             n=$m
  49.             echo -en "\e[$(($ht-$m+$scroll))A\e[47m\e[30m${arr[$n]}\e[0m\e[${#arr[$n]}D"
  50.         fi
  51. EOT
  52.     local scroll_down
  53.     readv scroll_down << 'EOT'
  54.         if [[ $amt -gt $(($ct - $n - 1)) ]]; then
  55.             amt=$(($ct - $n - 1))
  56.         fi
  57.         m=$(($n + $amt))
  58.         if [[ $n -ge $(($ct - 1)) ]]; then :
  59.         elif [[ $m -lt $(($scroll + $ht)) ]]; then
  60.             echo -en "${arr[$n]}\e[${#arr[$n]}D"`
  61.                 `"\e[${amt}B\e[47m\e[30m${arr[$m]}\e[0m"`
  62.                 `"\e[${#arr[$m]}D"
  63.             n=$m
  64.         else
  65.             echo -en "\e[$(($n-$scroll))A"
  66.             for i in $(seq $scroll $(($scroll + $ht - 1))); do
  67.                 printf "%${#arr[$i]}s" ''
  68.                 echo -en "\e[${#arr[$i]}D\e[B"
  69.             done
  70.             echo -en "\e[${ht}A"
  71.             scramt=$amt
  72.             if [[ $(($scroll + $scramt)) -gt $(($ct - $ht)) ]]; then
  73.                 scramt=$(($ct - $ht - $scroll))
  74.             fi
  75.             for i in $(seq $(($scroll + $scramt)) $(($scroll + $ht - 1 + $scramt))); do
  76.                 printf "%${#arr[$(($i-$scramt))]}s" ''
  77.                 echo -en "\e[${#arr[$(($i-$scramt))]}D"`
  78.                     `"${arr[$i]}\e[${#arr[$i]}D\e[B"
  79.             done
  80.             scroll=$(($scroll + $scramt))
  81.             n=$m
  82.             echo -en "\e[$(($ht-$m+$scroll))A\e[47m\e[30m${arr[$n]}\e[0m\e[${#arr[$n]}D"
  83.         fi
  84. EOT
  85.     local amt
  86.     while key=$(getkey); do case ${key} in
  87.     '^[[A')
  88.         amt=1
  89.         eval "$scroll_up"
  90.         ;;
  91.     '^[[B')
  92.         amt=1
  93.         eval "$scroll_down"
  94.         ;;
  95.     '^[[5~')
  96.         if [[ $n == $scroll ]]; then
  97.             amt=$ht
  98.         else
  99.             amt=$(($n - $scroll))
  100.         fi
  101.         eval "$scroll_up"
  102.         ;;
  103.     '^[[6~')
  104.         amt=$(($ht - $n + $scroll))
  105.         if [[ $(($scroll + $ht)) -lt $ct ]]; then
  106.             eval "$scroll_down"
  107.         else
  108.             local times=$amt
  109.             for j in $(seq $times); do
  110.                 amt=1
  111.                 eval "$scroll_down"
  112.             done
  113.         fi
  114.         ;;
  115.     '')
  116.         ref_choice=$n
  117.         return 0
  118.         ;;
  119.     esac; done
  120.     return 1
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement