Files
@ b168d439d9a0
Branch filter:
Location: linux-tools/kcdemu/gui/tray.py
b168d439d9a0
5.7 KiB
text/x-python
initial commit. Version 1.0
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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | from PyQt5 import QtCore, QtWidgets, QtGui
from gui.settings import SettingsForm
from .device_menu import QDeviceMenu
class TrayManager:
def __init__(self, cdemu, config, dropper):
"""
:type cdemu: cdemu.CDEmu
:type config: config.config.ConfigFile
:type dropper: gui.dropper.KCDEmuDropperWidget
"""
self.cdemu = cdemu
self.config = config
self.dropper = dropper
self.dropper.changed.connect(self.on_dropper_changed)
self.cdemu.add_handler('devices_changed', self.on_devices_changed)
self.cdemu.add_handler('daemon_stopped', self.on_daemon_stopped)
self.cdemu.add_handler('daemon_started', self.on_daemon_started)
self.act_device_sep = QtWidgets.QAction(None)
self.act_device_sep.setSeparator(True)
self.act_add = QtWidgets.QAction('Add device', None)
self.act_add.triggered.connect(self.on_act_add)
self.act_remove = QtWidgets.QAction('Remove device', None)
self.act_remove.triggered.connect(self.on_act_remove)
self.act_dropper_show = QtWidgets.QAction('Toggle dropper', None)
self.act_dropper_show.triggered.connect(self.on_act_dropper_show)
self.act_settings = QtWidgets.QAction('Settings', None)
self.act_settings.triggered.connect(self.on_act_settings)
self.act_about = QtWidgets.QAction('About', None)
self.act_about.triggered.connect(self.on_act_about)
self.act_quit = QtWidgets.QAction('Quit', None)
self.act_quit.triggered.connect(self.on_act_quit)
self.menus = {}
self.ctx_menu = QtWidgets.QMenu()
icon = QtGui.QIcon(self.config.get_tray_icon())
self.tray_icon = QtWidgets.QSystemTrayIcon(icon)
self.tray_icon.setIcon(icon)
self.tray_icon.setContextMenu(self.ctx_menu)
self.tray_icon.activated.connect(self.on_tray_icon_activated)
self.tray_icon.setToolTip('KCDEmu')
self.tray_icon.show()
self.update_menu()
def update_menu(self):
self.ctx_menu.clear()
self.ctx_menu.addAction(self.act_device_sep)
self.ctx_menu.addAction(self.act_add)
self.ctx_menu.addAction(self.act_remove)
self.ctx_menu.addSeparator()
self.ctx_menu.addAction(self.act_dropper_show)
self.ctx_menu.addAction(self.act_settings)
self.ctx_menu.addAction(self.act_about)
self.ctx_menu.addAction(self.act_quit)
if self.cdemu.is_daemon_ready():
self.on_devices_changed()
def toggle_dropper_visibility(self):
# TODO move to dropper object
if self.dropper.isVisible():
self.dropper.hide()
else:
self.dropper.show()
geo = QtWidgets.QApplication.desktop().availableGeometry()
position = self.config.get_position()
offset = self.config.get_offset()
if position == self.config.POSITION_TOP_LEFT:
self.dropper.move(offset[0], offset[1])
elif position == self.config.POSITION_TOP_RIGHT:
self.dropper.move(geo.width() - self.dropper.width() - offset[0], offset[1])
elif position == self.config.POSITION_BOTTOM_LEFT:
self.dropper.move(offset[0], geo.height() - self.dropper.height() - offset[1])
elif position == self.config.POSITION_BOTTOM_RIGHT:
self.dropper.move(
geo.width() - self.dropper.width() - offset[0], geo.height() - self.dropper.height() - offset[1]
)
def on_tray_icon_activated(self, reason):
if reason == QtWidgets.QSystemTrayIcon.Trigger:
self.toggle_dropper_visibility()
def on_dropper_changed(self):
if self.dropper.isVisible():
geo = QtWidgets.QApplication.desktop().availableGeometry()
self.dropper.move(geo.width() - self.dropper.width() - 16, geo.height() - self.dropper.height() - 16)
def on_act_quit(self):
QtCore.QCoreApplication.exit(0)
def on_act_dropper_show(self):
self.toggle_dropper_visibility()
def on_act_settings(self):
settings_form = SettingsForm(self.config)
settings_form.exec_()
def on_act_about(self):
print(self.cdemu.daemon.get_daemon_version())
settings_form = SettingsForm(1)
settings_form.exec_()
def on_act_add(self):
self.cdemu.add_device()
def on_act_remove(self):
self.cdemu.remove_device()
def get_menu_for_device(self, number, device):
if number in self.menus:
return self.menus[number]
else:
self.menus[number] = QDeviceMenu(device)
for k in sorted(self.menus.keys()):
if k > number:
self.ctx_menu.insertMenu(self.menus[number], self.menus[k])
self.ctx_menu.insertMenu(self.act_device_sep, self.menus[number])
def on_devices_changed(self, number=None):
devices = self.cdemu.get_devices()
for key in list(self.menus.keys()):
if key >= len(devices):
self.ctx_menu.removeAction(self.menus[key].menuAction())
del self.menus[key]
if number is None:
for number, device in enumerate(devices):
self.on_device_changed(device, self.get_menu_for_device(number, device))
else:
device = self.cdemu.get_devices()[number]
self.on_device_changed(device, self.get_menu_for_device(number, device))
def on_device_changed(self, device, menu):
pass
def on_daemon_started(self):
self.tray_icon.showMessage('KCDEmu', 'cdemu-daemon is ready')
def on_daemon_stopped(self):
self.tray_icon.showMessage('KCDEmu', 'cdemu-daemon has stopped')
|