hydrus/hydrus/client/gui/ClientGUISystemTray.py

253 lines
7.5 KiB
Python

import os
from qtpy import QtCore as QC
from qtpy import QtWidgets as QW
from qtpy import QtGui as QG
from hydrus.core import HydrusConstants as HC
from hydrus.core import HydrusGlobals as HG
from hydrus.client.gui import ClientGUIMenus
from hydrus.client.gui import QtPorting as QP
SystemTrayAvailable = QW.QSystemTrayIcon.isSystemTrayAvailable
class ClientSystemTrayIcon( QW.QSystemTrayIcon ):
flip_show_ui = QC.Signal()
flip_pause_network_jobs = QC.Signal()
flip_pause_subscription_jobs = QC.Signal()
highlight = QC.Signal()
exit_client = QC.Signal()
def __init__( self, parent: QW.QWidget ):
QW.QSystemTrayIcon.__init__( self, parent )
self._ui_is_currently_shown = True
self._should_always_show = False
self._network_traffic_paused = False
self._subscriptions_paused = False
self._show_hide_menu_item = None
self._network_traffic_menu_item = None
self._subscriptions_paused_menu_item = None
self._just_clicked_to_show = False
png_path = os.path.join( HC.STATIC_DIR, 'hydrus_non-transparent.png' )
self.setIcon( QG.QIcon( png_path ) )
self.activated.connect( self._ClickActivated )
self._RegenerateMenu()
def _ClickActivated( self, activation_reason ):
# if we click immediately, some users get frozen ui, I assume a mix-up with the icon being destroyed during the same click event or similar
QP.CallAfter( self._WasActivated, activation_reason )
def _RegenerateMenu( self ):
# I'm not a qwidget, but a qobject, so use my parent for this
parent_widget = self.parent()
new_menu = QW.QMenu( parent_widget )
self._show_hide_menu_item = ClientGUIMenus.AppendMenuItem( new_menu, 'show/hide', 'Hide or show the hydrus client', self.flip_show_ui.emit )
self._UpdateShowHideMenuItemLabel()
ClientGUIMenus.AppendSeparator( new_menu )
self._network_traffic_menu_item = ClientGUIMenus.AppendMenuItem( new_menu, 'network traffic', 'Pause/resume network traffic', self.flip_pause_network_jobs.emit )
self._UpdateNetworkTrafficMenuItemLabel()
self._subscriptions_paused_menu_item = ClientGUIMenus.AppendMenuItem( new_menu, 'subscriptions', 'Pause/resume subscriptions', self.flip_pause_subscription_jobs.emit )
self._UpdateSubscriptionsMenuItemLabel()
ClientGUIMenus.AppendSeparator( new_menu )
ClientGUIMenus.AppendMenuItem( new_menu, 'exit', 'Close the hydrus client', self.exit_client.emit )
#
old_menu = self.contextMenu()
self.setContextMenu( new_menu )
if old_menu is not None:
ClientGUIMenus.DestroyMenu( old_menu )
self._UpdateTooltip()
def _UpdateNetworkTrafficMenuItemLabel( self ):
label = 'unpause network traffic' if self._network_traffic_paused else 'pause network traffic'
self._network_traffic_menu_item.setText( label )
def _UpdateShowHideMenuItemLabel( self ):
label = 'hide' if self._ui_is_currently_shown else 'show'
self._show_hide_menu_item.setText( label )
def _UpdateShowSelf( self ) -> bool:
menu_regenerated = False
should_show = self._should_always_show or not self._ui_is_currently_shown
if should_show != self.isVisible():
self.setVisible( should_show )
if should_show:
# apparently context menu needs to be regenerated on re-show
self._RegenerateMenu()
menu_regenerated = True
return menu_regenerated
def _UpdateSubscriptionsMenuItemLabel( self ):
if self._subscriptions_paused_menu_item is not None:
label = 'unpause subscriptions' if self._subscriptions_paused else 'pause subscriptions'
self._subscriptions_paused_menu_item.setText( label )
def _UpdateTooltip( self ):
title = HG.client_controller.new_options.GetString( 'main_gui_title' )
if title is None or title == '':
title = 'hydrus client'
tooltip = title
if self._network_traffic_paused:
tooltip = '{} - network traffic paused'.format( tooltip )
if self._subscriptions_paused:
tooltip = '{} - subscriptions paused'.format( tooltip )
if self.toolTip != tooltip:
self.setToolTip( tooltip )
def _WasActivated( self, activation_reason ):
if not QP.isValid( self ):
return
if activation_reason in ( QW.QSystemTrayIcon.Unknown, QW.QSystemTrayIcon.Trigger ):
if self._ui_is_currently_shown:
self._just_clicked_to_show = False
self.highlight.emit()
else:
self._just_clicked_to_show = True
self.flip_show_ui.emit()
elif activation_reason in ( QW.QSystemTrayIcon.DoubleClick, QW.QSystemTrayIcon.MiddleClick ):
if activation_reason == QW.QSystemTrayIcon.DoubleClick and self._just_clicked_to_show:
return
self.flip_show_ui.emit()
def SetNetworkTrafficPaused( self, network_traffic_paused: bool ):
if network_traffic_paused != self._network_traffic_paused:
self._network_traffic_paused = network_traffic_paused
self._UpdateNetworkTrafficMenuItemLabel()
self._UpdateTooltip()
def SetSubscriptionsPaused( self, subscriptions_paused: bool ):
if subscriptions_paused != self._subscriptions_paused:
self._subscriptions_paused = subscriptions_paused
self._UpdateSubscriptionsMenuItemLabel()
self._UpdateTooltip()
def SetUIIsCurrentlyShown( self, ui_is_currently_shown: bool ):
if ui_is_currently_shown != self._ui_is_currently_shown:
self._ui_is_currently_shown = ui_is_currently_shown
menu_regenerated = self._UpdateShowSelf()
if not menu_regenerated:
self._UpdateShowHideMenuItemLabel()
if not self._ui_is_currently_shown:
self._just_clicked_to_show = False
def SetShouldAlwaysShow( self, should_always_show: bool ):
if should_always_show != self._should_always_show:
self._should_always_show = should_always_show
self._UpdateShowSelf()