Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- menuselect() {
- local -n ref_choice=$1
- local -a arr=( "${@:2}" )
- local ht=$MENUHT
- local ct=${#arr[@]}
- if [[ "$ht" == '' ]]; then
- ht=$(($TERM_HEIGHT - 10))
- fi
- if [[ $ht -gt $ct ]]; then
- ht=$ct
- fi
- for i in $(seq $(($ht - 1))); do
- echo -en "${arr[$i]}\e[${#arr[$i]}D\e[B"
- done
- echo -en "\e[${ht}A\e[47m\e[30m${arr[0]}\e[0m"`
- `"\e[${#arr[0]}D"
- local n=0
- local scroll=0
- local key
- local str
- local m
- local scroll_up
- readv scroll_up << 'EOT'
- if [[ $amt -gt $n ]]; then amt=$n; fi
- m=$(($n - $amt))
- if [[ $n -le 0 ]]; then :
- elif [[ $m -ge $scroll ]]; then
- echo -en "${arr[$n]}\e[${#arr[$n]}D"`
- `"\e[${amt}A\e[47m\e[30m${arr[$m]}\e[0m"`
- `"\e[${#arr[$m]}D"
- n=$m
- else
- for i in $(seq $scroll $(($scroll + $ht - 1))); do
- printf "%${#arr[$i]}s" ''
- echo -en "\e[${#arr[$i]}D\e[B"
- done
- echo -en "\e[${ht}A"
- scramt=$amt
- if [[ $(($scroll - $scramt)) -lt 0 ]]; then
- scramt=$scroll
- fi
- for i in $(seq $(($scroll - $scramt)) $(($scroll + $ht - 1 - $scramt))); do
- printf "%${#arr[$(($i+$scramt))]}s" ''
- echo -en "\e[${#arr[$(($i+$scramt))]}D"`
- `"${arr[$i]}\e[${#arr[$i]}D\e[B"
- done
- scroll=$(($scroll - $scramt))
- n=$m
- echo -en "\e[$(($ht-$m+$scroll))A\e[47m\e[30m${arr[$n]}\e[0m\e[${#arr[$n]}D"
- fi
- EOT
- local scroll_down
- readv scroll_down << 'EOT'
- if [[ $amt -gt $(($ct - $n - 1)) ]]; then
- amt=$(($ct - $n - 1))
- fi
- m=$(($n + $amt))
- if [[ $n -ge $(($ct - 1)) ]]; then :
- elif [[ $m -lt $(($scroll + $ht)) ]]; then
- echo -en "${arr[$n]}\e[${#arr[$n]}D"`
- `"\e[${amt}B\e[47m\e[30m${arr[$m]}\e[0m"`
- `"\e[${#arr[$m]}D"
- n=$m
- else
- echo -en "\e[$(($n-$scroll))A"
- for i in $(seq $scroll $(($scroll + $ht - 1))); do
- printf "%${#arr[$i]}s" ''
- echo -en "\e[${#arr[$i]}D\e[B"
- done
- echo -en "\e[${ht}A"
- scramt=$amt
- if [[ $(($scroll + $scramt)) -gt $(($ct - $ht)) ]]; then
- scramt=$(($ct - $ht - $scroll))
- fi
- for i in $(seq $(($scroll + $scramt)) $(($scroll + $ht - 1 + $scramt))); do
- printf "%${#arr[$(($i-$scramt))]}s" ''
- echo -en "\e[${#arr[$(($i-$scramt))]}D"`
- `"${arr[$i]}\e[${#arr[$i]}D\e[B"
- done
- scroll=$(($scroll + $scramt))
- n=$m
- echo -en "\e[$(($ht-$m+$scroll))A\e[47m\e[30m${arr[$n]}\e[0m\e[${#arr[$n]}D"
- fi
- EOT
- local amt
- while key=$(getkey); do case ${key} in
- '^[[A')
- amt=1
- eval "$scroll_up"
- ;;
- '^[[B')
- amt=1
- eval "$scroll_down"
- ;;
- '^[[5~')
- if [[ $n == $scroll ]]; then
- amt=$ht
- else
- amt=$(($n - $scroll))
- fi
- eval "$scroll_up"
- ;;
- '^[[6~')
- amt=$(($ht - $n + $scroll))
- if [[ $(($scroll + $ht)) -lt $ct ]]; then
- eval "$scroll_down"
- else
- local times=$amt
- for j in $(seq $times); do
- amt=1
- eval "$scroll_down"
- done
- fi
- ;;
- '')
- ref_choice=$n
- return 0
- ;;
- esac; done
- return 1
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement