revert feat(dialogs): rewrite class AddGameDialog from @Vector_null
This commit is contained in:
2025-06-29 07:21:14 +00:00
parent 39c0db91a6
commit 46eab703fe

View File

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