PublicFiles/Artian-Apps/etc/categoryedit

163 lines
6.8 KiB
Bash

#!/bin/bash
if [ -z "$DIRECTORY" ]; then
DIRECTORY="$(readlink -f "$(dirname "$(dirname "$0")")")"
fi
function error {
echo -e "\e[91m$1\e[39m"
exit 1
}
#Only one instance of this script should run at a time. wait if another process other than this one is running
#skip this check if this instance does not have an ARG (running as a GUI)
if [ ! -z "$1" ];then
# processes which are using categoryedit for scripting (not a GUI) will have additional column 3 and 4 output (the arguments)
# output of below command is: PID /bin/bash ARG1 ARG2
# pgrep -af ${DIRECTORY}/etc/categoryedit
# remove all output from the list if there is no second column (aka, there was not argument, meaning it is a GUI)
# pgrep -af ${DIRECTORY}/etc/categoryedit | awk '{print $1, $3}' | awk '$2 != ""'
# now only print the first column (the PIDs)
# pgrep -af ${DIRECTORY}/etc/categoryedit | awk '{print $1, $3}' | awk '$2 != ""' | awk '{print $1}'
while [[ $(pgrep -af ${DIRECTORY}/etc/categoryedit | awk '{print $1, $3}' | awk '$2 != ""' | awk '{print $1}' | sort | head -n 1) != $$ ]]; do
# waiting for another instance of categoryedit to finish
sleep 0.02
done
fi
#for read_category_files()
if ! command -v read_category_files >/dev/null ;then
source "${DIRECTORY}/api" || error "failed to source ${DIRECTORY}/api"
fi
refresh() { #set the categories variable to the current categories
categories="$(read_category_files)"
}
refresh
set_category() { #place the $1 app in the $2 category - don't write to files, only change the local_categories
local app="$1"
[ -z "$app" ] && error "set_category: app field empty!"
local category="$2"
#the category field may be left blank.
#store the contents of the global categories file and the local category-overrides file
#these are purposely not local-variables.
[ -z "$local_categories" ] && local_categories="$(cat "${DIRECTORY}/data/category-overrides")"
[ -z "$global_categories" ] && global_categories="$(cat "${DIRECTORY}/etc/categories")"
#the app may be: in both files, in global file, in overrides file, or in neither file
if echo "$local_categories" | grep -q "^${app}|" ;then
#if app is already listed in local categories file
if echo "$global_categories" | grep -qx "${app}|${category}" ;then
#if the app is already in that category in the global category file
echo "$app is already in the $category category in the global categories file; removing entry from the overrides file."
local_categories="$(echo "$local_categories" | grep -v "^${app}|")"
else #the app is NOT already in that category in the global category file
#add it to the overrides list
echo "$app is not in the $category category in the global categories file; adding entry to the overrides file."
local_categories="$(echo "$local_categories" | grep -v "^${app}|")\n${app}|${category}"
fi
else #app is not listed in local categories file
if echo "$global_categories" | grep -qx "${app}|${category}" ;then
#if the app is already in that category in the global category file
echo "$app is already in the $category category in the global categories file; doing nothing."
true #do nothing - don't add the app to the overrides file
else #the app is NOT currently in the desired category in the global category file
echo "$app is not in the $category category in the global categories file; adding entry to the overrides file."
local_categories="$(echo "$local_categories" | grep -v "^${app}|")\n${app}|${category}"
fi
fi
local_categories="$(echo -e "$local_categories" | sort)"
#echo "Line in file: $(echo -e "$local_categories" | grep "^${app}|")"
}
save_changes() { #writes the $local_categories variable to the category-overrides file
if [ "$local_categories" != "$(cat "${DIRECTORY}/data/category-overrides")" ];then
echo "$local_categories" > "${DIRECTORY}/data/category-overrides"
fi
}
APPS="$(list_apps local)"
#command line argument handler: $1 is app, $2 is category. (--delete means to remove the app from category-overrides)
if [ ! -z "$1" ];then
if ! echo "$APPS" | grep -q "$1" ;then
error "The '$1' app does not exist!"
fi
set_category "$1" "$2"
save_changes
exit 0
fi
while true;do #repeat the main window until Save or Exit clicked
#generate a virtual file system with apps in folders represented as subdirectories
IFS=$'\n'
LIST=''
for app in $APPS
do
category="$(echo "$categories" | grep "$app"'|' | awk -F '|' '{print $2}' | tr -d '.' | head -n1)"
#echo "category for $app is $category."
LIST="${LIST}${DIRECTORY}/apps/$app/icon-24.png
$app
$category
"
done
LIST="${LIST::-1}"
categories="$(echo -e "$LIST" | yad --center --title='Category editor' --height=400 \
--list --text="Changes saved to: $(echo "${DIRECTORY}/data/category-overrides" | sed "s+$HOME+~+g")" --editable --editable-cols=3 --multiple --dclick-action=true --print-all \
--separator='|' --window-icon="${DIRECTORY}/icons/settings.png" \
--column=:IMG --column=Name --column=Category:TEXT \
--button=Reset!"${DIRECTORY}/icons/backup.png"!"Removes all category overrides.":4 \
--button=All!"${DIRECTORY}/icons/trash.png"!"Clears categories so all apps are in one list.":2 \
--button=Cancel!"${DIRECTORY}/icons/exit.png"!"Don't save any changes.":1 \
--button=Save!"${DIRECTORY}/icons/check.png":0 )"
button=$?
if [ "$button" == 0 ];then
#save
#remove first and last characters from each line --- and '(null)' messaged from yad --- and sort it alphabetically
categories="$(echo "$categories" | sed 's/.$//; s/^.//' | sed "s/(null)//g" | sort)"
break #exit the loo to save the changes
elif [ "$button" == 2 ];then
#delete all
# remove categories from all lines, while leaving hidden ones intact
categories="$(echo -e "$(echo "$categories" | grep -v '|hidden' | sed 's/|.*/|/')\n$(echo "$categories" | grep '|hidden')" | sort)"
elif [ "$button" == 4 ];then
#reset - ignore the local category-overrides file
# list the global categories file |-----and all apps------------| filter out duplicates
categories="$( (cat "${DIRECTORY}/etc/categories" ; list_apps local | sed 's/$/|/g') | awk -F'|' '!seen[$1]++')"
else
#cancel or WM X
echo "User exited"
exit 0 #exit the script without saving changes
fi
done
#for every line in the output set the category with the set_category function
IFS=$'\n'
for line in $categories ;do
set_category "$(echo "$line" | awk -F'|' '{print $1}')" "$(echo "$line" | awk -F'|' '{print $2}')"
done
#The set_category function made modifications to the local_categories variable.
save_changes #Now save those changes to file.
#reload app-list in background
"${DIRECTORY}/etc/preload-daemon" "$(cat "${DIRECTORY}/data/settings/App List Style")" once &