More improvements to ui dialogs.
This commit is contained in:
@ -183,14 +183,102 @@ ui_progressbox() {
|
|||||||
local text="$2"
|
local text="$2"
|
||||||
|
|
||||||
if [[ "$dialog_type" == "yad" ]]; then
|
if [[ "$dialog_type" == "yad" ]]; then
|
||||||
|
# Start audio feedback for accessibility
|
||||||
|
local beep_pid
|
||||||
|
local yad_pid
|
||||||
|
|
||||||
|
# Cleanup function for traps
|
||||||
|
cleanup_progress() {
|
||||||
|
[[ -n "$beep_pid" ]] && kill "$beep_pid" 2>/dev/null
|
||||||
|
[[ -n "$yad_pid" ]] && kill "$yad_pid" 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Set trap to ensure cleanup on interruption
|
||||||
|
trap cleanup_progress EXIT INT TERM
|
||||||
|
|
||||||
|
if command -v sox >/dev/null 2>&1; then
|
||||||
|
{
|
||||||
|
while true; do
|
||||||
|
# Generate a short, pleasant progress beep (440Hz for 0.1s)
|
||||||
|
sox -q -n -d synth 0.1 sine 440 vol 0.3 2>/dev/null
|
||||||
|
sleep 2 # Beep every 2 seconds
|
||||||
|
done
|
||||||
|
} &
|
||||||
|
beep_pid=$!
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Start visual progress dialog with auto-close
|
||||||
yad --progress \
|
yad --progress \
|
||||||
--title="$title" \
|
--title="$title" \
|
||||||
--text="$text" \
|
--text="$text" \
|
||||||
--pulsate \
|
|
||||||
--auto-close \
|
--auto-close \
|
||||||
--no-buttons \
|
--pulsate \
|
||||||
--show-cursor \
|
--width=400 \
|
||||||
--width=400
|
--height=100 &
|
||||||
|
yad_pid=$!
|
||||||
|
|
||||||
|
# Process command output
|
||||||
|
local line_count=0
|
||||||
|
while IFS= read -r line; do
|
||||||
|
((line_count++))
|
||||||
|
done < <(stdbuf -oL cat)
|
||||||
|
|
||||||
|
# Clean up background processes
|
||||||
|
cleanup_progress
|
||||||
|
trap - EXIT INT TERM # Remove traps
|
||||||
|
else
|
||||||
|
dialog --title "$title" \
|
||||||
|
--progressbox "$text" 20 70
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Simple progress box that just shows the operation is running (no command output)
|
||||||
|
# Usage: command | ui_simple_progressbox "title" "text"
|
||||||
|
ui_simple_progressbox() {
|
||||||
|
local title="$1"
|
||||||
|
local text="$2"
|
||||||
|
|
||||||
|
if [[ "$dialog_type" == "yad" ]]; then
|
||||||
|
# Start audio feedback for accessibility
|
||||||
|
local beep_pid
|
||||||
|
local yad_pid
|
||||||
|
|
||||||
|
# Cleanup function for traps
|
||||||
|
cleanup_simple_progress() {
|
||||||
|
[[ -n "$beep_pid" ]] && kill "$beep_pid" 2>/dev/null
|
||||||
|
[[ -n "$yad_pid" ]] && kill "$yad_pid" 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Set trap to ensure cleanup on interruption
|
||||||
|
trap cleanup_simple_progress EXIT INT TERM
|
||||||
|
|
||||||
|
if command -v sox >/dev/null 2>&1; then
|
||||||
|
{
|
||||||
|
while true; do
|
||||||
|
# Generate a short, pleasant progress beep (440Hz for 0.1s)
|
||||||
|
sox -q -n -d synth 0.1 sine 440 vol 0.3 2>/dev/null
|
||||||
|
sleep 2 # Beep every 2 seconds
|
||||||
|
done
|
||||||
|
} &
|
||||||
|
beep_pid=$!
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Show progress dialog with pulsating
|
||||||
|
yad --progress \
|
||||||
|
--title="$title" \
|
||||||
|
--text="$text" \
|
||||||
|
--auto-close \
|
||||||
|
--pulsate \
|
||||||
|
--width=400 \
|
||||||
|
--height=100 &
|
||||||
|
yad_pid=$!
|
||||||
|
|
||||||
|
# Read from stdin and discard, but keep dialogs open until command finishes
|
||||||
|
cat > /dev/null
|
||||||
|
|
||||||
|
# Clean up background processes
|
||||||
|
cleanup_simple_progress
|
||||||
|
trap - EXIT INT TERM # Remove traps
|
||||||
else
|
else
|
||||||
dialog --title "$title" \
|
dialog --title "$title" \
|
||||||
--progressbox "$text" 20 70
|
--progressbox "$text" 20 70
|
||||||
@ -199,24 +287,46 @@ ui_progressbox() {
|
|||||||
|
|
||||||
# Check for updates
|
# Check for updates
|
||||||
check_update() {
|
check_update() {
|
||||||
local url="$(git ls-remote --get-url)"
|
if ! [[ -d ".git" ]]; then
|
||||||
if [[ "$url" =~ ^[[:alnum:]]+@ ]] || [[ -z "$url" ]]; then
|
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
git remote update > /dev/null 2>&1
|
local url
|
||||||
|
url="$(git ls-remote --get-url)"
|
||||||
|
if [[ "$url" =~ ^ssh://|git@|gitea@ ]] || [[ -z "$url" ]]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
git remote update &> /dev/null
|
||||||
local upstream='@{u}'
|
local upstream='@{u}'
|
||||||
local home="$(git rev-parse @)"
|
local home
|
||||||
local remote="$(git rev-parse "$upstream")"
|
local remote
|
||||||
|
home="$(git rev-parse @)"
|
||||||
|
remote="$(git rev-parse "$upstream")"
|
||||||
if [[ "$home" == "$remote" ]]; then
|
if [[ "$home" == "$remote" ]]; then
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
ui_yesno "Linux Game Manager" "Linux Game manager" "Updates are available. Would you like to update now?" || return
|
ui_yesno "Linux Game Manager" "Linux Game Manager" "Updates are available. Would you like to update now?" || return
|
||||||
# Store the current commit before pulling
|
|
||||||
local beforePull=$(git rev-parse HEAD)
|
# Perform git pull quietly, then show only the important changes
|
||||||
git pull
|
local update_result
|
||||||
# Show changes between the stored commit and current HEAD
|
git pull --quiet >/dev/null 2>&1
|
||||||
git log "$beforePull..HEAD" --pretty=format:'%an: %s' | tac
|
update_result=$?
|
||||||
exit $?
|
|
||||||
|
# Get the important information: commit messages and summary
|
||||||
|
local changes_summary
|
||||||
|
changes_summary=$({
|
||||||
|
echo "UPDATE COMPLETED"
|
||||||
|
echo
|
||||||
|
echo "Recent changes:"
|
||||||
|
git log '@{1}..' --pretty=format:'• %an: %s' | tac
|
||||||
|
echo
|
||||||
|
echo "Update summary:"
|
||||||
|
git diff --stat '@{1}..' | tail -1
|
||||||
|
} 2>/dev/null)
|
||||||
|
|
||||||
|
# Show only the meaningful update information
|
||||||
|
ui_msgbox "Update Complete" "Linux Game Manager" "$changes_summary"
|
||||||
|
|
||||||
|
exit $update_result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -251,11 +361,11 @@ check_dependencies() {
|
|||||||
if [[ "${#dependencies[@]}" -eq 0 ]]; then
|
if [[ "${#dependencies[@]}" -eq 0 ]]; then
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
echo "missing dependencies. Please install the following:"
|
local missing_deps="missing dependencies. Please install the following:\n\n"
|
||||||
echo
|
|
||||||
for i in "${dependencies[@]}" ; do
|
for i in "${dependencies[@]}" ; do
|
||||||
echo "$i"
|
missing_deps+="$i\n"
|
||||||
done
|
done
|
||||||
|
ui_msgbox "Linux Game Manager" "Linux Game Manager" "$missing_deps"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,10 +384,11 @@ terminal_emulator() {
|
|||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
echo "No suitable terminal emulators found, please install one of:"
|
local terminal_msg="No suitable terminal emulators found, please install one of:\n\n"
|
||||||
for i in "${terminals[@]}" ; do
|
for i in "${terminals[@]}" ; do
|
||||||
echo "$i"
|
terminal_msg+="$i\n"
|
||||||
done
|
done
|
||||||
|
ui_msgbox "Linux Game Manager" "Linux Game Manager" "$terminal_msg"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Function to open urls
|
# Function to open urls
|
||||||
@ -289,7 +400,7 @@ open_url() {
|
|||||||
desktop_launcher() {
|
desktop_launcher() {
|
||||||
local desktopFile="${HOME}/linux-game-manager.desktop"
|
local desktopFile="${HOME}/linux-game-manager.desktop"
|
||||||
if [[ -e "${desktopFile}" ]]; then
|
if [[ -e "${desktopFile}" ]]; then
|
||||||
echo "the file ${desktopFile} exists. Cannot create the launcher."
|
ui_msgbox "Linux Game Manager" "Linux Game Manager" "The file ${desktopFile} exists. Cannot create the launcher."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
local dotDesktop
|
local dotDesktop
|
||||||
@ -324,28 +435,20 @@ desktop_launcher() {
|
|||||||
# Alerts, for when user needs to read something.
|
# Alerts, for when user needs to read something.
|
||||||
alert() {
|
alert() {
|
||||||
play -qnV0 synth 3 pluck D3 pluck A3 pluck D4 pluck F4 pluck A4 delay 0 .1 .2 .3 .4 remix - chorus 0.9 0.9 38 0.75 0.3 0.5 -t
|
play -qnV0 synth 3 pluck D3 pluck A3 pluck D4 pluck F4 pluck A4 delay 0 .1 .2 .3 .4 remix - chorus 0.9 0.9 38 0.75 0.3 0.5 -t
|
||||||
echo
|
ui_msgbox "Linux Game Manager" "Linux Game Manager" "Press OK to continue."
|
||||||
read -rp "Press enter to continue." continue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
clear_cache() {
|
clear_cache() {
|
||||||
local answer
|
|
||||||
if [[ ! -d "${cache}" ]]; then
|
if [[ ! -d "${cache}" ]]; then
|
||||||
echo "No cache found at ${cache}."
|
ui_msgbox "Linux Game Manager" "Linux Game Manager" "No cache found at ${cache}."
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
while ! [[ "${answer,,}" =~ ^yes$|^no$ ]]; do
|
if ! ui_yesno "Linux Game Manager" "Linux Game Manager" "This will delete all contents of ${cache}. Are you sure you want to continue?"; then
|
||||||
echo "This will delete all contents of ${cache}. Are you sure you want to continue?"
|
|
||||||
echo "Please type yes or no."
|
|
||||||
echo
|
|
||||||
read -r answer
|
|
||||||
done
|
|
||||||
if [[ "$answer" == "no" ]]; then
|
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
# All safety checks done. Delete the cache.
|
# All safety checks done. Delete the cache.
|
||||||
rm -rfv "${cache}"
|
rm -rfv "${cache}" | ui_progressbox "Linux Game Manager" "Clearing cache..."
|
||||||
echo "Cache deleted."
|
ui_msgbox "Linux Game Manager" "Linux Game Manager" "Cache deleted."
|
||||||
}
|
}
|
||||||
|
|
||||||
download() {
|
download() {
|
||||||
@ -363,7 +466,7 @@ download() {
|
|||||||
# Skip if the item is in cache.
|
# Skip if the item is in cache.
|
||||||
[[ -e "${cache}/${dest}" ]] && continue
|
[[ -e "${cache}/${dest}" ]] && continue
|
||||||
{ if ! curl -L4 -C - --retry 10 --output "${cache}/${dest}" "${i}" ; then
|
{ if ! curl -L4 -C - --retry 10 --output "${cache}/${dest}" "${i}" ; then
|
||||||
echo "Could not download \"$i\"..."
|
ui_msgbox "Linux Game Manager" "Linux Game Manager" "Could not download \"$i\"..."
|
||||||
exit 1
|
exit 1
|
||||||
fi; } | ui_progressbox "Linux Game Manager" "Downloading \"$dest\" from \"$i\""
|
fi; } | ui_progressbox "Linux Game Manager" "Downloading \"$dest\" from \"$i\""
|
||||||
local downloadError=1
|
local downloadError=1
|
||||||
@ -416,7 +519,7 @@ download_named() {
|
|||||||
# Skip if the item is in cache.
|
# Skip if the item is in cache.
|
||||||
test -e "${cache}/${dest}" && return
|
test -e "${cache}/${dest}" && return
|
||||||
if ! curl -L4 --output "${cache}/${dest}" "${2}" ; then
|
if ! curl -L4 --output "${cache}/${dest}" "${2}" ; then
|
||||||
echo "Could not download \"$dest\"..."
|
ui_msgbox "Linux Game Manager" "Linux Game Manager" "Could not download \"$dest\"..."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@ -436,7 +539,6 @@ get_installer() {
|
|||||||
if echo "$2" | xclip -selection clipboard 2> /dev/null ; then
|
if echo "$2" | xclip -selection clipboard 2> /dev/null ; then
|
||||||
message+="\n\nThe URL has been copied to the clipboard."
|
message+="\n\nThe URL has been copied to the clipboard."
|
||||||
fi
|
fi
|
||||||
echo "Manual intervention required..."
|
|
||||||
alert
|
alert
|
||||||
ui_msgbox "Linux Game Manager" "Linux Game Manager" "$message"
|
ui_msgbox "Linux Game Manager" "Linux Game Manager" "$message"
|
||||||
# Search the Desktop and Downloads directories for the installation file
|
# Search the Desktop and Downloads directories for the installation file
|
||||||
@ -445,34 +547,30 @@ get_installer() {
|
|||||||
done
|
done
|
||||||
# If the file is still not available abort.
|
# If the file is still not available abort.
|
||||||
if [[ ! -f "${cache}/$1" ]]; then
|
if [[ ! -f "${cache}/$1" ]]; then
|
||||||
echo "couldn't find $1. Please download the file and try again."
|
ui_msgbox "Linux Game Manager" "Linux Game Manager" "Couldn't find $1. Please download the file and try again."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
help() {
|
help() {
|
||||||
echo "${0##*/}"
|
local help_text="${0##*/}\nReleased under the terms of the Common Public Attribution License Version 1.0\nThis is a Stormux project: https://stormux.org\n\nUsage:\n\nWith no arguments, open the game launcher.\n\n"
|
||||||
echo "Released under the terms of the Common Public Attribution License Version 1.0"
|
|
||||||
echo -e "This is a Stormux project: https://stormux.org\n"
|
# Add command options
|
||||||
echo -e "Usage:\n"
|
|
||||||
echo "With no arguments, open the game launcher."
|
|
||||||
for i in "${!command[@]}" ; do
|
for i in "${!command[@]}" ; do
|
||||||
echo "-${i/:/ <parameter>}: ${command[${i}]}"
|
help_text+="-${i/:/ <parameter>}: ${command[${i}]}\n"
|
||||||
done | sort
|
done
|
||||||
echo
|
|
||||||
echo "Some settings that are often used can be stored in a settings.conf file."
|
help_text+="\nSome settings that are often used can be stored in a settings.conf file.\nIf wanted, place it at the following location:\n${configFile%/*}/settings.conf\nThe syntax is variable=\"value\"\n\n"
|
||||||
echo "If wanted, place it at the following location:"
|
help_text+="doomLanguage=\"en\" # 2 letter language code for translation.\n"
|
||||||
echo "${configFile%/*}/settings.conf"
|
help_text+="ipfsGateway=\"https://ipfs.stormux.org\" # Gateway to be used for ipfs downloads.\n"
|
||||||
echo "The syntax is variable=\"value\""
|
help_text+="noCache=\"true\" # Do not keep downloaded items in the cache.\n"
|
||||||
echo
|
help_text+="spd_module=<module_name>\" # set speech-dispatcher module.\n"
|
||||||
echo "doomLanguage=\"en\" # 2 letter language code for translation."
|
help_text+="spd_pitch=<number>\" # set speech-dispatcher speech pitch.\n"
|
||||||
echo "ipfsGateway=\"https://ipfs.stormux.org\" # Gateway to be used for ipfs downloads."
|
help_text+="spd_rate=<number>\" # set speech-dispatcher speech rate.\n"
|
||||||
echo "noCache=\"true\" # Do not keep downloaded items in the cache."
|
help_text+="spd_voice=<voice_name>\" # set speech-dispatcher voice. Be sure module is correct.\n"
|
||||||
echo "spd_module=\<module_name>\" # set speech-dispatcher module."
|
help_text+="spd_volume=<number>\" # set speech-dispatcher speech volume."
|
||||||
echo "spd_pitch=\<number>\" # set speech-dispatcher speech pitch."
|
|
||||||
echo "spd_rate=\<number>\" # set speech-dispatcher speech rate."
|
ui_msgbox "Linux Game Manager Help" "Linux Game Manager" "$help_text"
|
||||||
echo "spd_voice=\<voice_name>\" # set speech-dispatcher voice. Be sure module is correct."
|
|
||||||
echo "spd_volume=\<number>\" # set speech-dispatcher speech volume."
|
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -507,7 +605,7 @@ game_installer() {
|
|||||||
done
|
done
|
||||||
# If all games are installed, exit
|
# If all games are installed, exit
|
||||||
if [[ ${#menuList[@]} -eq 0 ]]; then
|
if [[ ${#menuList[@]} -eq 0 ]]; then
|
||||||
echo "All games are already installed."
|
ui_msgbox "Linux Game Manager" "Linux Game Manager" "All games are already installed."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
# Add donation option at the end
|
# Add donation option at the end
|
||||||
@ -596,7 +694,7 @@ game_removal() {
|
|||||||
game_update() {
|
game_update() {
|
||||||
mapfile -t lines < <(find .update -type f -iname '*.sh' 2> /dev/null)
|
mapfile -t lines < <(find .update -type f -iname '*.sh' 2> /dev/null)
|
||||||
if [[ ${#lines} -eq 0 ]]; then
|
if [[ ${#lines} -eq 0 ]]; then
|
||||||
echo "No games found."
|
ui_msgbox "Linux Game Manager" "Linux Game Manager" "No games found."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
# Create the menu of updatable games
|
# Create the menu of updatable games
|
||||||
@ -723,8 +821,8 @@ requiredPackages=(
|
|||||||
"unzip"
|
"unzip"
|
||||||
)
|
)
|
||||||
for i in "${requiredPackages[@]}" ; do
|
for i in "${requiredPackages[@]}" ; do
|
||||||
if ! command -v $i > /dev/null 2>&1 ; then
|
if ! command -v "$i" > /dev/null 2>&1 ; then
|
||||||
echo "Please install ${i/7z/p7zip} before continuing."
|
ui_msgbox "Linux Game Manager" "Linux Game Manager" "Please install ${i/7z/p7zip} before continuing."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
Reference in New Issue
Block a user