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
fi
x="${result#* }"
y="${result%% *}"
- (($x > 190)) && x=190
+ ((x > 190)) && x=190
result="$y $x"
}
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
# This is like gsu_textbox() but the text is passed as a string.
gsu_msgbox()
{
+ local tmp
+
# Some versions of dialog segfault if the text is too long. Hence we
# always use a temporary file.
- local tmp="$(mktemp gsu_msgbox.XXXXXXXXXX)"
-
- if (($? != 0)); then
- ret=-$E_GSU_MKTEMP
- result='temp file for textbox'
- return
- fi
+ gsu_make_tempfile 'gsu_msgbox.XXXXXXXXXX'
+ ((ret < 0)) && return
+ tmp="$result"
trap "rm -f $tmp" EXIT
echo "$1" > "$tmp"
gsu_textbox "$tmp"
_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 $?
}
#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"
_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
}
fi
_get_root_nodes "$tree"
subtree="$result"
- _browse "main menu" "$tree" "$subtree"
+ _browse 'Main menu' "$tree" "$subtree"
}