14 Commits

Author SHA1 Message Date
c74d209dbd chore(ci): replace uv github action to manual install
All checks were successful
Code check / Check code (pull_request) Successful in 1m25s
Code check / Check code (push) Successful in 1m20s
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-08-23 21:04:59 +05:00
5b257d3b62 fix(ci): disable cache from node
All checks were successful
Code check / Check code (push) Successful in 1m59s
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-08-23 20:53:17 +05:00
4dcf1dbe6d fix(ci): I forget @
Some checks failed
Code check / Check code (push) Failing after 54s
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-08-23 20:50:47 +05:00
8d6fe4aa65 chore(ci): install node 20 for uv
Some checks failed
Code check / Check code (push) Failing after 4s
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-08-23 20:48:40 +05:00
022eb3f1e9 chore(changelog): update
Some checks failed
Check Translations / check-translations (push) Successful in 46s
Code check / Check code (push) Failing after 10s
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-08-23 20:41:42 +05:00
11b847ed05 chore(localization): update
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-08-23 20:36:02 +05:00
1e4e0127a4 fix(i18n): add translation for File Explorer window title
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-08-23 20:33:19 +05:00
c045aa7a56 fix(input_manager): correct button mappings for increase/decrease size actions
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-08-23 20:31:22 +05:00
f18e7bae6b chore(changelog): update
Some checks failed
Code check / Check code (push) Failing after 15s
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-08-23 11:28:02 +05:00
dcf8904037 feat(input_manager): enable cursor movement in QLineEdit with left/right arrows
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-08-23 11:25:26 +05:00
f9d24e385d fix(input_manager): prevent tab switching when using left/right arrows in QLineEdit
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-08-23 11:22:06 +05:00
09028931be feat: use Backspace for move to parent directory in FileExplorer
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-08-23 11:12:15 +05:00
0294c90c54 chore(changelog): update
All checks were successful
Code check / Check code (push) Successful in 2m43s
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-08-19 17:54:40 +05:00
17dfef2d27 chore(tray): drop
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-08-19 17:52:09 +05:00
19 changed files with 201 additions and 281 deletions

View File

@@ -22,10 +22,16 @@ jobs:
steps: steps:
- uses: https://gitea.com/actions/checkout@v4 - uses: https://gitea.com/actions/checkout@v4
- name: Install uv - name: Set up Node.js
uses: https://github.com/astral-sh/setup-uv@v6 uses: https://gitea.com/actions/setup-node@v4
with: with:
enable-cache: true node-version: 20
- name: Install uv manually
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
uv --version
- name: Sync dependencies into venv - name: Sync dependencies into venv
run: uv sync --all-extras --dev run: uv sync --all-extras --dev

View File

@@ -12,10 +12,16 @@ jobs:
steps: steps:
- uses: https://gitea.com/actions/checkout@v4 - uses: https://gitea.com/actions/checkout@v4
- name: Install uv - name: Set up Node.js
uses: https://github.com/astral-sh/setup-uv@v6 uses: https://gitea.com/actions/setup-node@v4
with: with:
enable-cache: true node-version: 20
- name: Install uv manually
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
uv --version
- name: Download external renovate config - name: Download external renovate config
run: | run: |

View File

@@ -6,23 +6,28 @@
## [Unreleased] ## [Unreleased]
### Added ### Added
- Больше типов анимаций при открытии карточки игры (за подробностями в документацию) - Больше типов анимаций при открытии карточки игры (подробности см. в документации).
- Анимация при выходе из карточки игры (за подробностями в документацию) - Анимация при закрытии карточки игры (подробности см. в документации).
- Добавлен обработчик нажатий стрелок на клавиатуре в поле ввода (позволяет перемещаться между символами с помощью стрелок).
### Changed ### Changed
- Уменьшена длительность анимации открытия карточки с 800 до 350мс - Уменьшена длительность анимации открытия карточки с 800 до 350 мс.
- Контекстное меню при открытие теперь сразу фокусируется на первом элементе - Контекстное меню при открытии теперь сразу фокусируется на первом элементе.
- Анимации теперь можно настраивать через темы (за подробностями в документацию) - Анимации теперь можно настраивать через темы (подробности см. в документации).
- Общие json (steam_apps и anticheat_games) теперь перекачиваются если сломаны - Общие JSON-файлы (`steam_apps` и `anticheat_games`) теперь перекачиваются, если они повреждены.
- Временно удалена светлая тема - Временно удалена светлая тема.
- Добавление и удаление игр из Steam теперь не требует перезагрузки Steam - Добавление и удаление игр из Steam больше не требует перезапуска клиента.
- Обновлены все зависимости (затрагивает только AppImage).
- Удалён отдельный трей, так как у PortProton есть собственный.
### Fixed ### Fixed
- legendary list теперь не вызывается если вход в EGS не был произведён - `legendary list` теперь не вызывается, если вход в EGS не был выполнен.
- Скриншоты тем теперь не теряют в качестве при масштабе отличном от 100% - Скриншоты тем больше не теряют качество при масштабе, отличном от 100%.
- Данные от HLTB теперь не отображаются в карточке если нет данных о времени прохождения - Данные от HLTB теперь не отображаются в карточке, если нет информации о времени прохождения.
- Диалог добавления игры теперь не добавляет игру если exe не существует - Диалог добавления игры больше не добавляет игру, если `exe` не существует.
- Вкладки больше не переключаются стрелками, если фокус в поле ввода.
- Исправлено переключение слайдера: RT (Xbox) / R2 (PS), LT (Xbox) / L2 (PS).
- Переведен заголовок окна диалога выбора файлов.
### Contributors ### Contributors
- @Alex Smith - @Alex Smith
@@ -32,24 +37,24 @@
## [0.1.4] - 2025-07-21 ## [0.1.4] - 2025-07-21
### Added ### Added
- Переводы в переопределениях (за подробностями в документацию) - Переводы в переопределениях (подробности см. в документации).
- Обложки и описания для всех автоинсталлов - Обложки и описания для всех автоинсталлов.
- Возможность указать ссылку для скачивания обложки в диалоге добавления игры - Возможность указать ссылку для скачивания обложки в диалоге добавления игры.
- Интеграция с howlongtobeat.com - Интеграция с howlongtobeat.com.
### Changed ### Changed
- Оптимизированны обложки автоинсталлов - Оптимизированы обложки автоинсталлов.
- Папка custom_data исключена из сборки модуля для уменьшение его размера - Папка `custom_data` исключена из сборки модуля для уменьшения его размера.
- Бейдж PortProton теперь открывает PortProtonDB - Бейдж PortProton теперь открывает PortProtonDB.
- Отключено переключение полноэкранного режима через F11 или кнопку Select на геймпаде в gamescope сессии - Отключено переключение полноэкранного режима через F11 или кнопку Select на геймпаде в Gamescope-сессии.
- Удалён аргумент `--session` так как тестирование gamescope сессии завершено - Удалён аргумент `--session`, так как тестирование Gamescope-сессии завершено.
- В контекстном меню игр без exe файла теперь отображается только пункт "Удалить из PortProton" - В контекстном меню игр без exe-файла теперь отображается только пункт «Удалить из PortProton».
### Fixed ### Fixed
- Запрос к GitHub API при загрузке legendary теперь не игнорирует настройки прокси - Запрос к GitHub API при загрузке legendary теперь учитывает настройки прокси.
- Путь к portprotonqt-session-select в оверлее - Путь к `portprotonqt-session-select` в оверлее.
- Работа exiftool в AppImage - Работа `exiftool` в AppImage.
- Открытие контекстного меню у игр без exe - Открытие контекстного меню у игр без exe-файла.
### Contributors ### Contributors
- @Vector_null - @Vector_null
@@ -59,32 +64,32 @@
## [0.1.3] - 2025-07-05 ## [0.1.3] - 2025-07-05
### Added ### Added
- Аргумент `--session` для запуска приложения в gamescope (Исключительно в целях тестирования) - Аргумент `--session` для запуска приложения в Gamescope (исключительно в целях тестирования).
- Начальная поддержка EGS (Без EOS, скачивания игр и запуска игр из сторонних магазинов) - Начальная поддержка EGS (без EOS, скачивания и запуска игр из сторонних магазинов).
- Автодополнение bash для комманды portprotonqt - Автодополнение bash для команды `portprotonqt`.
- Поддержка геймпадов в диалоге выбора игры - Поддержка геймпадов в диалоге выбора игры.
- Быстрый запуск и остановка игры через контекстное меню - Быстрый запуск и остановка игры через контекстное меню.
- Иконки в контекстом меню - Иконки в контекстном меню.
- Обложки для части автоинсталлов - Обложки для части автоинсталлов.
### Changed ### Changed
- Удалены сборки для Fedora 40 - Удалены сборки для Fedora 40.
- Перенесены параметры анимации GameCard в `styles.py` с подробной документацией для поддержки кастомизации тем. - Параметры анимации GameCard перенесены в `styles.py` с подробной документацией для кастомизации тем.
- Статус выделения и наведения на карточки теперь взаимоисключают друг друга - Статусы выделения и наведения на карточки теперь взаимоисключающие.
- Все desktop файлы создаются с коментарием "Запустить игру {название} через PortProton" - Все desktop-файлы создаются с комментарием «Запустить игру {название} через PortProton».
- Заполнители в переводах теперь стали более осмысленными - Заполнители в переводах стали более осмысленными.
- Изменена компоновка диалога добавления игры для лучшего отображения в Gamescope - Изменена компоновка диалога добавления игры для лучшего отображения в Gamescope.
- Текст бейджей теперь обрезается через ... если не помещается - Текст бейджей теперь обрезается троеточием, если не помещается.
### Fixed ### Fixed
- Дублирование обводки выделения карточек при быстром перемешении мыши - Дублирование обводки карточек при быстром перемещении мыши.
- Завершение приложения при закритие окна - Завершение приложения при закрытии окна.
- Использование системной палитры в темах - Использование системной палитры в темах.
- Ошибки темы в нативном пакете - Ошибки тем в нативном пакете.
- Ошибки темы в Gamescope - Ошибки тем в Gamescope.
- Размер иконок для desktop файлов теперь 128x128 - Размер иконок для desktop-файлов теперь 128x128.
- Пустая область при обновлении сетки игр - Пустая область при обновлении сетки игр.
- Запуск игры при открытом оверлее - Запуск игры при открытом оверлее.
### Contributors ### Contributors
- @Dervart - @Dervart
@@ -95,63 +100,63 @@
## [0.1.2] - 2025-06-15 ## [0.1.2] - 2025-06-15
### Added ### Added
- Кнопки сброса настроек и очистки кэша - Кнопки сброса настроек и очистки кэша.
- Бейдж PortProton - Бейдж PortProton.
- Зависимость от `xdg-utils` - Зависимость от `xdg-utils`.
- Интеграция статуса WeAntiCheatYet в карточку - Интеграция статуса WeAntiCheatYet в карточку.
- Переключение полноэкршанного режима через F11 или кнопку Select на геймпаде - Переключение полноэкранного режима через F11 или кнопку Select на геймпаде.
- Выбор состояния `QCheckBox` через Enter или кнопку A на геймпаде - Выбор состояния `QCheckBox` через Enter или кнопку A на геймпаде.
- Закрытие диалога добавления игры через ESC или кнопку B на геймпаде - Закрытие диалога добавления игры через ESC или кнопку B на геймпаде.
- Закрытие окна приложения по комбинации клавиш Ctrl+Q - Закрытие приложения комбинацией клавиш Ctrl+Q.
- Сохранение и восстановление размера окна при перезапуске - Сохранение и восстановление размера окна при перезапуске.
- Переключатель полноэкранного режима приложения - Переключатель полноэкранного режима приложения.
- Пункт в контекстном меню «Открыть папку игры» - Пункт в контекстном меню «Открыть папку игры».
- Пункты в контекстном меню «Добавить в Steam» и «Удалить из Steam» - Пункты в контекстном меню «Добавить в Steam» и «Удалить из Steam».
- Пункты в контекстном меню «Добавить в Избранное» и «Удалить из Избранного» - Пункты в контекстном меню «Добавить в избранное» и «Удалить из избранного».
- Метод сортировки «Сначала избранное» - Метод сортировки «Сначала избранное».
- Настройка автоматического перехода в полноэкранный режим при подключении геймпада (по умолчанию отключена) - Настройка автоматического перехода в полноэкранный режим при подключении геймпада (по умолчанию отключена).
- Поддержка управления геймпадом в `QMenu` и `QComboBox` - Поддержка управления геймпадом в `QMenu` и `QComboBox`.
- Аргумент `--fullscreen` для запуска приложения в полноэкранном режиме - Аргумент `--fullscreen` для запуска приложения в полноэкранном режиме.
- Оверлей на кнопку Insert или кнопку Xbox/PS на геймпаде для закрытия приложения, выключения, перезагрузки и перехода в спящий режим или переключения между сессиями - Оверлей на кнопку Insert или Xbox/PS-кнопку на геймпаде для закрытия приложения, выключения, перезагрузки, перехода в спящий режим или переключения между сессиями.
- [Gamescope сессия](https://git.linux-gaming.ru/Boria138/gamescope-session-portprotonqt) - [Gamescope-сессия](https://git.linux-gaming.ru/Boria138/gamescope-session-portprotonqt).
- Пресеты управления для DualShock 4 и DualSense - Пресеты управления для DualShock 4 и DualSense.
- Настройка тактильной отдачи на геймпаде при запуске игры (по умолчанию выключена) - Настройка тактильной отдачи на геймпаде при запуске игры (по умолчанию отключена).
- Переводы пунктов настроек - Переводы пунктов настроек.
### Changed ### Changed
- Обновлены все иконки - Обновлены все иконки.
- Переименована функция `_get_steam_home` в `get_steam_home` - Функция `_get_steam_home` переименована в `get_steam_home`.
- Переименован `steam_game` в `game_source` - `steam_game` переименован в `game_source`.
- Логика контекстного меню вынесена в `ContextMenuManager` - Логика контекстного меню вынесена в `ContextMenuManager`.
- Бейдж Steam теперь открывает Steam Community - Бейдж Steam теперь открывает Steam Community.
- Изменена лицензия с MIT на GPL-3.0 для совместимости с кодом от legendary - Лицензия изменена с MIT на GPL-3.0 для совместимости с кодом legendary.
- Оптимизирована генерация карточек для плавной работы при поиске и изменении размера окна - Оптимизирована генерация карточек для плавной работы при поиске и изменении размера окна.
- Бейджи с карточек теперь отображаются также на странице с деталями, а не только в библиотеке - Бейджи с карточек теперь отображаются и на странице с деталями, а не только в библиотеке.
- Установлена ширина бейджа в две трети ширины карточки - Установлена ширина бейджа в 2/3 ширины карточки.
- Бейджи источников (`Steam`, `EGS`, `PortProton`) теперь отображаются только при активном фильтре `all` или `favorites` - Бейджи источников (`Steam`, `EGS`, `PortProton`) отображаются только при активном фильтре `all` или `favorites`.
- Карточки теперь фокусируются в направлении движения стрелок или D-pad: - Карточки теперь фокусируются в направлении движения стрелок или D-pad.
- Поддерживается удержание D-pad для непрерывного переключения карточек - Поддерживается удержание D-pad для непрерывного переключения карточек.
- Объединён обработчик управления стрелками клавиатуры и D-pad для консистентности - Объединён обработчик управления стрелками клавиатуры и D-pad для консистентности.
- D-pad больше не переключает вкладки (только кнопки RB/LB) - D-pad больше не переключает вкладки (только кнопки RB/LB).
- Кнопка добавления игры больше не фокусируется - Кнопка добавления игры больше не получает фокус.
- Диалог добавления игры теперь открывается только в библиотеке - Диалог добавления игры открывается только в библиотеке.
- Удалены все упоминания PortProtonQT из кода и заменены на PortProtonQt - Все упоминания PortProtonQT заменены на PortProtonQt.
- Размер карточек теперь меняется только при отпускании слайдера - Размер карточек меняется только при отпускании слайдера.
- Слайдер теперь управляется через тригеры на геймпаде - Слайдер теперь управляется триггерами на геймпаде.
- Диалог добавления игры теперь открывается на X, а не на Y - Диалог добавления игры теперь открывается на X, а не на Y.
### Fixed ### Fixed
- Возврат к теме «standard» при выборе несуществующей темы - Возврат к теме «standard» при выборе несуществующей темы.
- Корректное открытие контекстного меню - Корректное открытие контекстного меню.
- Запуск приложения при отсутствии `exiftool` - Запуск приложения при отсутствии `exiftool`.
- Предотвращено бесконечное обращение к `get_portproton_location` - Предотвращено бесконечное обращение к `get_portproton_location`.
- Обновлены ссылки на документацию в README - Обновлены ссылки на документацию в README.
- Устранён traceback при отсутствии обложек (placeholder) - Исправлено падение при отсутствии обложек (placeholder).
- Устранены утечки памяти при загрузке обложек - Устранены утечки памяти при загрузке обложек.
- Исправлены ошибки при подключении геймпада - Исправлены ошибки при подключении геймпада.
- Предотвращено многократное открытие диалога добавления игры через геймпад - Предотвращено многократное открытие диалога добавления игры через геймпад.
- Корректная обработка событий геймпада во время игры - Корректная обработка событий геймпада во время игры.
- Убийсво всех процессов "зомби" при закрытии программы - Убийство всех процессов-зомби при закрытии программы.
### Contributors ### Contributors
- @Vector_null - @Vector_null
@@ -162,20 +167,20 @@
## [0.1.1] 2025-05-17 ## [0.1.1] 2025-05-17
### Added ### Added
- Алфавитная сортировка библиотеки - Алфавитная сортировка библиотеки.
- Проверка переводов через yaspeller - Проверка переводов через yaspeller.
- Сборка Fedora-пакета - Сборка Fedora-пакета.
- Сборка AppImage - Сборка AppImage.
### Changed ### Changed
- Удалён жёстко заданный размер окна - Удалён жёстко заданный размер окна.
- Использован `icoextract` как Python-модуль - Использован `icoextract` как Python-модуль.
### Fixed ### Fixed
- Скрытие статус-бара - Скрытие статус-бара.
- Чтение списка Steam-игр - Чтение списка Steam-игр.
- Зависание GUI - Зависание GUI.
- Сбой при повреждённом Steam - Сбой при повреждённом Steam.
### Contributors ### Contributors
- @Vector_null - @Vector_null

View File

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

View File

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

View File

@@ -3,8 +3,7 @@ from PySide6.QtCore import QLocale, QTranslator, QLibraryInfo
from PySide6.QtWidgets import QApplication from PySide6.QtWidgets import QApplication
from PySide6.QtGui import QIcon from PySide6.QtGui import QIcon
from portprotonqt.main_window import MainWindow from portprotonqt.main_window import MainWindow
from portprotonqt.tray import SystemTray from portprotonqt.config_utils import save_fullscreen_config
from portprotonqt.config_utils import read_theme_from_config, save_fullscreen_config
from portprotonqt.logger import get_logger from portprotonqt.logger import get_logger
from portprotonqt.cli import parse_args from portprotonqt.cli import parse_args
@@ -38,35 +37,13 @@ def main():
save_fullscreen_config(True) save_fullscreen_config(True)
window.showFullScreen() window.showFullScreen()
current_theme_name = read_theme_from_config()
tray = SystemTray(app, current_theme_name)
tray.show_action.triggered.connect(window.show)
tray.hide_action.triggered.connect(window.hide)
def recreate_tray():
nonlocal tray
if tray:
logger.debug("Recreating system tray")
tray.cleanup()
tray = None
current_theme = read_theme_from_config()
tray = SystemTray(app, current_theme)
# Ensure window is not None before connecting signals
if window:
tray.show_action.triggered.connect(window.show)
tray.hide_action.triggered.connect(window.hide)
def cleanup_on_exit(): def cleanup_on_exit():
nonlocal tray, window nonlocal window
app.aboutToQuit.disconnect() app.aboutToQuit.disconnect()
if tray:
tray.cleanup()
tray = None
if window: if window:
window.close() window.close()
app.quit() app.quit()
window.settings_saved.connect(recreate_tray)
app.aboutToQuit.connect(cleanup_on_exit) app.aboutToQuit.connect(cleanup_on_exit)
window.show() window.show()

View File

@@ -150,7 +150,7 @@ class FileExplorer(QDialog):
def setup_ui(self): def setup_ui(self):
"""Настройка интерфейса""" """Настройка интерфейса"""
self.setWindowTitle("File Explorer") self.setWindowTitle(_("File Explorer"))
self.setGeometry(100, 100, 600, 600) self.setGeometry(100, 100, 600, 600)
self.main_layout = QVBoxLayout() self.main_layout = QVBoxLayout()

View File

@@ -188,7 +188,7 @@ class GameCard(QFrame):
self.egsLabel.setVisible(self.egs_visible) self.egsLabel.setVisible(self.egs_visible)
# PortProton бейдж # PortProton бейдж
portproton_icon = self.theme_manager.get_icon("ppqt-tray") portproton_icon = self.theme_manager.get_icon("portproton")
self.portprotonLabel = ClickableLabel( self.portprotonLabel = ClickableLabel(
"PortProton", "PortProton",
icon=portproton_icon, icon=portproton_icon,

View File

@@ -42,17 +42,17 @@ class MainWindowProtocol(Protocol):
# https://github.com/torvalds/linux/blob/master/drivers/hid/hid-playstation.c # https://github.com/torvalds/linux/blob/master/drivers/hid/hid-playstation.c
# https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c # https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c
BUTTONS = { BUTTONS = {
'confirm': {ecodes.BTN_SOUTH}, # A (Xbox) / Cross (PS) 'confirm': {ecodes.BTN_SOUTH}, # A (Xbox) / Cross (PS)
'back': {ecodes.BTN_EAST}, # B (Xbox) / Circle (PS) 'back': {ecodes.BTN_EAST}, # B (Xbox) / Circle (PS)
'add_game': {ecodes.BTN_NORTH}, # X (Xbox) / Triangle (PS) 'add_game': {ecodes.BTN_NORTH}, # X (Xbox) / Triangle (PS)
'prev_dir': {ecodes.BTN_WEST}, # Y (Xbox) / Square (PS) 'prev_dir': {ecodes.BTN_WEST}, # Y (Xbox) / Square (PS)
'prev_tab': {ecodes.BTN_TL}, # LB (Xbox) / L1 (PS) 'prev_tab': {ecodes.BTN_TL}, # LB (Xbox) / L1 (PS)
'next_tab': {ecodes.BTN_TR}, # RB (Xbox) / R1 (PS) 'next_tab': {ecodes.BTN_TR}, # RB (Xbox) / R1 (PS)
'context_menu': {ecodes.BTN_START}, # Start (Xbox) / Options (PS) 'context_menu': {ecodes.BTN_START}, # Start (Xbox) / Options (PS)
'menu': {ecodes.BTN_SELECT}, # Select (Xbox) / Share (PS) 'menu': {ecodes.BTN_SELECT}, # Select (Xbox) / Share (PS)
'guide': {ecodes.BTN_MODE}, # Xbox Button / PS Button 'guide': {ecodes.BTN_MODE}, # Xbox Button / PS Button
'increase_size': {ecodes.ABS_RZ}, # RT (Xbox) / R2 (PS) 'increase_size': {ecodes.BTN_TR2}, # RT (Xbox) / R2 (PS)
'decrease_size': {ecodes.ABS_Z}, # LT (Xbox) / L2 (PS) 'decrease_size': {ecodes.BTN_TL2}, # LT (Xbox) / L2 (PS)
} }
class InputManager(QObject): class InputManager(QObject):
@@ -754,6 +754,14 @@ class InputManager(QObject):
# Handle key press events # Handle key press events
if event.type() == QEvent.Type.KeyPress: if event.type() == QEvent.Type.KeyPress:
# Handle QLineEdit cursor movement with Left/Right arrows
if isinstance(focused, QLineEdit) and key in (Qt.Key.Key_Left, Qt.Key.Key_Right):
if key == Qt.Key.Key_Left:
focused.cursorBackward(False, 1) # Move cursor left by one character
elif key == Qt.Key.Key_Right:
focused.cursorForward(False, 1) # Move cursor right by one character
return True # Consume the event to prevent further processing
# Open system overlay with Insert # Open system overlay with Insert
if key == Qt.Key.Key_Insert: if key == Qt.Key.Key_Insert:
if not popup and not isinstance(active_win, QDialog): if not popup and not isinstance(active_win, QDialog):
@@ -765,6 +773,11 @@ class InputManager(QObject):
app.quit() app.quit()
return True return True
# Handle Backspace for FileExplorer navigation (move to parent directory)
if key == Qt.Key.Key_Backspace and self.file_explorer:
self.file_explorer.previous_dir()
return True
# Close AddGameDialog with Escape # Close AddGameDialog with Escape
if key == Qt.Key.Key_Escape and isinstance(popup, QDialog): if key == Qt.Key.Key_Escape and isinstance(popup, QDialog):
popup.reject() popup.reject()
@@ -783,8 +796,8 @@ class InputManager(QObject):
active_win.show_next() active_win.show_next()
return True # Consume event to prevent tab switching return True # Consume event to prevent tab switching
# Handle tab switching with Left/Right arrow keys when not in GameCard focus # Handle tab switching with Left/Right arrow keys when not in GameCard focus or QLineEdit
if key in (Qt.Key.Key_Left, Qt.Key.Key_Right) and (not isinstance(focused, GameCard) or focused is None): if key in (Qt.Key.Key_Left, Qt.Key.Key_Right) and (not isinstance(focused, GameCard | QLineEdit) or focused is None):
idx = self._parent.stackedWidget.currentIndex() idx = self._parent.stackedWidget.currentIndex()
total = len(self._parent.tabButtons) total = len(self._parent.tabButtons)
if key == Qt.Key.Key_Left: if key == Qt.Key.Key_Left:

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-14 13:16+0500\n" "POT-Creation-Date: 2025-08-23 20:35+0500\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"
@@ -26,6 +26,9 @@ msgstr ""
msgid "PortProton is not found" msgid "PortProton is not found"
msgstr "" msgstr ""
msgid "Delete from PortProton"
msgstr ""
msgid "Stop Game" msgid "Stop Game"
msgstr "" msgstr ""
@@ -65,9 +68,6 @@ msgstr ""
msgid "Edit Shortcut" msgid "Edit Shortcut"
msgstr "" msgstr ""
msgid "Delete from PortProton"
msgstr ""
#, python-brace-format #, python-brace-format
msgid "Stopped '{game_name}'" msgid "Stopped '{game_name}'"
msgstr "" msgstr ""
@@ -170,18 +170,6 @@ msgstr ""
msgid "No .desktop file found for '{game_name}'" msgid "No .desktop file found for '{game_name}'"
msgstr "" msgstr ""
#, python-brace-format
msgid "Invalid executable command: {exec_line}"
msgstr ""
#, python-brace-format
msgid "Executable not found: {path}"
msgstr ""
#, python-brace-format
msgid "Failed to parse executable: {error}"
msgstr ""
msgid "Confirm Deletion" msgid "Confirm Deletion"
msgstr "" msgstr ""
@@ -260,6 +248,9 @@ msgstr ""
msgid "Select All" msgid "Select All"
msgstr "" msgstr ""
msgid "File Explorer"
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-14 13:16+0500\n" "POT-Creation-Date: 2025-08-23 20:35+0500\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"
@@ -26,6 +26,9 @@ msgstr ""
msgid "PortProton is not found" msgid "PortProton is not found"
msgstr "" msgstr ""
msgid "Delete from PortProton"
msgstr ""
msgid "Stop Game" msgid "Stop Game"
msgstr "" msgstr ""
@@ -65,9 +68,6 @@ msgstr ""
msgid "Edit Shortcut" msgid "Edit Shortcut"
msgstr "" msgstr ""
msgid "Delete from PortProton"
msgstr ""
#, python-brace-format #, python-brace-format
msgid "Stopped '{game_name}'" msgid "Stopped '{game_name}'"
msgstr "" msgstr ""
@@ -170,18 +170,6 @@ msgstr ""
msgid "No .desktop file found for '{game_name}'" msgid "No .desktop file found for '{game_name}'"
msgstr "" msgstr ""
#, python-brace-format
msgid "Invalid executable command: {exec_line}"
msgstr ""
#, python-brace-format
msgid "Executable not found: {path}"
msgstr ""
#, python-brace-format
msgid "Failed to parse executable: {error}"
msgstr ""
msgid "Confirm Deletion" msgid "Confirm Deletion"
msgstr "" msgstr ""
@@ -260,6 +248,9 @@ msgstr ""
msgid "Select All" msgid "Select All"
msgstr "" msgstr ""
msgid "File Explorer"
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-14 13:16+0500\n" "POT-Creation-Date: 2025-08-23 20:35+0500\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"
@@ -24,6 +24,9 @@ msgstr ""
msgid "PortProton is not found" msgid "PortProton is not found"
msgstr "" msgstr ""
msgid "Delete from PortProton"
msgstr ""
msgid "Stop Game" msgid "Stop Game"
msgstr "" msgstr ""
@@ -63,9 +66,6 @@ msgstr ""
msgid "Edit Shortcut" msgid "Edit Shortcut"
msgstr "" msgstr ""
msgid "Delete from PortProton"
msgstr ""
#, python-brace-format #, python-brace-format
msgid "Stopped '{game_name}'" msgid "Stopped '{game_name}'"
msgstr "" msgstr ""
@@ -168,18 +168,6 @@ msgstr ""
msgid "No .desktop file found for '{game_name}'" msgid "No .desktop file found for '{game_name}'"
msgstr "" msgstr ""
#, python-brace-format
msgid "Invalid executable command: {exec_line}"
msgstr ""
#, python-brace-format
msgid "Executable not found: {path}"
msgstr ""
#, python-brace-format
msgid "Failed to parse executable: {error}"
msgstr ""
msgid "Confirm Deletion" msgid "Confirm Deletion"
msgstr "" msgstr ""
@@ -258,6 +246,9 @@ msgstr ""
msgid "Select All" msgid "Select All"
msgstr "" msgstr ""
msgid "File Explorer"
msgstr ""
msgid "Select" msgid "Select"
msgstr "" msgstr ""

View File

@@ -9,8 +9,8 @@ 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-14 13:16+0500\n" "POT-Creation-Date: 2025-08-23 20:35+0500\n"
"PO-Revision-Date: 2025-07-14 13:16+0500\n" "PO-Revision-Date: 2025-08-23 20:35+0500\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language: ru_RU\n" "Language: ru_RU\n"
"Language-Team: ru_RU <LL@li.org>\n" "Language-Team: ru_RU <LL@li.org>\n"
@@ -27,6 +27,9 @@ msgstr "Ошибка"
msgid "PortProton is not found" msgid "PortProton is not found"
msgstr "PortProton не найден" msgstr "PortProton не найден"
msgid "Delete from PortProton"
msgstr "Удалить из PortProton"
msgid "Stop Game" msgid "Stop Game"
msgstr "Остановить игру" msgstr "Остановить игру"
@@ -66,9 +69,6 @@ msgstr "Добавить в меню"
msgid "Edit Shortcut" msgid "Edit Shortcut"
msgstr "Редактировать" msgstr "Редактировать"
msgid "Delete from PortProton"
msgstr "Удалить из PortProton"
#, python-brace-format #, python-brace-format
msgid "Stopped '{game_name}'" msgid "Stopped '{game_name}'"
msgstr "Остановлен(а) '{game_name}'" msgstr "Остановлен(а) '{game_name}'"
@@ -173,18 +173,6 @@ msgstr "Не удалось прочитать файл .desktop: {error}"
msgid "No .desktop file found for '{game_name}'" msgid "No .desktop file found for '{game_name}'"
msgstr "Файл .desktop для '{game_name}' не найден" msgstr "Файл .desktop для '{game_name}' не найден"
#, python-brace-format
msgid "Invalid executable command: {exec_line}"
msgstr "Недопустимая исполняемая команда: {exec_line}"
#, python-brace-format
msgid "Executable not found: {path}"
msgstr "Исполняемый файл не найден: {path}"
#, python-brace-format
msgid "Failed to parse executable: {error}"
msgstr "Не удалось разобрать исполняемый файл: {error}"
msgid "Confirm Deletion" msgid "Confirm Deletion"
msgstr "Подтвердите удаление" msgstr "Подтвердите удаление"
@@ -267,6 +255,9 @@ msgstr "Удалить"
msgid "Select All" msgid "Select All"
msgstr "Выбрать всё" msgstr "Выбрать всё"
msgid "File Explorer"
msgstr "Проводник"
msgid "Select" msgid "Select"
msgstr "Выбрать" msgstr "Выбрать"

View File

@@ -48,7 +48,6 @@ logger = get_logger(__name__)
class MainWindow(QMainWindow): class MainWindow(QMainWindow):
"""Main window of PortProtonQt.""" """Main window of PortProtonQt."""
settings_saved = Signal()
games_loaded = Signal(list) games_loaded = Signal(list)
update_progress = Signal(int) # Signal to update progress bar update_progress = Signal(int) # Signal to update progress bar
update_status_message = Signal(str, int) # Signal to update status message update_status_message = Signal(str, int) # Signal to update status message
@@ -1331,7 +1330,6 @@ class MainWindow(QMainWindow):
self.settingsDebounceTimer.start() self.settingsDebounceTimer.start()
self.settings_saved.emit()
# Управление полноэкранным режимом # Управление полноэкранным режимом
gamepad_connected = self.input_manager.find_gamepad() is not None gamepad_connected = self.input_manager.find_gamepad() is not None
@@ -1676,7 +1674,7 @@ class MainWindow(QMainWindow):
egsLabel.setVisible(egs_visible) egsLabel.setVisible(egs_visible)
# PortProton badge # PortProton badge
portproton_icon = self.theme_manager.get_icon("ppqt-tray") portproton_icon = self.theme_manager.get_icon("portproton")
portprotonLabel = ClickableLabel( portprotonLabel = ClickableLabel(
"PortProton", "PortProton",
icon=portproton_icon, icon=portproton_icon,

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -1,49 +0,0 @@
from PySide6.QtGui import QAction, QIcon
from PySide6.QtWidgets import QSystemTrayIcon, QMenu
from portprotonqt.theme_manager import ThemeManager
from typing import cast
import portprotonqt.themes.standart.styles as default_styles
from portprotonqt.config_utils import read_theme_from_config
class SystemTray:
def __init__(self, app, theme=None):
self.app = app
self.theme_manager = ThemeManager()
self.theme = theme if theme is not None else default_styles
self.current_theme_name = read_theme_from_config()
self.tray = QSystemTrayIcon()
self.tray.setIcon(cast(QIcon, self.theme_manager.get_icon("ppqt-tray", self.current_theme_name)))
self.tray.setToolTip("PortProtonQt")
self.tray.setVisible(True)
# Создаём меню
self.menu = QMenu()
self.hide_action = QAction("Скрыть окно")
self.menu.addAction(self.hide_action)
self.show_action = QAction("Показать окно")
self.menu.addAction(self.show_action)
self.quit_action = QAction("Выход")
self.quit_action.triggered.connect(app.quit)
self.menu.addAction(self.quit_action)
self.tray.setContextMenu(self.menu)
def hide_tray(self):
"""Скрыть иконку трея"""
if self.tray:
self.tray.setVisible(False)
if self.menu:
self.menu.deleteLater()
self.menu = None
def cleanup(self):
"""Очистка ресурсов трея"""
if self.tray:
self.tray.setVisible(False)
self.tray = None
if self.menu:
self.menu.deleteLater()
self.menu = None