toxygen/toxygen/ui/tray.py

112 lines
3.6 KiB
Python

from PyQt5 import QtWidgets, QtGui, QtCore
from utils.ui import tr
from utils.util import *
from ui.password_screen import UnlockAppScreen
import os.path
class SystemTrayIcon(QtWidgets.QSystemTrayIcon):
leftClicked = QtCore.pyqtSignal()
def __init__(self, icon, parent=None):
super().__init__(icon, parent)
self.activated.connect(self.icon_activated)
def icon_activated(self, reason):
if reason == QtWidgets.QSystemTrayIcon.Trigger:
self.leftClicked.emit()
class Menu(QtWidgets.QMenu):
def __init__(self, settings, profile, *args):
super().__init__(*args)
self._settings = settings
self._profile = profile
def new_status(self, status):
if not self._settings.locked:
self._profile.set_status(status)
self.about_to_show_handler()
self.hide()
def about_to_show_handler(self):
status = self._profile.status
act = self.act
if status is None or self._settings.locked:
self.actions()[1].setVisible(False)
else:
self.actions()[1].setVisible(True)
act.actions()[0].setChecked(False)
act.actions()[1].setChecked(False)
act.actions()[2].setChecked(False)
act.actions()[status].setChecked(True)
self.actions()[2].setVisible(not self._settings.locked)
def languageChange(self, *args, **kwargs):
self.actions()[0].setText(tr('Open Toxygen'))
self.actions()[1].setText(tr('Set status'))
self.actions()[2].setText(tr('Exit'))
self.act.actions()[0].setText(tr('Online'))
self.act.actions()[1].setText(tr('Away'))
self.act.actions()[2].setText(tr('Busy'))
def init_tray(profile, settings, main_screen, toxes):
icon = os.path.join(get_images_directory(), 'icon.png')
tray = SystemTrayIcon(QtGui.QIcon(icon))
menu = Menu(settings, profile)
show = menu.addAction(tr('Open Toxygen'))
sub = menu.addMenu(tr('Set status'))
online = sub.addAction(tr('Online'))
away = sub.addAction(tr('Away'))
busy = sub.addAction(tr('Busy'))
online.setCheckable(True)
away.setCheckable(True)
busy.setCheckable(True)
menu.act = sub
exit = menu.addAction(tr('Exit'))
def show_window():
def show():
if not main_screen.isActiveWindow():
main_screen.setWindowState(
main_screen.windowState() & ~QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive)
main_screen.activateWindow()
main_screen.show()
if not settings.locked:
show()
else:
def correct_pass():
show()
settings.locked = False
settings.unlockScreen = False
if not settings.unlockScreen:
settings.unlockScreen = True
show_window.screen = UnlockAppScreen(toxes, correct_pass)
show_window.screen.show()
def tray_activated(reason):
if reason == QtWidgets.QSystemTrayIcon.DoubleClick:
show_window()
def close_app():
if not settings.locked:
settings.closing = True
main_screen.close()
show.triggered.connect(show_window)
exit.triggered.connect(close_app)
menu.aboutToShow.connect(menu.about_to_show_handler)
online.triggered.connect(lambda: menu.new_status(0))
away.triggered.connect(lambda: menu.new_status(1))
busy.triggered.connect(lambda: menu.new_status(2))
tray.setContextMenu(menu)
tray.show()
tray.activated.connect(tray_activated)
return tray