changed the download and selection of wine/proton versions on the cloud
This commit is contained in:
@@ -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
|
||||
|
Reference in New Issue
Block a user