feat(tray_manager): implement double-click to toggle main window visibility

Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
This commit is contained in:
2025-08-27 11:14:14 +05:00
parent 1ee784d890
commit 893e33bdce

View File

@@ -1,6 +1,7 @@
import sys import sys
from PySide6.QtWidgets import QSystemTrayIcon, QMenu from PySide6.QtWidgets import QSystemTrayIcon, QMenu
from PySide6.QtGui import QIcon, QAction from PySide6.QtGui import QIcon, QAction
from PySide6.QtCore import QTimer
from portprotonqt.logger import get_logger from portprotonqt.logger import get_logger
from portprotonqt.theme_manager import ThemeManager from portprotonqt.theme_manager import ThemeManager
import portprotonqt.themes.standart.styles as default_styles import portprotonqt.themes.standart.styles as default_styles
@@ -13,7 +14,7 @@ class TrayManager:
"""Модуль управления системным треем для PortProtonQt. """Модуль управления системным треем для PortProtonQt.
Обеспечивает: Обеспечивает:
- Показ/скрытие главного окна по клику на иконку трея. - Показ/скрытие главного окна по двойному клику на иконку трея.
- Контекстное меню с опциями: Show/Hide (переключается в зависимости от состояния окна), - Контекстное меню с опциями: Show/Hide (переключается в зависимости от состояния окна),
Favorites (быстрый запуск избранных игр), Recent Games (быстрый запуск недавних игр), Exit. Favorites (быстрый запуск избранных игр), Recent Games (быстрый запуск недавних игр), Exit.
- Меню Favorites и Recent Games динамически заполняются при показе (через aboutToShow). - Меню Favorites и Recent Games динамически заполняются при показе (через aboutToShow).
@@ -36,7 +37,7 @@ class TrayManager:
icon = QIcon() icon = QIcon()
self.tray_icon.setIcon(icon) self.tray_icon.setIcon(icon)
self.tray_icon.activated.connect(self.toggle_window) self.tray_icon.activated.connect(self.handle_tray_click)
self.tray_icon.setToolTip(self.app_name) self.tray_icon.setToolTip(self.app_name)
# Контекстное меню # Контекстное меню
@@ -70,6 +71,12 @@ class TrayManager:
# Флаг для принудительного выхода # Флаг для принудительного выхода
self.main_window.is_exiting = False self.main_window.is_exiting = False
# Переменные для отслеживания двойного клика
self.click_count = 0
self.click_timer = QTimer()
self.click_timer.setSingleShot(True)
self.click_timer.timeout.connect(self.reset_click_count)
def update_toggle_action(self): def update_toggle_action(self):
"""Update toggle_action text based on window visibility.""" """Update toggle_action text based on window visibility."""
if self.main_window.isVisible(): if self.main_window.isVisible():
@@ -77,10 +84,22 @@ class TrayManager:
else: else:
self.toggle_action.setText(_("Show")) self.toggle_action.setText(_("Show"))
def toggle_window(self, reason): def handle_tray_click(self, reason):
"""Переключает видимость окна по клику на иконку трея.""" """Обрабатывает клики по иконке трея, отслеживая двойной клик."""
if reason == QSystemTrayIcon.ActivationReason.Trigger: if reason == QSystemTrayIcon.ActivationReason.Trigger:
self.toggle_window_action() self.click_count += 1
if self.click_count == 1:
# Запускаем таймер для ожидания второго клика (300 мс - стандартное время для двойного клика)
self.click_timer.start(300)
elif self.click_count == 2:
# Двойной клик зафиксирован
self.click_timer.stop()
self.toggle_window_action()
self.click_count = 0
def reset_click_count(self):
"""Сбрасывает счетчик кликов, если таймер истек."""
self.click_count = 0
def toggle_window_action(self): def toggle_window_action(self):
"""Toggle window visibility and update action text.""" """Toggle window visibility and update action text."""