add class CustomLineEdit & new icons for context menu #22

Manually merged
Dervart merged 5 commits from Dervart/PortProtonQt:context_menu into main 2025-07-02 16:19:00 +00:00
21 changed files with 208 additions and 67 deletions

View File

@ -16,3 +16,5 @@ Content-Transfer-Encoding:
Generated-By: Generated-By:
start.sh start.sh
EGS EGS
Stop Game
\t

View File

@ -20,9 +20,9 @@ Current translation status:
| Locale | Progress | Translated | | Locale | Progress | Translated |
| :----- | -------: | ---------: | | :----- | -------: | ---------: |
| [de_DE](./de_DE/LC_MESSAGES/messages.po) | 0% | 0 of 185 | | [de_DE](./de_DE/LC_MESSAGES/messages.po) | 0% | 0 of 192 |
| [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 of 185 | | [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 of 192 |
| [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 185 of 185 | | [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 192 of 192 |
--- ---

View File

@ -20,9 +20,9 @@
| Локаль | Прогресс | Переведено | | Локаль | Прогресс | Переведено |
| :----- | -------: | ---------: | | :----- | -------: | ---------: |
| [de_DE](./de_DE/LC_MESSAGES/messages.po) | 0% | 0 из 185 | | [de_DE](./de_DE/LC_MESSAGES/messages.po) | 0% | 0 из 192 |
| [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 из 185 | | [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 из 192 |
| [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 185 из 185 | | [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 192 из 192 |
--- ---

View File

@ -8,7 +8,7 @@ import logging
import orjson import orjson
import psutil import psutil
import signal import signal
from PySide6.QtWidgets import QMessageBox, QDialog, QMenu from PySide6.QtWidgets import QMessageBox, QDialog, QMenu, QLineEdit, QApplication
from PySide6.QtCore import QUrl, QPoint, QObject, Signal, Qt from PySide6.QtCore import QUrl, QPoint, QObject, Signal, Qt
from PySide6.QtGui import QDesktopServices, QIcon from PySide6.QtGui import QDesktopServices, QIcon
from portprotonqt.localization import _ from portprotonqt.localization import _
@ -1080,3 +1080,69 @@ Icon={icon_path}
_("Error"), _("Error"),
_("Failed to open folder: {error}").format(error=str(e)) _("Failed to open folder: {error}").format(error=str(e))
) )
class CustomLineEdit(QLineEdit):
def __init__(self, *args, theme=None, **kwargs):
super().__init__(*args, **kwargs)
self.theme = theme
self.theme_manager = ThemeManager()
def contextMenuEvent(self, event):
def get_safe_icon(icon_name: str) -> QIcon:
icon = self.theme_manager.get_icon(icon_name)
if isinstance(icon, QIcon):
return icon
elif isinstance(icon, str) and os.path.exists(icon):
return QIcon(icon)
return QIcon()
menu = QMenu(self)
if self.theme and hasattr(self.theme, "CONTEXT_MENU_STYLE"):
menu.setStyleSheet(self.theme.CONTEXT_MENU_STYLE)
# Undo
undo = menu.addAction(get_safe_icon("undo"), _("Undo\tCtrl+Z"))
undo.triggered.connect(self.undo)
undo.setEnabled(self.isUndoAvailable())
# Redo
redo = menu.addAction(get_safe_icon("redo"), _("Redo\tCtrl+Y"))
redo.triggered.connect(self.redo)
redo.setEnabled(self.isRedoAvailable())
menu.addSeparator()
# Cut
cut = menu.addAction(get_safe_icon("cut"), _("Cut\tCtrl+X"))
cut.triggered.connect(self.cut)
cut.setEnabled(self.hasSelectedText())
# Copy
copy = menu.addAction(get_safe_icon("copy"), _("Copy\tCtrl+C"))
copy.triggered.connect(self.copy)
copy.setEnabled(self.hasSelectedText())
# Paste
paste = menu.addAction(get_safe_icon("paste"), _("Paste\tCtrl+V"))
paste.triggered.connect(self.paste)
paste.setEnabled(QApplication.clipboard().mimeData().hasText())
# Delete
delete = menu.addAction(get_safe_icon("delete"), _("Delete\tDel"))
delete.triggered.connect(self._delete_selected_text)
delete.setEnabled(self.hasSelectedText())
menu.addSeparator()
# Select All
select_all = menu.addAction(get_safe_icon("select_all"), _("Select All\tCtrl+A"))
select_all.triggered.connect(self.selectAll)
select_all.setEnabled(bool(self.text()))
menu.exec(event.globalPos())
def _delete_selected_text(self):
cursor_pos = self.cursorPosition()
self.backspace()
self.setCursorPosition(cursor_pos)

View File

@ -3,7 +3,7 @@ import tempfile
from typing import cast, TYPE_CHECKING from typing import cast, TYPE_CHECKING
from PySide6.QtGui import QPixmap, QIcon from PySide6.QtGui import QPixmap, QIcon
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
QDialog, QLineEdit, QFormLayout, QHBoxLayout, QLabel, QVBoxLayout, QListWidget, QScrollArea, QWidget, QListWidgetItem, QSizePolicy, QApplication QDialog, QFormLayout, QHBoxLayout, QLabel, QVBoxLayout, QListWidget, QScrollArea, QWidget, QListWidgetItem, QSizePolicy, QApplication
) )
from PySide6.QtCore import Qt, QObject, Signal, QMimeDatabase, QTimer from PySide6.QtCore import Qt, QObject, Signal, QMimeDatabase, QTimer
from icoextract import IconExtractor, IconExtractorError from icoextract import IconExtractor, IconExtractorError
@ -442,6 +442,7 @@ class FileExplorer(QDialog):
class AddGameDialog(QDialog): class AddGameDialog(QDialog):
def __init__(self, parent=None, theme=None, edit_mode=False, game_name=None, exe_path=None, cover_path=None): def __init__(self, parent=None, theme=None, edit_mode=False, game_name=None, exe_path=None, cover_path=None):
super().__init__(parent) super().__init__(parent)
from portprotonqt.context_menu_manager import CustomLineEdit # Локальный импорт
self.theme = theme if theme else default_styles self.theme = theme if theme else default_styles
self.theme_manager = ThemeManager() self.theme_manager = ThemeManager()
self.edit_mode = edit_mode self.edit_mode = edit_mode
@ -461,7 +462,7 @@ class AddGameDialog(QDialog):
layout.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.ExpandingFieldsGrow) layout.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.ExpandingFieldsGrow)
# Game name # Game name
self.nameEdit = QLineEdit(self) self.nameEdit = CustomLineEdit(self, theme=self.theme)
self.nameEdit.setStyleSheet(self.theme.ADDGAME_INPUT_STYLE) self.nameEdit.setStyleSheet(self.theme.ADDGAME_INPUT_STYLE)
if game_name: if game_name:
self.nameEdit.setText(game_name) self.nameEdit.setText(game_name)
@ -474,7 +475,7 @@ class AddGameDialog(QDialog):
exe_label.setStyleSheet( exe_label.setStyleSheet(
self.theme.PARAMS_TITLE_STYLE) self.theme.PARAMS_TITLE_STYLE)
self.exeEdit = QLineEdit(self) self.exeEdit = CustomLineEdit(self, theme=self.theme)
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)
@ -496,7 +497,7 @@ class AddGameDialog(QDialog):
cover_label = QLabel(_("Custom Cover:")) cover_label = QLabel(_("Custom Cover:"))
cover_label.setStyleSheet(self.theme.PARAMS_TITLE_STYLE) cover_label.setStyleSheet(self.theme.PARAMS_TITLE_STYLE)
self.coverEdit = QLineEdit(self) self.coverEdit = CustomLineEdit(self, theme=self.theme)
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)

View File

@ -9,7 +9,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2025-07-02 10:43+0500\n" "POT-Creation-Date: 2025-07-02 22:45+0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: de_DE\n" "Language: de_DE\n"
@ -239,6 +239,27 @@ msgstr ""
msgid "Failed to remove game '{game_name}' from Steam: {error}" msgid "Failed to remove game '{game_name}' from Steam: {error}"
msgstr "" msgstr ""
msgid "Undo\tCtrl+Z"
msgstr ""
msgid "Redo\tCtrl+Y"
msgstr ""
msgid "Cut\tCtrl+X"
msgstr ""
msgid "Copy\tCtrl+C"
msgstr ""
msgid "Paste\tCtrl+V"
msgstr ""
msgid "Delete\tDel"
msgstr ""
msgid "Select All\tCtrl+A"
msgstr ""
msgid "Select" msgid "Select"
msgstr "" msgstr ""

View File

@ -9,7 +9,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2025-07-02 10:43+0500\n" "POT-Creation-Date: 2025-07-02 22:45+0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: es_ES\n" "Language: es_ES\n"
@ -239,6 +239,27 @@ msgstr ""
msgid "Failed to remove game '{game_name}' from Steam: {error}" msgid "Failed to remove game '{game_name}' from Steam: {error}"
msgstr "" msgstr ""
msgid "Undo\tCtrl+Z"
msgstr ""
msgid "Redo\tCtrl+Y"
msgstr ""
msgid "Cut\tCtrl+X"
msgstr ""
msgid "Copy\tCtrl+C"
msgstr ""
msgid "Paste\tCtrl+V"
msgstr ""
msgid "Delete\tDel"
msgstr ""
msgid "Select All\tCtrl+A"
msgstr ""
msgid "Select" msgid "Select"
msgstr "" msgstr ""

View File

@ -9,7 +9,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PortProtonQt 0.1.1\n" "Project-Id-Version: PortProtonQt 0.1.1\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2025-07-02 10:43+0500\n" "POT-Creation-Date: 2025-07-02 22:52+0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -237,6 +237,27 @@ msgstr ""
msgid "Failed to remove game '{game_name}' from Steam: {error}" msgid "Failed to remove game '{game_name}' from Steam: {error}"
msgstr "" msgstr ""
msgid "Undo\tCtrl+Z"
msgstr ""
msgid "Redo\tCtrl+Y"
msgstr ""
msgid "Cut\tCtrl+X"
msgstr ""
msgid "Copy\tCtrl+C"
msgstr ""
msgid "Paste\tCtrl+V"
msgstr ""
msgid "Delete\tDel"
msgstr ""
msgid "Select All\tCtrl+A"
msgstr ""
msgid "Select" msgid "Select"
msgstr "" msgstr ""

View File

@ -9,17 +9,18 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2025-07-02 10:43+0500\n" "POT-Creation-Date: 2025-07-02 22:45+0700\n"
"PO-Revision-Date: 2025-07-02 10:43+0500\n" "PO-Revision-Date: 2025-07-02 22:51+0700\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language: ru_RU\n"
"Language-Team: ru_RU <LL@li.org>\n" "Language-Team: ru_RU <LL@li.org>\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "Language: ru_RU\n"
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 "
"&& (n%100<10 || n%100>=20) ? 1 : 2);\n"
"Generated-By: Babel 2.17.0\n" "Generated-By: Babel 2.17.0\n"
"X-Generator: Poedit 3.6\n"
msgid "Error" msgid "Error"
msgstr "Ошибка" msgstr "Ошибка"
@ -86,11 +87,11 @@ msgstr "Успешно"
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"'{game_name}' was added to Steam. Please restart Steam for changes to " "'{game_name}' was added to Steam. Please restart Steam for changes to take "
"take effect." "effect."
msgstr "" msgstr ""
"'{game_name}' был(а) добавлен(а) в Steam. Пожалуйста, перезапустите " "'{game_name}' был(а) добавлен(а) в Steam. Пожалуйста, перезапустите Steam, "
"Steam, чтобы изменения вступили в силу." "чтобы изменения вступили в силу."
#, python-brace-format #, python-brace-format
msgid "Executable not found for game: {game_name}" msgid "Executable not found for game: {game_name}"
@ -190,8 +191,8 @@ msgstr "Подтвердите удаление"
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"Are you sure you want to delete '{game_name}'? This will remove the " "Are you sure you want to delete '{game_name}'? This will remove the .desktop "
".desktop file and custom data." "file and custom data."
msgstr "" msgstr ""
"Вы уверены, что хотите удалить '{game_name}'? Это приведёт к удалению " "Вы уверены, что хотите удалить '{game_name}'? Это приведёт к удалению "
"файла .desktop и пользовательских данных." "файла .desktop и пользовательских данных."
@ -236,16 +237,37 @@ msgstr "Не удалось добавить '{game_name}' в Steam: {error}"
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"'{game_name}' was removed from Steam. Please restart Steam for changes to" "'{game_name}' was removed from Steam. Please restart Steam for changes to take "
" take effect." "effect."
msgstr "" msgstr ""
"'{game_name}' был(а) удалён(а) из Steam. Пожалуйста, перезапустите Steam," "'{game_name}' был(а) удалён(а) из Steam. Пожалуйста, перезапустите Steam, чтобы "
" чтобы изменения вступили в силу." "изменения вступили в силу."
#, python-brace-format #, python-brace-format
msgid "Failed to remove game '{game_name}' from Steam: {error}" msgid "Failed to remove game '{game_name}' from Steam: {error}"
msgstr "Не удалось удалить игру '{game_name}' из Steam: {error}" msgstr "Не удалось удалить игру '{game_name}' из Steam: {error}"
msgid "Undo\tCtrl+Z"
msgstr "Отмена\tCtrl+Z"
msgid "Redo\tCtrl+Y"
msgstr "Повтор\tCtrl+Y"
msgid "Cut\tCtrl+X"
msgstr "Вырезать\tCtrl+X"
msgid "Copy\tCtrl+C"
msgstr "Копировать\tCtrl+C"
msgid "Paste\tCtrl+V"
msgstr "Вставить\tCtrl+V"
msgid "Delete\tDel"
msgstr "Удалить\tDel"
msgid "Select All\tCtrl+A"
msgstr "Выделить всё\tCtrl+A"
msgid "Select" msgid "Select"
msgstr "Выбрать" msgstr "Выбрать"
@ -486,8 +508,7 @@ msgstr "Подтвердите удаление"
msgid "Are you sure you want to reset all settings? This action cannot be undone." msgid "Are you sure you want to reset all settings? This action cannot be undone."
msgstr "" msgstr ""
"Вы уверены, что хотите сбросить все настройки? Это действие нельзя " "Вы уверены, что хотите сбросить все настройки? Это действие нельзя отменить."
"отменить."
msgid "Settings reset. Restarting..." msgid "Settings reset. Restarting..."
msgstr "Настройки сброшены. Перезапуск..." msgstr "Настройки сброшены. Перезапуск..."
@ -632,4 +653,3 @@ msgstr "мин."
msgid "sec." msgid "sec."
msgstr "сек." msgstr "сек."

View File

@ -12,7 +12,7 @@ from portprotonqt.dialogs import AddGameDialog, FileExplorer
from portprotonqt.game_card import GameCard from portprotonqt.game_card import GameCard
from portprotonqt.custom_widgets import FlowLayout, ClickableLabel, AutoSizeButton, NavLabel from portprotonqt.custom_widgets import FlowLayout, ClickableLabel, AutoSizeButton, NavLabel
from portprotonqt.input_manager import InputManager from portprotonqt.input_manager import InputManager
from portprotonqt.context_menu_manager import ContextMenuManager from portprotonqt.context_menu_manager import ContextMenuManager, CustomLineEdit
from portprotonqt.system_overlay import SystemOverlay from portprotonqt.system_overlay import SystemOverlay
from portprotonqt.image_utils import load_pixmap_async, round_corners, ImageCarousel from portprotonqt.image_utils import load_pixmap_async, round_corners, ImageCarousel
@ -589,7 +589,7 @@ class MainWindow(QMainWindow):
self.addGameButton.clicked.connect(self.openAddGameDialog) self.addGameButton.clicked.connect(self.openAddGameDialog)
layout.addWidget(self.addGameButton, alignment=Qt.AlignmentFlag.AlignRight) layout.addWidget(self.addGameButton, alignment=Qt.AlignmentFlag.AlignRight)
self.searchEdit = QLineEdit() self.searchEdit = CustomLineEdit(self, theme=self.theme)
icon: QIcon = cast(QIcon, self.theme_manager.get_icon("search")) icon: QIcon = cast(QIcon, self.theme_manager.get_icon("search"))
action_pos = cast(QLineEdit.ActionPosition, QLineEdit.ActionPosition.LeadingPosition) action_pos = cast(QLineEdit.ActionPosition, QLineEdit.ActionPosition.LeadingPosition)
self.search_action = self.searchEdit.addAction(icon, action_pos) self.search_action = self.searchEdit.addAction(icon, action_pos)
@ -1039,7 +1039,7 @@ class MainWindow(QMainWindow):
formLayout.addRow(self.gamesDisplayTitle, self.gamesDisplayCombo) formLayout.addRow(self.gamesDisplayTitle, self.gamesDisplayCombo)
# 4. Proxy settings # 4. Proxy settings
self.proxyUrlEdit = QLineEdit() self.proxyUrlEdit = CustomLineEdit(self, theme=self.theme)
self.proxyUrlEdit.setPlaceholderText(_("Proxy URL")) self.proxyUrlEdit.setPlaceholderText(_("Proxy URL"))
self.proxyUrlEdit.setStyleSheet(self.theme.PROXY_INPUT_STYLE) self.proxyUrlEdit.setStyleSheet(self.theme.PROXY_INPUT_STYLE)
self.proxyUrlEdit.setFocusPolicy(Qt.FocusPolicy.StrongFocus) self.proxyUrlEdit.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
@ -1051,7 +1051,7 @@ class MainWindow(QMainWindow):
self.proxyUrlEdit.setText(proxy_cfg["http"]) self.proxyUrlEdit.setText(proxy_cfg["http"])
formLayout.addRow(self.proxyUrlTitle, self.proxyUrlEdit) formLayout.addRow(self.proxyUrlTitle, self.proxyUrlEdit)
self.proxyUserEdit = QLineEdit() self.proxyUserEdit = CustomLineEdit(self, theme=self.theme)
self.proxyUserEdit.setPlaceholderText(_("Proxy Username")) self.proxyUserEdit.setPlaceholderText(_("Proxy Username"))
self.proxyUserEdit.setStyleSheet(self.theme.PROXY_INPUT_STYLE) self.proxyUserEdit.setStyleSheet(self.theme.PROXY_INPUT_STYLE)
self.proxyUserEdit.setFocusPolicy(Qt.FocusPolicy.StrongFocus) self.proxyUserEdit.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
@ -1060,7 +1060,7 @@ class MainWindow(QMainWindow):
self.proxyUserTitle.setFocusPolicy(Qt.FocusPolicy.NoFocus) self.proxyUserTitle.setFocusPolicy(Qt.FocusPolicy.NoFocus)
formLayout.addRow(self.proxyUserTitle, self.proxyUserEdit) formLayout.addRow(self.proxyUserTitle, self.proxyUserEdit)
self.proxyPasswordEdit = QLineEdit() self.proxyPasswordEdit = CustomLineEdit(self, theme=self.theme)
self.proxyPasswordEdit.setPlaceholderText(_("Proxy Password")) self.proxyPasswordEdit.setPlaceholderText(_("Proxy Password"))
self.proxyPasswordEdit.setEchoMode(QLineEdit.EchoMode.Password) self.proxyPasswordEdit.setEchoMode(QLineEdit.EchoMode.Password)
self.proxyPasswordEdit.setStyleSheet(self.theme.PROXY_INPUT_STYLE) self.proxyPasswordEdit.setStyleSheet(self.theme.PROXY_INPUT_STYLE)
@ -1117,7 +1117,7 @@ class MainWindow(QMainWindow):
self.legendaryAuthTitle.setFocusPolicy(Qt.FocusPolicy.NoFocus) self.legendaryAuthTitle.setFocusPolicy(Qt.FocusPolicy.NoFocus)
formLayout.addRow(self.legendaryAuthTitle, self.legendaryAuthButton) formLayout.addRow(self.legendaryAuthTitle, self.legendaryAuthButton)
self.legendaryCodeEdit = QLineEdit() self.legendaryCodeEdit = CustomLineEdit(self, theme=self.theme)
self.legendaryCodeEdit.setPlaceholderText(_("Enter Legendary Authorization Code")) self.legendaryCodeEdit.setPlaceholderText(_("Enter Legendary Authorization Code"))
self.legendaryCodeEdit.setStyleSheet(self.theme.PROXY_INPUT_STYLE) self.legendaryCodeEdit.setStyleSheet(self.theme.PROXY_INPUT_STYLE)
self.legendaryCodeEdit.setFocusPolicy(Qt.FocusPolicy.StrongFocus) self.legendaryCodeEdit.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
@ -1359,7 +1359,7 @@ class MainWindow(QMainWindow):
self.themeMetainfoLabel.setWordWrap(True) self.themeMetainfoLabel.setWordWrap(True)
self.themeInfoLayout.addWidget(self.themeMetainfoLabel) self.themeInfoLayout.addWidget(self.themeMetainfoLabel)
self.applyButton = AutoSizeButton(_("Apply Theme"), icon=self.theme_manager.get_icon("update")) self.applyButton = AutoSizeButton(_("Apply Theme"), icon=self.theme_manager.get_icon("apply"))
self.applyButton.setStyleSheet(self.theme.ACTION_BUTTON_STYLE) self.applyButton.setStyleSheet(self.theme.ACTION_BUTTON_STYLE)
self.applyButton.setObjectName("actionButton") self.applyButton.setObjectName("actionButton")
self.themeInfoLayout.addWidget(self.applyButton) self.themeInfoLayout.addWidget(self.applyButton)

View File

@ -0,0 +1 @@
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path d="m6.25 12.2q-0.5775 0-0.98875-0.41125t-0.41125-0.98875v-8.4q0-0.5775 0.41125-0.98875t0.98875-0.41125h6.3q0.5775 0 0.98875 0.41125t0.41125 0.98875v8.4q0 0.5775-0.41125 0.98875t-0.98875 0.41125zm0-1.4h6.3v-8.4h-6.3zm-2.8 4.2q-0.5775 0-0.98875-0.41125t-0.41125-0.98875v-9.8h1.4v9.8h7.7v1.4zm2.8-4.2v-8.4z" fill="#fff" stroke-width=".0175"/></svg>

After

Width:  |  Height:  |  Size: 470 B

View File

@ -0,0 +1 @@
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path d="m14.3 3.1-4.9 4.9 1.645 1.645q0.2625-0.14 0.56-0.1925t0.595-0.0525q1.155 0 1.9775 0.8225t0.8225 1.9775-0.8225 1.9775-1.9775 0.8225-1.9775-0.8225-0.8225-1.9775q0-0.2975 0.0525-0.595t0.1925-0.56l-1.645-1.645-1.645 1.645q0.14 0.2625 0.1925 0.56t0.0525 0.595q0 1.155-0.8225 1.9775t-1.9775 0.8225-1.9775-0.8225-0.8225-1.9775 0.8225-1.9775 1.9775-0.8225q0.2975 0 0.595 0.0525t0.56 0.1925l8.645-8.645h0.7zm-7 2.8-1.4 1.4-4.2-4.2v-2.1h0.7zm-2.1 6.3q0-0.5775-0.41125-0.98875t-0.98875-0.41125-0.98875 0.41125-0.41125 0.98875 0.41125 0.98875 0.98875 0.41125 0.98875-0.41125 0.41125-0.98875zm3.15-4.2q0-0.14-0.105-0.245t-0.245-0.105-0.245 0.105-0.105 0.245 0.105 0.245 0.245 0.105 0.245-0.105 0.105-0.245zm5.25 4.2q0-0.5775-0.41125-0.98875t-0.98875-0.41125-0.98875 0.41125-0.41125 0.98875 0.41125 0.98875 0.98875 0.41125 0.98875-0.41125 0.41125-0.98875z" fill="#fff" stroke-width=".0175"/></svg>

After

Width:  |  Height:  |  Size: 1011 B

View File

@ -1 +1 @@
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path d="m5.48 11.5 2.52-2.52 2.52 2.52 0.98-0.98-2.52-2.52 2.52-2.52-0.98-0.98-2.52 2.52-2.52-2.52-0.98 0.98 2.52 2.52-2.52 2.52zm2.52 3.5q-1.4525 0-2.73-0.55125t-2.2225-1.4962-1.4962-2.2225-0.55125-2.73 0.55125-2.73 1.4962-2.2225 2.2225-1.4962 2.73-0.55125 2.73 0.55125 2.2225 1.4962 1.4962 2.2225 0.55125 2.73-0.55125 2.73-1.4962 2.2225-2.2225 1.4962-2.73 0.55125zm0-1.4q2.345 0 3.9725-1.6275t1.6275-3.9725-1.6275-3.9725-3.9725-1.6275-3.9725 1.6275-1.6275 3.9725 1.6275 3.9725 3.9725 1.6275z" fill="#fff"/></svg> <svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path d="m4.1111 15q-0.64167 0-1.0986-0.45694-0.45694-0.45694-0.45694-1.0986v-10.111h-0.77778v-1.5556h3.8889v-0.77778h4.6667v0.77778h3.8889v1.5556h-0.77778v10.111q0 0.64167-0.45694 1.0986-0.45694 0.45694-1.0986 0.45694zm7.7778-11.667h-7.7778v10.111h7.7778zm-6.2222 8.5556h1.5556v-7h-1.5556zm3.1111 0h1.5556v-7h-1.5556zm-4.6667-8.5556v10.111z" fill="#fff" stroke-width=".019444"/></svg>

Before

Width:  |  Height:  |  Size: 634 B

After

Width:  |  Height:  |  Size: 504 B

View File

@ -0,0 +1 @@
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path d="m3.1 15q-0.5775 0-0.98875-0.41125t-0.41125-0.98875v-9.8q0-0.5775 0.41125-0.98875t0.98875-0.41125h2.9225q0.1925-0.6125 0.7525-1.0062t1.225-0.39375q0.7 0 1.2512 0.39375t0.74375 1.0062h2.905q0.5775 0 0.98875 0.41125t0.41125 0.98875v9.8q0 0.5775-0.41125 0.98875t-0.98875 0.41125zm0-1.4h9.8v-9.8h-1.4v2.1h-7v-2.1h-1.4zm4.9-9.8q0.2975 0 0.49875-0.20125t0.20125-0.49875-0.20125-0.49875-0.49875-0.20125-0.49875 0.20125-0.20125 0.49875 0.20125 0.49875 0.49875 0.20125z" fill="#fff" stroke-width=".0175"/></svg>

After

Width:  |  Height:  |  Size: 629 B

View File

@ -0,0 +1 @@
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path d="m6.1625 14.562q-2.1219 0-3.6422-1.3781t-1.5203-3.4344 1.5203-3.4344 3.6422-1.3781h5.5125l-2.275-2.275 1.225-1.225 4.375 4.375-4.375 4.375-1.225-1.225 2.275-2.275h-5.5125q-1.3781 0-2.3953 0.875t-1.0172 2.1875 1.0172 2.1875 2.3953 0.875h6.2125v1.75z" fill="#fff" stroke-width=".021875"/></svg>

After

Width:  |  Height:  |  Size: 419 B

View File

@ -0,0 +1 @@
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path d="m4.1111 11.889v-7.7778h7.7778v7.7778zm1.5556-1.5556h4.6667v-4.6667h-4.6667zm-3.1111 3.1111v1.5556q-0.64167 0-1.0986-0.45694-0.45694-0.45694-0.45694-1.0986zm-1.5556-1.5556v-1.5556h1.5556v1.5556zm0-3.1111v-1.5556h1.5556v1.5556zm0-3.1111v-1.5556h1.5556v1.5556zm1.5556-3.1111h-1.5556q0-0.64167 0.45694-1.0986 0.45694-0.45694 1.0986-0.45694zm1.5556 12.444v-1.5556h1.5556v1.5556zm0-12.444v-1.5556h1.5556v1.5556zm3.1111 12.444v-1.5556h1.5556v1.5556zm0-12.444v-1.5556h1.5556v1.5556zm3.1111 12.444v-1.5556h1.5556v1.5556zm0-12.444v-1.5556h1.5556v1.5556zm3.1111 12.444v-1.5556h1.5556q0 0.64167-0.45694 1.0986-0.45694 0.45694-1.0986 0.45694zm0-3.1111v-1.5556h1.5556v1.5556zm0-3.1111v-1.5556h1.5556v1.5556zm0-3.1111v-1.5556h1.5556v1.5556zm0-3.1111v-1.5556q0.64167 0 1.0986 0.45694 0.45694 0.45694 0.45694 1.0986z" fill="#fff" stroke-width=".019444"/></svg>

After

Width:  |  Height:  |  Size: 971 B

View File

@ -0,0 +1 @@
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path d="m3.625 14.562v-1.75h6.2125q1.3781 0 2.3953-0.875 1.0172-0.875 1.0172-2.1875t-1.0172-2.1875q-1.0172-0.875-2.3953-0.875h-5.5125l2.275 2.275-1.225 1.225-4.375-4.375 4.375-4.375 1.225 1.225-2.275 2.275h5.5125q2.1219 0 3.6422 1.3781 1.5203 1.3781 1.5203 3.4344t-1.5203 3.4344q-1.5203 1.3781-3.6422 1.3781z" fill="#fff" stroke-width=".021875"/></svg>

After

Width:  |  Height:  |  Size: 472 B

View File

@ -103,6 +103,7 @@ CONTEXT_MENU_STYLE = f"""
font-family: '{font_family}'; font-family: '{font_family}';
font-size: {font_size_a}; font-size: {font_size_a};
padding: 5px; padding: 5px;
min-width: 150px;
}} }}
QMenu::icon {{ QMenu::icon {{
margin-left: 15px; margin-left: 15px;
@ -117,6 +118,9 @@ CONTEXT_MENU_STYLE = f"""
background: {color_a}; background: {color_a};
color: {color_f}; color: {color_f};
}} }}
QMenu::item:disabled {{
color: #7f7f7f;
}}
QMenu::item:hover {{ QMenu::item:hover {{
background: {color_a}; background: {color_a};
color: {color_f}; color: {color_f};
@ -127,6 +131,11 @@ CONTEXT_MENU_STYLE = f"""
border: {border_b} rgba(255, 255, 255, 0.3); border: {border_b} rgba(255, 255, 255, 0.3);
border-radius: {border_radius_a}; border-radius: {border_radius_a};
}} }}
QMenu::separator {{
height: 1px;
background-color: #7f7f7f;
margin: 4px 8px;
}}
""" """
# ГЛОБАЛЬНЫЙ СТИЛЬ ДЛЯ ОКНА (ФОН), ЛЭЙБЛОВ, КНОПОК # ГЛОБАЛЬНЫЙ СТИЛЬ ДЛЯ ОКНА (ФОН), ЛЭЙБЛОВ, КНОПОК
@ -574,19 +583,6 @@ ADDGAME_INPUT_STYLE = f"""
border: {border_c} {color_a}; border: {border_c} {color_a};
background-color: {color_e}; background-color: {color_e};
}} }}
QMenu {{
border: {border_b} {color_g};
padding: 5px 10px;
background: {color_d};
}}
QMenu::item {{
padding: 0px 10px;
border: 10px solid {color_h}; /* reserve space for selection border */
}}
QMenu::item:selected {{
background: {color_c};
border-radius: {border_radius_a};
}}
""" """
# СТИЛЬ КАРТОЧКИ ИГРЫ (GAMECARD) # СТИЛЬ КАРТОЧКИ ИГРЫ (GAMECARD)
@ -742,19 +738,6 @@ PROXY_INPUT_STYLE = f"""
border: {border_c} {color_a}; border: {border_c} {color_a};
background-color: {color_e}; background-color: {color_e};
}} }}
QMenu {{
border: {border_b} rgba(255, 255, 255, 0.2);
padding: 5px 10px;
background: {color_d};
}}
QMenu::item {{
padding: 0px 10px;
border: 10px solid {color_h}; /* reserve space for selection border */
}}
QMenu::item:selected {{
background: {color_c};
border-radius: {border_radius_a};
}}
""" """
SETTINGS_COMBO_STYLE = f""" SETTINGS_COMBO_STYLE = f"""