diff --git a/winehelper_gui.py b/winehelper_gui.py index 7015e4f..f4e8eec 100644 --- a/winehelper_gui.py +++ b/winehelper_gui.py @@ -1210,9 +1210,9 @@ class CreatePrefixDialog(QDialog): def __init__(self, parent=None): super().__init__(parent) - self.parent_gui = parent # Store reference to main window + self.parent_gui = parent # Сохранить ссылку на главное окно self.setWindowTitle("Создание нового префикса") - self.setMinimumSize(500, 250) + self.setMinimumSize(680, 250) self.setModal(True) # Attributes to store results @@ -1226,9 +1226,22 @@ class CreatePrefixDialog(QDialog): form_layout = QFormLayout() form_layout.setSpacing(10) + # Создаем виджет для поля ввода и предупреждения + name_input_widget = QWidget() + name_input_layout = QVBoxLayout(name_input_widget) + name_input_layout.setContentsMargins(0, 0, 0, 0) + name_input_layout.setSpacing(2) + self.prefix_name_edit = QLineEdit() self.prefix_name_edit.setPlaceholderText("Например: my_prefix") - form_layout.addRow("Имя нового префикса:", self.prefix_name_edit) + name_input_layout.addWidget(self.prefix_name_edit) + + self.name_warning_label = QLabel("Имя может содержать только латинские буквы, цифры, тире и знаки подчеркивания.") + self.name_warning_label.setStyleSheet("color: red;") + self.name_warning_label.setVisible(False) + name_input_layout.addWidget(self.name_warning_label) + + form_layout.addRow("Имя нового префикса:", name_input_widget) arch_widget = QWidget() arch_layout = QHBoxLayout(arch_widget) @@ -1285,7 +1298,7 @@ class CreatePrefixDialog(QDialog): # Connect signals self.arch_win32_radio.toggled.connect(self.clear_wine_version_selection) - self.prefix_name_edit.textChanged.connect(self.update_create_button_state) + self.prefix_name_edit.textChanged.connect(self.validate_prefix_name) self.wine_version_edit.textChanged.connect(self.update_create_button_state) def open_wine_version_dialog(self): @@ -1301,11 +1314,28 @@ class CreatePrefixDialog(QDialog): self.wine_version_edit.clear() self.selected_wine_version_value = None + def validate_prefix_name(self, text): + """Проверяет имя префикса в реальном времени и показывает/скрывает предупреждение.""" + valid_pattern = r'^[a-zA-Z0-9_-]*$' + if re.match(valid_pattern, text): + self.name_warning_label.setVisible(False) + else: + # Удаляем недопустимые символы + cleaned_text = re.sub(r'[^a-zA-Z0-9_-]', '', text) + # Блокируем сигналы, чтобы избежать рекурсии при изменении текста + self.prefix_name_edit.blockSignals(True) + self.prefix_name_edit.setText(cleaned_text) + self.prefix_name_edit.blockSignals(False) + self.name_warning_label.setVisible(True) + + self.update_create_button_state() + def update_create_button_state(self): """Включает или выключает кнопку 'Создать'.""" name_ok = bool(self.prefix_name_edit.text().strip()) version_ok = bool(self.wine_version_edit.text().strip()) - self.create_button.setEnabled(name_ok and version_ok) + # Кнопка активна, только если имя валидно и версия выбрана + self.create_button.setEnabled(name_ok and version_ok and not self.name_warning_label.isVisible()) def accept_creation(self): """Валидирует данные, сохраняет их и закрывает диалог с успехом.""" @@ -1315,8 +1345,8 @@ class CreatePrefixDialog(QDialog): QMessageBox.warning(self, "Ошибка", "Имя префикса не может быть пустым.") return - if not re.match(r'^[a-zA-Z0-9_.-]+$', prefix_name): - QMessageBox.warning(self, "Ошибка", "Имя префикса может содержать только латинские буквы, цифры, точки, дефисы и подчеркивания.") + if not re.match(r'^[a-zA-Z0-9_-]+$', prefix_name): + QMessageBox.warning(self, "Ошибка", "Имя префикса может содержать только латинские буквы, цифры, дефисы и знаки подчеркивания.") return prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name) @@ -2133,7 +2163,7 @@ class WineHelperGUI(QMainWindow): # --- Контейнер для выбора и управления созданными префиксами --- self.management_container_groupbox = QGroupBox() - self.management_container_groupbox.setVisible(False) # Скрыт, пока нет префиксов + self.management_container_groupbox.setVisible(True) # Всегда виден container_layout = QVBoxLayout(self.management_container_groupbox) selector_layout = QHBoxLayout() @@ -2313,8 +2343,8 @@ class WineHelperGUI(QMainWindow): def _load_created_prefixes(self): """Загружает и обновляет список созданных префиксов в выпадающем списке.""" prefixes_root_path = os.path.join(Var.USER_WORK_PATH, "prefixes") - if not os.path.isdir(prefixes_root_path): - self.management_container_groupbox.setVisible(False) + has_prefixes_dir = os.path.isdir(prefixes_root_path) + if not has_prefixes_dir: return try: @@ -2333,12 +2363,9 @@ class WineHelperGUI(QMainWindow): self.created_prefix_selector.blockSignals(False) if not prefix_names: - self.management_container_groupbox.setVisible(False) self.on_created_prefix_selected(-1) # Убедимся, что панель управления сброшена return - self.management_container_groupbox.setVisible(True) - def on_created_prefix_selected(self, index): """Обрабатывает выбор префикса из выпадающего списка.""" if index == -1: @@ -3014,14 +3041,15 @@ class WineHelperGUI(QMainWindow): authors_text = QTextEdit() authors_text.setReadOnly(True) authors_text.setHtml(""" -
-

Разработчики

+
+

Разработчики
Михаил Тергоев (fidel)
Сергей Пальчех (minergenon)

-

Помощники
+

Помощники
Иван Мажукин (vanomj)

-

Идея и поддержка:
- сообщество ALT Linux

+

Идея и поддержка
+ ООО "Базальт СПО"
+ ALT Linux Team


Отдельная благодарность всем, кто вносит свой вклад в развитие проекта,
тестирует и сообщает об ошибках!

@@ -3199,9 +3227,6 @@ class WineHelperGUI(QMainWindow): self.created_prefix_selector.setCurrentText(prefix_name) - if not self.management_container_groupbox.isVisible(): - self.management_container_groupbox.setVisible(True) - def update_installed_apps(self): """Обновляет список установленных приложений в виде кнопок""" # Если активная кнопка находится в списке удаляемых, сбрасываем ее