File diff 000000000000 → b168d439d9a0
gui/tray.py
Show inline comments
 
new file 100644
 
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')