#!%%LOCALBASE%%/bin/bash ################################################## # # The src gather dialog # ################################################## # # Data model # typeset src_gather_dlg_title typeset src_gather_dlg_action typeset src_gather_dlg_action_desc typeset src_gather_dlg_get_data_ex typeset src_gather_dlg_load_ui_ex typeset src_gather_dlg_action_ex typeset src_list_height=13 typeset src_list_sel_index=0 typeset src_list_top_index=0 typeset -a src_list_array typeset -a src_dir_array typeset recent_dir typeset -i src_total_size load_src_gather_dialog_ui() { if [ "$src_gather_dlg_load_ui_ex" != "" ]; then $src_gather_dlg_load_ui_ex else load_ui_res << EOF [A=[&(A) [R=[&(R) [U=[&(U) [D=[&(D) [[]K -- Action[]]=[ -- [X=[&(X) (fff-fff/fff)= ~ ~ ############################ ~ +-----------------------------------------+ ~ | ######### | | ~ | ######### | [A -- Add] | ~ | ######### | | ~ | ######### | [R -- Remove] | ~ | ######### | | ~ | ######### | [U -- Up] | ~ | ######### | | ~ | ######### | [D -- Down] | ~ | ######### | | ~ | ######### | [K -- Action] | ~ | ######## | | ~ | ######## | [X -- Exit] | ~ | ######## | | ~ |-----(fff-fff/fff)-----------------------| ~ | | ~ | Total size: #### | ~ | | ~ +-----------------------------------------+ ~ ~ Press &(?) for help EOF fi } load_src_gather_dialog_help() { load_ui_res << EOF | K=| ~ ~ &([Help]) ~ +-----------------------------------------+ ~ | Key | Function | ~ |-----------------------------------------| ~ | Up arrow | Scroll up | ~ | Down arrow | Scroll down | ~ | Page up | Scroll page up | ~ | Page down | Scroll page down | ~ | Home | Scroll to first | ~ | End | Scroll to end | ~ | A | Add a file | ~ | R | Remove a file | ~ | U | Move up | ~ | D | Move down | ~ | K | ######### | ~ | X | Exit the program | ~ +-----------------------------------------+ ~ Press 'x' to return EOF } src_gather_dialog_get_data() { local name=$1 local -i index=$2 _DATA_="???" case $1 in title) _DATA_="$src_gather_dlg_title" _DATA_ATTR_=1 ;; hkey) _DATA_="${src_gather_dlg_action:0:1}" ;; key) _DATA_="${src_gather_dlg_action:0:1}" _DATA_ATTR_=1 ;; action) _DATA_="${src_gather_dlg_action}]" ;; desc) _DATA_="$src_gather_dlg_action_desc" ;; list) get_list_data "src_list" $index ;; range) get_list_range "src_list" 13 ;; size) _DATA_="${src_total_size} K" ;; *) if [ "$src_gather_dlg_get_data_ex" != "" ]; then $src_gather_dlg_get_data_ex $* fi ;; esac } # # $1 -- array name # $2 -- index # del_array_element() { local array_name="$1" local -i i=$2 local -i size eval 'size=${#'"$array_name"'[*]}' while [ $i -lt $(($size-1)) ]; do eval "$array_name[$i]="'${'"$array_name[$(($i+1))]"'}' let i++ done eval "unset $array_name[$(($size-1))]" } # # $1 -- array name # $2 -- index # $3 -- n # mv_array_element() { local array_name="$1" local -i i=$2 local -i j=$(($i$3)) local -i size local tmp eval 'size=${#'"$array_name"'[*]}' if [ $j -ge 0 ] && [ $j -lt $size ]; then eval "tmp="'${'"$array_name[$i]"'}' eval "$array_name[$i]="'${'"$array_name[$j]"'}' eval "$array_name[$j]=""$tmp" fi } # # get the file size in (K) # # $1 -- file name # fsize() { du_info="$(du -k "$1")" echo "${du_info%%[^0123456789]*}" } # # run the source gather dialog # # $1 -- title # $2 -- action # $3 -- action_desc # $4 -- filter # $5 -- filter_desc # run_src_gather_dialog() { src_gather_dlg_title="$1" src_gather_dlg_action="$2" src_gather_dlg_action_desc="$3" src_gather_dlg_filter="$4" src_total_size=0 # recent_dir=`pwd` # if [ -f .recent_dir ]; then # recent_dir=$(< .recent_dir) # fi load_src_gather_dialog_ui _FOCUS_="src_list" local close="false" while [ "$close" != "true" ]; do update_ui "src_gather_dialog_get_data" read_key case "$_KEY_" in X|x) close="true" ;; up|down|pgup|pgdown|home|end) scroll_list "src_list" $_KEY_ ;; A|a) run_file_dialog "$src_gather_dlg_title --> add new file($5)" "$recent_dir" "$4" if [ "$_KEY_" == "O" ] || [ "$_KEY_" == "o" ]; then count=${#src_list_array[*]} src_list_array[$count]="$file_dialog_file" src_dir_array[$count]="$file_dialog_dir" recent_dir="$file_dialog_dir" let src_total_size+=$(fsize "${file_dialog_dir}/${file_dialog_file}") fi load_src_gather_dialog_ui _FOCUS_="src_list" ;; R|r) if [ ${#src_list_array[*]} -gt 0 ]; then let src_total_size-=$(fsize "${src_dir_array[$src_list_sel_index]}/${src_list_array[$src_list_sel_index]}") del_array_element "src_list_array" $src_list_sel_index del_array_element "src_dir_array" $src_list_sel_index scroll_list "src_list" "valid" _UI_UPDATED_="false" fi ;; U|u) if [ $src_list_sel_index -gt 0 ]; then mv_array_element "src_list_array" $src_list_sel_index "-1" mv_array_element "src_dir_array" $src_list_sel_index "-1" scroll_list "src_list" "up" _UI_UPDATED_="false" fi ;; D|d) if [ $src_list_sel_index -lt $((${#src_list_array[*]}-1)) ]; then mv_array_element "src_list_array" $src_list_sel_index "+1" mv_array_element "src_dir_array" $src_list_sel_index "+1" scroll_list "src_list" "down" _UI_UPDATED_="false" fi ;; ${src_gather_dlg_action:0:1}|$(echo ${src_gather_dlg_action:0:1} | dd bs=1 conv=lcase <&0 2> /dev/null)) if [ ${#src_list_array[*]} -gt 0 ]; then close="true" fi ;; '?') load_src_gather_dialog_help update_ui "src_gather_dialog_get_data" while [ "$_KEY_" != "x" ]; do read_key; done load_src_gather_dialog_ui ;; *) if ! [ -z "$src_gather_dlg_action_ex" ]; then $src_gather_dlg_action_ex fi esac done # echo "$recent_dir" > .recent_dir }