X-Git-Url: http://git.tuebingen.mpg.de/?p=gsu.git;a=blobdiff_plain;f=gui;h=42975647e6900bb67c900c8108cc9925e4022739;hp=34f732e27bacc9646710efb0c11eef09659a2ce4;hb=refs%2Fheads%2Fpu;hpb=32134f1512eab90da01e9cfd9f676bffef27a939 diff --git a/gui b/gui index 34f732e..83da0cd 100644 --- a/gui +++ b/gui @@ -4,7 +4,7 @@ if [[ "$(type -t _gsu_setup)" != "function" ]]; then gsu_dir=${gsu_dir:-${BASH_SOURCE[0]%/*}} - . $gsu_dir/common || exit 1 + . "$gsu_dir/common" || exit 1 _gsu_setup fi @@ -20,7 +20,7 @@ _get_geometry() fi x="${result#* }" y="${result%% *}" - (($x > 190)) && x=190 + ((x > 190)) && x=190 result="$y $x" } @@ -30,7 +30,7 @@ _set_dialog_ret() case "$ec" in 0) ret=$GSU_SUCCESS;; - 1) ret=1;; # cancelled + 1|255) ret=1;; # cancelled *) result="dialog exit code $ec" ret=-$E_GSU_DIALOG @@ -85,7 +85,7 @@ gsu_msgbox() # Some versions of dialog segfault if the text is too long. Hence we # always use a temporary file. gsu_make_tempfile 'gsu_msgbox.XXXXXXXXXX' - (($ret < 0)) && return + ((ret < 0)) && return tmp="$result" trap "rm -f $tmp" EXIT echo "$1" > "$tmp" @@ -95,17 +95,16 @@ gsu_msgbox() _gsu_menu() { - local header="${1:-root}" - local items="$2" - local i state opts num=0 + local header=$1 dflt_item=$2 + local geom + shift 2 _get_geometry - opts="$result 16" - for i in $items; do - let num++ - opts+=" $i $num" - done - result="$(dialog --menu "$gsu_banner_txt ($header)" $opts 3>&1 1>&2 2>&3 3>&-)" + geom=$result + result="$(dialog --no-lines --no-items \ + --default-item "$dflt_item" \ + --menu "$gsu_banner_txt"$'\n'"Current location: $header" \ + $geom 16 "$@" 3>&1 1>&2 2>&3 3>&-)" _set_dialog_ret $? } @@ -132,7 +131,7 @@ _get_subtree() #echo "line: $line_num, root: $root, indent level: $level" result="$(sed -e "1,${line_num}d;" <<< "$tree" \ | sed -e "/^$TAB\{1,$level\}$_gsu_node_name_pattern/,\$d" \ - | sed -e "/^$TAB\{$(($level + 2))\}/d")" + | sed -e "/^$TAB\{$((level + 2))\}/d")" if (($? != 0)); then ret=-$E_GSU_MENU_TREE result="sed command for subtree $root failed" @@ -156,24 +155,46 @@ _get_root_nodes() _browse() { - local header="$1" old_header - local tree="$2" subtree="$3" - + local root_item=$1 tree=$2 subtree=$3 + local -a items arr + local -A ids + local old_root dflt_item + local item id OIFS + local -i i=0 + + while read -a arr; do + ((${#arr[@]} == 0)) && continue + id=${arr[0]} + if ((${#arr[@]} > 1)); then + unset arr[0]; + item=${arr[*]} + if [[ "${id:$((${#id} - 1)):1}" == '/' ]]; then + item+=/ + else + item="• $item" + fi + else + item=$id + fi + items[$i]=$item + ids["$item"]=$id + let i++ + done <<< "$subtree" + dflt_item=${items[0]} while :; do - _gsu_menu "$header" "$subtree" - (($ret < 0)) && return + _gsu_menu "$root_item" "$dflt_item" "${items[@]}" + ((ret < 0)) && return [[ -z "$result" ]] && return # menu was cancelled - if [[ "${result%/}" != "$result" ]]; then - old_header="$header" - header="$result" - _get_subtree "$tree" "$header" - (($ret < 0)) && return - _browse "$header" "$tree" "$result" - (($ret < 0)) && return - header="$old_header" + dflt_item=$result + id=${ids["$result"]} + if [[ "${id:$((${#id} - 1)):1}" == '/' ]]; then + _get_subtree "$tree" "$id" + ((ret < 0)) && return + _browse "${dflt_item%/}" "$tree" "$result" + ((ret < 0)) && return continue fi - eval ${gsu_name}_$result + eval ${gsu_name}_${id} done } @@ -188,5 +209,5 @@ gsu_gui() fi _get_root_nodes "$tree" subtree="$result" - _browse "main menu" "$tree" "$subtree" + _browse 'Main menu' "$tree" "$subtree" }