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:
|
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
|
||||||
|
@@ -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: |
|
||||||
|
229
CHANGELOG.md
229
CHANGELOG.md
@@ -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
|
||||||
|
@@ -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 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@@ -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 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@@ -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()
|
||||||
|
@@ -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()
|
||||||
|
@@ -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,
|
||||||
|
@@ -51,8 +51,8 @@ BUTTONS = {
|
|||||||
'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:
|
||||||
|
Binary file not shown.
@@ -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 ""
|
||||||
|
|
||||||
|
Binary file not shown.
@@ -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 ""
|
||||||
|
|
||||||
|
@@ -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 ""
|
||||||
|
|
||||||
|
Binary file not shown.
@@ -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 "Выбрать"
|
||||||
|
|
||||||
|
@@ -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,
|
||||||
|
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