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
from PySide6.QtWidgets import QSystemTrayIcon, QMenu
from PySide6.QtGui import QIcon, QAction
from PySide6.QtCore import QTimer
from portprotonqt.logger import get_logger
from portprotonqt.theme_manager import ThemeManager
import portprotonqt.themes.standart.styles as default_styles
@@ -13,7 +14,7 @@ class TrayManager:
"""Модуль управления системным треем для PortProtonQt.
Обеспечивает:
- Показ/скрытие главного окна по клику на иконку трея.
- Показ/скрытие главного окна по двойному клику на иконку трея.
- Контекстное меню с опциями: Show/Hide (переключается в зависимости от состояния окна),
Favorites (быстрый запуск избранных игр), Recent Games (быстрый запуск недавних игр), Exit.
- Меню Favorites и Recent Games динамически заполняются при показе (через aboutToShow).
@@ -36,7 +37,7 @@ class TrayManager:
icon = QIcon()
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)
# Контекстное меню
@@ -70,6 +71,12 @@ class TrayManager:
# Флаг для принудительного выхода
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):
"""Update toggle_action text based on window visibility."""
if self.main_window.isVisible():
@@ -77,10 +84,22 @@ class TrayManager:
else:
self.toggle_action.setText(_("Show"))
def toggle_window(self, reason):
"""Переключает видимость окна по клику на иконку трея."""
def handle_tray_click(self, reason):
"""Обрабатывает клики по иконке трея, отслеживая двойной клик."""
if reason == QSystemTrayIcon.ActivationReason.Trigger:
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):
"""Toggle window visibility and update action text."""