#!/bin/bash
list=( {a..z} )
init(){
MIN_INDEX=0
MAX_INDEX=$(( ${#list[@]} - 1 ))
ITEM_NUM=${#list[@]}
PAGE_SIZE=10
PAGE_WIDTH=10
PAGE_NUM=$(( ( MAX_INDEX % PAGE_SIZE ) ? MAX_INDEX / PAGE_SIZE + 1: MAX_INDEX / PAGE_SIZE ))
BAR_LEN=$(( (PAGE_SIZE - 2) / PAGE_NUM ))
(( BAR_LEN <= 0 )) && BAR_LEN=1
index=0
}
draw(){
local i page_index page_start page_end bar_len bar_start
tput cup 0 0
(( page_index = index / PAGE_SIZE ))
(( page_start = page_index*PAGE_SIZE ))
(( page_end = page_start + PAGE_SIZE - 1 ))
(( bar_start = page_index * (PAGE_SIZE - 2) /PAGE_NUM ))
printf "index=%2d, page_index=%2d, bar_len=%2d, bar_start=%2d\n" $index $page_index $BAR_LEN $bar_start
for (( i=page_start; i <=page_end; ++i ))
do
(( i == index )) && echo -ne "\033[1;37;44m"
printf "%-${PAGE_WIDTH}s" "${list[$i]}"
if (( i == page_start )) ; then
echo -e "\033[${PAGE_WIDTH}G\033[1;30;47m\0342\0226\0262\033[m"
elif (( i == page_end )) ; then
echo -e "\033[${PAGE_WIDTH}G\033[1;30;47m\0342\0226\0274\033[m"
elif (( i >= page_start + bar_start + 1 && i <= page_start + bar_start + BAR_LEN + 1)) ; then
echo -e "\033[${PAGE_WIDTH}G\033[1;44m \033[m"
else
echo -e "\033[${PAGE_WIDTH}G\033[1;47m \033[m"
fi
done
}
input(){
echo -ne "\033[?25l"
aKey=(0 0 0 0)
cESC=`echo -ne "\033"`
while :
do
read -s -n 1 key
aKey=( "${aKey[@]:1}" "$key")
if [[ $key${aKey[2]} = $cESC$cESC ]] ; then break
elif [[ "${aKey[@]:1:2}$key" = "${cESC} [A" ]] ; then (( --index ))
elif [[ "${aKey[@]:1:2}$key" = "${cESC} [B" ]] ; then (( ++index ))
elif [[ "${aKey[@]}" = "${cESC} [ 5 ~" ]] ; then (( index-=PAGE_SIZE ))
elif [[ "${aKey[@]}" = "${cESC} [ 6 ~" ]] ; then (( index+=PAGE_SIZE ))
else continue
fi
if (( index < MIN_INDEX )) ; then index=$MIN_INDEX
elif (( index > MAX_INDEX )) ; then index=$MAX_INDEX
fi
draw $INDEX
done
echo -ne "\033[?25h"
}
clear
init
draw
input