openlp/openlp/core/projectors/manager.py

1002 lines
53 KiB
Python
Raw Normal View History

2014-10-06 19:10:03 +00:00
# -*- coding: utf-8 -*-
2019-04-13 13:00:22 +00:00
##########################################################################
# OpenLP - Open Source Lyrics Projection #
# ---------------------------------------------------------------------- #
2022-02-01 10:10:57 +00:00
# Copyright (c) 2008-2022 OpenLP Developers #
2019-04-13 13:00:22 +00:00
# ---------------------------------------------------------------------- #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
##########################################################################
2014-10-06 19:10:03 +00:00
"""
2017-10-23 22:09:57 +00:00
:mod: openlp.core.ui.projector.manager` module
2014-10-17 17:28:12 +00:00
2017-10-23 22:09:57 +00:00
Provides the functions for the display/control of Projectors.
2014-10-06 19:10:03 +00:00
"""
import logging
2015-11-07 00:49:40 +00:00
from PyQt5 import QtCore, QtGui, QtWidgets
2014-10-06 19:10:03 +00:00
2017-10-07 07:05:07 +00:00
from openlp.core.common.i18n import translate
2017-10-23 22:09:57 +00:00
from openlp.core.common.mixins import LogMixin, RegistryProperties
2018-10-20 04:33:32 +00:00
from openlp.core.common.registry import Registry, RegistryBase
2014-10-09 14:41:32 +00:00
from openlp.core.lib.ui import create_widget_action
2017-11-10 11:59:38 +00:00
from openlp.core.projectors import DialogSourceStyle
2018-10-24 21:02:06 +00:00
from openlp.core.projectors.constants import E_AUTHENTICATION, E_ERROR, E_NETWORK, E_NOT_CONNECTED, E_SOCKET_TIMEOUT,\
E_UNKNOWN_SOCKET_ERROR, PJLINK_PORT, QSOCKET_STATE, S_CONNECTED, S_CONNECTING, S_COOLDOWN, S_INITIALIZE, \
S_NOT_CONNECTED, S_OFF, S_ON, S_STANDBY, S_WARMUP, STATUS_CODE, STATUS_MSG
2017-12-25 08:44:30 +00:00
2017-11-10 11:59:38 +00:00
from openlp.core.projectors.db import ProjectorDB
from openlp.core.projectors.editform import ProjectorEditForm
2017-12-28 08:27:44 +00:00
from openlp.core.projectors.pjlink import PJLink, PJLinkUDP
2018-10-02 04:39:42 +00:00
from openlp.core.projectors.sourceselectform import SourceSelectSingle, SourceSelectTabs
from openlp.core.ui.icons import UiIcons
2017-10-23 22:09:57 +00:00
from openlp.core.widgets.toolbar import OpenLPToolbar
2014-10-06 19:10:03 +00:00
log = logging.getLogger(__name__)
log.debug('projectormanager loaded')
class UiProjectorManager(object):
2014-10-06 19:10:03 +00:00
"""
UI part of the Projector Manager
"""
def setup_ui(self, widget):
"""
Define the UI
2014-10-20 23:36:07 +00:00
2014-10-06 19:10:03 +00:00
:param widget: The screen object the dialog is to be attached to.
"""
log.debug('setup_ui()')
# Create ProjectorManager box
2015-11-07 00:49:40 +00:00
self.layout = QtWidgets.QVBoxLayout(widget)
2014-10-06 19:10:03 +00:00
self.layout.setSpacing(0)
2015-11-07 00:49:40 +00:00
self.layout.setContentsMargins(0, 0, 0, 0)
2014-10-06 19:10:03 +00:00
self.layout.setObjectName('layout')
# Add one selection toolbar
self.one_toolbar = OpenLPToolbar(widget)
self.one_toolbar.add_toolbar_action('new_projector',
2014-10-15 01:40:21 +00:00
text=translate('OpenLP.ProjectorManager', 'Add Projector'),
2018-04-08 19:54:28 +00:00
icon=UiIcons().new,
2016-03-03 17:53:29 +00:00
tooltip=translate('OpenLP.ProjectorManager', 'Add a new projector.'),
triggers=self.on_add_projector)
2014-10-15 01:40:21 +00:00
# Show edit/delete when projector not connected
self.one_toolbar.add_toolbar_action('edit_projector',
text=translate('OpenLP.ProjectorManager', 'Edit Projector'),
2018-04-08 19:54:28 +00:00
icon=UiIcons().edit,
2016-03-03 17:53:29 +00:00
tooltip=translate('OpenLP.ProjectorManager', 'Edit selected projector.'),
2014-10-15 01:40:21 +00:00
triggers=self.on_edit_projector)
self.one_toolbar.add_toolbar_action('delete_projector',
text=translate('OpenLP.ProjectorManager', 'Delete Projector'),
2018-04-08 19:54:28 +00:00
icon=UiIcons().delete,
2016-03-03 17:53:29 +00:00
tooltip=translate('OpenLP.ProjectorManager', 'Delete selected projector.'),
2014-10-15 01:40:21 +00:00
triggers=self.on_delete_projector)
# Show source/view when projector connected
2014-10-23 02:21:26 +00:00
self.one_toolbar.add_toolbar_action('source_view_projector',
2014-10-15 01:40:21 +00:00
text=translate('OpenLP.ProjectorManager', 'Select Input Source'),
2018-06-16 06:09:15 +00:00
icon=UiIcons().projector_hdmi,
2014-10-15 01:40:21 +00:00
tooltip=translate('OpenLP.ProjectorManager',
2016-03-03 17:53:29 +00:00
'Choose input source on selected projector.'),
2014-10-15 01:40:21 +00:00
triggers=self.on_select_input)
self.one_toolbar.add_toolbar_action('view_projector',
text=translate('OpenLP.ProjectorManager', 'View Projector'),
2018-04-13 20:07:09 +00:00
icon=UiIcons().info,
2014-10-15 01:40:21 +00:00
tooltip=translate('OpenLP.ProjectorManager',
2016-03-03 17:53:29 +00:00
'View selected projector information.'),
2014-10-15 01:40:21 +00:00
triggers=self.on_status_projector)
self.one_toolbar.addSeparator()
2014-10-15 01:40:21 +00:00
self.one_toolbar.add_toolbar_action('connect_projector',
2014-10-10 19:14:15 +00:00
text=translate('OpenLP.ProjectorManager',
2016-03-03 17:53:29 +00:00
'Connect to selected projector.'),
2019-03-08 15:19:57 +00:00
icon=UiIcons().projector_select_connect,
2015-02-18 22:21:39 +00:00
tooltip=translate('OpenLP.ProjectorManager',
2016-03-03 17:53:29 +00:00
'Connect to selected projector.'),
2014-10-10 19:14:15 +00:00
triggers=self.on_connect_projector)
self.one_toolbar.add_toolbar_action('connect_projector_multiple',
text=translate('OpenLP.ProjectorManager',
'Connect to selected projectors'),
2018-06-10 19:29:00 +00:00
icon=UiIcons().projector_connect,
2015-02-18 22:21:39 +00:00
tooltip=translate('OpenLP.ProjectorManager',
2016-03-03 17:53:29 +00:00
'Connect to selected projectors.'),
triggers=self.on_connect_projector)
2014-10-15 01:40:21 +00:00
self.one_toolbar.add_toolbar_action('disconnect_projector',
2014-10-10 19:14:15 +00:00
text=translate('OpenLP.ProjectorManager',
'Disconnect from selected projectors'),
2019-03-08 15:19:57 +00:00
icon=UiIcons().projector_select_disconnect,
2014-10-10 19:14:15 +00:00
tooltip=translate('OpenLP.ProjectorManager',
2016-03-03 17:53:29 +00:00
'Disconnect from selected projector.'),
2014-10-10 19:14:15 +00:00
triggers=self.on_disconnect_projector)
self.one_toolbar.add_toolbar_action('disconnect_projector_multiple',
text=translate('OpenLP.ProjectorManager',
'Disconnect from selected projector'),
2018-06-10 19:29:00 +00:00
icon=UiIcons().projector_disconnect,
tooltip=translate('OpenLP.ProjectorManager',
2016-03-03 17:53:29 +00:00
'Disconnect from selected projectors.'),
triggers=self.on_disconnect_projector)
self.one_toolbar.addSeparator()
2014-10-15 01:40:21 +00:00
self.one_toolbar.add_toolbar_action('poweron_projector',
2014-10-10 19:14:15 +00:00
text=translate('OpenLP.ProjectorManager',
'Power on selected projector'),
2019-03-08 15:19:57 +00:00
icon=UiIcons().projector_power_on,
2014-10-10 19:14:15 +00:00
tooltip=translate('OpenLP.ProjectorManager',
2016-03-03 17:53:29 +00:00
'Power on selected projector.'),
2014-10-10 19:14:15 +00:00
triggers=self.on_poweron_projector)
self.one_toolbar.add_toolbar_action('poweron_projector_multiple',
text=translate('OpenLP.ProjectorManager',
'Power on selected projector'),
2018-06-10 19:29:00 +00:00
icon=UiIcons().projector_on,
tooltip=translate('OpenLP.ProjectorManager',
2016-03-03 17:53:29 +00:00
'Power on selected projectors.'),
triggers=self.on_poweron_projector)
2014-10-15 01:40:21 +00:00
self.one_toolbar.add_toolbar_action('poweroff_projector',
text=translate('OpenLP.ProjectorManager', 'Standby selected projector'),
2019-03-08 15:19:57 +00:00
icon=UiIcons().projector_power_off,
2014-10-10 19:14:15 +00:00
tooltip=translate('OpenLP.ProjectorManager',
2016-03-03 17:53:29 +00:00
'Put selected projector in standby.'),
2014-10-10 19:14:15 +00:00
triggers=self.on_poweroff_projector)
self.one_toolbar.add_toolbar_action('poweroff_projector_multiple',
text=translate('OpenLP.ProjectorManager', 'Standby selected projector'),
2018-06-10 19:29:00 +00:00
icon=UiIcons().projector_off,
tooltip=translate('OpenLP.ProjectorManager',
2016-03-03 17:53:29 +00:00
'Put selected projectors in standby.'),
triggers=self.on_poweroff_projector)
2014-10-15 18:45:41 +00:00
self.one_toolbar.addSeparator()
2014-10-15 01:40:21 +00:00
self.one_toolbar.add_toolbar_action('blank_projector',
2014-10-10 19:14:15 +00:00
text=translate('OpenLP.ProjectorManager',
'Blank selected projector screen'),
2018-04-13 19:02:32 +00:00
icon=UiIcons().blank,
2014-10-10 19:14:15 +00:00
tooltip=translate('OpenLP.ProjectorManager',
'Blank selected projector screen'),
2014-10-10 19:14:15 +00:00
triggers=self.on_blank_projector)
self.one_toolbar.add_toolbar_action('blank_projector_multiple',
text=translate('OpenLP.ProjectorManager',
2016-03-03 17:53:29 +00:00
'Blank selected projectors screen'),
2018-06-10 19:29:00 +00:00
icon=UiIcons().blank,
tooltip=translate('OpenLP.ProjectorManager',
2016-03-03 17:53:29 +00:00
'Blank selected projectors screen.'),
triggers=self.on_blank_projector)
2014-10-15 01:40:21 +00:00
self.one_toolbar.add_toolbar_action('show_projector',
2015-02-18 22:21:39 +00:00
text=translate('OpenLP.ProjectorManager',
'Show selected projector screen'),
2018-06-10 19:29:00 +00:00
icon=UiIcons().desktop,
2014-10-10 19:14:15 +00:00
tooltip=translate('OpenLP.ProjectorManager',
2016-03-03 17:53:29 +00:00
'Show selected projector screen.'),
2014-10-10 19:14:15 +00:00
triggers=self.on_show_projector)
self.one_toolbar.add_toolbar_action('show_projector_multiple',
2015-02-18 22:21:39 +00:00
text=translate('OpenLP.ProjectorManager',
'Show selected projector screen'),
2018-06-10 19:29:00 +00:00
icon=UiIcons().desktop,
tooltip=translate('OpenLP.ProjectorManager',
2016-03-03 17:53:29 +00:00
'Show selected projectors screen.'),
triggers=self.on_show_projector)
self.layout.addWidget(self.one_toolbar)
2015-11-07 00:49:40 +00:00
self.projector_one_widget = QtWidgets.QWidgetAction(self.one_toolbar)
self.projector_one_widget.setObjectName('projector_one_toolbar_widget')
2014-10-10 17:29:52 +00:00
# Create projector manager list
2015-11-07 00:49:40 +00:00
self.projector_list_widget = QtWidgets.QListWidget(widget)
self.projector_list_widget.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
2014-10-10 17:29:52 +00:00
self.projector_list_widget.setAlternatingRowColors(True)
self.projector_list_widget.setIconSize(QtCore.QSize(90, 50))
self.projector_list_widget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.projector_list_widget.setObjectName('projector_list_widget')
self.layout.addWidget(self.projector_list_widget)
2014-10-06 19:10:03 +00:00
self.projector_list_widget.customContextMenuRequested.connect(self.context_menu)
2014-10-16 21:11:43 +00:00
self.projector_list_widget.itemDoubleClicked.connect(self.on_doubleclick_item)
2014-10-06 19:10:03 +00:00
# Build the context menu
2015-11-07 00:49:40 +00:00
self.menu = QtWidgets.QMenu()
2014-10-06 19:10:03 +00:00
self.status_action = create_widget_action(self.menu,
text=translate('OpenLP.ProjectorManager',
2014-10-15 01:40:21 +00:00
'&View Projector Information'),
2018-04-13 20:07:09 +00:00
icon=UiIcons().info,
2014-10-06 19:10:03 +00:00
triggers=self.on_status_projector)
self.edit_action = create_widget_action(self.menu,
text=translate('OpenLP.ProjectorManager',
'&Edit Projector'),
2018-04-08 19:54:28 +00:00
icon=UiIcons().edit,
2014-10-06 19:10:03 +00:00
triggers=self.on_edit_projector)
self.menu.addSeparator()
self.connect_action = create_widget_action(self.menu,
text=translate('OpenLP.ProjectorManager',
'&Connect Projector'),
2018-06-16 06:09:15 +00:00
icon=UiIcons().projector_connect,
2014-10-06 19:10:03 +00:00
triggers=self.on_connect_projector)
self.disconnect_action = create_widget_action(self.menu,
text=translate('OpenLP.ProjectorManager',
'D&isconnect Projector'),
2018-06-16 06:09:15 +00:00
icon=UiIcons().projector_off,
2014-10-06 19:10:03 +00:00
triggers=self.on_disconnect_projector)
self.menu.addSeparator()
self.poweron_action = create_widget_action(self.menu,
text=translate('OpenLP.ProjectorManager',
'Power &On Projector'),
2018-06-16 06:09:15 +00:00
icon=UiIcons().projector_on,
2014-10-06 19:10:03 +00:00
triggers=self.on_poweron_projector)
self.poweroff_action = create_widget_action(self.menu,
text=translate('OpenLP.ProjectorManager',
'Power O&ff Projector'),
2018-06-16 06:09:15 +00:00
icon=UiIcons().projector_off,
2014-10-06 19:10:03 +00:00
triggers=self.on_poweroff_projector)
self.menu.addSeparator()
self.select_input_action = create_widget_action(self.menu,
text=translate('OpenLP.ProjectorManager',
'Select &Input'),
2018-06-16 06:09:15 +00:00
icon=UiIcons().projector_hdmi,
2014-10-06 19:10:03 +00:00
triggers=self.on_select_input)
2014-10-23 02:21:26 +00:00
self.edit_input_action = create_widget_action(self.menu,
text=translate('OpenLP.ProjectorManager',
'Edit Input Source'),
2018-04-08 19:54:28 +00:00
icon=UiIcons().edit,
2014-10-23 02:21:26 +00:00
triggers=self.on_edit_input)
2014-10-06 19:10:03 +00:00
self.blank_action = create_widget_action(self.menu,
text=translate('OpenLP.ProjectorManager',
'&Blank Projector Screen'),
2018-04-13 19:02:32 +00:00
icon=UiIcons().blank,
2014-10-06 19:10:03 +00:00
triggers=self.on_blank_projector)
self.show_action = create_widget_action(self.menu,
text=translate('OpenLP.ProjectorManager',
'&Show Projector Screen'),
2018-06-16 06:09:15 +00:00
icon=UiIcons().projector,
2014-10-06 19:10:03 +00:00
triggers=self.on_show_projector)
self.menu.addSeparator()
self.delete_action = create_widget_action(self.menu,
text=translate('OpenLP.ProjectorManager',
'&Delete Projector'),
2018-04-08 19:54:28 +00:00
icon=UiIcons().delete,
2014-10-06 19:10:03 +00:00
triggers=self.on_delete_projector)
self.update_icons()
2014-10-06 19:10:03 +00:00
2017-10-23 22:09:57 +00:00
class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogMixin, RegistryProperties):
2014-10-06 19:10:03 +00:00
"""
Manage the projectors.
"""
def __init__(self, parent=None, projectordb=None):
2014-10-17 17:28:12 +00:00
"""
Basic initialization.
:param parent: Who I belong to.
:param projectordb: Database session inherited from superclass.
"""
2014-10-06 19:10:03 +00:00
log.debug('__init__()')
2017-10-23 22:09:57 +00:00
super(ProjectorManager, self).__init__(parent)
2014-10-06 19:10:03 +00:00
self.settings_section = 'projector'
self.projectordb = projectordb
self.projector_list = []
self.source_select_form = None
2018-05-03 14:58:50 +00:00
# Dictionary of PJLinkUDP objects to listen for UDP broadcasts from PJLink 2+ projectors.
2018-10-20 04:33:32 +00:00
# Key is port number
2018-05-03 14:58:50 +00:00
self.pjlink_udp = {}
2018-06-03 17:30:11 +00:00
# Dict for matching projector status to display icon
2018-06-10 19:29:00 +00:00
self.status_icons = {
2018-06-03 17:30:11 +00:00
S_NOT_CONNECTED: UiIcons().projector_disconnect,
S_CONNECTING: UiIcons().projector_connect,
S_CONNECTED: UiIcons().projector_off,
S_OFF: UiIcons().projector_off,
S_INITIALIZE: UiIcons().projector_on,
S_STANDBY: UiIcons().projector_off,
S_WARMUP: UiIcons().projector_warmup,
2019-03-08 15:19:57 +00:00
S_ON: UiIcons().projector_on,
2018-06-03 17:30:11 +00:00
S_COOLDOWN: UiIcons().projector_cooldown,
E_ERROR: UiIcons().projector_error,
2018-06-16 06:09:15 +00:00
E_NETWORK: UiIcons().error,
2018-06-28 20:40:54 +00:00
E_SOCKET_TIMEOUT: UiIcons().authentication,
2018-06-16 06:09:15 +00:00
E_AUTHENTICATION: UiIcons().authentication,
E_UNKNOWN_SOCKET_ERROR: UiIcons().error,
E_NOT_CONNECTED: UiIcons().projector_disconnect
2018-06-03 17:30:11 +00:00
}
2014-10-06 19:10:03 +00:00
def bootstrap_initialise(self):
2014-10-17 17:28:12 +00:00
"""
Pre-initialize setups.
"""
2014-10-06 19:10:03 +00:00
self.setup_ui(self)
if self.projectordb is None:
# Work around for testing creating a ~/.openlp.data.projector.projector.sql file
log.debug('Creating new ProjectorDB() instance')
self.projectordb = ProjectorDB()
else:
log.debug('Using existing ProjectorDB() instance')
self.get_settings()
2014-10-06 19:10:03 +00:00
def bootstrap_post_set_up(self):
2014-10-17 17:28:12 +00:00
"""
Post-initialize setups.
"""
# Set 1.5 second delay before loading all projectors
if self.autostart:
log.debug('Delaying 1.5 seconds before loading all projectors')
QtCore.QTimer().singleShot(1500, self._load_projectors)
else:
log.debug('Loading all projectors')
self._load_projectors()
self.projector_form = ProjectorEditForm(self, projectordb=self.projectordb)
self.projector_form.newProjector.connect(self.add_projector_from_wizard)
self.projector_form.editProjector.connect(self.edit_projector_from_wizard)
self.projector_list_widget.itemSelectionChanged.connect(self.update_icons)
2014-10-06 19:10:03 +00:00
def udp_listen_add(self, port=PJLINK_PORT):
2018-10-20 04:33:32 +00:00
"""
Add UDP broadcast listener
"""
if port in self.pjlink_udp:
log.warning('UDP Listener for port {port} already added - skipping'.format(port=port))
else:
log.debug('Adding UDP listener on port {port}'.format(port=port))
self.pjlink_udp[port] = PJLinkUDP(port=port)
Registry().execute('udp_broadcast_add', port=port, callback=self.pjlink_udp[port].check_settings)
def udp_listen_delete(self, port):
"""
Remove a UDP broadcast listener
"""
log.debug('Checking for UDP port {port} listener deletion'.format(port=port))
if port not in self.pjlink_udp:
2019-07-03 13:23:23 +00:00
log.warning('UDP listener for port {port} not there - skipping delete'.format(port=port))
2018-10-20 04:33:32 +00:00
return
keep_port = False
for item in self.projector_list:
if port == item.link.port:
keep_port = True
if keep_port:
2019-07-03 13:23:23 +00:00
log.warning('UDP listener for port {port} needed for other projectors - skipping delete'.format(port=port))
2018-10-20 04:33:32 +00:00
return
Registry().execute('udp_broadcast_remove', port=port)
del self.pjlink_udp[port]
log.debug('UDP listener for port {port} deleted'.format(port=port))
def get_settings(self):
2014-10-20 23:36:07 +00:00
"""
Retrieve the saved settings
"""
2018-02-11 11:42:13 +00:00
log.debug('Updating ProjectorManager settings')
self.autostart = self.settings.value('projector/connect on start')
self.poll_time = self.settings.value('projector/poll time')
self.socket_timeout = self.settings.value('projector/socket timeout')
self.source_select_dialog_type = self.settings.value('projector/source dialog type')
2014-10-06 19:10:03 +00:00
def context_menu(self, point):
"""
Build the Right Click Context menu and set state.
:param point: The position of the mouse so the correct item can be found.
"""
2014-10-17 17:28:12 +00:00
# QListWidgetItem to build menu for.
2014-10-06 19:10:03 +00:00
item = self.projector_list_widget.itemAt(point)
if item is None:
return
real_projector = item.data(QtCore.Qt.UserRole)
projector_name = str(item.text())
visible = real_projector.link.status_connect >= S_CONNECTED
log.debug('({name}) Building menu - visible = {visible}'.format(name=projector_name, visible=visible))
2014-10-06 19:10:03 +00:00
self.delete_action.setVisible(True)
self.edit_action.setVisible(True)
self.connect_action.setVisible(not visible)
self.disconnect_action.setVisible(visible)
self.status_action.setVisible(visible)
2018-06-28 15:37:37 +00:00
self.select_input_action.setVisible(visible and real_projector.link.power == S_ON)
self.edit_input_action.setVisible(visible and real_projector.link.power == S_ON)
self.poweron_action.setVisible(visible and real_projector.link.power == S_STANDBY)
self.poweroff_action.setVisible(visible and real_projector.link.power == S_ON)
self.blank_action.setVisible(visible and real_projector.link.power == S_ON and
not real_projector.link.shutter)
self.show_action.setVisible(visible and real_projector.link.power == S_ON and
real_projector.link.shutter)
2014-10-06 19:10:03 +00:00
self.menu.projector = real_projector
2015-11-07 00:49:40 +00:00
self.menu.exec(self.projector_list_widget.mapToGlobal(point))
2014-10-06 19:10:03 +00:00
2014-10-23 02:21:26 +00:00
def on_edit_input(self, opt=None):
self.on_select_input(opt=opt, edit=True)
def on_select_input(self, opt=None, edit=False):
2014-10-06 19:10:03 +00:00
"""
Builds menu for 'Select Input' option, then calls the selected projector
item to change input source.
2015-11-07 00:49:40 +00:00
:param opt: Needed by PyQt5
2014-10-06 19:10:03 +00:00
"""
self.get_settings() # In case the dialog interface setting was changed
2014-10-06 19:10:03 +00:00
list_item = self.projector_list_widget.item(self.projector_list_widget.currentRow())
projector = list_item.data(QtCore.Qt.UserRole)
2014-10-19 23:55:19 +00:00
# QTabwidget for source select
2014-10-23 02:21:26 +00:00
source = 100
while source > 99:
if self.source_select_dialog_type == DialogSourceStyle.Tabbed:
source_select_form = SourceSelectTabs(parent=self,
projectordb=self.projectordb,
edit=edit)
else:
source_select_form = SourceSelectSingle(parent=self,
projectordb=self.projectordb,
edit=edit)
2015-11-07 00:49:40 +00:00
source = source_select_form.exec(projector.link)
log.debug('({ip}) source_select_form() returned {data}'.format(ip=projector.link.ip, data=source))
2014-10-19 23:55:19 +00:00
if source is not None and source > 0:
projector.link.set_input_source(str(source))
return
2014-10-06 19:10:03 +00:00
def on_add_projector(self, opt=None):
"""
2014-10-17 17:28:12 +00:00
Calls edit dialog to add a new projector to the database
2014-10-06 19:10:03 +00:00
2015-11-07 00:49:40 +00:00
:param opt: Needed by PyQt5
2014-10-06 19:10:03 +00:00
"""
2015-11-07 00:49:40 +00:00
self.projector_form.exec()
2014-10-06 19:10:03 +00:00
def on_blank_projector(self, opt=None):
"""
Calls projector thread to send blank screen command
2015-11-07 00:49:40 +00:00
:param opt: Needed by PyQt5
2014-10-06 19:10:03 +00:00
"""
try:
2017-07-07 23:43:50 +00:00
opt.link.set_shutter_closed()
2014-10-06 19:10:03 +00:00
except AttributeError:
for list_item in self.projector_list_widget.selectedItems():
if list_item is None:
return
projector = list_item.data(QtCore.Qt.UserRole)
try:
projector.link.set_shutter_closed()
2018-10-27 01:40:20 +00:00
except Exception:
continue
2014-10-06 19:10:03 +00:00
2014-10-16 21:11:43 +00:00
def on_doubleclick_item(self, item, opt=None):
2014-10-17 17:28:12 +00:00
"""
When item is doubleclicked, will connect to projector.
:param item: List widget item for connection.
2015-11-07 00:49:40 +00:00
:param opt: Needed by PyQt5
2014-10-17 17:28:12 +00:00
"""
2014-10-16 21:11:43 +00:00
projector = item.data(QtCore.Qt.UserRole)
2017-12-25 08:44:30 +00:00
if QSOCKET_STATE[projector.link.state()] != S_CONNECTED:
try:
2017-12-25 08:44:30 +00:00
log.debug('ProjectorManager: Calling connect_to_host() on "{ip}"'.format(ip=projector.link.ip))
projector.link.connect_to_host()
2018-10-27 01:40:20 +00:00
except Exception:
2017-12-25 08:44:30 +00:00
log.debug('ProjectorManager: "{ip}" already connected - skipping'.format(ip=projector.link.ip))
2014-10-16 21:11:43 +00:00
return
2014-10-06 19:10:03 +00:00
def on_connect_projector(self, opt=None):
"""
Calls projector thread to connect to projector
2015-11-07 00:49:40 +00:00
:param opt: Needed by PyQt5
2014-10-06 19:10:03 +00:00
"""
try:
2017-07-07 23:43:50 +00:00
opt.link.connect_to_host()
2014-10-06 19:10:03 +00:00
except AttributeError:
for list_item in self.projector_list_widget.selectedItems():
if list_item is None:
return
projector = list_item.data(QtCore.Qt.UserRole)
try:
projector.link.connect_to_host()
2019-03-09 03:53:20 +00:00
except Exception:
continue
2014-10-06 19:10:03 +00:00
def on_delete_projector(self, opt=None):
"""
Deletes a projector from the list and the database
2015-11-07 00:49:40 +00:00
:param opt: Needed by PyQt5
2014-10-06 19:10:03 +00:00
"""
list_item = self.projector_list_widget.item(self.projector_list_widget.currentRow())
if list_item is None:
return
projector = list_item.data(QtCore.Qt.UserRole)
2015-11-07 00:49:40 +00:00
msg = QtWidgets.QMessageBox()
msg.setText(translate('OpenLP.ProjectorManager',
'Delete projector ({ip}) {name}?'.format(ip=projector.link.ip,
name=projector.link.name)))
2015-10-12 12:59:17 +00:00
msg.setInformativeText(translate('OpenLP.ProjectorManager', 'Are you sure you want to delete this projector?'))
2014-10-06 19:10:03 +00:00
msg.setStandardButtons(msg.Cancel | msg.Ok)
msg.setDefaultButton(msg.Cancel)
2015-11-07 00:49:40 +00:00
ans = msg.exec()
2014-10-06 19:10:03 +00:00
if ans == msg.Cancel:
return
try:
projector.link.changeStatus.disconnect(self.update_status)
except (AttributeError, TypeError):
2014-10-06 19:10:03 +00:00
pass
2014-10-13 20:16:25 +00:00
try:
projector.link.authentication_error.disconnect(self.authentication_error)
except (AttributeError, TypeError):
2014-10-13 20:16:25 +00:00
pass
try:
projector.link.no_authentication_error.disconnect(self.no_authentication_error)
except (AttributeError, TypeError):
2014-10-13 20:16:25 +00:00
pass
2014-10-15 17:22:12 +00:00
try:
projector.link.projectorUpdateIcons.disconnect(self.update_icons)
except (AttributeError, TypeError):
2014-10-15 17:22:12 +00:00
pass
2014-10-06 19:10:03 +00:00
try:
2018-10-20 04:33:32 +00:00
projector.link.poll_timer.stop()
projector.link.poll_timer.timeout.disconnect(projector.link.poll_loop)
2014-10-17 02:28:51 +00:00
except (AttributeError, TypeError):
pass
2018-06-28 15:37:37 +00:00
try:
2018-10-20 04:33:32 +00:00
projector.link.socket_timer.stop()
projector.link.socket_timer.timeout.disconnect(projector.link.socket_abort)
2018-06-28 15:37:37 +00:00
except (AttributeError, TypeError):
pass
2018-05-03 14:58:50 +00:00
2018-10-20 04:33:32 +00:00
old_port = projector.link.port
2018-05-03 14:58:50 +00:00
# Rebuild projector list
2014-10-06 19:10:03 +00:00
new_list = []
for item in self.projector_list:
2017-11-10 11:59:38 +00:00
if item.link.db_item.id == projector.link.db_item.id:
2018-10-20 04:33:32 +00:00
log.debug('Removing projector "{item}"'.format(item=item.link.name))
2014-10-06 19:10:03 +00:00
continue
new_list.append(item)
self.projector_list = new_list
list_item = self.projector_list_widget.takeItem(self.projector_list_widget.currentRow())
list_item = None
2017-07-07 23:43:50 +00:00
if not self.projectordb.delete_projector(projector.db_item):
log.warning('Delete projector {item} failed'.format(item=projector.db_item))
2014-10-06 19:10:03 +00:00
for item in self.projector_list:
log.debug('New projector list - item: {ip} {name}'.format(ip=item.link.ip, name=item.link.name))
2018-10-20 04:33:32 +00:00
self.udp_listen_delete(old_port)
2014-10-06 19:10:03 +00:00
def on_disconnect_projector(self, opt=None):
"""
Calls projector thread to disconnect from projector
2015-11-07 00:49:40 +00:00
:param opt: Needed by PyQt5
2014-10-06 19:10:03 +00:00
"""
try:
2017-07-07 23:43:50 +00:00
opt.link.disconnect_from_host()
2014-10-06 19:10:03 +00:00
except AttributeError:
for list_item in self.projector_list_widget.selectedItems():
if list_item is None:
return
projector = list_item.data(QtCore.Qt.UserRole)
try:
projector.link.disconnect_from_host()
2018-10-27 01:40:20 +00:00
except Exception:
continue
2014-10-06 19:10:03 +00:00
def on_edit_projector(self, opt=None):
"""
2014-10-17 17:28:12 +00:00
Calls edit dialog with selected projector to edit information
2014-10-06 19:10:03 +00:00
2015-11-07 00:49:40 +00:00
:param opt: Needed by PyQt5
2014-10-06 19:10:03 +00:00
"""
list_item = self.projector_list_widget.item(self.projector_list_widget.currentRow())
projector = list_item.data(QtCore.Qt.UserRole)
if projector is None:
return
self.old_projector = projector
projector.link.disconnect_from_host()
2015-11-07 00:49:40 +00:00
self.projector_form.exec(projector.db_item)
projector.db_item = self.projectordb.get_projector_by_id(self.old_projector.db_item.id)
2014-10-06 19:10:03 +00:00
def on_poweroff_projector(self, opt=None):
"""
Calls projector link to send Power Off command
2015-11-07 00:49:40 +00:00
:param opt: Needed by PyQt5
2014-10-06 19:10:03 +00:00
"""
try:
2017-07-07 23:43:50 +00:00
opt.link.set_power_off()
2014-10-06 19:10:03 +00:00
except AttributeError:
for list_item in self.projector_list_widget.selectedItems():
if list_item is None:
return
projector = list_item.data(QtCore.Qt.UserRole)
try:
projector.link.set_power_off()
2018-10-27 01:40:20 +00:00
except Exception:
continue
2014-10-06 19:10:03 +00:00
def on_poweron_projector(self, opt=None):
"""
Calls projector link to send Power On command
2015-11-07 00:49:40 +00:00
:param opt: Needed by PyQt5
2014-10-06 19:10:03 +00:00
"""
try:
2017-07-07 23:43:50 +00:00
opt.link.set_power_on()
2014-10-06 19:10:03 +00:00
except AttributeError:
for list_item in self.projector_list_widget.selectedItems():
if list_item is None:
return
projector = list_item.data(QtCore.Qt.UserRole)
try:
projector.link.set_power_on()
2018-10-27 01:40:20 +00:00
except Exception:
continue
2014-10-06 19:10:03 +00:00
def on_show_projector(self, opt=None):
"""
Calls projector thread to send open shutter command
2015-11-07 00:49:40 +00:00
:param opt: Needed by PyQt5
2014-10-06 19:10:03 +00:00
"""
try:
2017-07-07 23:43:50 +00:00
opt.link.set_shutter_open()
2014-10-06 19:10:03 +00:00
except AttributeError:
for list_item in self.projector_list_widget.selectedItems():
if list_item is None:
return
projector = list_item.data(QtCore.Qt.UserRole)
try:
projector.link.set_shutter_open()
2018-10-27 01:40:20 +00:00
except Exception:
continue
2014-10-06 19:10:03 +00:00
def on_status_projector(self, opt=None):
"""
Builds message box with projector status information
2015-11-07 00:49:40 +00:00
:param opt: Needed by PyQt5
2014-10-06 19:10:03 +00:00
"""
lwi = self.projector_list_widget.item(self.projector_list_widget.currentRow())
projector = lwi.data(QtCore.Qt.UserRole)
message = '<b>{title}</b>: {data}<BR />'.format(title=translate('OpenLP.ProjectorManager', 'Name'),
data=projector.link.name)
message += '<b>{title}</b>: {data}<br />'.format(title=translate('OpenLP.ProjectorManager', 'IP'),
data=projector.link.ip)
message += '<b>{title}</b>: {data}<br />'.format(title=translate('OpenLP.ProjectorManager', 'Port'),
data=projector.link.port)
message += '<b>{title}</b>: {data}<br />'.format(title=translate('OpenLP.ProjectorManager', 'Notes'),
data=projector.link.notes)
message += '<hr /><br >'
2014-10-06 19:10:03 +00:00
if projector.link.manufacturer is None:
message += translate('OpenLP.ProjectorManager', 'Projector information not available at this time.')
2014-10-06 19:10:03 +00:00
else:
message += '<b>{title}</b>: {data}<br />'.format(title=translate('OpenLP.ProjectorManager',
'Projector Name'),
data=projector.link.pjlink_name)
message += '<b>{title}</b>: {data}<br />'.format(title=translate('OpenLP.ProjectorManager', 'Manufacturer'),
data=projector.link.manufacturer)
message += '<b>{title}</b>: {data}<br />'.format(title=translate('OpenLP.ProjectorManager', 'Model'),
data=projector.link.model)
2018-06-28 15:37:37 +00:00
message += '<b>{title}</b>: {data}<br />'.format(title=translate('OpenLP.ProjectorManager', 'PJLink Class'),
data=projector.link.pjlink_class)
if projector.link.pjlink_class != 1:
message += '<b>{title}</b>: {data}<br />'.format(title=translate('OpenLP.ProjectorManager',
'Software Version'),
data=projector.link.sw_version)
message += '<b>{title}</b>: {data}<br />'.format(title=translate('OpenLP.ProjectorManager',
'Serial Number'),
data=projector.link.serial_no)
message += '<b>{title}</b>: {data}<br />'.format(title=translate('OpenLP.ProjectorManager',
'Lamp Model Number'),
data=projector.link.model_lamp)
message += '<b>{title}</b>: {data}<br />'.format(title=translate('OpenLP.ProjectorManager',
'Filter Model Number'),
data=projector.link.model_filter)
message += '<b>{title}</b>: {data}<br /><br />'.format(title=translate('OpenLP.ProjectorManager',
'Other info'),
data=projector.link.other_info)
message += '<b>{title}</b>: {data}<br />'.format(title=translate('OpenLP.ProjectorManager', 'Power status'),
2017-12-25 08:44:30 +00:00
data=STATUS_MSG[projector.link.power])
message += '<b>{title}</b>: {data}<br />'.format(title=translate('OpenLP.ProjectorManager', 'Shutter is'),
data=translate('OpenLP.ProjectorManager', 'Closed')
if projector.link.shutter
else translate('OpenLP', 'Open'))
2017-07-07 23:43:50 +00:00
message = '{msg}<b>{source}</b>: {selected}<br />'.format(msg=message,
source=translate('OpenLP.ProjectorManager',
'Current source input is'),
selected=projector.link.source)
2014-10-10 03:28:24 +00:00
count = 1
for item in projector.link.lamp:
2017-11-24 08:30:37 +00:00
if item['On'] is None:
2017-11-24 19:08:23 +00:00
status = translate('OpenLP.ProjectorManager', 'Unavailable')
2017-11-24 08:30:37 +00:00
elif item['On']:
2017-11-24 19:08:23 +00:00
status = translate('OpenLP.ProjectorManager', 'ON')
2017-11-24 08:30:37 +00:00
else:
2017-11-24 19:08:23 +00:00
status = translate('OpenLP.ProjectorManager', 'OFF')
message += '<b>{title} {count}</b> {status} '.format(title=translate('OpenLP.ProjectorManager',
'Lamp'),
count=count,
2017-11-24 19:08:23 +00:00
status=status)
message += '<b>{title}</b>: {hours}<br />'.format(title=translate('OpenLP.ProjectorManager', 'Hours'),
hours=item['Hours'])
count += 1
message += '<hr /><br />'
2014-10-15 02:18:40 +00:00
if projector.link.projector_errors is None:
message += translate('OpenLP.ProjectorManager', 'No current errors or warnings')
2014-10-15 02:18:40 +00:00
else:
message += '<b>{data}</b>'.format(data=translate('OpenLP.ProjectorManager', 'Current errors/warnings'))
2014-10-15 02:18:40 +00:00
for (key, val) in projector.link.projector_errors.items():
2017-12-25 08:44:30 +00:00
message += '<b>{key}</b>: {data}<br />'.format(key=key, data=STATUS_MSG[val])
2015-11-07 00:49:40 +00:00
QtWidgets.QMessageBox.information(self, translate('OpenLP.ProjectorManager', 'Projector Information'), message)
2014-10-06 19:10:03 +00:00
def _add_projector(self, projector):
"""
Helper app to build a projector instance
2014-10-20 23:36:07 +00:00
:param projector: Dict of projector database information
2017-05-20 05:51:58 +00:00
:returns: PJLink() instance
2014-10-06 19:10:03 +00:00
"""
log.debug('_add_projector()')
2017-09-22 12:03:28 +00:00
return PJLink(projector=projector,
2017-05-20 05:51:58 +00:00
poll_time=self.poll_time,
2017-09-22 12:03:28 +00:00
socket_timeout=self.socket_timeout)
2014-10-06 19:10:03 +00:00
2014-10-23 02:21:26 +00:00
def add_projector(self, projector, start=False):
2014-10-06 19:10:03 +00:00
"""
Builds manager list item, projector thread, and timer for projector instance.
2014-10-23 02:21:26 +00:00
:param projector: Projector instance to add
:param start: Start projector if True
2014-10-06 19:10:03 +00:00
"""
item = ProjectorItem(link=self._add_projector(projector))
item.db_item = projector
2018-06-10 19:29:00 +00:00
item.icon = QtGui.QIcon(self.status_icons[S_NOT_CONNECTED])
2018-01-13 05:41:42 +00:00
widget = QtWidgets.QListWidgetItem(item.icon,
2015-11-07 00:49:40 +00:00
item.link.name,
self.projector_list_widget
)
2014-10-06 19:10:03 +00:00
widget.setData(QtCore.Qt.UserRole, item)
2014-10-23 02:21:26 +00:00
item.link.db_item = item.db_item
2014-10-06 19:10:03 +00:00
item.widget = widget
item.link.changeStatus.connect(self.update_status)
2014-10-13 20:16:25 +00:00
item.link.projectorAuthentication.connect(self.authentication_error)
item.link.projectorNoAuthentication.connect(self.no_authentication_error)
2014-10-15 17:22:12 +00:00
item.link.projectorUpdateIcons.connect(self.update_icons)
2018-10-20 04:33:32 +00:00
# Add UDP listener for new projector port
self.udp_listen_add(item.link.port)
2014-10-06 19:10:03 +00:00
self.projector_list.append(item)
2014-10-23 02:21:26 +00:00
if start:
2014-10-06 19:10:03 +00:00
item.link.connect_to_host()
2014-10-23 02:21:26 +00:00
for item in self.projector_list:
log.debug('New projector list - item: ({ip}) {name}'.format(ip=item.link.ip, name=item.link.name))
2014-10-06 19:10:03 +00:00
@QtCore.pyqtSlot(str)
2014-10-06 19:10:03 +00:00
def add_projector_from_wizard(self, ip, opts=None):
"""
2014-10-17 17:28:12 +00:00
Add a projector from the edit dialog
2014-10-06 19:10:03 +00:00
2014-10-17 17:28:12 +00:00
:param ip: IP address of new record item to find
2015-11-07 00:49:40 +00:00
:param opts: Needed by PyQt5
2014-10-06 19:10:03 +00:00
"""
log.debug('add_projector_from_wizard(ip={ip})'.format(ip=ip))
2014-10-06 19:10:03 +00:00
item = self.projectordb.get_projector_by_ip(ip)
self.add_projector(item)
@QtCore.pyqtSlot(object)
2014-10-23 02:21:26 +00:00
def edit_projector_from_wizard(self, projector):
2014-10-06 19:10:03 +00:00
"""
Update projector from the wizard edit page
:param projector: Projector() instance of projector with updated information
"""
log.debug('edit_projector_from_wizard(ip={ip})'.format(ip=projector.ip))
2018-10-20 04:33:32 +00:00
old_port = self.old_projector.link.port
old_ip = self.old_projector.link.ip
2014-10-06 19:10:03 +00:00
self.old_projector.link.name = projector.name
self.old_projector.link.ip = projector.ip
2014-10-13 20:16:25 +00:00
self.old_projector.link.pin = None if projector.pin == '' else projector.pin
2014-10-06 19:10:03 +00:00
self.old_projector.link.location = projector.location
self.old_projector.link.notes = projector.notes
self.old_projector.widget.setText(projector.name)
2018-10-20 04:33:32 +00:00
self.old_projector.link.port = int(projector.port)
# Update projector list items
for item in self.projector_list:
if item.link.ip == old_ip:
item.link.port = int(projector.port)
# NOTE: This assumes (!) we are using IP addresses as keys
break
# Update UDP listeners before setting old_projector.port
if old_port != projector.port:
self.udp_listen_delete(old_port)
self.udp_listen_add(int(projector.port))
2014-10-06 19:10:03 +00:00
2014-10-20 23:36:07 +00:00
def _load_projectors(self):
2014-10-06 19:10:03 +00:00
"""'
Load projectors - only call when initializing
"""
2014-10-23 02:21:26 +00:00
log.debug('_load_projectors()')
2014-10-06 19:10:03 +00:00
self.projector_list_widget.clear()
2014-10-10 03:28:24 +00:00
for item in self.projectordb.get_projector_all():
2014-10-23 02:21:26 +00:00
self.add_projector(projector=item, start=self.autostart)
2014-10-06 19:10:03 +00:00
def get_projector_list(self):
"""
Return the list of active projectors
:returns: list
"""
return self.projector_list
@QtCore.pyqtSlot(str, int, str)
2014-10-06 19:10:03 +00:00
def update_status(self, ip, status=None, msg=None):
"""
Update the status information/icon for selected list item
:param ip: IP address of projector
:param status: Optional status code
:param msg: Optional status message
"""
if status is None:
return
item = None
for list_item in self.projector_list:
if ip == list_item.link.ip:
item = list_item
break
2017-12-25 08:44:30 +00:00
if item is None:
log.error('ProjectorManager: Unknown item "{ip}" - not updating status'.format(ip=ip))
return
elif item.status == status:
log.debug('ProjectorManager: No status change for "{ip}" - not updating status'.format(ip=ip))
return
item.status = status
2018-06-10 19:29:00 +00:00
item.icon = self.status_icons[status]
2017-12-25 08:44:30 +00:00
log.debug('({name}) Updating icon with {code}'.format(name=item.link.name, code=STATUS_CODE[status]))
item.widget.setIcon(item.icon)
return self.update_icons()
2014-10-15 01:40:21 +00:00
def get_toolbar_item(self, name, enabled=False, hidden=False):
2015-11-07 00:49:40 +00:00
item = self.one_toolbar.findChild(QtWidgets.QAction, name)
2014-10-15 01:40:21 +00:00
if item == 0:
log.debug('No item found with name "{name}"'.format(name=name))
2014-10-23 02:21:26 +00:00
return
2014-10-15 01:40:21 +00:00
item.setVisible(False if hidden else True)
item.setEnabled(True if enabled else False)
2014-10-06 19:10:03 +00:00
@QtCore.pyqtSlot()
def update_icons(self):
"""
Update the icons when the selected projectors change
"""
2019-03-08 15:19:57 +00:00
log.debug('update_icons(): Checking for selected projector items in list')
count = len(self.projector_list_widget.selectedItems())
2014-10-15 01:40:21 +00:00
projector = None
if count == 0:
self.get_toolbar_item('edit_projector')
self.get_toolbar_item('delete_projector')
self.get_toolbar_item('view_projector', hidden=True)
2014-10-23 02:21:26 +00:00
self.get_toolbar_item('source_view_projector', hidden=True)
2014-10-15 01:40:21 +00:00
self.get_toolbar_item('connect_projector')
self.get_toolbar_item('disconnect_projector')
self.get_toolbar_item('poweron_projector')
self.get_toolbar_item('poweroff_projector')
self.get_toolbar_item('blank_projector')
self.get_toolbar_item('show_projector')
self.get_toolbar_item('connect_projector_multiple', hidden=True)
self.get_toolbar_item('disconnect_projector_multiple', hidden=True)
self.get_toolbar_item('poweron_projector_multiple', hidden=True)
self.get_toolbar_item('poweroff_projector_multiple', hidden=True)
self.get_toolbar_item('blank_projector_multiple', hidden=True)
self.get_toolbar_item('show_projector_multiple', hidden=True)
2014-10-15 01:40:21 +00:00
elif count == 1:
2019-03-08 15:19:57 +00:00
log.debug('update_icons(): Found one item selected')
2014-10-15 01:40:21 +00:00
projector = self.projector_list_widget.selectedItems()[0].data(QtCore.Qt.UserRole)
2017-12-25 08:44:30 +00:00
connected = QSOCKET_STATE[projector.link.state()] == S_CONNECTED
2014-10-15 01:40:21 +00:00
power = projector.link.power == S_ON
self.get_toolbar_item('connect_projector_multiple', hidden=True)
self.get_toolbar_item('disconnect_projector_multiple', hidden=True)
self.get_toolbar_item('poweron_projector_multiple', hidden=True)
self.get_toolbar_item('poweroff_projector_multiple', hidden=True)
self.get_toolbar_item('blank_projector_multiple', hidden=True)
self.get_toolbar_item('show_projector_multiple', hidden=True)
2014-10-15 01:40:21 +00:00
if connected:
2019-03-08 15:19:57 +00:00
log.debug('update_icons(): Updating icons for connected state')
2014-10-15 01:40:21 +00:00
self.get_toolbar_item('view_projector', enabled=True)
2014-10-23 02:21:26 +00:00
self.get_toolbar_item('source_view_projector',
2019-03-08 15:19:57 +00:00
enabled=projector.link.source_available is not None and connected and power)
2014-10-15 01:40:21 +00:00
self.get_toolbar_item('edit_projector', hidden=True)
self.get_toolbar_item('delete_projector', hidden=True)
else:
2019-03-08 15:19:57 +00:00
log.debug('update_icons(): Updating for not connected state')
2014-10-15 01:40:21 +00:00
self.get_toolbar_item('view_projector', hidden=True)
2014-10-23 02:21:26 +00:00
self.get_toolbar_item('source_view_projector', hidden=True)
2014-10-15 01:40:21 +00:00
self.get_toolbar_item('edit_projector', enabled=True)
self.get_toolbar_item('delete_projector', enabled=True)
self.get_toolbar_item('connect_projector', enabled=not connected)
self.get_toolbar_item('disconnect_projector', enabled=connected)
self.get_toolbar_item('poweron_projector', enabled=connected and (projector.link.power == S_STANDBY))
self.get_toolbar_item('poweroff_projector', enabled=connected and (projector.link.power == S_ON))
if projector.link.shutter is not None:
2014-10-15 17:22:12 +00:00
self.get_toolbar_item('blank_projector', enabled=(connected and power and not projector.link.shutter))
self.get_toolbar_item('show_projector', enabled=(connected and power and projector.link.shutter))
else:
self.get_toolbar_item('blank_projector', enabled=False)
self.get_toolbar_item('show_projector', enabled=False)
2014-10-15 01:40:21 +00:00
else:
2019-03-08 15:19:57 +00:00
log.debug('update_icons(): Updating for multiple items selected')
2014-10-15 01:40:21 +00:00
self.get_toolbar_item('edit_projector', enabled=False)
self.get_toolbar_item('delete_projector', enabled=False)
self.get_toolbar_item('view_projector', hidden=True)
2014-10-23 02:21:26 +00:00
self.get_toolbar_item('source_view_projector', hidden=True)
self.get_toolbar_item('connect_projector', hidden=True)
self.get_toolbar_item('disconnect_projector', hidden=True)
self.get_toolbar_item('poweron_projector', hidden=True)
self.get_toolbar_item('poweroff_projector', hidden=True)
self.get_toolbar_item('blank_projector', hidden=True)
self.get_toolbar_item('show_projector', hidden=True)
self.get_toolbar_item('connect_projector_multiple', hidden=False, enabled=True)
self.get_toolbar_item('disconnect_projector_multiple', hidden=False, enabled=True)
self.get_toolbar_item('poweron_projector_multiple', hidden=False, enabled=True)
self.get_toolbar_item('poweroff_projector_multiple', hidden=False, enabled=True)
self.get_toolbar_item('blank_projector_multiple', hidden=False, enabled=True)
self.get_toolbar_item('show_projector_multiple', hidden=False, enabled=True)
@QtCore.pyqtSlot(str)
2014-10-13 20:16:25 +00:00
def authentication_error(self, name):
2014-10-17 17:28:12 +00:00
"""
Display warning dialog when attempting to connect with invalid pin
:param name: Name from QListWidgetItem
"""
2016-04-17 23:47:44 +00:00
title = '"{name} {message}" '.format(name=name,
message=translate('OpenLP.ProjectorManager', 'Authentication Error'))
QtWidgets.QMessageBox.warning(self, title,
2015-11-07 00:49:40 +00:00
'<br />There was an authentication error while trying to connect.'
'<br /><br />Please verify your PIN setting '
'for projector item "{name}"'.format(name=name))
2014-10-13 20:16:25 +00:00
@QtCore.pyqtSlot(str)
2014-10-13 20:16:25 +00:00
def no_authentication_error(self, name):
2014-10-17 17:28:12 +00:00
"""
Display warning dialog when pin saved for item but projector does not
require pin.
:param name: Name from QListWidgetItem
"""
2016-04-17 23:47:44 +00:00
title = '"{name} {message}" '.format(name=name,
2016-04-17 23:57:33 +00:00
message=translate('OpenLP.ProjectorManager', 'No Authentication Error'))
QtWidgets.QMessageBox.warning(self, title,
2015-11-07 00:49:40 +00:00
'<br />PIN is set and projector does not require authentication.'
'<br /><br />Please verify your PIN setting '
'for projector item "{name}"'.format(name=name))
2014-10-13 20:16:25 +00:00
2014-10-06 19:10:03 +00:00
class ProjectorItem(QtCore.QObject):
2014-10-06 19:10:03 +00:00
"""
Class for the projector list widget item.
NOTE: Actual PJLink class instance should be saved as self.link
"""
def __init__(self, link=None):
2014-10-17 17:28:12 +00:00
"""
Initialization for ProjectorItem instance
2017-05-20 05:51:58 +00:00
:param link: PJLink instance for QListWidgetItem
2014-10-17 17:28:12 +00:00
"""
2014-10-06 19:10:03 +00:00
self.link = link
self.thread = None
self.icon = None
self.widget = None
self.my_parent = None
self.timer = None
self.projectordb_item = None
self.poll_time = None
self.socket_timeout = None
self.status = S_NOT_CONNECTED
2018-06-28 15:37:37 +00:00
self.serial_no = None
self.sw_version = None
self.model_filter = None
self.model_lamp = None
2017-06-09 12:12:39 +00:00
super().__init__()
2014-10-06 19:10:03 +00:00
def not_implemented(function):
"""
Temporary function to build an information message box indicating function not implemented yet
:param func: Function name
"""
2015-11-07 00:49:40 +00:00
QtWidgets.QMessageBox.information(None,
translate('OpenLP.ProjectorManager', 'Not Implemented Yet'),
translate('OpenLP.ProjectorManager',
'Function "{function}"<br />has not been implemented yet.'
'<br />Please check back again later.'.format(function=function)))