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:
start.sh
EGS
Stop Game
\t

View File

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

View File

@ -8,7 +8,7 @@ import logging
import orjson
import psutil
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.QtGui import QDesktopServices, QIcon
from portprotonqt.localization import _
@ -1080,3 +1080,69 @@ Icon={icon_path}
_("Error"),
_("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 PySide6.QtGui import QPixmap, QIcon
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 icoextract import IconExtractor, IconExtractorError
@ -442,6 +442,7 @@ class FileExplorer(QDialog):
class AddGameDialog(QDialog):
def __init__(self, parent=None, theme=None, edit_mode=False, game_name=None, exe_path=None, cover_path=None):
super().__init__(parent)
from portprotonqt.context_menu_manager import CustomLineEdit # Локальный импорт
self.theme = theme if theme else default_styles
self.theme_manager = ThemeManager()
self.edit_mode = edit_mode
@ -461,7 +462,7 @@ class AddGameDialog(QDialog):
layout.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.ExpandingFieldsGrow)
# Game name
self.nameEdit = QLineEdit(self)
self.nameEdit = CustomLineEdit(self, theme=self.theme)
self.nameEdit.setStyleSheet(self.theme.ADDGAME_INPUT_STYLE)
if game_name:
self.nameEdit.setText(game_name)
@ -474,7 +475,7 @@ class AddGameDialog(QDialog):
exe_label.setStyleSheet(
self.theme.PARAMS_TITLE_STYLE)
self.exeEdit = QLineEdit(self)
self.exeEdit = CustomLineEdit(self, theme=self.theme)
self.exeEdit.setStyleSheet(self.theme.ADDGAME_INPUT_STYLE)
if exe_path:
self.exeEdit.setText(exe_path)
@ -496,7 +497,7 @@ class AddGameDialog(QDialog):
cover_label = QLabel(_("Custom Cover:"))
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)
if cover_path:
self.coverEdit.setText(cover_path)

View File

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: de_DE\n"
@ -239,6 +239,27 @@ msgstr ""
msgid "Failed to remove game '{game_name}' from Steam: {error}"
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"
msgstr ""

View File

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: es_ES\n"
@ -239,6 +239,27 @@ msgstr ""
msgid "Failed to remove game '{game_name}' from Steam: {error}"
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"
msgstr ""

View File

@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PortProtonQt 0.1.1\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -237,6 +237,27 @@ msgstr ""
msgid "Failed to remove game '{game_name}' from Steam: {error}"
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"
msgstr ""

View File

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

View File

@ -12,7 +12,7 @@ from portprotonqt.dialogs import AddGameDialog, FileExplorer
from portprotonqt.game_card import GameCard
from portprotonqt.custom_widgets import FlowLayout, ClickableLabel, AutoSizeButton, NavLabel
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.image_utils import load_pixmap_async, round_corners, ImageCarousel
@ -589,7 +589,7 @@ class MainWindow(QMainWindow):
self.addGameButton.clicked.connect(self.openAddGameDialog)
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"))
action_pos = cast(QLineEdit.ActionPosition, QLineEdit.ActionPosition.LeadingPosition)
self.search_action = self.searchEdit.addAction(icon, action_pos)
@ -1039,7 +1039,7 @@ class MainWindow(QMainWindow):
formLayout.addRow(self.gamesDisplayTitle, self.gamesDisplayCombo)
# 4. Proxy settings
self.proxyUrlEdit = QLineEdit()
self.proxyUrlEdit = CustomLineEdit(self, theme=self.theme)
self.proxyUrlEdit.setPlaceholderText(_("Proxy URL"))
self.proxyUrlEdit.setStyleSheet(self.theme.PROXY_INPUT_STYLE)
self.proxyUrlEdit.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
@ -1051,7 +1051,7 @@ class MainWindow(QMainWindow):
self.proxyUrlEdit.setText(proxy_cfg["http"])
formLayout.addRow(self.proxyUrlTitle, self.proxyUrlEdit)
self.proxyUserEdit = QLineEdit()
self.proxyUserEdit = CustomLineEdit(self, theme=self.theme)
self.proxyUserEdit.setPlaceholderText(_("Proxy Username"))
self.proxyUserEdit.setStyleSheet(self.theme.PROXY_INPUT_STYLE)
self.proxyUserEdit.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
@ -1060,7 +1060,7 @@ class MainWindow(QMainWindow):
self.proxyUserTitle.setFocusPolicy(Qt.FocusPolicy.NoFocus)
formLayout.addRow(self.proxyUserTitle, self.proxyUserEdit)
self.proxyPasswordEdit = QLineEdit()
self.proxyPasswordEdit = CustomLineEdit(self, theme=self.theme)
self.proxyPasswordEdit.setPlaceholderText(_("Proxy Password"))
self.proxyPasswordEdit.setEchoMode(QLineEdit.EchoMode.Password)
self.proxyPasswordEdit.setStyleSheet(self.theme.PROXY_INPUT_STYLE)
@ -1117,7 +1117,7 @@ class MainWindow(QMainWindow):
self.legendaryAuthTitle.setFocusPolicy(Qt.FocusPolicy.NoFocus)
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.setStyleSheet(self.theme.PROXY_INPUT_STYLE)
self.legendaryCodeEdit.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
@ -1359,7 +1359,7 @@ class MainWindow(QMainWindow):
self.themeMetainfoLabel.setWordWrap(True)
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.setObjectName("actionButton")
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,9 +103,10 @@ CONTEXT_MENU_STYLE = f"""
font-family: '{font_family}';
font-size: {font_size_a};
padding: 5px;
min-width: 150px;
}}
QMenu::icon {{
margin-left: 15px;
margin-left: 15px;
}}
QMenu::item {{
padding: 8px 20px 8px 10px;
@ -117,6 +118,9 @@ CONTEXT_MENU_STYLE = f"""
background: {color_a};
color: {color_f};
}}
QMenu::item:disabled {{
color: #7f7f7f;
}}
QMenu::item:hover {{
background: {color_a};
color: {color_f};
@ -127,6 +131,11 @@ CONTEXT_MENU_STYLE = f"""
border: {border_b} rgba(255, 255, 255, 0.3);
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};
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)
@ -742,19 +738,6 @@ PROXY_INPUT_STYLE = f"""
border: {border_c} {color_a};
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"""