-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlinak_tray_qt.py
70 lines (59 loc) · 2.37 KB
/
linak_tray_qt.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
"""Small system tray application to adjust height of a Linak-based desk"""
import sys
from PyQt5 import QtWidgets
from PyQt5 import QtGui
from PyQt5 import QtCore
from linak_controller import LinakController
class LinakTray(LinakController, QtWidgets.QSystemTrayIcon):
"""System tray icon class"""
def __init__(self):
self.qt_app = self._init_qt()
QtWidgets.QSystemTrayIcon.__init__(self)
LinakController.__init__(self)
self.menu = self._construct_menu()
self.setContextMenu(self.menu)
self.activated.connect(lambda reason: self.action_click(reason, self))
self._set_icon()
self.show()
def run(self):
"""Run main loop"""
self.qt_app.exec_()
@staticmethod
def _init_qt():
"""Initialize the Qt application"""
app = QtWidgets.QApplication([])
app.setQuitOnLastWindowClosed(False)
return app
def _construct_menu(self):
"""Construct a menu from the current configuration"""
menu = QtWidgets.QMenu()
self._construct_menu_toggle(menu)
menu.addSeparator()
self._construct_menu_positions(menu)
menu.addSeparator()
self._construct_menu_quit(menu)
return menu
def _construct_menu_positions(self, parent):
"""Create entries for saved positions"""
for key, value in self.positions.items():
action = parent.addAction(key)
action.triggered.connect(lambda state, position=value: self.set_position(position))
def _construct_menu_toggle(self, parent):
"""Create toggle favourite button"""
action_toggle = parent.addAction("Toggle")
action_toggle.triggered.connect(lambda _: self.toggle_favourite())
@classmethod
def _construct_menu_quit(cls, parent):
"""Create quit button"""
action_quit = parent.addAction("Quit")
action_quit.triggered.connect(lambda _: sys.exit())
def _set_icon(self, active=False):
path = self._get_icon_path(active=active)
icon = QtGui.QIcon(path) if path else QtGui.QIcon.fromTheme(self._get_icon_fallback())
self.setIcon(icon)
@classmethod
@QtCore.pyqtSlot()
def action_click(cls, reason, tray):
"""Toggle menu on click"""
if reason in [QtWidgets.QSystemTrayIcon.DoubleClick, QtWidgets.QSystemTrayIcon.MiddleClick]:
tray.toggle_favourite()