Compare commits
14 Commits
f0690f8811
...
uv-manual
Author | SHA1 | Date | |
---|---|---|---|
c74d209dbd
|
|||
5b257d3b62
|
|||
4dcf1dbe6d
|
|||
8d6fe4aa65
|
|||
022eb3f1e9
|
|||
11b847ed05
|
|||
1e4e0127a4
|
|||
c045aa7a56
|
|||
f18e7bae6b
|
|||
dcf8904037
|
|||
f9d24e385d
|
|||
09028931be
|
|||
0294c90c54
|
|||
17dfef2d27
|
@@ -22,10 +22,16 @@ jobs:
|
||||
steps:
|
||||
- uses: https://gitea.com/actions/checkout@v4
|
||||
|
||||
- name: Install uv
|
||||
uses: https://github.com/astral-sh/setup-uv@v6
|
||||
- name: Set up Node.js
|
||||
uses: https://gitea.com/actions/setup-node@v4
|
||||
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
|
||||
run: uv sync --all-extras --dev
|
||||
|
@@ -12,10 +12,16 @@ jobs:
|
||||
steps:
|
||||
- uses: https://gitea.com/actions/checkout@v4
|
||||
|
||||
- name: Install uv
|
||||
uses: https://github.com/astral-sh/setup-uv@v6
|
||||
- name: Set up Node.js
|
||||
uses: https://gitea.com/actions/setup-node@v4
|
||||
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
|
||||
run: |
|
||||
|
229
CHANGELOG.md
229
CHANGELOG.md
@@ -6,23 +6,28 @@
|
||||
## [Unreleased]
|
||||
|
||||
### Added
|
||||
- Больше типов анимаций при открытии карточки игры (за подробностями в документацию)
|
||||
- Анимация при выходе из карточки игры (за подробностями в документацию)
|
||||
- Больше типов анимаций при открытии карточки игры (подробности см. в документации).
|
||||
- Анимация при закрытии карточки игры (подробности см. в документации).
|
||||
- Добавлен обработчик нажатий стрелок на клавиатуре в поле ввода (позволяет перемещаться между символами с помощью стрелок).
|
||||
|
||||
### Changed
|
||||
- Уменьшена длительность анимации открытия карточки с 800 до 350мс
|
||||
- Контекстное меню при открытие теперь сразу фокусируется на первом элементе
|
||||
- Анимации теперь можно настраивать через темы (за подробностями в документацию)
|
||||
- Общие json (steam_apps и anticheat_games) теперь перекачиваются если сломаны
|
||||
- Временно удалена светлая тема
|
||||
- Добавление и удаление игр из Steam теперь не требует перезагрузки Steam
|
||||
- Уменьшена длительность анимации открытия карточки с 800 до 350 мс.
|
||||
- Контекстное меню при открытии теперь сразу фокусируется на первом элементе.
|
||||
- Анимации теперь можно настраивать через темы (подробности см. в документации).
|
||||
- Общие JSON-файлы (`steam_apps` и `anticheat_games`) теперь перекачиваются, если они повреждены.
|
||||
- Временно удалена светлая тема.
|
||||
- Добавление и удаление игр из Steam больше не требует перезапуска клиента.
|
||||
- Обновлены все зависимости (затрагивает только AppImage).
|
||||
- Удалён отдельный трей, так как у PortProton есть собственный.
|
||||
|
||||
### Fixed
|
||||
- legendary list теперь не вызывается если вход в EGS не был произведён
|
||||
- Скриншоты тем теперь не теряют в качестве при масштабе отличном от 100%
|
||||
- Данные от HLTB теперь не отображаются в карточке если нет данных о времени прохождения
|
||||
- Диалог добавления игры теперь не добавляет игру если exe не существует
|
||||
|
||||
- `legendary list` теперь не вызывается, если вход в EGS не был выполнен.
|
||||
- Скриншоты тем больше не теряют качество при масштабе, отличном от 100%.
|
||||
- Данные от HLTB теперь не отображаются в карточке, если нет информации о времени прохождения.
|
||||
- Диалог добавления игры больше не добавляет игру, если `exe` не существует.
|
||||
- Вкладки больше не переключаются стрелками, если фокус в поле ввода.
|
||||
- Исправлено переключение слайдера: RT (Xbox) / R2 (PS), LT (Xbox) / L2 (PS).
|
||||
- Переведен заголовок окна диалога выбора файлов.
|
||||
|
||||
### Contributors
|
||||
- @Alex Smith
|
||||
@@ -32,24 +37,24 @@
|
||||
## [0.1.4] - 2025-07-21
|
||||
|
||||
### Added
|
||||
- Переводы в переопределениях (за подробностями в документацию)
|
||||
- Обложки и описания для всех автоинсталлов
|
||||
- Возможность указать ссылку для скачивания обложки в диалоге добавления игры
|
||||
- Интеграция с howlongtobeat.com
|
||||
- Переводы в переопределениях (подробности см. в документации).
|
||||
- Обложки и описания для всех автоинсталлов.
|
||||
- Возможность указать ссылку для скачивания обложки в диалоге добавления игры.
|
||||
- Интеграция с howlongtobeat.com.
|
||||
|
||||
### Changed
|
||||
- Оптимизированны обложки автоинсталлов
|
||||
- Папка custom_data исключена из сборки модуля для уменьшение его размера
|
||||
- Бейдж PortProton теперь открывает PortProtonDB
|
||||
- Отключено переключение полноэкранного режима через F11 или кнопку Select на геймпаде в gamescope сессии
|
||||
- Удалён аргумент `--session` так как тестирование gamescope сессии завершено
|
||||
- В контекстном меню игр без exe файла теперь отображается только пункт "Удалить из PortProton"
|
||||
- Оптимизированы обложки автоинсталлов.
|
||||
- Папка `custom_data` исключена из сборки модуля для уменьшения его размера.
|
||||
- Бейдж PortProton теперь открывает PortProtonDB.
|
||||
- Отключено переключение полноэкранного режима через F11 или кнопку Select на геймпаде в Gamescope-сессии.
|
||||
- Удалён аргумент `--session`, так как тестирование Gamescope-сессии завершено.
|
||||
- В контекстном меню игр без exe-файла теперь отображается только пункт «Удалить из PortProton».
|
||||
|
||||
### Fixed
|
||||
- Запрос к GitHub API при загрузке legendary теперь не игнорирует настройки прокси
|
||||
- Путь к portprotonqt-session-select в оверлее
|
||||
- Работа exiftool в AppImage
|
||||
- Открытие контекстного меню у игр без exe
|
||||
- Запрос к GitHub API при загрузке legendary теперь учитывает настройки прокси.
|
||||
- Путь к `portprotonqt-session-select` в оверлее.
|
||||
- Работа `exiftool` в AppImage.
|
||||
- Открытие контекстного меню у игр без exe-файла.
|
||||
|
||||
### Contributors
|
||||
- @Vector_null
|
||||
@@ -59,32 +64,32 @@
|
||||
## [0.1.3] - 2025-07-05
|
||||
|
||||
### Added
|
||||
- Аргумент `--session` для запуска приложения в gamescope (Исключительно в целях тестирования)
|
||||
- Начальная поддержка EGS (Без EOS, скачивания игр и запуска игр из сторонних магазинов)
|
||||
- Автодополнение bash для комманды portprotonqt
|
||||
- Поддержка геймпадов в диалоге выбора игры
|
||||
- Быстрый запуск и остановка игры через контекстное меню
|
||||
- Иконки в контекстом меню
|
||||
- Обложки для части автоинсталлов
|
||||
- Аргумент `--session` для запуска приложения в Gamescope (исключительно в целях тестирования).
|
||||
- Начальная поддержка EGS (без EOS, скачивания и запуска игр из сторонних магазинов).
|
||||
- Автодополнение bash для команды `portprotonqt`.
|
||||
- Поддержка геймпадов в диалоге выбора игры.
|
||||
- Быстрый запуск и остановка игры через контекстное меню.
|
||||
- Иконки в контекстном меню.
|
||||
- Обложки для части автоинсталлов.
|
||||
|
||||
### Changed
|
||||
- Удалены сборки для Fedora 40
|
||||
- Перенесены параметры анимации GameCard в `styles.py` с подробной документацией для поддержки кастомизации тем.
|
||||
- Статус выделения и наведения на карточки теперь взаимоисключают друг друга
|
||||
- Все desktop файлы создаются с коментарием "Запустить игру {название} через PortProton"
|
||||
- Заполнители в переводах теперь стали более осмысленными
|
||||
- Изменена компоновка диалога добавления игры для лучшего отображения в Gamescope
|
||||
- Текст бейджей теперь обрезается через ... если не помещается
|
||||
- Удалены сборки для Fedora 40.
|
||||
- Параметры анимации GameCard перенесены в `styles.py` с подробной документацией для кастомизации тем.
|
||||
- Статусы выделения и наведения на карточки теперь взаимоисключающие.
|
||||
- Все desktop-файлы создаются с комментарием «Запустить игру {название} через PortProton».
|
||||
- Заполнители в переводах стали более осмысленными.
|
||||
- Изменена компоновка диалога добавления игры для лучшего отображения в Gamescope.
|
||||
- Текст бейджей теперь обрезается троеточием, если не помещается.
|
||||
|
||||
### Fixed
|
||||
- Дублирование обводки выделения карточек при быстром перемешении мыши
|
||||
- Завершение приложения при закритие окна
|
||||
- Использование системной палитры в темах
|
||||
- Ошибки темы в нативном пакете
|
||||
- Ошибки темы в Gamescope
|
||||
- Размер иконок для desktop файлов теперь 128x128
|
||||
- Пустая область при обновлении сетки игр
|
||||
- Запуск игры при открытом оверлее
|
||||
- Дублирование обводки карточек при быстром перемещении мыши.
|
||||
- Завершение приложения при закрытии окна.
|
||||
- Использование системной палитры в темах.
|
||||
- Ошибки тем в нативном пакете.
|
||||
- Ошибки тем в Gamescope.
|
||||
- Размер иконок для desktop-файлов теперь 128x128.
|
||||
- Пустая область при обновлении сетки игр.
|
||||
- Запуск игры при открытом оверлее.
|
||||
|
||||
### Contributors
|
||||
- @Dervart
|
||||
@@ -95,63 +100,63 @@
|
||||
## [0.1.2] - 2025-06-15
|
||||
|
||||
### Added
|
||||
- Кнопки сброса настроек и очистки кэша
|
||||
- Бейдж PortProton
|
||||
- Зависимость от `xdg-utils`
|
||||
- Интеграция статуса WeAntiCheatYet в карточку
|
||||
- Переключение полноэкршанного режима через F11 или кнопку Select на геймпаде
|
||||
- Выбор состояния `QCheckBox` через Enter или кнопку A на геймпаде
|
||||
- Закрытие диалога добавления игры через ESC или кнопку B на геймпаде
|
||||
- Закрытие окна приложения по комбинации клавиш Ctrl+Q
|
||||
- Сохранение и восстановление размера окна при перезапуске
|
||||
- Переключатель полноэкранного режима приложения
|
||||
- Пункт в контекстном меню «Открыть папку игры»
|
||||
- Пункты в контекстном меню «Добавить в Steam» и «Удалить из Steam»
|
||||
- Пункты в контекстном меню «Добавить в Избранное» и «Удалить из Избранного»
|
||||
- Метод сортировки «Сначала избранное»
|
||||
- Настройка автоматического перехода в полноэкранный режим при подключении геймпада (по умолчанию отключена)
|
||||
- Поддержка управления геймпадом в `QMenu` и `QComboBox`
|
||||
- Аргумент `--fullscreen` для запуска приложения в полноэкранном режиме
|
||||
- Оверлей на кнопку Insert или кнопку Xbox/PS на геймпаде для закрытия приложения, выключения, перезагрузки и перехода в спящий режим или переключения между сессиями
|
||||
- [Gamescope сессия](https://git.linux-gaming.ru/Boria138/gamescope-session-portprotonqt)
|
||||
- Пресеты управления для DualShock 4 и DualSense
|
||||
- Настройка тактильной отдачи на геймпаде при запуске игры (по умолчанию выключена)
|
||||
- Переводы пунктов настроек
|
||||
- Кнопки сброса настроек и очистки кэша.
|
||||
- Бейдж PortProton.
|
||||
- Зависимость от `xdg-utils`.
|
||||
- Интеграция статуса WeAntiCheatYet в карточку.
|
||||
- Переключение полноэкранного режима через F11 или кнопку Select на геймпаде.
|
||||
- Выбор состояния `QCheckBox` через Enter или кнопку A на геймпаде.
|
||||
- Закрытие диалога добавления игры через ESC или кнопку B на геймпаде.
|
||||
- Закрытие приложения комбинацией клавиш Ctrl+Q.
|
||||
- Сохранение и восстановление размера окна при перезапуске.
|
||||
- Переключатель полноэкранного режима приложения.
|
||||
- Пункт в контекстном меню «Открыть папку игры».
|
||||
- Пункты в контекстном меню «Добавить в Steam» и «Удалить из Steam».
|
||||
- Пункты в контекстном меню «Добавить в избранное» и «Удалить из избранного».
|
||||
- Метод сортировки «Сначала избранное».
|
||||
- Настройка автоматического перехода в полноэкранный режим при подключении геймпада (по умолчанию отключена).
|
||||
- Поддержка управления геймпадом в `QMenu` и `QComboBox`.
|
||||
- Аргумент `--fullscreen` для запуска приложения в полноэкранном режиме.
|
||||
- Оверлей на кнопку Insert или Xbox/PS-кнопку на геймпаде для закрытия приложения, выключения, перезагрузки, перехода в спящий режим или переключения между сессиями.
|
||||
- [Gamescope-сессия](https://git.linux-gaming.ru/Boria138/gamescope-session-portprotonqt).
|
||||
- Пресеты управления для DualShock 4 и DualSense.
|
||||
- Настройка тактильной отдачи на геймпаде при запуске игры (по умолчанию отключена).
|
||||
- Переводы пунктов настроек.
|
||||
|
||||
### Changed
|
||||
- Обновлены все иконки
|
||||
- Переименована функция `_get_steam_home` в `get_steam_home`
|
||||
- Переименован `steam_game` в `game_source`
|
||||
- Логика контекстного меню вынесена в `ContextMenuManager`
|
||||
- Бейдж Steam теперь открывает Steam Community
|
||||
- Изменена лицензия с MIT на GPL-3.0 для совместимости с кодом от legendary
|
||||
- Оптимизирована генерация карточек для плавной работы при поиске и изменении размера окна
|
||||
- Бейджи с карточек теперь отображаются также на странице с деталями, а не только в библиотеке
|
||||
- Установлена ширина бейджа в две трети ширины карточки
|
||||
- Бейджи источников (`Steam`, `EGS`, `PortProton`) теперь отображаются только при активном фильтре `all` или `favorites`
|
||||
- Карточки теперь фокусируются в направлении движения стрелок или D-pad:
|
||||
- Поддерживается удержание D-pad для непрерывного переключения карточек
|
||||
- Объединён обработчик управления стрелками клавиатуры и D-pad для консистентности
|
||||
- D-pad больше не переключает вкладки (только кнопки RB/LB)
|
||||
- Кнопка добавления игры больше не фокусируется
|
||||
- Диалог добавления игры теперь открывается только в библиотеке
|
||||
- Удалены все упоминания PortProtonQT из кода и заменены на PortProtonQt
|
||||
- Размер карточек теперь меняется только при отпускании слайдера
|
||||
- Слайдер теперь управляется через тригеры на геймпаде
|
||||
- Диалог добавления игры теперь открывается на X, а не на Y
|
||||
- Обновлены все иконки.
|
||||
- Функция `_get_steam_home` переименована в `get_steam_home`.
|
||||
- `steam_game` переименован в `game_source`.
|
||||
- Логика контекстного меню вынесена в `ContextMenuManager`.
|
||||
- Бейдж Steam теперь открывает Steam Community.
|
||||
- Лицензия изменена с MIT на GPL-3.0 для совместимости с кодом legendary.
|
||||
- Оптимизирована генерация карточек для плавной работы при поиске и изменении размера окна.
|
||||
- Бейджи с карточек теперь отображаются и на странице с деталями, а не только в библиотеке.
|
||||
- Установлена ширина бейджа в 2/3 ширины карточки.
|
||||
- Бейджи источников (`Steam`, `EGS`, `PortProton`) отображаются только при активном фильтре `all` или `favorites`.
|
||||
- Карточки теперь фокусируются в направлении движения стрелок или D-pad.
|
||||
- Поддерживается удержание D-pad для непрерывного переключения карточек.
|
||||
- Объединён обработчик управления стрелками клавиатуры и D-pad для консистентности.
|
||||
- D-pad больше не переключает вкладки (только кнопки RB/LB).
|
||||
- Кнопка добавления игры больше не получает фокус.
|
||||
- Диалог добавления игры открывается только в библиотеке.
|
||||
- Все упоминания PortProtonQT заменены на PortProtonQt.
|
||||
- Размер карточек меняется только при отпускании слайдера.
|
||||
- Слайдер теперь управляется триггерами на геймпаде.
|
||||
- Диалог добавления игры теперь открывается на X, а не на Y.
|
||||
|
||||
### Fixed
|
||||
- Возврат к теме «standard» при выборе несуществующей темы
|
||||
- Корректное открытие контекстного меню
|
||||
- Запуск приложения при отсутствии `exiftool`
|
||||
- Предотвращено бесконечное обращение к `get_portproton_location`
|
||||
- Обновлены ссылки на документацию в README
|
||||
- Устранён traceback при отсутствии обложек (placeholder)
|
||||
- Устранены утечки памяти при загрузке обложек
|
||||
- Исправлены ошибки при подключении геймпада
|
||||
- Предотвращено многократное открытие диалога добавления игры через геймпад
|
||||
- Корректная обработка событий геймпада во время игры
|
||||
- Убийсво всех процессов "зомби" при закрытии программы
|
||||
- Возврат к теме «standard» при выборе несуществующей темы.
|
||||
- Корректное открытие контекстного меню.
|
||||
- Запуск приложения при отсутствии `exiftool`.
|
||||
- Предотвращено бесконечное обращение к `get_portproton_location`.
|
||||
- Обновлены ссылки на документацию в README.
|
||||
- Исправлено падение при отсутствии обложек (placeholder).
|
||||
- Устранены утечки памяти при загрузке обложек.
|
||||
- Исправлены ошибки при подключении геймпада.
|
||||
- Предотвращено многократное открытие диалога добавления игры через геймпад.
|
||||
- Корректная обработка событий геймпада во время игры.
|
||||
- Убийство всех процессов-зомби при закрытии программы.
|
||||
|
||||
### Contributors
|
||||
- @Vector_null
|
||||
@@ -162,20 +167,20 @@
|
||||
## [0.1.1] – 2025-05-17
|
||||
|
||||
### Added
|
||||
- Алфавитная сортировка библиотеки
|
||||
- Проверка переводов через yaspeller
|
||||
- Сборка Fedora-пакета
|
||||
- Сборка AppImage
|
||||
- Алфавитная сортировка библиотеки.
|
||||
- Проверка переводов через yaspeller.
|
||||
- Сборка Fedora-пакета.
|
||||
- Сборка AppImage.
|
||||
|
||||
### Changed
|
||||
- Удалён жёстко заданный размер окна
|
||||
- Использован `icoextract` как Python-модуль
|
||||
- Удалён жёстко заданный размер окна.
|
||||
- Использован `icoextract` как Python-модуль.
|
||||
|
||||
### Fixed
|
||||
- Скрытие статус-бара
|
||||
- Чтение списка Steam-игр
|
||||
- Зависание GUI
|
||||
- Сбой при повреждённом Steam
|
||||
- Скрытие статус-бара.
|
||||
- Чтение списка Steam-игр.
|
||||
- Зависание GUI.
|
||||
- Сбой при повреждённом Steam.
|
||||
|
||||
### Contributors
|
||||
- @Vector_null
|
||||
|
@@ -21,9 +21,9 @@ Current translation status:
|
||||
|
||||
| Locale | Progress | Translated |
|
||||
| :----- | -------: | ---------: |
|
||||
| [de_DE](./de_DE/LC_MESSAGES/messages.po) | 0% | 0 of 197 |
|
||||
| [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 of 197 |
|
||||
| [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 197 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 195 |
|
||||
| [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 195 of 195 |
|
||||
|
||||
---
|
||||
|
||||
|
@@ -21,9 +21,9 @@
|
||||
|
||||
| Локаль | Прогресс | Переведено |
|
||||
| :----- | -------: | ---------: |
|
||||
| [de_DE](./de_DE/LC_MESSAGES/messages.po) | 0% | 0 из 197 |
|
||||
| [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 из 197 |
|
||||
| [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 197 из 197 |
|
||||
| [de_DE](./de_DE/LC_MESSAGES/messages.po) | 0% | 0 из 195 |
|
||||
| [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 из 195 |
|
||||
| [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 195 из 195 |
|
||||
|
||||
---
|
||||
|
||||
|
@@ -3,8 +3,7 @@ from PySide6.QtCore import QLocale, QTranslator, QLibraryInfo
|
||||
from PySide6.QtWidgets import QApplication
|
||||
from PySide6.QtGui import QIcon
|
||||
from portprotonqt.main_window import MainWindow
|
||||
from portprotonqt.tray import SystemTray
|
||||
from portprotonqt.config_utils import read_theme_from_config, save_fullscreen_config
|
||||
from portprotonqt.config_utils import save_fullscreen_config
|
||||
from portprotonqt.logger import get_logger
|
||||
from portprotonqt.cli import parse_args
|
||||
|
||||
@@ -38,35 +37,13 @@ def main():
|
||||
save_fullscreen_config(True)
|
||||
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():
|
||||
nonlocal tray, window
|
||||
nonlocal window
|
||||
app.aboutToQuit.disconnect()
|
||||
if tray:
|
||||
tray.cleanup()
|
||||
tray = None
|
||||
if window:
|
||||
window.close()
|
||||
app.quit()
|
||||
|
||||
window.settings_saved.connect(recreate_tray)
|
||||
app.aboutToQuit.connect(cleanup_on_exit)
|
||||
|
||||
window.show()
|
||||
|
@@ -150,7 +150,7 @@ class FileExplorer(QDialog):
|
||||
|
||||
def setup_ui(self):
|
||||
"""Настройка интерфейса"""
|
||||
self.setWindowTitle("File Explorer")
|
||||
self.setWindowTitle(_("File Explorer"))
|
||||
self.setGeometry(100, 100, 600, 600)
|
||||
|
||||
self.main_layout = QVBoxLayout()
|
||||
|
@@ -188,7 +188,7 @@ class GameCard(QFrame):
|
||||
self.egsLabel.setVisible(self.egs_visible)
|
||||
|
||||
# PortProton бейдж
|
||||
portproton_icon = self.theme_manager.get_icon("ppqt-tray")
|
||||
portproton_icon = self.theme_manager.get_icon("portproton")
|
||||
self.portprotonLabel = ClickableLabel(
|
||||
"PortProton",
|
||||
icon=portproton_icon,
|
||||
|
@@ -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/input/joystick/xpad.c
|
||||
BUTTONS = {
|
||||
'confirm': {ecodes.BTN_SOUTH}, # A (Xbox) / Cross (PS)
|
||||
'back': {ecodes.BTN_EAST}, # B (Xbox) / Circle (PS)
|
||||
'add_game': {ecodes.BTN_NORTH}, # X (Xbox) / Triangle (PS)
|
||||
'prev_dir': {ecodes.BTN_WEST}, # Y (Xbox) / Square (PS)
|
||||
'prev_tab': {ecodes.BTN_TL}, # LB (Xbox) / L1 (PS)
|
||||
'next_tab': {ecodes.BTN_TR}, # RB (Xbox) / R1 (PS)
|
||||
'context_menu': {ecodes.BTN_START}, # Start (Xbox) / Options (PS)
|
||||
'menu': {ecodes.BTN_SELECT}, # Select (Xbox) / Share (PS)
|
||||
'guide': {ecodes.BTN_MODE}, # Xbox Button / PS Button
|
||||
'increase_size': {ecodes.ABS_RZ}, # RT (Xbox) / R2 (PS)
|
||||
'decrease_size': {ecodes.ABS_Z}, # LT (Xbox) / L2 (PS)
|
||||
'confirm': {ecodes.BTN_SOUTH}, # A (Xbox) / Cross (PS)
|
||||
'back': {ecodes.BTN_EAST}, # B (Xbox) / Circle (PS)
|
||||
'add_game': {ecodes.BTN_NORTH}, # X (Xbox) / Triangle (PS)
|
||||
'prev_dir': {ecodes.BTN_WEST}, # Y (Xbox) / Square (PS)
|
||||
'prev_tab': {ecodes.BTN_TL}, # LB (Xbox) / L1 (PS)
|
||||
'next_tab': {ecodes.BTN_TR}, # RB (Xbox) / R1 (PS)
|
||||
'context_menu': {ecodes.BTN_START}, # Start (Xbox) / Options (PS)
|
||||
'menu': {ecodes.BTN_SELECT}, # Select (Xbox) / Share (PS)
|
||||
'guide': {ecodes.BTN_MODE}, # Xbox Button / PS Button
|
||||
'increase_size': {ecodes.BTN_TR2}, # RT (Xbox) / R2 (PS)
|
||||
'decrease_size': {ecodes.BTN_TL2}, # LT (Xbox) / L2 (PS)
|
||||
}
|
||||
|
||||
class InputManager(QObject):
|
||||
@@ -754,6 +754,14 @@ class InputManager(QObject):
|
||||
|
||||
# Handle key press events
|
||||
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
|
||||
if key == Qt.Key.Key_Insert:
|
||||
if not popup and not isinstance(active_win, QDialog):
|
||||
@@ -765,6 +773,11 @@ class InputManager(QObject):
|
||||
app.quit()
|
||||
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
|
||||
if key == Qt.Key.Key_Escape and isinstance(popup, QDialog):
|
||||
popup.reject()
|
||||
@@ -783,8 +796,8 @@ class InputManager(QObject):
|
||||
active_win.show_next()
|
||||
return True # Consume event to prevent tab switching
|
||||
|
||||
# Handle tab switching with Left/Right arrow keys when not in GameCard focus
|
||||
if key in (Qt.Key.Key_Left, Qt.Key.Key_Right) and (not isinstance(focused, GameCard) or focused is None):
|
||||
# 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 | QLineEdit) or focused is None):
|
||||
idx = self._parent.stackedWidget.currentIndex()
|
||||
total = len(self._parent.tabButtons)
|
||||
if key == Qt.Key.Key_Left:
|
||||
|
Binary file not shown.
@@ -9,7 +9,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\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"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language: de_DE\n"
|
||||
@@ -26,6 +26,9 @@ msgstr ""
|
||||
msgid "PortProton is not found"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete from PortProton"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stop Game"
|
||||
msgstr ""
|
||||
|
||||
@@ -65,9 +68,6 @@ msgstr ""
|
||||
msgid "Edit Shortcut"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete from PortProton"
|
||||
msgstr ""
|
||||
|
||||
#, python-brace-format
|
||||
msgid "Stopped '{game_name}'"
|
||||
msgstr ""
|
||||
@@ -170,18 +170,6 @@ msgstr ""
|
||||
msgid "No .desktop file found for '{game_name}'"
|
||||
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"
|
||||
msgstr ""
|
||||
|
||||
@@ -260,6 +248,9 @@ msgstr ""
|
||||
msgid "Select All"
|
||||
msgstr ""
|
||||
|
||||
msgid "File Explorer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select"
|
||||
msgstr ""
|
||||
|
||||
|
Binary file not shown.
@@ -9,7 +9,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\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"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language: es_ES\n"
|
||||
@@ -26,6 +26,9 @@ msgstr ""
|
||||
msgid "PortProton is not found"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete from PortProton"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stop Game"
|
||||
msgstr ""
|
||||
|
||||
@@ -65,9 +68,6 @@ msgstr ""
|
||||
msgid "Edit Shortcut"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete from PortProton"
|
||||
msgstr ""
|
||||
|
||||
#, python-brace-format
|
||||
msgid "Stopped '{game_name}'"
|
||||
msgstr ""
|
||||
@@ -170,18 +170,6 @@ msgstr ""
|
||||
msgid "No .desktop file found for '{game_name}'"
|
||||
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"
|
||||
msgstr ""
|
||||
|
||||
@@ -260,6 +248,9 @@ msgstr ""
|
||||
msgid "Select All"
|
||||
msgstr ""
|
||||
|
||||
msgid "File Explorer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select"
|
||||
msgstr ""
|
||||
|
||||
|
@@ -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-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"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -24,6 +24,9 @@ msgstr ""
|
||||
msgid "PortProton is not found"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete from PortProton"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stop Game"
|
||||
msgstr ""
|
||||
|
||||
@@ -63,9 +66,6 @@ msgstr ""
|
||||
msgid "Edit Shortcut"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete from PortProton"
|
||||
msgstr ""
|
||||
|
||||
#, python-brace-format
|
||||
msgid "Stopped '{game_name}'"
|
||||
msgstr ""
|
||||
@@ -168,18 +168,6 @@ msgstr ""
|
||||
msgid "No .desktop file found for '{game_name}'"
|
||||
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"
|
||||
msgstr ""
|
||||
|
||||
@@ -258,6 +246,9 @@ msgstr ""
|
||||
msgid "Select All"
|
||||
msgstr ""
|
||||
|
||||
msgid "File Explorer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select"
|
||||
msgstr ""
|
||||
|
||||
|
Binary file not shown.
@@ -9,8 +9,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2025-07-14 13:16+0500\n"
|
||||
"PO-Revision-Date: 2025-07-14 13:16+0500\n"
|
||||
"POT-Creation-Date: 2025-08-23 20:35+0500\n"
|
||||
"PO-Revision-Date: 2025-08-23 20:35+0500\n"
|
||||
"Last-Translator: \n"
|
||||
"Language: ru_RU\n"
|
||||
"Language-Team: ru_RU <LL@li.org>\n"
|
||||
@@ -27,6 +27,9 @@ msgstr "Ошибка"
|
||||
msgid "PortProton is not found"
|
||||
msgstr "PortProton не найден"
|
||||
|
||||
msgid "Delete from PortProton"
|
||||
msgstr "Удалить из PortProton"
|
||||
|
||||
msgid "Stop Game"
|
||||
msgstr "Остановить игру"
|
||||
|
||||
@@ -66,9 +69,6 @@ msgstr "Добавить в меню"
|
||||
msgid "Edit Shortcut"
|
||||
msgstr "Редактировать"
|
||||
|
||||
msgid "Delete from PortProton"
|
||||
msgstr "Удалить из PortProton"
|
||||
|
||||
#, python-brace-format
|
||||
msgid "Stopped '{game_name}'"
|
||||
msgstr "Остановлен(а) '{game_name}'"
|
||||
@@ -173,18 +173,6 @@ msgstr "Не удалось прочитать файл .desktop: {error}"
|
||||
msgid "No .desktop file found for '{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"
|
||||
msgstr "Подтвердите удаление"
|
||||
|
||||
@@ -267,6 +255,9 @@ msgstr "Удалить"
|
||||
msgid "Select All"
|
||||
msgstr "Выбрать всё"
|
||||
|
||||
msgid "File Explorer"
|
||||
msgstr "Проводник"
|
||||
|
||||
msgid "Select"
|
||||
msgstr "Выбрать"
|
||||
|
||||
|
@@ -48,7 +48,6 @@ logger = get_logger(__name__)
|
||||
|
||||
class MainWindow(QMainWindow):
|
||||
"""Main window of PortProtonQt."""
|
||||
settings_saved = Signal()
|
||||
games_loaded = Signal(list)
|
||||
update_progress = Signal(int) # Signal to update progress bar
|
||||
update_status_message = Signal(str, int) # Signal to update status message
|
||||
@@ -1331,7 +1330,6 @@ class MainWindow(QMainWindow):
|
||||
|
||||
self.settingsDebounceTimer.start()
|
||||
|
||||
self.settings_saved.emit()
|
||||
|
||||
# Управление полноэкранным режимом
|
||||
gamepad_connected = self.input_manager.find_gamepad() is not None
|
||||
@@ -1676,7 +1674,7 @@ class MainWindow(QMainWindow):
|
||||
egsLabel.setVisible(egs_visible)
|
||||
|
||||
# PortProton badge
|
||||
portproton_icon = self.theme_manager.get_icon("ppqt-tray")
|
||||
portproton_icon = self.theme_manager.get_icon("portproton")
|
||||
portprotonLabel = ClickableLabel(
|
||||
"PortProton",
|
||||
icon=portproton_icon,
|
||||
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
@@ -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
|
Reference in New Issue
Block a user