Compare commits
	
		
			12 Commits
		
	
	
		
			0.5.4.1
			...
			5c01220382
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 5c01220382 | ||
|  | b74fe77bad | ||
|  | 3a442f6288 | ||
|  | 20030d43e4 | ||
|  | b44849661d | ||
|  | 4c39ec3c8e | ||
|  | 8950d8de2f | ||
|  | 85bd5fdf5d | ||
|  | b98c6e5408 | ||
|  | bab49377a3 | ||
|  | aa591112ff | ||
|  | 08090bbb6b | 
| @@ -4,7 +4,7 @@ _winehelper_completions() { | |||||||
|     COMPREPLY=() |     COMPREPLY=() | ||||||
|     cur="${COMP_WORDS[COMP_CWORD]}" |     cur="${COMP_WORDS[COMP_CWORD]}" | ||||||
|     prev="${COMP_WORDS[COMP_CWORD-1]}" |     prev="${COMP_WORDS[COMP_CWORD-1]}" | ||||||
|     opts="--help --version --debug install installed install-dxvk install-vkd3d -r -i remove-all --clear-pfx killall remove-prefix backup-prefix restore-prefix create-prefix --changelog changelog" |     opts="--help --version --debug install installed install-dxvk install-vkd3d -r -i remove-all --clear-pfx killall remove-prefix backup-prefix restore-prefix create-prefix --changelog changelog change-wine" | ||||||
|     wine_cmd="winecfg winereg winefile wineconsole winetricks desktop regedit explorer cmd run" |     wine_cmd="winecfg winereg winefile wineconsole winetricks desktop regedit explorer cmd run" | ||||||
|  |  | ||||||
|     case "${prev}" in |     case "${prev}" in | ||||||
| @@ -34,6 +34,20 @@ _winehelper_completions() { | |||||||
|         restore-prefix) |         restore-prefix) | ||||||
|             return 0 |             return 0 | ||||||
|             ;; |             ;; | ||||||
|  |         install-dxvk|install-vkd3d) | ||||||
|  |             local versions=$(winehelper "${prev}" list 2>/dev/null | grep ' - ' | sed 's/ - //') | ||||||
|  |             COMPREPLY=( $(compgen -W "${versions} none list" -- "${cur}") ) | ||||||
|  |             return 0 | ||||||
|  |             ;; | ||||||
|  |         change-wine) | ||||||
|  |             local wine_versions=$(awk ' | ||||||
|  |                 /^#+\s*(WINE|WINE_LG|PROTON_LG|PROTON_STEAM)\s*#*$/ { in_group=1 } | ||||||
|  |                 /^#+/ { if (! ($0 ~ /^#+\s*(WINE|WINE_LG|PROTON_LG|PROTON_STEAM)\s*#*$/)) in_group=0 } | ||||||
|  |                 /^[a-f0-9]{64}/ && in_group { sub(/\.tar\.xz$/, "", $2); print $2 } | ||||||
|  |             ' /usr/share/winehelper/sha256sum.list 2>/dev/null) | ||||||
|  |             COMPREPLY=( $(compgen -W "system ${wine_versions}" -- "${cur}") ) | ||||||
|  |             return 0 | ||||||
|  |             ;; | ||||||
|         *) |         *) | ||||||
|             ;; |             ;; | ||||||
|     esac |     esac | ||||||
|   | |||||||
| @@ -20,6 +20,7 @@ _winehelper() { | |||||||
|     'remove-prefix[Удалить префикс и все связанные данные]' |     'remove-prefix[Удалить префикс и все связанные данные]' | ||||||
|     'backup-prefix[Создать резерную копию префикса]' |     'backup-prefix[Создать резерную копию префикса]' | ||||||
|     'restore-prefix[восстановить префикс из резервной копии "путь/до/whpack"]' |     'restore-prefix[восстановить префикс из резервной копии "путь/до/whpack"]' | ||||||
|  |     'change-wine[Изменить версию Wine/Proton для префикса]' | ||||||
|   ) |   ) | ||||||
|  |  | ||||||
|   wine_cmd=( |   wine_cmd=( | ||||||
| @@ -69,6 +70,9 @@ _winehelper() { | |||||||
|         install-vkd3d) |         install-vkd3d) | ||||||
|           _get_component_versions 'install-vkd3d' |           _get_component_versions 'install-vkd3d' | ||||||
|           ;; |           ;; | ||||||
|  |         change-wine) | ||||||
|  |           _get_wine_versions | ||||||
|  |           ;; | ||||||
|         *) |         *) | ||||||
|           _values 'winehelper options' "${opts[@]}" "${wine_cmd[@]}" |           _values 'winehelper options' "${opts[@]}" "${wine_cmd[@]}" | ||||||
|           ;; |           ;; | ||||||
| @@ -87,6 +91,22 @@ _get_component_versions () { | |||||||
|   _values 'versions' "${versions[@]}" |   _values 'versions' "${versions[@]}" | ||||||
| } | } | ||||||
|  |  | ||||||
|  | _get_wine_versions () { | ||||||
|  |   local -a versions | ||||||
|  |   local sha256_file="/usr/share/winehelper/sha256sum.list" | ||||||
|  |  | ||||||
|  |   if [[ -f "$sha256_file" ]]; then | ||||||
|  |     versions=( ${(f)"$(awk ' | ||||||
|  |         /^#+\s*(WINE|WINE_LG|PROTON_LG|PROTON_STEAM)\s*#*$/ { in_group=1 } | ||||||
|  |         /^#+/ { if (! ($0 ~ /^#+\s*(WINE|WINE_LG|PROTON_LG|PROTON_STEAM)\s*#*$/)) in_group=0 } | ||||||
|  |         /^[a-f0-9]{64}/ && in_group { sub(/\.tar\.xz$/, "", $2); print $2 } | ||||||
|  |     ' "$sha256_file" 2>/dev/null)"} ) | ||||||
|  |   fi | ||||||
|  |  | ||||||
|  |   versions+=(system) | ||||||
|  |   _values 'wine/proton versions' "${versions[@]}" | ||||||
|  | } | ||||||
|  |  | ||||||
| _get_prefixes () { | _get_prefixes () { | ||||||
|   prefixes=( ${(f)"$(ls -1 ~/.local/share/winehelper/prefixes 2>/dev/null)"} ) |   prefixes=( ${(f)"$(ls -1 ~/.local/share/winehelper/prefixes 2>/dev/null)"} ) | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										39
									
								
								autoinstall/arm-kt-att
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								autoinstall/arm-kt-att
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | # info_ru: Программа “АРМ КТ ПРОФ АТТЕСТАТ” для документов об основном общем, среднем общем образовании. | ||||||
|  | ######################################################################## | ||||||
|  | export PROG_URL="https://armregistr.ru/programmnoe-obespechenie/licenziya-na-programmnoe-obespechenie-dlya-zapolneniya-blank-4" | ||||||
|  | export WH_WINE_USE="wine_x_tkg_10-0_amd64" | ||||||
|  | export WINEPREFIX="arm-kt" | ||||||
|  | export PROG_NAME="АРМ КТ ПРОФ АТТЕСТАТ" | ||||||
|  | export PROG_ICON="armkt" | ||||||
|  | export BASE_PFX="none" | ||||||
|  | export WINEARCH="win64" | ||||||
|  | export INSTALL_DLL="" | ||||||
|  | export WH_WINDOWS_VER="7" | ||||||
|  |  | ||||||
|  | AUTOINSTALL_URL=$(curl -s "$PROG_URL" | grep "setup.zip" | awk -F'"' '{print $2}') | ||||||
|  | SHORT_NAME=$(echo $AUTOINSTALL_URL | awk -F'/' '{print $5}') | ||||||
|  | VER_EXE=$(echo $AUTOINSTALL_URL | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+') | ||||||
|  | AUTOINSTALL_ZIP="${WH_TMP_DIR}/$SHORT_NAME-$VER_EXE-setup.zip" | ||||||
|  | AUTOINSTALL_EXE="${WH_TMP_DIR}/$SHORT_NAME-$VER_EXE-setup.exe" | ||||||
|  |  | ||||||
|  | if [[ -z $VER_EXE ]] | ||||||
|  | then fatal "Не удалось получить версию ПО со страницы на сайте!" | ||||||
|  | else print_info "Устанавливаем $PROG_NAME версии $VER_EXE" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | prepair_wine | ||||||
|  |  | ||||||
|  | if try_download "$AUTOINSTALL_URL" "$AUTOINSTALL_ZIP" ; then | ||||||
|  |     unpack "$AUTOINSTALL_ZIP" "${WH_TMP_DIR}" | ||||||
|  |     try_remove_file "$AUTOINSTALL_ZIP" | ||||||
|  |  | ||||||
|  |     wine_run_install "${AUTOINSTALL_EXE}" /VERYSILENT | ||||||
|  |     try_remove_file "${AUTOINSTALL_EXE}" | ||||||
|  |  | ||||||
|  |     create_desktop "$PROG_NAME" \ | ||||||
|  |     "$DRIVE_C/Program Files/KtSoftware/$SHORT_NAME/$SHORT_NAME.exe" "$PROG_ICON" | ||||||
|  |  | ||||||
|  |     create_desktop "Регистрация $PROG_NAME" \ | ||||||
|  |     "$DRIVE_C/Program Files/KtSoftware/$SHORT_NAME/${SHORT_NAME}Reg.exe" "$PROG_ICON" | ||||||
|  | fi | ||||||
							
								
								
									
										39
									
								
								autoinstall/arm-kt-dpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								autoinstall/arm-kt-dpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | # info_ru: Программа “АРМ КТ ПРОФ ДПП” для заполнения бланков документов о повышении квалификации и профессиональной переподготовке. | ||||||
|  | ######################################################################## | ||||||
|  | export PROG_URL="https://armregistr.ru/programmnoe-obespechenie/licenziya-na-programmnoe-obespechenie-dlya-zapolneniya-blank" | ||||||
|  | export WH_WINE_USE="wine_x_tkg_10-0_amd64" | ||||||
|  | export WINEPREFIX="arm-kt" | ||||||
|  | export PROG_NAME="АРМ КТ ПРОФ ДПП" | ||||||
|  | export PROG_ICON="armkt" | ||||||
|  | export BASE_PFX="none" | ||||||
|  | export WINEARCH="win64" | ||||||
|  | export INSTALL_DLL="" | ||||||
|  | export WH_WINDOWS_VER="7" | ||||||
|  |  | ||||||
|  | AUTOINSTALL_URL=$(curl -s "$PROG_URL" | grep "setup.zip" | awk -F'"' '{print $2}') | ||||||
|  | SHORT_NAME=$(echo $AUTOINSTALL_URL | awk -F'/' '{print $5}') | ||||||
|  | VER_EXE=$(echo $AUTOINSTALL_URL | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+') | ||||||
|  | AUTOINSTALL_ZIP="${WH_TMP_DIR}/$SHORT_NAME-$VER_EXE-setup.zip" | ||||||
|  | AUTOINSTALL_EXE="${WH_TMP_DIR}/$SHORT_NAME-$VER_EXE-setup.exe" | ||||||
|  |  | ||||||
|  | if [[ -z $VER_EXE ]] | ||||||
|  | then fatal "Не удалось получить версию ПО со страницы на сайте!" | ||||||
|  | else print_info "Устанавливаем $PROG_NAME версии $VER_EXE" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | prepair_wine | ||||||
|  |  | ||||||
|  | if try_download "$AUTOINSTALL_URL" "$AUTOINSTALL_ZIP" ; then | ||||||
|  |     unpack "$AUTOINSTALL_ZIP" "${WH_TMP_DIR}" | ||||||
|  |     try_remove_file "$AUTOINSTALL_ZIP" | ||||||
|  |  | ||||||
|  |     wine_run_install "${AUTOINSTALL_EXE}" /VERYSILENT | ||||||
|  |     try_remove_file "${AUTOINSTALL_EXE}" | ||||||
|  |  | ||||||
|  |     create_desktop "$PROG_NAME" \ | ||||||
|  |     "$DRIVE_C/Program Files/KtSoftware/$SHORT_NAME/$SHORT_NAME.exe" "$PROG_ICON" | ||||||
|  |  | ||||||
|  |     create_desktop "Регистрация $PROG_NAME" \ | ||||||
|  |     "$DRIVE_C/Program Files/KtSoftware/$SHORT_NAME/${SHORT_NAME}Reg.exe" "$PROG_ICON" | ||||||
|  | fi | ||||||
							
								
								
									
										35
									
								
								autoinstall/arm-kt-es
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								autoinstall/arm-kt-es
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | # info_ru: Программа “АРМ КТ ПРОФ НШ” для заполнения бланков документов об окончании начальной школы. | ||||||
|  | ######################################################################## | ||||||
|  | export PROG_URL="https://armregistr.ru/programmnoe-obespechenie/licenziya-na-programmnoe-obespechenie-dlya-zapolneniya-blank-1" | ||||||
|  | export WH_WINE_USE="wine_x_tkg_10-0_amd64" | ||||||
|  | export WINEPREFIX="arm-kt" | ||||||
|  | export PROG_NAME="АРМ КТ ПРОФ НШ" | ||||||
|  | export PROG_ICON="armkt" | ||||||
|  | export BASE_PFX="none" | ||||||
|  | export WINEARCH="win64" | ||||||
|  | export INSTALL_DLL="" | ||||||
|  | export WH_WINDOWS_VER="7" | ||||||
|  |  | ||||||
|  | AUTOINSTALL_URL=$(curl -s "$PROG_URL" | grep "setup.exe" | awk -F'"' '{print $2}') | ||||||
|  | SHORT_NAME=$(echo $AUTOINSTALL_URL | awk -F'/' '{print $5}') | ||||||
|  | VER_EXE=$(echo $AUTOINSTALL_URL | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+') | ||||||
|  | AUTOINSTALL_EXE="${WH_TMP_DIR}/$SHORT_NAME-$VER_EXE-setup.exe" | ||||||
|  |  | ||||||
|  | if [[ -z $VER_EXE ]] | ||||||
|  | then fatal "Не удалось получить версию ПО со страницы на сайте!" | ||||||
|  | else print_info "Устанавливаем $PROG_NAME версии $VER_EXE" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | prepair_wine | ||||||
|  |  | ||||||
|  | if try_download "$AUTOINSTALL_URL" "$AUTOINSTALL_EXE" ; then | ||||||
|  |     wine_run_install "${AUTOINSTALL_EXE}" /VERYSILENT | ||||||
|  |     try_remove_file "${AUTOINSTALL_EXE}" | ||||||
|  |  | ||||||
|  |     create_desktop "$PROG_NAME" \ | ||||||
|  |     "$DRIVE_C/Program Files/KtSoftware/$SHORT_NAME/$SHORT_NAME.exe" "$PROG_ICON" | ||||||
|  |  | ||||||
|  |     create_desktop "Регистрация $PROG_NAME" \ | ||||||
|  |     "$DRIVE_C/Program Files/KtSoftware/$SHORT_NAME/${SHORT_NAME}Reg.exe" "$PROG_ICON" | ||||||
|  | fi | ||||||
							
								
								
									
										38
									
								
								autoinstall/arm-kt-med
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								autoinstall/arm-kt-med
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | # info_ru: Программа “АРМ КТ ПРОФ МЕД” для заполнения бланков документов о послевузовском профессиональном образовании и сертификатов специалиста.###################################################### | ||||||
|  | export PROG_URL="https://armregistr.ru/programmnoe-obespechenie/licenziya-na-programmnoe-obespechenie-dlya-zapolneniya-blank-3" | ||||||
|  | export WH_WINE_USE="wine_x_tkg_10-0_amd64" | ||||||
|  | export WINEPREFIX="arm-kt" | ||||||
|  | export PROG_NAME="АРМ КТ ПРОФ МЕД" | ||||||
|  | export PROG_ICON="armkt" | ||||||
|  | export BASE_PFX="none" | ||||||
|  | export WINEARCH="win64" | ||||||
|  | export INSTALL_DLL="" | ||||||
|  | export WH_WINDOWS_VER="7" | ||||||
|  |  | ||||||
|  | AUTOINSTALL_URL=$(curl -s "$PROG_URL" | grep "setup.zip" | awk -F'"' '{print $2}') | ||||||
|  | SHORT_NAME=$(echo $AUTOINSTALL_URL | awk -F'/' '{print $5}') | ||||||
|  | VER_EXE=$(echo $AUTOINSTALL_URL | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+') | ||||||
|  | AUTOINSTALL_ZIP="${WH_TMP_DIR}/$SHORT_NAME-$VER_EXE-setup.zip" | ||||||
|  | AUTOINSTALL_EXE="${WH_TMP_DIR}/$SHORT_NAME-$VER_EXE-setup.exe" | ||||||
|  |  | ||||||
|  | if [[ -z $VER_EXE ]] | ||||||
|  | then fatal "Не удалось получить версию ПО со страницы на сайте!" | ||||||
|  | else print_info "Устанавливаем $PROG_NAME версии $VER_EXE" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | prepair_wine | ||||||
|  |  | ||||||
|  | if try_download "$AUTOINSTALL_URL" "$AUTOINSTALL_ZIP" ; then | ||||||
|  |     unpack "$AUTOINSTALL_ZIP" "${WH_TMP_DIR}" | ||||||
|  |     try_remove_file "$AUTOINSTALL_ZIP" | ||||||
|  |  | ||||||
|  |     wine_run_install "${AUTOINSTALL_EXE}" /VERYSILENT | ||||||
|  |     try_remove_file "${AUTOINSTALL_EXE}" | ||||||
|  |  | ||||||
|  |     create_desktop "$PROG_NAME" \ | ||||||
|  |     "$DRIVE_C/Program Files/KtSoftware/$SHORT_NAME/$SHORT_NAME.exe" "$PROG_ICON" | ||||||
|  |  | ||||||
|  |     create_desktop "Регистрация $PROG_NAME" \ | ||||||
|  |     "$DRIVE_C/Program Files/KtSoftware/$SHORT_NAME/${SHORT_NAME}Reg.exe" "$PROG_ICON" | ||||||
|  | fi | ||||||
							
								
								
									
										39
									
								
								autoinstall/arm-kt-prof
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								autoinstall/arm-kt-prof
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | # info_ru: Программа “АРМ КТ ПРОФ ПРОФЕССИЯ” для заполнения бланков документов профессионального обучения. | ||||||
|  | ######################################################################## | ||||||
|  | export PROG_URL="https://armregistr.ru/programmnoe-obespechenie/licenziya-na-programmnoe-obespechenie-dlya-zapolneniya-blank-5" | ||||||
|  | export WH_WINE_USE="wine_x_tkg_10-0_amd64" | ||||||
|  | export WINEPREFIX="arm-kt" | ||||||
|  | export PROG_NAME="АРМ КТ ПРОФ ПРОФЕССИЯ" | ||||||
|  | export PROG_ICON="armkt" | ||||||
|  | export BASE_PFX="none" | ||||||
|  | export WINEARCH="win64" | ||||||
|  | export INSTALL_DLL="" | ||||||
|  | export WH_WINDOWS_VER="7" | ||||||
|  |  | ||||||
|  | AUTOINSTALL_URL=$(curl -s "$PROG_URL" | grep "setup.zip" | awk -F'"' '{print $2}') | ||||||
|  | SHORT_NAME=$(echo $AUTOINSTALL_URL | awk -F'/' '{print $5}') | ||||||
|  | VER_EXE=$(echo $AUTOINSTALL_URL | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+') | ||||||
|  | AUTOINSTALL_ZIP="${WH_TMP_DIR}/$SHORT_NAME-$VER_EXE-setup.zip" | ||||||
|  | AUTOINSTALL_EXE="${WH_TMP_DIR}/$SHORT_NAME-$VER_EXE-setup.exe" | ||||||
|  |  | ||||||
|  | if [[ -z $VER_EXE ]] | ||||||
|  | then fatal "Не удалось получить версию ПО со страницы на сайте!" | ||||||
|  | else print_info "Устанавливаем $PROG_NAME версии $VER_EXE" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | prepair_wine | ||||||
|  |  | ||||||
|  | if try_download "$AUTOINSTALL_URL" "$AUTOINSTALL_ZIP" ; then | ||||||
|  |     unpack "$AUTOINSTALL_ZIP" "${WH_TMP_DIR}" | ||||||
|  |     try_remove_file "$AUTOINSTALL_ZIP" | ||||||
|  |  | ||||||
|  |     wine_run_install "${AUTOINSTALL_EXE}" /VERYSILENT | ||||||
|  |     try_remove_file "${AUTOINSTALL_EXE}" | ||||||
|  |  | ||||||
|  |     create_desktop "$PROG_NAME" \ | ||||||
|  |     "$DRIVE_C/Program Files/KtSoftware/$SHORT_NAME/$SHORT_NAME.exe" "$PROG_ICON" | ||||||
|  |  | ||||||
|  |     create_desktop "Регистрация $PROG_NAME" \ | ||||||
|  |     "$DRIVE_C/Program Files/KtSoftware/$SHORT_NAME/${SHORT_NAME}Reg.exe" "$PROG_ICON" | ||||||
|  | fi | ||||||
							
								
								
									
										39
									
								
								autoinstall/arm-kt-spo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								autoinstall/arm-kt-spo
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | # info_ru: Программа “АРМ КТ ПРОФ СПО” для заполнения бланков документов о среднем профессиональном образовании. | ||||||
|  | ######################################################################## | ||||||
|  | export PROG_URL="https://armregistr.ru/programmnoe-obespechenie/licenziya-na-programmnoe-obespechenie-dlya-zapolneniya-blank-2" | ||||||
|  | export WH_WINE_USE="wine_x_tkg_10-0_amd64" | ||||||
|  | export WINEPREFIX="arm-kt" | ||||||
|  | export PROG_NAME="АРМ КТ ПРОФ СПО" | ||||||
|  | export PROG_ICON="armkt" | ||||||
|  | export BASE_PFX="none" | ||||||
|  | export WINEARCH="win64" | ||||||
|  | export INSTALL_DLL="" | ||||||
|  | export WH_WINDOWS_VER="7" | ||||||
|  |  | ||||||
|  | AUTOINSTALL_URL=$(curl -s "$PROG_URL" | grep "setup.zip" | awk -F'"' '{print $2}') | ||||||
|  | SHORT_NAME=$(echo $AUTOINSTALL_URL | awk -F'/' '{print $5}') | ||||||
|  | VER_EXE=$(echo $AUTOINSTALL_URL | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+') | ||||||
|  | AUTOINSTALL_ZIP="${WH_TMP_DIR}/$SHORT_NAME-$VER_EXE-setup.zip" | ||||||
|  | AUTOINSTALL_EXE="${WH_TMP_DIR}/$SHORT_NAME-$VER_EXE-setup.exe" | ||||||
|  |  | ||||||
|  | if [[ -z $VER_EXE ]] | ||||||
|  | then fatal "Не удалось получить версию ПО со страницы на сайте!" | ||||||
|  | else print_info "Устанавливаем $PROG_NAME версии $VER_EXE" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | prepair_wine | ||||||
|  |  | ||||||
|  | if try_download "$AUTOINSTALL_URL" "$AUTOINSTALL_ZIP" ; then | ||||||
|  |     unpack "$AUTOINSTALL_ZIP" "${WH_TMP_DIR}" | ||||||
|  |     try_remove_file "$AUTOINSTALL_ZIP" | ||||||
|  |  | ||||||
|  |     wine_run_install "${AUTOINSTALL_EXE}" /VERYSILENT | ||||||
|  |     try_remove_file "${AUTOINSTALL_EXE}" | ||||||
|  |  | ||||||
|  |     create_desktop "$PROG_NAME" \ | ||||||
|  |     "$DRIVE_C/Program Files/KtSoftware/$SHORT_NAME/$SHORT_NAME.exe" "$PROG_ICON" | ||||||
|  |  | ||||||
|  |     create_desktop "Регистрация $PROG_NAME" \ | ||||||
|  |     "$DRIVE_C/Program Files/KtSoftware/$SHORT_NAME/${SHORT_NAME}Reg.exe" "$PROG_ICON" | ||||||
|  | fi | ||||||
							
								
								
									
										39
									
								
								autoinstall/arm-kt-vuz
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								autoinstall/arm-kt-vuz
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | # info_ru: Программа “АРМ КТ ПРОФ ВУЗ” для заполнения бланков документов о высшем образовании. | ||||||
|  | ######################################################################## | ||||||
|  | export PROG_URL="https://armregistr.ru/programmnoe-obespechenie/licenziya-na-programmnoe-obespechenie-dlya-zapolneniya-blank-6" | ||||||
|  | export WH_WINE_USE="wine_x_tkg_10-0_amd64" | ||||||
|  | export WINEPREFIX="arm-kt" | ||||||
|  | export PROG_NAME="АРМ КТ ПРОФ ВУЗ" | ||||||
|  | export PROG_ICON="armkt" | ||||||
|  | export BASE_PFX="none" | ||||||
|  | export WINEARCH="win64" | ||||||
|  | export INSTALL_DLL="" | ||||||
|  | export WH_WINDOWS_VER="7" | ||||||
|  |  | ||||||
|  | AUTOINSTALL_URL=$(curl -s "$PROG_URL" | grep "setup.zip" | awk -F'"' '{print $2}') | ||||||
|  | SHORT_NAME=$(echo $AUTOINSTALL_URL | awk -F'/' '{print $5}') | ||||||
|  | VER_EXE=$(echo $AUTOINSTALL_URL | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+') | ||||||
|  | AUTOINSTALL_ZIP="${WH_TMP_DIR}/$SHORT_NAME-$VER_EXE-setup.zip" | ||||||
|  | AUTOINSTALL_EXE="${WH_TMP_DIR}/$SHORT_NAME-$VER_EXE-setup.exe" | ||||||
|  |  | ||||||
|  | if [[ -z $VER_EXE ]] | ||||||
|  | then fatal "Не удалось получить версию ПО со страницы на сайте!" | ||||||
|  | else print_info "Устанавливаем $PROG_NAME версии $VER_EXE" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | prepair_wine | ||||||
|  |  | ||||||
|  | if try_download "$AUTOINSTALL_URL" "$AUTOINSTALL_ZIP" ; then | ||||||
|  |     unpack "$AUTOINSTALL_ZIP" "${WH_TMP_DIR}" | ||||||
|  |     try_remove_file "$AUTOINSTALL_ZIP" | ||||||
|  |  | ||||||
|  |     wine_run_install "${AUTOINSTALL_EXE}" /VERYSILENT | ||||||
|  |     try_remove_file "${AUTOINSTALL_EXE}" | ||||||
|  |  | ||||||
|  |     create_desktop "$PROG_NAME" \ | ||||||
|  |     "$DRIVE_C/Program Files/KtSoftware/$SHORT_NAME/$SHORT_NAME.exe" "$PROG_ICON" | ||||||
|  |  | ||||||
|  |     create_desktop "Регистрация $PROG_NAME" \ | ||||||
|  |     "$DRIVE_C/Program Files/KtSoftware/$SHORT_NAME/${SHORT_NAME}Reg.exe" "$PROG_ICON" | ||||||
|  | fi | ||||||
							
								
								
									
										
											BIN
										
									
								
								image/armkt.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								image/armkt.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 23 KiB | 
							
								
								
									
										41
									
								
								winehelper
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								winehelper
									
									
									
									
									
								
							| @@ -7,18 +7,20 @@ if [[ $(id -u) -eq 0 ]] ; then | |||||||
| fi | fi | ||||||
|  |  | ||||||
| ##### DEFAULT PATH ##### | ##### DEFAULT PATH ##### | ||||||
| export SCRIPT_NAME USER_WORK_PATH RUN_SCRIPT DATA_PATH CHANGELOG_FILE WH_ICON_PATH LICENSE_FILE AGREEMENT | export SCRIPT_NAME USER_WORK_PATH RUN_SCRIPT DATA_PATH CHANGELOG_FILE WH_ICON_PATH LICENSE_FILE AGREEMENT THIRD_PARTY_FILE | ||||||
|  |  | ||||||
| SCRIPT_NAME="$(basename "$0")" | SCRIPT_NAME="$(basename "$0")" | ||||||
| if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then | if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then | ||||||
|     # переменные для установленного WineHelper в систему |     # переменные для установленного WineHelper в систему | ||||||
|  |     WH_VERSION="$(rpm -q winehelper | awk -F'-' '{print $2}')" | ||||||
|     USER_WORK_PATH="$HOME/.local/share/$SCRIPT_NAME" |     USER_WORK_PATH="$HOME/.local/share/$SCRIPT_NAME" | ||||||
|     RUN_SCRIPT="/usr/bin/$SCRIPT_NAME" |     RUN_SCRIPT="/usr/bin/$SCRIPT_NAME" | ||||||
|     DATA_PATH="/usr/share/$SCRIPT_NAME" |     DATA_PATH="/usr/share/$SCRIPT_NAME" | ||||||
|     CHANGELOG_FILE="$(realpath "/usr/share/doc/winehelper"-*/CHANGELOG)" |  | ||||||
|     WH_ICON_PATH="$DATA_PATH/image/gui/winehelper.svg" |     WH_ICON_PATH="$DATA_PATH/image/gui/winehelper.svg" | ||||||
|     LICENSE_FILE="$(realpath "/usr/share/doc/winehelper"-*/LICENSE)" |     CHANGELOG_FILE="/usr/share/doc/winehelper-$WH_VERSION/CHANGELOG" | ||||||
|     AGREEMENT="$(realpath "/usr/share/doc/winehelper"-*/LICENSE_AGREEMENT)" |     LICENSE_FILE="/usr/share/doc/winehelper-$WH_VERSION/LICENSE" | ||||||
|  |     AGREEMENT="/usr/share/doc/winehelper-$WH_VERSION/LICENSE_AGREEMENT" | ||||||
|  |     THIRD_PARTY_FILE="/usr/share/doc/winehelper-$WH_VERSION/THIRD-PARTY" | ||||||
| else | else | ||||||
|     # переменные для тестового запуска WineHelper из репозитория |     # переменные для тестового запуска WineHelper из репозитория | ||||||
|     USER_WORK_PATH="$HOME/test-$SCRIPT_NAME" |     USER_WORK_PATH="$HOME/test-$SCRIPT_NAME" | ||||||
| @@ -28,6 +30,7 @@ else | |||||||
|     WH_ICON_PATH="$DATA_PATH/image/gui/winehelper-devel.svg" |     WH_ICON_PATH="$DATA_PATH/image/gui/winehelper-devel.svg" | ||||||
|     LICENSE_FILE="$DATA_PATH/LICENSE" |     LICENSE_FILE="$DATA_PATH/LICENSE" | ||||||
|     AGREEMENT="$DATA_PATH/LICENSE_AGREEMENT" |     AGREEMENT="$DATA_PATH/LICENSE_AGREEMENT" | ||||||
|  |     THIRD_PARTY_FILE="$DATA_PATH/THIRD-PARTY" | ||||||
|  |  | ||||||
|     # минимальная проверка синтаксиса скриптов |     # минимальная проверка синтаксиса скриптов | ||||||
|     for self_check_script in "$RUN_SCRIPT" \ |     for self_check_script in "$RUN_SCRIPT" \ | ||||||
| @@ -1652,8 +1655,8 @@ select_wine_version() { | |||||||
|         read -p "Введите номер для выбора wine/proton (0-$max_choice): " user_choice |         read -p "Введите номер для выбора wine/proton (0-$max_choice): " user_choice | ||||||
|         if [[ "$user_choice" =~ ^[0-9]+$ ]] && (( user_choice >= 0 && user_choice <= max_choice )); then |         if [[ "$user_choice" =~ ^[0-9]+$ ]] && (( user_choice >= 0 && user_choice <= max_choice )); then | ||||||
|             if [[ "$user_choice" == "0" ]]; then |             if [[ "$user_choice" == "0" ]]; then | ||||||
|                 print_info "Создание префикса отменено." |                 print_info "Операция отменена." | ||||||
|                 exit 0 |                 return 1 | ||||||
|             fi |             fi | ||||||
|             local selected_opt |             local selected_opt | ||||||
|             selected_opt="${selectable_options[$user_choice]}" |             selected_opt="${selectable_options[$user_choice]}" | ||||||
| @@ -1667,6 +1670,7 @@ select_wine_version() { | |||||||
|             print_error "Неверный выбор. Введите число от 0 до $max_choice." |             print_error "Неверный выбор. Введите число от 0 до $max_choice." | ||||||
|         fi |         fi | ||||||
|     done |     done | ||||||
|  |     return 0 | ||||||
| } | } | ||||||
|  |  | ||||||
| create_prefix() { | create_prefix() { | ||||||
| @@ -1716,7 +1720,7 @@ create_prefix() { | |||||||
|         *) fatal "Неверный выбор. Операция отменена." ;; |         *) fatal "Неверный выбор. Операция отменена." ;; | ||||||
|     esac |     esac | ||||||
|  |  | ||||||
|     select_wine_version |     select_wine_version || exit 0 | ||||||
|  |  | ||||||
|     print_info "Выберите тип создаваемого префикса:" |     print_info "Выберите тип создаваемого префикса:" | ||||||
|     echo " 0) Отмена создания префикса" |     echo " 0) Отмена создания префикса" | ||||||
| @@ -2171,6 +2175,27 @@ run_install_vkd3d() { | |||||||
|     wait_wineserver |     wait_wineserver | ||||||
| } | } | ||||||
|  |  | ||||||
|  | run_change_wine_version() { | ||||||
|  |     local new_version="$1" | ||||||
|  |  | ||||||
|  |     check_prefix_var | ||||||
|  |     init_database | ||||||
|  |  | ||||||
|  |     if [[ -z "$new_version" ]]; then | ||||||
|  |         select_wine_version || exit 0 | ||||||
|  |         new_version="$WH_WINE_USE" | ||||||
|  |     else | ||||||
|  |         export WH_WINE_USE="$new_version" | ||||||
|  |     fi | ||||||
|  |  | ||||||
|  |     init_wine_ver | ||||||
|  |  | ||||||
|  |     init_wineprefix | ||||||
|  |  | ||||||
|  |     wait_wineserver | ||||||
|  |     print_ok "Версия Wine для префикса $PREFIX_NAME успешно изменена на $WH_WINE_USE." | ||||||
|  | } | ||||||
|  |  | ||||||
| wh_info () { | wh_info () { | ||||||
|     echo "Использование: $SCRIPT_NAME [команда] |     echo "Использование: $SCRIPT_NAME [команда] | ||||||
|  |  | ||||||
| @@ -2181,6 +2206,7 @@ wh_info () { | |||||||
|  |  | ||||||
|     install-dxvk [версия|none|list] установить, удалить или показать версии DXVK |     install-dxvk [версия|none|list] установить, удалить или показать версии DXVK | ||||||
|     install-vkd3d [версия|none|list] установить, удалить или показать версии VKD3D |     install-vkd3d [версия|none|list] установить, удалить или показать версии VKD3D | ||||||
|  |     change-wine [версия]            изменить версию Wine/Proton для текущего префикса | ||||||
|  |  | ||||||
|     installed                       список установленных программ |     installed                       список установленных программ | ||||||
|     run [программа]                 запуск программы (отладка) |     run [программа]                 запуск программы (отладка) | ||||||
| @@ -2231,6 +2257,7 @@ case "$arg1" in | |||||||
|     install|-i) run_autoinstall "$@" ;; |     install|-i) run_autoinstall "$@" ;; | ||||||
|     install-dxvk) run_install_dxvk "$@" ;; |     install-dxvk) run_install_dxvk "$@" ;; | ||||||
|     install-vkd3d) run_install_vkd3d "$@" ;; |     install-vkd3d) run_install_vkd3d "$@" ;; | ||||||
|  |     change-wine) run_change_wine_version "$@" ;; | ||||||
|     installed) check_installed_programs "$1" ;; |     installed) check_installed_programs "$1" ;; | ||||||
|     run|-r) run_installed_programs "$1" ;; |     run|-r) run_installed_programs "$1" ;; | ||||||
|     backup-prefix) backup_prefix "$@" ;; |     backup-prefix) backup_prefix "$@" ;; | ||||||
|   | |||||||
| @@ -28,6 +28,7 @@ class Var: | |||||||
|     WH_ICON_PATH = os.environ.get("WH_ICON_PATH") |     WH_ICON_PATH = os.environ.get("WH_ICON_PATH") | ||||||
|     LICENSE_FILE = os.environ.get("LICENSE_FILE") |     LICENSE_FILE = os.environ.get("LICENSE_FILE") | ||||||
|     LICENSE_AGREEMENT_FILE = os.environ.get("AGREEMENT") |     LICENSE_AGREEMENT_FILE = os.environ.get("AGREEMENT") | ||||||
|  |     THIRD_PARTY_FILE = os.environ.get("THIRD_PARTY_FILE") | ||||||
|  |  | ||||||
| class DependencyManager: | class DependencyManager: | ||||||
|     """Класс для управления проверкой и установкой системных зависимостей.""" |     """Класс для управления проверкой и установкой системных зависимостей.""" | ||||||
| @@ -42,14 +43,10 @@ class DependencyManager: | |||||||
|  |  | ||||||
|     def _get_dependencies_path(self): |     def _get_dependencies_path(self): | ||||||
|         """Определяет и возвращает путь к скрипту dependencies.sh.""" |         """Определяет и возвращает путь к скрипту dependencies.sh.""" | ||||||
|         if Var.DATA_PATH: |         if not Var.DATA_PATH: | ||||||
|             base_path = Var.DATA_PATH |  | ||||||
|         elif Var.RUN_SCRIPT and os.path.exists(Var.RUN_SCRIPT): |  | ||||||
|             base_path = os.path.dirname(Var.RUN_SCRIPT) |  | ||||||
|         else: |  | ||||||
|             return None |             return None | ||||||
|  |  | ||||||
|         return os.path.join(base_path, 'dependencies.sh') |         return os.path.join(Var.DATA_PATH, 'dependencies.sh') | ||||||
|  |  | ||||||
|     def _calculate_file_hash(self): |     def _calculate_file_hash(self): | ||||||
|         """Вычисляет хэш SHA256 файла зависимостей.""" |         """Вычисляет хэш SHA256 файла зависимостей.""" | ||||||
| @@ -1574,6 +1571,12 @@ class WineHelperGUI(QMainWindow): | |||||||
|  |  | ||||||
|         # Загружаем состояние после создания всех виджетов |         # Загружаем состояние после создания всех виджетов | ||||||
|         self._load_created_prefixes() |         self._load_created_prefixes() | ||||||
|  |         # После загрузки выбираем первый элемент, если он доступен | ||||||
|  |         if self.created_prefix_selector.count() > 0: | ||||||
|  |             self.created_prefix_selector.setCurrentIndex(0) | ||||||
|  |         else: | ||||||
|  |             # Если список пуст, сбрасываем панель управления | ||||||
|  |             self.on_created_prefix_selected(-1) | ||||||
|  |  | ||||||
|         # Инициализируем состояние, которое будет использоваться для логов |         # Инициализируем состояние, которое будет использоваться для логов | ||||||
|         self._reset_log_state() |         self._reset_log_state() | ||||||
| @@ -2109,39 +2112,51 @@ class WineHelperGUI(QMainWindow): | |||||||
|         self.prefix_winefile_button.setToolTip("Запуск файлового менеджера Wine (winefile) для просмотра файлов внутри префикса.") |         self.prefix_winefile_button.setToolTip("Запуск файлового менеджера Wine (winefile) для просмотра файлов внутри префикса.") | ||||||
|         management_layout.addWidget(self.prefix_winefile_button, 2, 1) |         management_layout.addWidget(self.prefix_winefile_button, 2, 1) | ||||||
|  |  | ||||||
|         # Добавляем небольшой отступ |         self.change_wine_version_button = QPushButton("Управление Wine/Proton") | ||||||
|         spacer_widget = QWidget() |         self.change_wine_version_button.setMinimumHeight(32) | ||||||
|         spacer_widget.setFixedHeight(5) |         self.change_wine_version_button.clicked.connect(self.open_wine_version_manager) | ||||||
|         management_layout.addWidget(spacer_widget, 3, 0, 1, 2) |         self.change_wine_version_button.setToolTip("Изменение версии Wine или Proton для выбранного префикса.") | ||||||
|  |         management_layout.addWidget(self.change_wine_version_button, 3, 0, 1, 2) | ||||||
|  |  | ||||||
|  |         self.esync_button = QPushButton("ESync") | ||||||
|  |         self.esync_button.setCheckable(True) | ||||||
|  |         self.esync_button.setToolTip("Включить/выключить Eventfd-based synchronization.") | ||||||
|  |         self.esync_button.clicked.connect(lambda: self.update_sync_option("WINEESYNC", self.esync_button.isChecked())) | ||||||
|  |         management_layout.addWidget(self.esync_button, 4, 0) | ||||||
|  |  | ||||||
|  |         self.fsync_button = QPushButton("FSync") | ||||||
|  |         self.fsync_button.setCheckable(True) | ||||||
|  |         self.fsync_button.setToolTip("Включить/выключить Futex-based synchronization.") | ||||||
|  |         self.fsync_button.clicked.connect(lambda: self.update_sync_option("WINEFSYNC", self.fsync_button.isChecked())) | ||||||
|  |         management_layout.addWidget(self.fsync_button, 4, 1) | ||||||
|  |  | ||||||
|         self.dxvk_manage_button = QPushButton("Управление DXVK") |         self.dxvk_manage_button = QPushButton("Управление DXVK") | ||||||
|         self.dxvk_manage_button.setMinimumHeight(32) |         self.dxvk_manage_button.setMinimumHeight(32) | ||||||
|         self.dxvk_manage_button.clicked.connect(lambda: self.open_component_version_manager('dxvk')) |         self.dxvk_manage_button.clicked.connect(lambda: self.open_component_version_manager('dxvk')) | ||||||
|         self.dxvk_manage_button.setToolTip("Установка или удаление определенной версии DXVK в префиксе.") |         self.dxvk_manage_button.setToolTip("Установка или удаление определенной версии DXVK в префиксе.") | ||||||
|         management_layout.addWidget(self.dxvk_manage_button, 4, 0) |         management_layout.addWidget(self.dxvk_manage_button, 5, 0) | ||||||
|  |  | ||||||
|         self.vkd3d_manage_button = QPushButton("Управление VKD3D") |         self.vkd3d_manage_button = QPushButton("Управление VKD3D") | ||||||
|         self.vkd3d_manage_button.setMinimumHeight(32) |         self.vkd3d_manage_button.setMinimumHeight(32) | ||||||
|         self.vkd3d_manage_button.clicked.connect(lambda: self.open_component_version_manager('vkd3d-proton')) |         self.vkd3d_manage_button.clicked.connect(lambda: self.open_component_version_manager('vkd3d-proton')) | ||||||
|         self.vkd3d_manage_button.setToolTip("Установка или удаление определенной версии vkd3d-proton в префиксе.") |         self.vkd3d_manage_button.setToolTip("Установка или удаление определенной версии vkd3d-proton в префиксе.") | ||||||
|         management_layout.addWidget(self.vkd3d_manage_button, 4, 1) |         management_layout.addWidget(self.vkd3d_manage_button, 5, 1) | ||||||
|  |  | ||||||
|         # --- Правая сторона: Информационный блок --- |         # --- Правая сторона: Информационный блок --- | ||||||
|         self.prefix_info_display = QTextBrowser() |         self.prefix_info_display = QTextBrowser() | ||||||
|         self.prefix_info_display.setReadOnly(True) |         self.prefix_info_display.setReadOnly(True) | ||||||
|         self.prefix_info_display.setFrameStyle(QFrame.StyledPanel) |         self.prefix_info_display.setFrameStyle(QFrame.StyledPanel) | ||||||
|         # Увеличиваем rowspan, чтобы учесть добавленный отступ |         # Увеличиваем rowspan, чтобы охватить все строки с кнопками | ||||||
|         management_layout.addWidget(self.prefix_info_display, 0, 2, 5, 1) |         management_layout.addWidget(self.prefix_info_display, 0, 2, 6, 1) | ||||||
|  |  | ||||||
|         management_layout.setColumnStretch(0, 1) |         management_layout.setColumnStretch(0, 1) | ||||||
|         management_layout.setColumnStretch(1, 1) |         management_layout.setColumnStretch(1, 1) | ||||||
|         management_layout.setColumnStretch(2, 2) |         management_layout.setColumnStretch(2, 2) | ||||||
|  |  | ||||||
|         # --- Separator and Installer --- |  | ||||||
|         separator = QFrame() |         separator = QFrame() | ||||||
|         separator.setFrameShape(QFrame.HLine) |         separator.setFrameShape(QFrame.HLine) | ||||||
|         separator.setFrameShadow(QFrame.Sunken) |         separator.setFrameShadow(QFrame.Sunken) | ||||||
|         management_layout.addWidget(separator, 5, 0, 1, 3) |         management_layout.addWidget(separator, 6, 0, 1, 3) | ||||||
|  |  | ||||||
|         install_group = QWidget() |         install_group = QWidget() | ||||||
|         install_layout = QVBoxLayout(install_group) |         install_layout = QVBoxLayout(install_group) | ||||||
| @@ -2173,8 +2188,7 @@ class WineHelperGUI(QMainWindow): | |||||||
|         self.create_launcher_button.setEnabled(False)  # Изначально неактивна |         self.create_launcher_button.setEnabled(False)  # Изначально неактивна | ||||||
|         action_buttons_layout.addWidget(self.create_launcher_button) |         action_buttons_layout.addWidget(self.create_launcher_button) | ||||||
|         install_layout.addLayout(action_buttons_layout) |         install_layout.addLayout(action_buttons_layout) | ||||||
|  |         management_layout.addWidget(install_group, 7, 0, 1, 3) | ||||||
|         management_layout.addWidget(install_group, 6, 0, 1, 3) |  | ||||||
|  |  | ||||||
|         container_layout.addWidget(self.prefix_management_groupbox) |         container_layout.addWidget(self.prefix_management_groupbox) | ||||||
|         layout.addWidget(self.management_container_groupbox) |         layout.addWidget(self.management_container_groupbox) | ||||||
| @@ -2204,7 +2218,7 @@ class WineHelperGUI(QMainWindow): | |||||||
|             self.created_prefix_selector.removeItem(index_to_remove) |             self.created_prefix_selector.removeItem(index_to_remove) | ||||||
|  |  | ||||||
|     def _load_created_prefixes(self): |     def _load_created_prefixes(self): | ||||||
|         """Загружает список созданных префиксов, сканируя файловую систему, и восстанавливает последнее выбранное состояние.""" |         """Загружает и обновляет список созданных префиксов в выпадающем списке.""" | ||||||
|         prefixes_root_path = os.path.join(Var.USER_WORK_PATH, "prefixes") |         prefixes_root_path = os.path.join(Var.USER_WORK_PATH, "prefixes") | ||||||
|         if not os.path.isdir(prefixes_root_path): |         if not os.path.isdir(prefixes_root_path): | ||||||
|             self.management_container_groupbox.setVisible(False) |             self.management_container_groupbox.setVisible(False) | ||||||
| @@ -2232,13 +2246,6 @@ class WineHelperGUI(QMainWindow): | |||||||
|  |  | ||||||
|         self.management_container_groupbox.setVisible(True) |         self.management_container_groupbox.setVisible(True) | ||||||
|  |  | ||||||
|         # По умолчанию выбираем первый элемент в списке, если он есть. |  | ||||||
|         if self.created_prefix_selector.count() > 0: |  | ||||||
|             self.created_prefix_selector.setCurrentIndex(0) |  | ||||||
|         else: |  | ||||||
|             # Если список пуст, убедимся, что панель управления сброшена. |  | ||||||
|             self.on_created_prefix_selected(-1) |  | ||||||
|  |  | ||||||
|     def on_created_prefix_selected(self, index): |     def on_created_prefix_selected(self, index): | ||||||
|         """Обрабатывает выбор префикса из выпадающего списка.""" |         """Обрабатывает выбор префикса из выпадающего списка.""" | ||||||
|         if index == -1: |         if index == -1: | ||||||
| @@ -2330,6 +2337,9 @@ class WineHelperGUI(QMainWindow): | |||||||
|         else: |         else: | ||||||
|             self.prefix_info_display.clear() |             self.prefix_info_display.clear() | ||||||
|             self.prefix_install_path_edit.clear() |             self.prefix_install_path_edit.clear() | ||||||
|  |             # Сбрасываем состояние кнопок, когда префикс не выбран | ||||||
|  |             self.esync_button.setChecked(False) | ||||||
|  |             self.fsync_button.setChecked(False) | ||||||
|  |  | ||||||
|         self.update_prefix_install_button_state() |         self.update_prefix_install_button_state() | ||||||
|  |  | ||||||
| @@ -2337,12 +2347,16 @@ class WineHelperGUI(QMainWindow): | |||||||
|         """Обновляет информационный блок для созданного префикса, читая данные из last.conf.""" |         """Обновляет информационный блок для созданного префикса, читая данные из last.conf.""" | ||||||
|         if not prefix_name: |         if not prefix_name: | ||||||
|             self.prefix_info_display.clear() |             self.prefix_info_display.clear() | ||||||
|  |             self.esync_button.setChecked(False) | ||||||
|  |             self.fsync_button.setChecked(False) | ||||||
|             return |             return | ||||||
|  |  | ||||||
|         last_conf_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name, "last.conf") |         last_conf_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name, "last.conf") | ||||||
|  |  | ||||||
|         if not os.path.exists(last_conf_path): |         if not os.path.exists(last_conf_path): | ||||||
|             self.prefix_info_display.setHtml(f"<p>Файл конфигурации last.conf не найден для префикса '{prefix_name}'.</p>") |             self.prefix_info_display.setHtml(f"<p>Файл конфигурации last.conf не найден для префикса '{prefix_name}'.</p>") | ||||||
|  |             self.esync_button.setChecked(False) | ||||||
|  |             self.fsync_button.setChecked(False) | ||||||
|             return |             return | ||||||
|  |  | ||||||
|         # Словарь для хранения всех переменных из файла |         # Словарь для хранения всех переменных из файла | ||||||
| @@ -2361,6 +2375,17 @@ class WineHelperGUI(QMainWindow): | |||||||
|             self.prefix_info_display.setHtml(f"<p>Ошибка чтения last.conf: {e}</p>") |             self.prefix_info_display.setHtml(f"<p>Ошибка чтения last.conf: {e}</p>") | ||||||
|             return |             return | ||||||
|  |  | ||||||
|  |         # --- Обновить кнопки ESync/FSync --- | ||||||
|  |         # Блокировать сигналы, чтобы предотвратить запуск метода обновления, когда мы устанавливаем состояние | ||||||
|  |         self.esync_button.blockSignals(True) | ||||||
|  |         self.fsync_button.blockSignals(True) | ||||||
|  |  | ||||||
|  |         self.esync_button.setChecked(all_vars.get("WINEESYNC") == "1") | ||||||
|  |         self.fsync_button.setChecked(all_vars.get("WINEFSYNC") == "1") | ||||||
|  |  | ||||||
|  |         self.esync_button.blockSignals(False) | ||||||
|  |         self.fsync_button.blockSignals(False) | ||||||
|  |  | ||||||
|         # Карта для красивого отображения известных переменных |         # Карта для красивого отображения известных переменных | ||||||
|         display_map = { |         display_map = { | ||||||
|             "WINEPREFIX": ("Путь", lambda v: v), |             "WINEPREFIX": ("Путь", lambda v: v), | ||||||
| @@ -2369,8 +2394,10 @@ class WineHelperGUI(QMainWindow): | |||||||
|             "BASE_PFX": ("Тип", lambda v: 'Чистый' if v == "none" else 'С рекомендуемыми библиотеками'), |             "BASE_PFX": ("Тип", lambda v: 'Чистый' if v == "none" else 'С рекомендуемыми библиотеками'), | ||||||
|             "DXVK_VER": ("Версия DXVK", lambda v: v if v else "Не установлено"), |             "DXVK_VER": ("Версия DXVK", lambda v: v if v else "Не установлено"), | ||||||
|             "VKD3D_VER": ("Версия VKD3D", lambda v: v if v else "Не установлено"), |             "VKD3D_VER": ("Версия VKD3D", lambda v: v if v else "Не установлено"), | ||||||
|  |             "WINEESYNC": ("ESync", lambda v: "Включен" if v == "1" else "Выключен"), | ||||||
|  |             "WINEFSYNC": ("FSync", lambda v: "Включен" if v == "1" else "Выключен"), | ||||||
|         } |         } | ||||||
|         display_order = ["WINEPREFIX", "WINEARCH", "WH_WINE_USE", "BASE_PFX", "DXVK_VER", "VKD3D_VER"] |         display_order = ["WINEPREFIX", "WINEARCH", "WH_WINE_USE", "BASE_PFX", "DXVK_VER", "VKD3D_VER", "WINEESYNC", "WINEFSYNC"] | ||||||
|  |  | ||||||
|         html_content = f'<p style="line-height: 1.3; font-size: 9pt;">' |         html_content = f'<p style="line-height: 1.3; font-size: 9pt;">' | ||||||
|         html_content += f"<b>Имя:</b> {html.escape(prefix_name)}<br>" |         html_content += f"<b>Имя:</b> {html.escape(prefix_name)}<br>" | ||||||
| @@ -2532,6 +2559,81 @@ class WineHelperGUI(QMainWindow): | |||||||
|                 # Если лицензия принята, запускаем установку. |                 # Если лицензия принята, запускаем установку. | ||||||
|                 self.run_component_install_command(prefix_name, command, version) |                 self.run_component_install_command(prefix_name, command, version) | ||||||
|  |  | ||||||
|  |     def open_wine_version_manager(self): | ||||||
|  |         """Открывает диалог для смены версии Wine/Proton для префикса.""" | ||||||
|  |         prefix_name = self.current_managed_prefix_name | ||||||
|  |         if not prefix_name: | ||||||
|  |             QMessageBox.warning(self, "Ошибка", "Сначала выберите префикс.") | ||||||
|  |             return | ||||||
|  |  | ||||||
|  |         # Определяем архитектуру префикса | ||||||
|  |         prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name) | ||||||
|  |         last_conf_path = os.path.join(prefix_path, "last.conf") | ||||||
|  |         architecture = "win64"  # По умолчанию | ||||||
|  |         if os.path.exists(last_conf_path): | ||||||
|  |             try: | ||||||
|  |                 with open(last_conf_path, 'r', encoding='utf-8') as f: | ||||||
|  |                     for line in f: | ||||||
|  |                         if 'WINEARCH=' in line: | ||||||
|  |                             arch_val = line.split('=', 1)[1].strip().strip('"\'') | ||||||
|  |                             if arch_val: | ||||||
|  |                                 architecture = arch_val | ||||||
|  |                                 break | ||||||
|  |             except Exception as e: | ||||||
|  |                 print(f"Предупреждение: не удалось прочитать архитектуру из {last_conf_path}: {e}") | ||||||
|  |  | ||||||
|  |         dialog = WineVersionSelectionDialog(architecture, self) | ||||||
|  |         if dialog.exec_() == QDialog.Accepted and dialog.selected_version: | ||||||
|  |             new_version = dialog.selected_version | ||||||
|  |             new_version_display = dialog.selected_display_text | ||||||
|  |  | ||||||
|  |             if not self._show_license_agreement_dialog(): | ||||||
|  |                 return  # Пользователь отклонил лицензию | ||||||
|  |  | ||||||
|  |             self.run_change_wine_version_command(prefix_name, new_version, new_version_display) | ||||||
|  |  | ||||||
|  |     def run_change_wine_version_command(self, prefix_name, new_version, new_version_display): | ||||||
|  |         """Выполняет команду смены версии Wine/Proton через winehelper.""" | ||||||
|  |         self.command_dialog = QDialog(self) | ||||||
|  |         self.command_dialog.setWindowTitle(f"Смена версии Wine на: {new_version_display}") | ||||||
|  |         self.command_dialog.setMinimumSize(750, 400) | ||||||
|  |         self.command_dialog.setModal(True) | ||||||
|  |         self.command_dialog.setWindowFlags(self.command_dialog.windowFlags() & ~Qt.WindowCloseButtonHint) | ||||||
|  |  | ||||||
|  |         layout = QVBoxLayout() | ||||||
|  |         self.command_log_output = QTextEdit() | ||||||
|  |         self.command_log_output.setReadOnly(True) | ||||||
|  |         self.command_log_output.setFont(QFont('DejaVu Sans Mono', 10)) | ||||||
|  |         layout.addWidget(self.command_log_output) | ||||||
|  |  | ||||||
|  |         self.command_close_button = QPushButton("Закрыть") | ||||||
|  |         self.command_close_button.setEnabled(False) | ||||||
|  |         self.command_close_button.clicked.connect(self.command_dialog.close) | ||||||
|  |         layout.addWidget(self.command_close_button) | ||||||
|  |         self.command_dialog.setLayout(layout) | ||||||
|  |  | ||||||
|  |         # Сбрасываем состояние для обработки лога с прогрессом | ||||||
|  |         self.command_output_buffer = "" | ||||||
|  |         self.command_last_line_was_progress = False | ||||||
|  |  | ||||||
|  |         self.command_process = QProcess(self.command_dialog) | ||||||
|  |         self.command_process.setProcessChannelMode(QProcess.MergedChannels) | ||||||
|  |         self.command_process.readyReadStandardOutput.connect(self._handle_prefix_creation_output) | ||||||
|  |         self.command_process.finished.connect( | ||||||
|  |             lambda exit_code, exit_status: self._handle_change_wine_version_finished( | ||||||
|  |                 prefix_name, exit_code, exit_status | ||||||
|  |             ) | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |         env = QProcessEnvironment.systemEnvironment() | ||||||
|  |         env.insert("WINEPREFIX", os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name)) | ||||||
|  |         self.command_process.setProcessEnvironment(env) | ||||||
|  |  | ||||||
|  |         args = ["change-wine", new_version] | ||||||
|  |         self.command_log_output.append(f"Выполнение: {shlex.quote(self.winehelper_path)} {' '.join(shlex.quote(a) for a in args)}") | ||||||
|  |         self.command_process.start(self.winehelper_path, args) | ||||||
|  |         self.command_dialog.exec_() | ||||||
|  |  | ||||||
|     def run_component_install_command(self, prefix_name, command, version): |     def run_component_install_command(self, prefix_name, command, version): | ||||||
|         """Выполняет команду установки компонента (DXVK/VKD3D) через winehelper.""" |         """Выполняет команду установки компонента (DXVK/VKD3D) через winehelper.""" | ||||||
|         prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name) |         prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name) | ||||||
| @@ -2572,11 +2674,31 @@ class WineHelperGUI(QMainWindow): | |||||||
|         self.command_process.start(self.winehelper_path, args) |         self.command_process.start(self.winehelper_path, args) | ||||||
|         self.command_dialog.exec_() |         self.command_dialog.exec_() | ||||||
|  |  | ||||||
|  |     def _handle_change_wine_version_finished(self, prefix_name, exit_code, exit_status): | ||||||
|  |         """Обрабатывает завершение смены версии Wine и обновляет информацию о префиксе.""" | ||||||
|  |         # Обрабатываем остаток в буфере, если он есть | ||||||
|  |         if self.command_output_buffer: | ||||||
|  |             self._process_command_log_line(self.command_output_buffer) | ||||||
|  |             self.command_output_buffer = "" | ||||||
|  |  | ||||||
|  |         # Если последней строкой был прогресс, "завершаем" его переносом строки. | ||||||
|  |         if self.command_last_line_was_progress: | ||||||
|  |             cursor = self.command_log_output.textCursor() | ||||||
|  |             cursor.movePosition(QTextCursor.End) | ||||||
|  |             cursor.insertText("\n") | ||||||
|  |             self.command_last_line_was_progress = False | ||||||
|  |  | ||||||
|  |         # Вызываем общий обработчик для обновления лога и кнопки закрытия | ||||||
|  |         self._handle_command_finished(exit_code, exit_status) | ||||||
|  |  | ||||||
|  |         # В случае успеха обновляем панель информации о префиксе | ||||||
|  |         if exit_code == 0: | ||||||
|  |             self.update_prefix_info_display(prefix_name) | ||||||
|  |  | ||||||
|     def _handle_component_install_finished(self, prefix_name, exit_code, exit_status): |     def _handle_component_install_finished(self, prefix_name, exit_code, exit_status): | ||||||
|         """Обрабатывает завершение установки компонента и обновляет информацию о префиксе.""" |         """Обрабатывает завершение установки компонента и обновляет информацию о префиксе.""" | ||||||
|         # Вызываем общий обработчик для обновления лога и кнопки закрытия |         # Вызываем общий обработчик для обновления лога и кнопки закрытия | ||||||
|         self._handle_command_finished(exit_code, exit_status) |         self._handle_command_finished(exit_code, exit_status) | ||||||
|  |  | ||||||
|         # В случае успеха обновляем панель информации о префиксе |         # В случае успеха обновляем панель информации о префиксе | ||||||
|         if exit_code == 0: |         if exit_code == 0: | ||||||
|             self.update_prefix_info_display(prefix_name) |             self.update_prefix_info_display(prefix_name) | ||||||
| @@ -2723,8 +2845,8 @@ class WineHelperGUI(QMainWindow): | |||||||
|  |  | ||||||
|             # Читаем и парсим файл THIRD-PARTY |             # Читаем и парсим файл THIRD-PARTY | ||||||
|             third_party_html = "" |             third_party_html = "" | ||||||
|             third_party_file_path = os.path.join(Var.DATA_PATH, "THIRD-PARTY") |             third_party_file_path = Var.THIRD_PARTY_FILE | ||||||
|             if os.path.exists(third_party_file_path): |             if third_party_file_path and os.path.exists(third_party_file_path): | ||||||
|                 with open(third_party_file_path, 'r', encoding='utf-8') as f_tp: |                 with open(third_party_file_path, 'r', encoding='utf-8') as f_tp: | ||||||
|                     third_party_content = f_tp.read() |                     third_party_content = f_tp.read() | ||||||
|  |  | ||||||
| @@ -3196,20 +3318,20 @@ class WineHelperGUI(QMainWindow): | |||||||
|             QMessageBox.critical(self, "Ошибка", f"Каталог префикса не найден:\n{prefix_path}") |             QMessageBox.critical(self, "Ошибка", f"Каталог префикса не найден:\n{prefix_path}") | ||||||
|             return |             return | ||||||
|  |  | ||||||
|         winehelper_dir = os.path.dirname(self.winehelper_path) |         winetricks_search_dir = Var.DATA_PATH | ||||||
|         winetricks_path = None |         winetricks_path = None | ||||||
|         try: |         try: | ||||||
|             # Ищем файл, который начинается с 'winetricks_' |             # Ищем файл, который начинается с 'winetricks_' | ||||||
|             for filename in os.listdir(winehelper_dir): |             for filename in os.listdir(winetricks_search_dir): | ||||||
|                 if filename.startswith("winetricks_"): |                 if filename.startswith("winetricks_"): | ||||||
|                     winetricks_path = os.path.join(winehelper_dir, filename) |                     winetricks_path = os.path.join(winetricks_search_dir, filename) | ||||||
|                     break  # Нашли, выходим из цикла |                     break  # Нашли, выходим из цикла | ||||||
|         except OSError as e: |         except OSError as e: | ||||||
|             QMessageBox.critical(self, "Ошибка", f"Не удалось прочитать директорию {winehelper_dir}: {e}") |             QMessageBox.critical(self, "Ошибка", f"Не удалось прочитать директорию {winetricks_search_dir}: {e}") | ||||||
|             return |             return | ||||||
|  |  | ||||||
|         if not winetricks_path: |         if not winetricks_path: | ||||||
|             QMessageBox.critical(self, "Ошибка", f"Скрипт winetricks не найден в директории:\n{winehelper_dir}") |             QMessageBox.critical(self, "Ошибка", f"Скрипт winetricks не найден в директории:\n{winetricks_search_dir}") | ||||||
|             return |             return | ||||||
|  |  | ||||||
|         wine_executable = self._get_wine_executable_for_prefix(prefix_name) |         wine_executable = self._get_wine_executable_for_prefix(prefix_name) | ||||||
| @@ -3243,6 +3365,43 @@ class WineHelperGUI(QMainWindow): | |||||||
|                                 "Будет использована системная версия Wine.") |                                 "Будет использована системная версия Wine.") | ||||||
|         return 'wine'  # По умолчанию системный wine |         return 'wine'  # По умолчанию системный wine | ||||||
|  |  | ||||||
|  |     def update_sync_option(self, var_name, is_enabled): | ||||||
|  |         """Обновляет значение WINEESYNC или WINEFSYNC в last.conf.""" | ||||||
|  |         prefix_name = self.current_managed_prefix_name | ||||||
|  |         if not prefix_name: | ||||||
|  |             return | ||||||
|  |  | ||||||
|  |         last_conf_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name, "last.conf") | ||||||
|  |         if not os.path.exists(last_conf_path): | ||||||
|  |             QMessageBox.warning(self, "Ошибка", f"Файл last.conf не найден для префикса '{prefix_name}'.") | ||||||
|  |             return | ||||||
|  |  | ||||||
|  |         new_value = "1" if is_enabled else "0" | ||||||
|  |         updated = False | ||||||
|  |         lines = [] | ||||||
|  |  | ||||||
|  |         try: | ||||||
|  |             with open(last_conf_path, 'r', encoding='utf-8') as f: | ||||||
|  |                 lines = f.readlines() | ||||||
|  |  | ||||||
|  |             for i, line in enumerate(lines): | ||||||
|  |                 if line.strip().startswith(f"export {var_name}="): | ||||||
|  |                     lines[i] = f'export {var_name}="{new_value}"\n' | ||||||
|  |                     updated = True | ||||||
|  |                     break | ||||||
|  |  | ||||||
|  |             if not updated: | ||||||
|  |                 lines.append(f'export {var_name}="{new_value}"\n') | ||||||
|  |  | ||||||
|  |             with open(last_conf_path, 'w', encoding='utf-8') as f: | ||||||
|  |                 f.writelines(lines) | ||||||
|  |  | ||||||
|  |             # Обновляем информационную панель, чтобы отразить изменения | ||||||
|  |             self.update_prefix_info_display(prefix_name) | ||||||
|  |  | ||||||
|  |         except IOError as e: | ||||||
|  |             QMessageBox.critical(self, "Ошибка записи", f"Не удалось обновить файл last.conf:\n{e}") | ||||||
|  |  | ||||||
|     def _run_wine_util(self, util_name, prefix_name=None): |     def _run_wine_util(self, util_name, prefix_name=None): | ||||||
|         """Запускает стандартную утилиту Wine для выбранного префикса.""" |         """Запускает стандартную утилиту Wine для выбранного префикса.""" | ||||||
|         if not prefix_name: |         if not prefix_name: | ||||||
| @@ -3951,13 +4110,18 @@ class WineHelperGUI(QMainWindow): | |||||||
|             self._load_created_prefixes() |             self._load_created_prefixes() | ||||||
|  |  | ||||||
|             new_prefix_name = None |             new_prefix_name = None | ||||||
|  |             selected_new = False | ||||||
|             if new_prefixes: |             if new_prefixes: | ||||||
|                 # Обычно создается один префикс, берем первый из найденных |                 # Обычно создается один префикс, берем первый из найденных. | ||||||
|                 new_prefix_name = new_prefixes.pop() |                 new_prefix_name = new_prefixes.pop() | ||||||
|                 # Находим и выбираем его в выпадающем списке |                 # Находим и выбираем его в выпадающем списке. | ||||||
|                 index = self.created_prefix_selector.findText(new_prefix_name) |                 index = self.created_prefix_selector.findText(new_prefix_name) | ||||||
|                 if index != -1: |                 if index != -1: | ||||||
|                     self.created_prefix_selector.setCurrentIndex(index) |                     self.created_prefix_selector.setCurrentIndex(index) | ||||||
|  |                     selected_new = True | ||||||
|  |  | ||||||
|  |             if not selected_new and self.created_prefix_selector.count() > 0: | ||||||
|  |                 self.created_prefix_selector.setCurrentIndex(0) | ||||||
|             # --- Конец обновления списка префиксов --- |             # --- Конец обновления списка префиксов --- | ||||||
|  |  | ||||||
|             # Создаем кастомный диалог, чтобы кнопка была на русском |             # Создаем кастомный диалог, чтобы кнопка была на русском | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user