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/" |             unpack "$wine_package" "$WH_DIST_DIR/" | ||||||
|             try_remove_file "$wine_package" |             try_remove_file "$wine_package" | ||||||
|  |  | ||||||
|             # Handle Proton's 'files' subdirectory structure by moving contents up |             # Управление структурой подкаталога Proton "files", перемещая содержимое вверх | ||||||
|             if [[ -d "$WINEDIR/files" ]]; then |             if [[ -d "$WINEDIR/files" ]]; then | ||||||
|                 print_info "Обнаружена структура каталогов Proton, исправляем пути..." |                 print_info "Обнаружена структура каталогов Proton, исправляем пути..." | ||||||
|                 mv "$WINEDIR"/files/* "$WINEDIR/" |                 mv "$WINEDIR"/files/* "$WINEDIR/" | ||||||
| @@ -1638,50 +1638,132 @@ select_wine_version() { | |||||||
|     WINE_METADATA_FILE="$WH_TMP_DIR/wine_metadata.json" |     WINE_METADATA_FILE="$WH_TMP_DIR/wine_metadata.json" | ||||||
|     [[ ! -f "$WINE_METADATA_FILE" ]] && fatal "Файл метаданных WINE не найден." |     [[ ! -f "$WINE_METADATA_FILE" ]] && fatal "Файл метаданных WINE не найден." | ||||||
|  |  | ||||||
|     local jq_filter |     local arch_filter_jq | ||||||
|     if [[ "$WINEARCH" == "win64" ]]; then |     if [[ "$WINEARCH" == "win64" ]]; then | ||||||
|         print_info "Фильтруем версии для 64-битного префикса..." |         print_info "Фильтруем версии для 64-битного префикса..." | ||||||
|         # Для 64-битных префиксов показываем сборки с 'amd64', 'x86_64', 'wow64' |         # Для 64-битных префиксов показываем сборки с 'amd64', 'x86_64', 'wow64' | ||||||
|         # или те, у которых нет явного указания на 32-битную архитектуру. |         # или те, у которых нет явного указания на 32-битную архитектуру. | ||||||
|         jq_filter=' |         arch_filter_jq='select((.name | test("amd64|x86_64|wow64")) or (.name | test("i[3-6]86|x86(?!_64)") | not))' | ||||||
|             .[] | .[] | |  | ||||||
|             select( |  | ||||||
|                 (.name | test("amd64|x86_64|wow64")) or |  | ||||||
|                 (.name | test("i[3-6]86|x86(?!_64)") | not) |  | ||||||
|             ) | .name |  | ||||||
|         ' |  | ||||||
|     else # win32 |     else # win32 | ||||||
|         print_info "Фильтруем версии для 32-битного префикса..." |         print_info "Фильтруем версии для 32-битного префикса..." | ||||||
|         # Для 32-битных префиксов показываем только сборки с явным указанием 32-битной архитектуры. |         # Для 32-битных префиксов показываем только сборки с явным указанием 32-битной архитектуры. | ||||||
|         jq_filter=' |         arch_filter_jq='select(.name | test("i[3-6]86|x86(?!_64)"))' | ||||||
|             .[] | .[] | |  | ||||||
|             select(.name | test("i[3-6]86|x86(?!_64)")) | .name |  | ||||||
|         ' |  | ||||||
|     fi |     fi | ||||||
|  |  | ||||||
|     # Создание единого, отсортированного списка версий |     local options=() | ||||||
|     local versions=() |     local total_versions_found=0 | ||||||
|     mapfile -t versions < <(jq -r "$jq_filter" "$WINE_METADATA_FILE" | sort -V -r | uniq) |  | ||||||
|  |  | ||||||
|     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 "Не найдено подходящих версий WINE/Proton для архитектуры $WINEARCH." | ||||||
|         print_warning "Будет использована версия по умолчанию: $WH_WINE_USE" |         print_warning "Будет использована версия по умолчанию: $WH_WINE_USE" | ||||||
|         return |         return | ||||||
|     fi |     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 префикса:" |     print_info "Выберите версию WINE/Proton для $WINEARCH префикса:" | ||||||
|     PS3="Ваш выбор: " |  | ||||||
|     select opt in "Отмена" "${options[@]}"; do |     # Показывать группы одну за другой | ||||||
|         if [[ "$REPLY" == "1" ]] || [[ "$opt" == "Отмена" ]]; then |     local first_block=true | ||||||
|             print_info "Создание префикса отменено." |     for group_data in "${display_groups[@]}"; do | ||||||
|             exit 0 |  | ||||||
|         elif [[ -n "$opt" ]]; then |         if [[ "$group_data" == "---"* ]]; then | ||||||
|             export WH_WINE_USE="$opt" |             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 |             break | ||||||
|         else |         else | ||||||
|             print_error "Неверный выбор. Попробуйте еще раз." |             print_error "Неверный выбор. Введите число от 0 до $max_choice." | ||||||
|         fi |         fi | ||||||
|     done |     done | ||||||
| } | } | ||||||
| @@ -1737,15 +1819,15 @@ create_prefix() { | |||||||
|  |  | ||||||
|     print_info "Выберите тип создаваемого префикса:" |     print_info "Выберите тип создаваемого префикса:" | ||||||
|     echo " 0) Отмена создания префикса" |     echo " 0) Отмена создания префикса" | ||||||
|     echo " 1) С рекомендуемыми библиотеками (по умолчанию)" |     echo " 1) Чистый префикс (без библиотек)" | ||||||
|     echo " 2) Чистый префикс (без библиотек)" |     echo " 2) С рекомендуемыми библиотеками (по умолчанию)" | ||||||
|     echo |     echo | ||||||
|     local pfx_type_choice |     local pfx_type_choice | ||||||
|     read -p "Ваш выбор [0-2] (по умолчанию 1): " pfx_type_choice |     read -p "Ваш выбор [0-2] (по умолчанию 1): " pfx_type_choice | ||||||
|     case "${pfx_type_choice:-1}" in |     case "${pfx_type_choice:-1}" in | ||||||
|         0) print_info "Создание префикса отменено." ; exit 0 ;; |         0) print_info "Создание префикса отменено." ; exit 0 ;; | ||||||
|         1) ;; # Оставляем BASE_PFX пустым, чтобы init_wineprefix использовал значение по умолчанию |         1) export BASE_PFX="none" ;; | ||||||
|         2) export BASE_PFX="none" ;; |         2) ;; # Оставляем BASE_PFX пустым, чтобы init_wineprefix использовал значение по умолчанию | ||||||
|         *) fatal "Неверный выбор. Операция отменена." ;; |         *) fatal "Неверный выбор. Операция отменена." ;; | ||||||
|     esac |     esac | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user