added separation of wine/proton display by groups
This commit is contained in:
		
							
								
								
									
										142
									
								
								winehelper
									
									
									
									
									
								
							
							
						
						
									
										142
									
								
								winehelper
									
									
									
									
									
								
							| @@ -847,7 +847,7 @@ init_wine_ver () { | ||||
|             unpack "$wine_package" "$WH_DIST_DIR/" | ||||
|             try_remove_file "$wine_package" | ||||
|  | ||||
|             # Handle Proton's 'files' subdirectory structure by moving contents up | ||||
|             # Управление структурой подкаталога Proton "files", перемещая содержимое вверх | ||||
|             if [[ -d "$WINEDIR/files" ]]; then | ||||
|                 print_info "Обнаружена структура каталогов Proton, исправляем пути..." | ||||
|                 mv "$WINEDIR"/files/* "$WINEDIR/" | ||||
| @@ -1638,50 +1638,132 @@ select_wine_version() { | ||||
|     WINE_METADATA_FILE="$WH_TMP_DIR/wine_metadata.json" | ||||
|     [[ ! -f "$WINE_METADATA_FILE" ]] && fatal "Файл метаданных WINE не найден." | ||||
|  | ||||
|     local jq_filter | ||||
|     local arch_filter_jq | ||||
|     if [[ "$WINEARCH" == "win64" ]]; then | ||||
|         print_info "Фильтруем версии для 64-битного префикса..." | ||||
|         # Для 64-битных префиксов показываем сборки с 'amd64', 'x86_64', 'wow64' | ||||
|         # или те, у которых нет явного указания на 32-битную архитектуру. | ||||
|         jq_filter=' | ||||
|             .[] | .[] | | ||||
|             select( | ||||
|                 (.name | test("amd64|x86_64|wow64")) or | ||||
|                 (.name | test("i[3-6]86|x86(?!_64)") | not) | ||||
|             ) | .name | ||||
|         ' | ||||
|         arch_filter_jq='select((.name | test("amd64|x86_64|wow64")) or (.name | test("i[3-6]86|x86(?!_64)") | not))' | ||||
|     else # win32 | ||||
|         print_info "Фильтруем версии для 32-битного префикса..." | ||||
|         # Для 32-битных префиксов показываем только сборки с явным указанием 32-битной архитектуры. | ||||
|         jq_filter=' | ||||
|             .[] | .[] | | ||||
|             select(.name | test("i[3-6]86|x86(?!_64)")) | .name | ||||
|         ' | ||||
|         arch_filter_jq='select(.name | test("i[3-6]86|x86(?!_64)"))' | ||||
|     fi | ||||
|  | ||||
|     # Создание единого, отсортированного списка версий | ||||
|     local versions=() | ||||
|     mapfile -t versions < <(jq -r "$jq_filter" "$WINE_METADATA_FILE" | sort -V -r | uniq) | ||||
|     local options=() | ||||
|     local total_versions_found=0 | ||||
|  | ||||
|     if [[ ${#versions[@]} -eq 0 ]]; then | ||||
|     # --- System --- | ||||
|     options+=("--- System ---") | ||||
|     options+=("system") | ||||
|  | ||||
|     # --- Other versions from JSON --- | ||||
|     local group_keys | ||||
|     mapfile -t group_keys < <(jq -r 'keys_unsorted | .[]' "$WINE_METADATA_FILE") | ||||
|  | ||||
|     for key in "${group_keys[@]}"; do | ||||
|         local group_versions | ||||
|         mapfile -t group_versions < <(jq -r --arg key "$key" '.[$key] | .[] | '"$arch_filter_jq"' | .name' "$WINE_METADATA_FILE" | sort -V -r | uniq) | ||||
|  | ||||
|         if [[ ${#group_versions[@]} -gt 0 ]]; then | ||||
|             # Prettify the group name (e.g., "proton_ge" -> "Proton Ge") | ||||
|             local pretty_key | ||||
|             pretty_key=$(echo "$key" | tr '_' ' ' | sed -e "s/\b\(.\)/\u\1/g") | ||||
|  | ||||
|             options+=("--- $pretty_key ---") | ||||
|             options+=("${group_versions[@]}") | ||||
|             ((total_versions_found+=${#group_versions[@]})) | ||||
|         fi | ||||
|     done | ||||
|  | ||||
|     if [[ $total_versions_found -eq 0 ]]; then | ||||
|         print_warning "Не найдено подходящих версий WINE/Proton для архитектуры $WINEARCH." | ||||
|         print_warning "Будет использована версия по умолчанию: $WH_WINE_USE" | ||||
|         return | ||||
|     fi | ||||
|  | ||||
|     local options=("system" "${versions[@]}") | ||||
|     # --- Пользовательское меню с разделением на группы и пустыми строками --- | ||||
|     local selectable_options=("Отмена") | ||||
|     local display_groups=() | ||||
|     local current_group_items=() | ||||
|     local choice_idx=0 | ||||
|  | ||||
|     # Помощник для переноса текущей группы элементов в основной массив display_groups | ||||
|     flush_current_group() { | ||||
|         if ((${#current_group_items[@]} > 0)); then | ||||
|             # Объединяйте элементы с помощью уникального разделителя для последующего разделения | ||||
|             display_groups+=("$(IFS='@@@'; echo "${current_group_items[*]}")") | ||||
|             current_group_items=() | ||||
|         fi | ||||
|     } | ||||
|  | ||||
|     current_group_items+=(" 0) Отмена создания префикса") | ||||
|  | ||||
|     # Обработка массива основных параметров для создания групп | ||||
|     for opt in "${options[@]}"; do | ||||
|         if [[ "$opt" == "---"* ]]; then | ||||
|         flush_current_group | ||||
|         display_groups+=("$opt") # Добавьте заголовок как отдельный элемент | ||||
|         else | ||||
|             ((choice_idx++)) | ||||
|             current_group_items+=(" ${choice_idx}) $opt") | ||||
|             selectable_options+=("$opt") | ||||
|         fi | ||||
|     done | ||||
|     flush_current_group # Очистка последней группы | ||||
|  | ||||
|     print_info "Выберите версию WINE/Proton для $WINEARCH префикса:" | ||||
|     PS3="Ваш выбор: " | ||||
|     select opt in "Отмена" "${options[@]}"; do | ||||
|         if [[ "$REPLY" == "1" ]] || [[ "$opt" == "Отмена" ]]; then | ||||
|             print_info "Создание префикса отменено." | ||||
|             exit 0 | ||||
|         elif [[ -n "$opt" ]]; then | ||||
|             export WH_WINE_USE="$opt" | ||||
|  | ||||
|     # Показывать группы одну за другой | ||||
|     local first_block=true | ||||
|     for group_data in "${display_groups[@]}"; do | ||||
|  | ||||
|         if [[ "$group_data" == "---"* ]]; then | ||||
|             if [[ "$first_block" = false ]]; then | ||||
|             echo | ||||
|         fi | ||||
|             echo "$group_data" | ||||
|         else | ||||
|             # Это блок элементов для печати в столбцах | ||||
|             local items_to_print=() | ||||
|             IFS='@@@' read -r -a items_to_print <<< "$group_data" | ||||
|  | ||||
|             local num_items=${#items_to_print[@]} | ||||
|             local term_width=${COLUMNS:-80} | ||||
|             local max_len=0 | ||||
|             for item in "${items_to_print[@]}"; do | ||||
|                 (( ${#item} > max_len )) && max_len=${#item} | ||||
|             done | ||||
|  | ||||
|             ((max_len+=2)) | ||||
|             local num_cols=$(( term_width / max_len )) | ||||
|             (( num_cols = num_cols > 0 ? num_cols : 1 )) | ||||
|             local num_rows=$(( (num_items + num_cols - 1) / num_cols )) | ||||
|  | ||||
|             for ((i=0; i<num_rows; i++)); do | ||||
|                 for ((j=0; j<num_cols; j++)); do | ||||
|                     local index=$(( i + j * num_rows )) | ||||
|                     (( index < num_items )) && printf "%-*s" "$max_len" "${items_to_print[index]}" | ||||
|                 done | ||||
|                 echo | ||||
|             done | ||||
|         fi | ||||
|         first_block=false | ||||
|         done | ||||
|  | ||||
|     while true; do | ||||
|         local max_choice=$(( ${#selectable_options[@]} - 1 )) | ||||
|         read -p "Введите номер (0-$max_choice): " user_choice | ||||
|         if [[ "$user_choice" =~ ^[0-9]+$ ]] && (( user_choice >= 0 && user_choice <= max_choice )); then | ||||
|             if [[ "$user_choice" == "0" ]]; then | ||||
|                 print_info "Создание префикса отменено." | ||||
|                 exit 0 | ||||
|             fi | ||||
|             local selected_opt="${selectable_options[$user_choice]}" | ||||
|             export WH_WINE_USE="$selected_opt" | ||||
|             break | ||||
|         else | ||||
|             print_error "Неверный выбор. Попробуйте еще раз." | ||||
|             print_error "Неверный выбор. Введите число от 0 до $max_choice." | ||||
|         fi | ||||
|     done | ||||
| } | ||||
| @@ -1737,15 +1819,15 @@ create_prefix() { | ||||
|  | ||||
|     print_info "Выберите тип создаваемого префикса:" | ||||
|     echo " 0) Отмена создания префикса" | ||||
|     echo " 1) С рекомендуемыми библиотеками (по умолчанию)" | ||||
|     echo " 2) Чистый префикс (без библиотек)" | ||||
|     echo " 1) Чистый префикс (без библиотек)" | ||||
|     echo " 2) С рекомендуемыми библиотеками (по умолчанию)" | ||||
|     echo | ||||
|     local pfx_type_choice | ||||
|     read -p "Ваш выбор [0-2] (по умолчанию 1): " pfx_type_choice | ||||
|     case "${pfx_type_choice:-1}" in | ||||
|         0) print_info "Создание префикса отменено." ; exit 0 ;; | ||||
|         1) ;; # Оставляем BASE_PFX пустым, чтобы init_wineprefix использовал значение по умолчанию | ||||
|         2) export BASE_PFX="none" ;; | ||||
|         1) export BASE_PFX="none" ;; | ||||
|         2) ;; # Оставляем BASE_PFX пустым, чтобы init_wineprefix использовал значение по умолчанию | ||||
|         *) fatal "Неверный выбор. Операция отменена." ;; | ||||
|     esac | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user