forked from CastroFidel/winehelper
the choice of the prefix template has been changed
This commit is contained in:
@@ -1224,6 +1224,7 @@ class WineVersionSelectionDialog(QDialog):
|
||||
self.installed_grid_layout.setAlignment(Qt.AlignTop)
|
||||
|
||||
installed_versions_for_grid = []
|
||||
|
||||
# Системная версия
|
||||
if shutil.which('wine'):
|
||||
try:
|
||||
@@ -1231,7 +1232,6 @@ class WineVersionSelectionDialog(QDialog):
|
||||
self.system_wine_display_name = result.stdout.strip()
|
||||
except (FileNotFoundError, subprocess.CalledProcessError) as e:
|
||||
print(f"Не удалось получить версию системного wine: {e}")
|
||||
self.system_wine_display_name = "Системная версия"
|
||||
installed_versions_for_grid.append((self.system_wine_display_name, "system"))
|
||||
|
||||
# Локально установленные версии
|
||||
@@ -1265,8 +1265,8 @@ class WineVersionSelectionDialog(QDialog):
|
||||
allowed_groups_for_arch = {"WINE AMD64", "WINE WOW64"}
|
||||
tab_order = ["WINE AMD64", "WINE WOW64"]
|
||||
else: # win32
|
||||
allowed_groups_for_arch = {"WINE I586","WINE AMD64", "WINE WOW64"}
|
||||
tab_order = ["WINE I586","WINE AMD64", "WINE WOW64"]
|
||||
allowed_groups_for_arch = {"WINE I586","WINE AMD64"}
|
||||
tab_order = ["WINE I586","WINE AMD64"]
|
||||
|
||||
# Получаем только те ключи, которые есть в данных и разрешены для данной архитектуры
|
||||
available_keys = [key for key in self.wine_versions_data.keys() if key in allowed_groups_for_arch]
|
||||
@@ -1302,6 +1302,7 @@ class WineVersionSelectionDialog(QDialog):
|
||||
|
||||
def _create_grid_buttons(self, grid_layout, versions_list, is_download_tab=False):
|
||||
is_win64_prefix = self.architecture == "win64"
|
||||
is_win32_prefix = self.architecture == "win32"
|
||||
re_32bit_version = re.compile(r'i[3-6]86|i586')
|
||||
|
||||
num_columns = 3
|
||||
@@ -1326,6 +1327,12 @@ class WineVersionSelectionDialog(QDialog):
|
||||
btn.setEnabled(False)
|
||||
btn.setToolTip("Эта 32-битная версия Wine несовместима с 64-битным префиксом.")
|
||||
|
||||
# Отключение 64-битных версий Wine (системной и wow64) при выборе 32-битного префикса
|
||||
if not is_download_tab and is_win32_prefix:
|
||||
if value_name == "system" or 'wow64' in value_name:
|
||||
btn.setEnabled(False)
|
||||
btn.setToolTip("Эта 64-битная версия Wine несовместима с 32-битным префиксом.")
|
||||
|
||||
grid_layout.addWidget(btn, row, col)
|
||||
col += 1
|
||||
if col >= num_columns:
|
||||
@@ -1390,6 +1397,7 @@ class CreatePrefixDialog(QDialog):
|
||||
self.prefix_name = None
|
||||
self.wine_arch = None
|
||||
self.base_pfx = None
|
||||
self.prepared_prefixes = {}
|
||||
self.selected_wine_version_value = None
|
||||
self.selected_wine_version_display = None
|
||||
|
||||
@@ -1424,18 +1432,10 @@ class CreatePrefixDialog(QDialog):
|
||||
arch_layout.addWidget(self.arch_win64_radio)
|
||||
form_layout.addRow("<b>Разрядность:</b>", arch_widget)
|
||||
|
||||
type_widget = QWidget()
|
||||
type_layout = QHBoxLayout(type_widget)
|
||||
type_layout.setContentsMargins(0, 0, 0, 0)
|
||||
self.type_clean_radio = QRadioButton("Чистый")
|
||||
self.type_clean_radio.setToolTip("Создает пустой префикс Wine без каких-либо дополнительных компонентов.")
|
||||
self.type_recommended_radio = QRadioButton("С рекомендуемыми библиотеками")
|
||||
tooltip_text = "Устанавливает базовый набор компонентов, необходимый для большинства приложений"
|
||||
self.type_recommended_radio.setToolTip(tooltip_text)
|
||||
self.type_clean_radio.setChecked(True)
|
||||
type_layout.addWidget(self.type_clean_radio)
|
||||
type_layout.addWidget(self.type_recommended_radio)
|
||||
form_layout.addRow("<b>Наполнение:</b>", type_widget)
|
||||
# Виджет для выбора типа префикса (шаблона)
|
||||
self.prefix_template_selector = QComboBox()
|
||||
self.prefix_template_selector.setToolTip("Выберите шаблон для создания префикса.")
|
||||
form_layout.addRow("<b>Шаблон префикса:</b>", self.prefix_template_selector)
|
||||
|
||||
self.wine_version_edit = QLineEdit()
|
||||
self.wine_version_edit.setReadOnly(True)
|
||||
@@ -1468,10 +1468,66 @@ class CreatePrefixDialog(QDialog):
|
||||
layout.addLayout(button_layout)
|
||||
|
||||
# Connect signals
|
||||
self.arch_win32_radio.toggled.connect(self.clear_wine_version_selection)
|
||||
self.arch_win32_radio.toggled.connect(self.on_architecture_changed)
|
||||
self.prefix_name_edit.textChanged.connect(self.validate_prefix_name)
|
||||
self.wine_version_edit.textChanged.connect(self.update_create_button_state)
|
||||
|
||||
# Загружаем и настраиваем шаблоны префиксов
|
||||
self._load_prepared_prefixes()
|
||||
self.on_architecture_changed()
|
||||
|
||||
def _load_prepared_prefixes(self):
|
||||
"""Загружает и парсит шаблоны префиксов из sha256sum.list."""
|
||||
self.prepared_prefixes = {'win32': [], 'win64': []}
|
||||
sha256_file = os.path.join(Var.DATA_PATH, "sha256sum.list")
|
||||
if not os.path.exists(sha256_file):
|
||||
QMessageBox.warning(self, "Ошибка", f"Файл с описаниями префиксов не найден: {sha256_file}")
|
||||
return
|
||||
|
||||
in_prefix_section = False
|
||||
current_description = ""
|
||||
current_prefix_name = None
|
||||
|
||||
try:
|
||||
with open(sha256_file, 'r', encoding='utf-8') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if "##### PREFIX #####" in line:
|
||||
in_prefix_section = True
|
||||
continue
|
||||
elif line.startswith("#####"):
|
||||
in_prefix_section = False
|
||||
continue
|
||||
|
||||
if not in_prefix_section:
|
||||
continue
|
||||
|
||||
if re.match(r'^[a-f0-9]{64}', line):
|
||||
current_prefix_name = line.split(maxsplit=1)[1].replace('.tar.xz', '')
|
||||
|
||||
arch = None
|
||||
if "_x86_" in current_prefix_name or "_i586_" in current_prefix_name:
|
||||
arch = 'win32'
|
||||
elif "_x64_" in current_prefix_name or "_amd64_" in current_prefix_name:
|
||||
arch = 'win64'
|
||||
|
||||
if arch:
|
||||
description = current_description.strip().replace('\\n', '\n') if current_description else "Рекомендуемый набор библиотек"
|
||||
self.prepared_prefixes[arch].append((current_prefix_name, description))
|
||||
|
||||
current_description = ""
|
||||
current_prefix_name = None
|
||||
|
||||
elif line.startswith('# '):
|
||||
current_description += line[2:] + "\\n"
|
||||
|
||||
except IOError as e:
|
||||
QMessageBox.warning(self, "Ошибка", f"Не удалось прочитать файл с описаниями префиксов: {e}")
|
||||
|
||||
# Добавляем опцию "Чистый префикс" для обеих архитектур
|
||||
self.prepared_prefixes['win32'].insert(0, ('none', 'Создать чистый префикс без дополнительных библиотек'))
|
||||
self.prepared_prefixes['win64'].insert(0, ('none', 'Создать чистый префикс без дополнительных библиотек'))
|
||||
|
||||
def open_wine_version_dialog(self):
|
||||
"""Открывает диалог выбора версии Wine."""
|
||||
architecture = "win32" if self.arch_win32_radio.isChecked() else "win64"
|
||||
@@ -1480,11 +1536,29 @@ class CreatePrefixDialog(QDialog):
|
||||
self.wine_version_edit.setText(dialog.selected_display_text)
|
||||
self.selected_wine_version_value = dialog.selected_version
|
||||
|
||||
def clear_wine_version_selection(self):
|
||||
"""Сбрасывает выбор версии Wine."""
|
||||
def on_architecture_changed(self):
|
||||
"""Обновляет список шаблонов и сбрасывает выбор версии Wine при смене архитектуры."""
|
||||
# Сбрасываем выбор версии
|
||||
self.wine_version_edit.clear()
|
||||
self.selected_wine_version_value = None
|
||||
|
||||
# Обновляем список шаблонов
|
||||
self.prefix_template_selector.blockSignals(True)
|
||||
self.prefix_template_selector.clear()
|
||||
|
||||
architecture = "win32" if self.arch_win32_radio.isChecked() else "win64"
|
||||
templates = self.prepared_prefixes.get(architecture, [])
|
||||
|
||||
for value, description in templates:
|
||||
# Для 'none' используем более понятное имя
|
||||
display_name = "Чистый префикс" if value == "none" else value
|
||||
self.prefix_template_selector.addItem(display_name, userData={'value': value, 'tooltip': description})
|
||||
|
||||
self.prefix_template_selector.blockSignals(False)
|
||||
# Обновляем тултип при смене элемента
|
||||
self.prefix_template_selector.currentIndexChanged.connect(lambda i: self.prefix_template_selector.setToolTip(self.prefix_template_selector.itemData(i)['tooltip']))
|
||||
self.prefix_template_selector.setToolTip(self.prefix_template_selector.itemData(0)['tooltip'])
|
||||
|
||||
def validate_prefix_name(self, text):
|
||||
"""Проверяет имя префикса в реальном времени и показывает/скрывает предупреждение."""
|
||||
valid_pattern = r'^[a-zA-Z0-9_-]*$'
|
||||
@@ -1528,7 +1602,10 @@ class CreatePrefixDialog(QDialog):
|
||||
# Save data
|
||||
self.prefix_name = prefix_name
|
||||
self.wine_arch = "win32" if self.arch_win32_radio.isChecked() else "win64"
|
||||
self.base_pfx = "none" if self.type_clean_radio.isChecked() else ""
|
||||
|
||||
# Получаем значение `BASE_PFX` из выбранного шаблона
|
||||
current_index = self.prefix_template_selector.currentIndex()
|
||||
self.base_pfx = self.prefix_template_selector.itemData(current_index)['value']
|
||||
self.selected_wine_version_display = self.wine_version_edit.text()
|
||||
|
||||
self.accept()
|
||||
|
||||
Reference in New Issue
Block a user