AddGameDialog rewrite from @VectorNull #19
@@ -6,7 +6,7 @@ from PySide6.QtWidgets import (
 | 
			
		||||
    QDialog, QLineEdit, QFormLayout, QPushButton,
 | 
			
		||||
    QHBoxLayout, QLabel, QVBoxLayout, QListWidget, QScrollArea, QWidget, QListWidgetItem
 | 
			
		||||
)
 | 
			
		||||
from PySide6.QtCore import Qt, QObject, Signal, QMimeDatabase, QTimer
 | 
			
		||||
from PySide6.QtCore import Qt, QObject, Signal, QMimeDatabase
 | 
			
		||||
from icoextract import IconExtractor, IconExtractorError
 | 
			
		||||
from PIL import Image
 | 
			
		||||
from portprotonqt.config_utils import get_portproton_location
 | 
			
		||||
@@ -383,16 +383,15 @@ class AddGameDialog(QDialog):
 | 
			
		||||
        self.theme_manager = ThemeManager()
 | 
			
		||||
        self.edit_mode = edit_mode
 | 
			
		||||
        self.original_name = game_name
 | 
			
		||||
        self.last_exe_path = exe_path  # Store last selected exe path
 | 
			
		||||
        self.last_cover_path = cover_path  # Store last selected cover path
 | 
			
		||||
 | 
			
		||||
        self.setWindowTitle(_("Edit Game") if edit_mode else _("Add Game"))
 | 
			
		||||
        self.setModal(True)
 | 
			
		||||
        self.setFixedWidth(600)
 | 
			
		||||
        self.setStyleSheet(self.theme.MAIN_WINDOW_STYLE + self.theme.MESSAGE_BOX_STYLE)
 | 
			
		||||
 | 
			
		||||
        layout = QFormLayout(self)
 | 
			
		||||
        layout.setLabelAlignment(Qt.AlignmentFlag.AlignLeft)
 | 
			
		||||
        layout.setFormAlignment(Qt.AlignmentFlag.AlignLeft)
 | 
			
		||||
        layout.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.ExpandingFieldsGrow)
 | 
			
		||||
 | 
			
		||||
        # Game name
 | 
			
		||||
        self.nameEdit = QLineEdit(self)
 | 
			
		||||
@@ -400,60 +399,46 @@ class AddGameDialog(QDialog):
 | 
			
		||||
        if game_name:
 | 
			
		||||
            self.nameEdit.setText(game_name)
 | 
			
		||||
        name_label = QLabel(_("Game Name:"))
 | 
			
		||||
        name_label.setStyleSheet(
 | 
			
		||||
            self.theme.PARAMS_TITLE_STYLE + " QLabel { color: #ffffff; font-size: 14px; font-weight: bold; }")
 | 
			
		||||
        name_label.setStyleSheet(self.theme.PARAMS_TITLE_STYLE + " QLabel { color: #ffffff; font-size: 14px; font-weight: bold; }")
 | 
			
		||||
        layout.addRow(name_label, self.nameEdit)
 | 
			
		||||
 | 
			
		||||
        # Exe path
 | 
			
		||||
        exe_label = QLabel(_("Path to Executable:"))
 | 
			
		||||
        exe_label.setStyleSheet(
 | 
			
		||||
            self.theme.PARAMS_TITLE_STYLE + " QLabel { color: #ffffff; font-size: 14px; font-weight: bold; }")
 | 
			
		||||
 | 
			
		||||
        self.exeEdit = QLineEdit(self)
 | 
			
		||||
        self.exeEdit.setStyleSheet(self.theme.ADDGAME_INPUT_STYLE)
 | 
			
		||||
        if exe_path:
 | 
			
		||||
            self.exeEdit.setText(exe_path)
 | 
			
		||||
 | 
			
		||||
        exeBrowseButton = QPushButton(_("Browse..."), self)
 | 
			
		||||
        exeBrowseButton.setStyleSheet(self.theme.ACTION_BUTTON_STYLE)
 | 
			
		||||
        exeBrowseButton.clicked.connect(self.browseExe)
 | 
			
		||||
        exeBrowseButton.setObjectName("exeBrowseButton")  # Для поиска кнопки
 | 
			
		||||
 | 
			
		||||
        # Добавляем поле ввода для exe
 | 
			
		||||
        layout.addRow(exe_label, self.exeEdit)
 | 
			
		||||
 | 
			
		||||
        # Добавляем кнопку обзора под полем ввода с выравниванием
 | 
			
		||||
        empty_label = QLabel("")
 | 
			
		||||
        empty_label.setFixedWidth(exe_label.sizeHint().width())
 | 
			
		||||
        layout.addRow(empty_label, exeBrowseButton)
 | 
			
		||||
        exeLayout = QHBoxLayout()
 | 
			
		||||
        exeLayout.addWidget(self.exeEdit)
 | 
			
		||||
        exeLayout.addWidget(exeBrowseButton)
 | 
			
		||||
        exe_label = QLabel(_("Path to Executable:"))
 | 
			
		||||
        exe_label.setStyleSheet(self.theme.PARAMS_TITLE_STYLE + " QLabel { color: #ffffff; font-size: 14px; font-weight: bold; }")
 | 
			
		||||
        layout.addRow(exe_label, exeLayout)
 | 
			
		||||
 | 
			
		||||
        # Cover path
 | 
			
		||||
        cover_label = QLabel(_("Custom Cover:"))
 | 
			
		||||
        cover_label.setStyleSheet(
 | 
			
		||||
            self.theme.PARAMS_TITLE_STYLE + " QLabel { color: #ffffff; font-size: 14px; font-weight: bold; }")
 | 
			
		||||
 | 
			
		||||
        self.coverEdit = QLineEdit(self)
 | 
			
		||||
        self.coverEdit.setStyleSheet(self.theme.ADDGAME_INPUT_STYLE)
 | 
			
		||||
        if cover_path:
 | 
			
		||||
            self.coverEdit.setText(cover_path)
 | 
			
		||||
 | 
			
		||||
        coverBrowseButton = QPushButton(_("Browse..."), self)
 | 
			
		||||
        coverBrowseButton.setStyleSheet(self.theme.ACTION_BUTTON_STYLE)
 | 
			
		||||
        coverBrowseButton.clicked.connect(self.browseCover)
 | 
			
		||||
        coverBrowseButton.setObjectName("coverBrowseButton")  # Для поиска кнопки
 | 
			
		||||
 | 
			
		||||
        # Добавляем поле ввода для обложки
 | 
			
		||||
        layout.addRow(cover_label, self.coverEdit)
 | 
			
		||||
 | 
			
		||||
        # Добавляем кнопку обзора под полем ввода с выравниванием
 | 
			
		||||
        layout.addRow(empty_label, coverBrowseButton)
 | 
			
		||||
        coverLayout = QHBoxLayout()
 | 
			
		||||
        coverLayout.addWidget(self.coverEdit)
 | 
			
		||||
        coverLayout.addWidget(coverBrowseButton)
 | 
			
		||||
        cover_label = QLabel(_("Custom Cover:"))
 | 
			
		||||
        cover_label.setStyleSheet(self.theme.PARAMS_TITLE_STYLE + " QLabel { color: #ffffff; font-size: 14px; font-weight: bold; }")
 | 
			
		||||
        layout.addRow(cover_label, coverLayout)
 | 
			
		||||
 | 
			
		||||
        # Preview
 | 
			
		||||
        self.coverPreview = QLabel(self)
 | 
			
		||||
        self.coverPreview.setStyleSheet(self.theme.CONTENT_STYLE + " QLabel { color: #ffffff; }")
 | 
			
		||||
        preview_label = QLabel(_("Cover Preview:"))
 | 
			
		||||
        preview_label.setStyleSheet(
 | 
			
		||||
            self.theme.PARAMS_TITLE_STYLE + " QLabel { color: #ffffff; font-size: 14px; font-weight: bold; }")
 | 
			
		||||
        preview_label.setStyleSheet(self.theme.PARAMS_TITLE_STYLE + " QLabel { color: #ffffff; font-size: 14px; font-weight: bold; }")
 | 
			
		||||
        layout.addRow(preview_label, self.coverPreview)
 | 
			
		||||
 | 
			
		||||
        # Dialog buttons
 | 
			
		||||
@@ -467,28 +452,21 @@ class AddGameDialog(QDialog):
 | 
			
		||||
        self.button_layout.addWidget(self.cancel_button)
 | 
			
		||||
        layout.addRow(self.button_layout)
 | 
			
		||||
 | 
			
		||||
        # Подключение сигналов
 | 
			
		||||
        self.select_button.clicked.connect(self.accept)
 | 
			
		||||
        self.cancel_button.clicked.connect(self.reject)
 | 
			
		||||
 | 
			
		||||
        self.coverEdit.textChanged.connect(self.updatePreview)
 | 
			
		||||
        self.exeEdit.textChanged.connect(self.updatePreview)
 | 
			
		||||
 | 
			
		||||
        # Установка одинаковой ширины для кнопок и полей ввода
 | 
			
		||||
        def update_button_widths():
 | 
			
		||||
            exeBrowseButton.setFixedWidth(self.exeEdit.width())
 | 
			
		||||
            coverBrowseButton.setFixedWidth(self.coverEdit.width())
 | 
			
		||||
 | 
			
		||||
        # Вызываем после отображения окна, когда размеры установлены, чтобы реально дождаться, когда всё сформируется
 | 
			
		||||
        QTimer.singleShot(0, update_button_widths)
 | 
			
		||||
 | 
			
		||||
        # Обновляем превью, если в режиме редактирования
 | 
			
		||||
        if edit_mode:
 | 
			
		||||
            self.updatePreview()
 | 
			
		||||
 | 
			
		||||
    def browseExe(self):
 | 
			
		||||
        """Открывает файловый менеджер для выбора exe-файла"""
 | 
			
		||||
        try:
 | 
			
		||||
            file_explorer = FileExplorer(self, file_filter='.exe')
 | 
			
		||||
            # Use last_exe_path if available and valid, otherwise fallback to home
 | 
			
		||||
            initial_path = os.path.dirname(self.last_exe_path) if self.last_exe_path and os.path.isfile(self.last_exe_path) else None
 | 
			
		||||
            file_explorer = FileExplorer(self, file_filter='.exe', initial_path=initial_path)
 | 
			
		||||
            file_explorer.file_signal.file_selected.connect(self.onExeSelected)
 | 
			
		||||
 | 
			
		||||
            # Центрируем FileExplorer относительно родительского виджета
 | 
			
		||||
@@ -507,6 +485,7 @@ class AddGameDialog(QDialog):
 | 
			
		||||
    def onExeSelected(self, file_path):
 | 
			
		||||
        """Обработчик выбора файла в FileExplorer"""
 | 
			
		||||
        self.exeEdit.setText(file_path)
 | 
			
		||||
        self.last_exe_path = file_path  # Update last selected exe path
 | 
			
		||||
        if not self.edit_mode:
 | 
			
		||||
            # Автоматически заполняем имя игры, если не в режиме редактирования
 | 
			
		||||
            game_name = os.path.splitext(os.path.basename(file_path))[0]
 | 
			
		||||
@@ -518,7 +497,9 @@ class AddGameDialog(QDialog):
 | 
			
		||||
    def browseCover(self):
 | 
			
		||||
        """Открывает файловый менеджер для выбора изображения обложки"""
 | 
			
		||||
        try:
 | 
			
		||||
            file_explorer = FileExplorer(self, file_filter=('.png', '.jpg', '.jpeg', '.bmp'))
 | 
			
		||||
            # Use last_cover_path if available and valid, otherwise fallback to home
 | 
			
		||||
            initial_path = os.path.dirname(self.last_cover_path) if self.last_cover_path and os.path.isfile(self.last_cover_path) else None
 | 
			
		||||
            file_explorer = FileExplorer(self, file_filter=('.png', '.jpg', '.jpeg', '.bmp'), initial_path=initial_path)
 | 
			
		||||
            file_explorer.file_signal.file_selected.connect(self.onCoverSelected)
 | 
			
		||||
 | 
			
		||||
            # Центрируем FileExplorer относительно родительского виджета
 | 
			
		||||
@@ -538,6 +519,7 @@ class AddGameDialog(QDialog):
 | 
			
		||||
        """Обработчик выбора файла обложки в FileExplorer"""
 | 
			
		||||
        if file_path and os.path.splitext(file_path)[1].lower() in ('.png', '.jpg', '.jpeg', '.bmp'):
 | 
			
		||||
            self.coverEdit.setText(file_path)
 | 
			
		||||
            self.last_cover_path = file_path  # Update last selected cover path
 | 
			
		||||
        else:
 | 
			
		||||
            logger.warning(f"Selected file is not a valid image: {file_path}")
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user