changed the download and selection of wine/proton versions on the cloud

This commit is contained in:
Sergey Palcheh
2025-08-28 21:15:39 +06:00
parent b4d663f2a7
commit 662a62267c
3 changed files with 252 additions and 245 deletions

View File

@@ -1014,11 +1014,9 @@ class ScriptParser:
class WineVersionSelectionDialog(QDialog):
"""Диалог для выбора версии Wine/Proton с группировкой."""
def __init__(self, architecture, winehelper_path, user_work_path, parent=None):
def __init__(self, architecture, parent=None):
super().__init__(parent)
self.architecture = architecture
self.winehelper_path = winehelper_path
self.user_work_path = user_work_path
self.selected_version = None
self.wine_versions_data = {}
self.system_wine_display_name = "Системная версия"
@@ -1049,10 +1047,6 @@ class WineVersionSelectionDialog(QDialog):
def load_versions(self):
"""Запускает процесс получения списка версий Wine."""
if not shutil.which('jq'):
QMessageBox.critical(self, "Ошибка", "Утилита 'jq' не найдена. Невозможно получить список версий Wine.\n\nУстановите пакет 'jq'.")
return
self.version_tabs.clear()
loading_widget = QWidget()
loading_layout = QVBoxLayout(loading_widget)
@@ -1061,52 +1055,71 @@ class WineVersionSelectionDialog(QDialog):
loading_layout.addWidget(status_label)
self.version_tabs.addTab(loading_widget, "Загрузка...")
self.version_tabs.setEnabled(False)
self.refresh_button.setEnabled(False)
self.db_process = QProcess(self)
self.db_process.setProcessChannelMode(QProcess.MergedChannels)
self.db_process.finished.connect(self._on_db_generation_finished)
self.db_process.start(self.winehelper_path, ["generate-db"])
def _on_db_generation_finished(self, exit_code, exit_status):
"""Обрабатывает завершение генерации метаданных Wine."""
QApplication.processEvents()
self._parse_sha256_list()
self.populate_ui()
self.refresh_button.setEnabled(True)
self.version_tabs.setEnabled(True)
error_message = None
if exit_code != 0:
error_output = self.db_process.readAll().data().decode('utf-8', 'ignore')
QMessageBox.warning(self, "Ошибка", f"Не удалось получить список версий Wine.\n\n{error_output}")
error_message = "Ошибка загрузки списка версий."
else:
metadata_file = os.path.join(self.user_work_path, "tmp", "wine_metadata.json")
if not os.path.exists(metadata_file):
QMessageBox.warning(self, "Ошибка", f"Файл метаданных не найден:\n{metadata_file}")
error_message = "Ошибка: файл метаданных не найден."
else:
try:
with open(metadata_file, 'r', encoding='utf-8') as f:
self.wine_versions_data = json.load(f)
except (json.JSONDecodeError, IOError) as e:
QMessageBox.warning(self, "Ошибка", f"Не удалось прочитать или обработать файл метаданных:\n{e}")
error_message = "Ошибка парсинга JSON."
if error_message:
self.version_tabs.clear()
error_widget = QWidget()
error_layout = QVBoxLayout(error_widget)
error_label = QLabel(error_message)
error_label.setAlignment(Qt.AlignCenter)
error_layout.addWidget(error_label)
self.version_tabs.addTab(error_widget, "Ошибка")
def _parse_sha256_list(self):
"""Парсит sha256sum.list для получения списка версий."""
sha256_path = os.path.join(Var.DATA_PATH, "sha256sum.list")
if not os.path.exists(sha256_path):
QMessageBox.warning(self, "Ошибка", f"Файл с версиями не найден:\n{sha256_path}")
self.wine_versions_data = {}
return
self.populate_ui()
self.wine_versions_data = {}
current_group = None
try:
with open(sha256_path, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if not line:
continue
match = re.match(r'^#+\s+([A-Z_]+)\s+#*$', line)
if match:
group_name = match.group(1)
allowed_groups = {"WINE", "WINE_LG", "PROTON_LG", "PROTON_STEAM"}
# Отображаем только группы, которые являются сборками WINE или PROTON
if group_name in allowed_groups:
current_group = group_name
if current_group not in self.wine_versions_data:
self.wine_versions_data[current_group] = []
else:
current_group = None
continue
if current_group and re.match(r'^[a-f0-9]{64}', line):
parts = line.split(maxsplit=1)
if len(parts) == 2:
filename = parts[1]
if filename.endswith('.tar.xz'):
version_name = filename[:-7]
self.wine_versions_data[current_group].append(version_name)
except IOError as e:
QMessageBox.warning(self, "Ошибка", f"Не удалось прочитать файл версий:\n{e}")
self.wine_versions_data = {}
def populate_ui(self):
"""Заполняет UI отфильтрованными версиями."""
self.version_tabs.clear()
if not self.wine_versions_data:
error_widget = QWidget()
error_layout = QVBoxLayout(error_widget)
error_label = QLabel("Список версий пуст или не удалось его загрузить.")
error_label.setAlignment(Qt.AlignCenter)
error_layout.addWidget(error_label)
self.version_tabs.addTab(error_widget, "Ошибка")
return
is_win64 = self.architecture == "win64"
re_32bit = re.compile(r'i[3-6]86|x86(?!_64)')
re_64bit = re.compile(r'amd64|x86_64|wow64')
@@ -1131,10 +1144,9 @@ class WineVersionSelectionDialog(QDialog):
for key in group_keys:
versions = self.wine_versions_data.get(key, [])
all_version_names = {v.get("name", "") for v in versions if v.get("name")}
filtered_versions = []
for name in sorted(list(all_version_names), reverse=True):
for name in sorted(versions, reverse=True):
if is_win64:
if re_64bit.search(name) or not re_32bit.search(name):
filtered_versions.append(name)
@@ -1802,7 +1814,7 @@ class WineHelperGUI(QMainWindow):
def open_wine_version_dialog(self):
"""Открывает диалог выбора версии Wine."""
architecture = "win32" if self.arch_win32_radio.isChecked() else "win64"
dialog = WineVersionSelectionDialog(architecture, self.winehelper_path, Var.USER_WORK_PATH, self)
dialog = WineVersionSelectionDialog(architecture, self)
if dialog.exec_() == QDialog.Accepted and dialog.selected_version:
self.wine_version_edit.setText(dialog.selected_display_text)
self.selected_wine_version_value = dialog.selected_version