]> git.tuebingen.mpg.de Git - gsu.git/blobdiff - gui
gui: Implement descriptive tree items.
[gsu.git] / gui
diff --git a/gui b/gui
index 23e9e903af340ccb74c936b4fd8704b32dfb8fee..83da0cd6b7c06b117647551b7f0eae14795a1006 100644 (file)
--- a/gui
+++ b/gui
@@ -20,7 +20,7 @@ _get_geometry()
        fi
        x="${result#* }"
        y="${result%% *}"
        fi
        x="${result#* }"
        y="${result%% *}"
-       (($x > 190)) && x=190
+       ((x > 190)) && x=190
        result="$y $x"
 }
 
        result="$y $x"
 }
 
@@ -30,7 +30,7 @@ _set_dialog_ret()
 
        case "$ec" in
        0) ret=$GSU_SUCCESS;;
 
        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
        *)
                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'
        # 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"
        tmp="$result"
        trap "rm -f $tmp" EXIT
        echo "$1" > "$tmp"
@@ -95,17 +95,16 @@ gsu_msgbox()
 
 _gsu_menu()
 {
 
 _gsu_menu()
 {
-       local header="${1:-root}"
-       local items="$2"
-       local i opts num=0
+       local header=$1 dflt_item=$2
+       local geom
 
 
+       shift 2
        _get_geometry
        _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 $?
 }
 
        _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" \
        #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"
        if (($? != 0)); then
                ret=-$E_GSU_MENU_TREE
                result="sed command for subtree $root failed"
@@ -156,24 +155,46 @@ _get_root_nodes()
 
 _browse()
 {
 
 _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
        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
                [[ -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
                        continue
                fi
-               eval ${gsu_name}_$result
+               eval ${gsu_name}_${id}
        done
 }
 
        done
 }
 
@@ -188,5 +209,5 @@ gsu_gui()
        fi
        _get_root_nodes "$tree"
        subtree="$result"
        fi
        _get_root_nodes "$tree"
        subtree="$result"
-       _browse "main menu" "$tree" "$subtree"
+       _browse 'Main menu' "$tree" "$subtree"
 }
 }