# -*- coding: utf-8 -*- ########################################################################## # OpenLP - Open Source Lyrics Projection # # ---------------------------------------------------------------------- # # Copyright (c) 2008-2022 OpenLP Developers # # ---------------------------------------------------------------------- # # 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 . # ########################################################################## """ The :mod: `openlp.core.ui.projector.editform` module provides the functions for adding/editing entries in the projector database. """ import logging from PyQt5 import QtCore, QtWidgets from openlp.core.common import verify_ip_address from openlp.core.common.i18n import translate from openlp.core.projectors.constants import PJLINK_PORT from openlp.core.projectors.db import Projector from openlp.core.ui.icons import UiIcons log = logging.getLogger(__name__) log.debug('editform loaded') # TODO: Fix db entries for input source(s) class Ui_ProjectorEditForm(object): """ The :class:`~openlp.core.lib.ui.projector.editform.Ui_ProjectorEditForm` class defines the user interface for the ProjectorEditForm dialog. """ def setup_ui(self, edit_projector_dialog): """ Create the interface layout. """ edit_projector_dialog.setObjectName('edit_projector_dialog') edit_projector_dialog.setWindowIcon(UiIcons().main_icon) edit_projector_dialog.setMinimumWidth(400) edit_projector_dialog.setModal(True) # Define the basic layout self.dialog_layout = QtWidgets.QGridLayout(edit_projector_dialog) self.dialog_layout.setObjectName('dialog_layout') self.dialog_layout.setSpacing(8) self.dialog_layout.setContentsMargins(8, 8, 8, 8) # IP Address self.ip_label = QtWidgets.QLabel(edit_projector_dialog) self.ip_label.setObjectName('projector_edit_ip_label') self.ip_text_edit = QtWidgets.QLineEdit(edit_projector_dialog) self.ip_text_edit.setObjectName('projector_edit_ip_text') self.ip_text_label = QtWidgets.QLabel(edit_projector_dialog) self.ip_text_label.setObjectName('projector_show_ip_text') self.dialog_layout.addWidget(self.ip_label, 0, 0) # For new projector, use edit widget self.dialog_layout.addWidget(self.ip_text_edit, 0, 1) # For edit projector, use show widget self.dialog_layout.addWidget(self.ip_text_label, 0, 1) # Port number self.port_label = QtWidgets.QLabel(edit_projector_dialog) self.port_label.setObjectName('projector_edit_ip_label') self.port_text = QtWidgets.QLineEdit(edit_projector_dialog) self.port_text.setObjectName('projector_edit_port_text') self.dialog_layout.addWidget(self.port_label, 1, 0) self.dialog_layout.addWidget(self.port_text, 1, 1) # PIN self.pin_label = QtWidgets.QLabel(edit_projector_dialog) self.pin_label.setObjectName('projector_edit_pin_label') self.pin_text = QtWidgets.QLineEdit(edit_projector_dialog) self.pin_label.setObjectName('projector_edit_pin_text') self.dialog_layout.addWidget(self.pin_label, 2, 0) self.dialog_layout.addWidget(self.pin_text, 2, 1) # Name self.name_label = QtWidgets.QLabel(edit_projector_dialog) self.name_label.setObjectName('projector_edit_name_label') self.name_text = QtWidgets.QLineEdit(edit_projector_dialog) self.name_text.setObjectName('projector_edit_name_text') self.dialog_layout.addWidget(self.name_label, 3, 0) self.dialog_layout.addWidget(self.name_text, 3, 1) # Location self.location_label = QtWidgets.QLabel(edit_projector_dialog) self.location_label.setObjectName('projector_edit_location_label') self.location_text = QtWidgets.QLineEdit(edit_projector_dialog) self.location_text.setObjectName('projector_edit_location_text') self.dialog_layout.addWidget(self.location_label, 4, 0) self.dialog_layout.addWidget(self.location_text, 4, 1) # Notes self.notes_label = QtWidgets.QLabel(edit_projector_dialog) self.notes_label.setObjectName('projector_edit_notes_label') self.notes_text = QtWidgets.QPlainTextEdit(edit_projector_dialog) self.notes_text.setObjectName('projector_edit_notes_text') self.dialog_layout.addWidget(self.notes_label, 5, 0, alignment=QtCore.Qt.AlignTop) self.dialog_layout.addWidget(self.notes_text, 5, 1) # Time for the buttons self.button_box = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Help | QtWidgets.QDialogButtonBox.Save | QtWidgets.QDialogButtonBox.Cancel) self.dialog_layout.addWidget(self.button_box, 8, 0, 1, 2) def retranslate_ui(self, edit_projector_dialog): if self.new_projector: title = translate('OpenLP.ProjectorEditForm', 'Add New Projector') self.projector.port = PJLINK_PORT else: title = translate('OpenLP.ProjectorEditForm', 'Edit Projector') edit_projector_dialog.setWindowTitle(title) self.ip_label.setText(translate('OpenLP.ProjectorEditForm', 'IP Address')) self.ip_text_edit.setText(self.projector.ip) self.ip_text_label.setText(self.projector.ip) self.port_label.setText(translate('OpenLP.ProjectorEditForm', 'Port Number')) self.port_text.setText(str(self.projector.port)) self.pin_label.setText(translate('OpenLP.ProjectorEditForm', 'PIN')) self.pin_text.setText(self.projector.pin) self.name_label.setText(translate('OpenLP.ProjectorEditForm', 'Name')) self.name_text.setText(self.projector.name) self.location_label.setText(translate('OpenLP.ProjectorEditForm', 'Location')) self.location_text.setText(self.projector.location) self.notes_label.setText(translate('OpenLP.ProjectorEditForm', 'Notes')) self.notes_text.clear() self.notes_text.insertPlainText(self.projector.notes) class ProjectorEditForm(QtWidgets.QDialog, Ui_ProjectorEditForm): """ Class to add or edit a projector entry in the database. Fields that are editable: ip = Column(String(100)) (Only edit for new projector) port = Column(String(8)) pin = Column(String(20)) name = Column(String(20)) location = Column(String(30)) notes = Column(String(200)) """ newProjector = QtCore.pyqtSignal(str) editProjector = QtCore.pyqtSignal(object) def __init__(self, parent=None, projectordb=None): super(ProjectorEditForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowCloseButtonHint) self.projectordb = projectordb self.setup_ui(self) self.button_box.accepted.connect(self.accept_me) self.button_box.helpRequested.connect(self.help_me) self.button_box.rejected.connect(self.cancel_me) def exec(self, projector=None): if projector is None: self.projector = Projector() self.new_projector = True self.ip_text_edit.setVisible(True) self.ip_text_edit.setFocus() self.ip_text_label.setVisible(False) else: self.projector = projector self.new_projector = False self.ip_text_edit.setVisible(False) self.ip_text_label.setVisible(True) # Since it's already defined, IP address is unchangeable, so focus on port number self.port_text.setFocus() self.retranslate_ui(self) reply = QtWidgets.QDialog.exec(self) return reply @QtCore.pyqtSlot() def accept_me(self): """ Validate input before accepting input. """ log.debug('accept_me() signal received') valid = True if len(self.name_text.text().strip()) < 1: QtWidgets.QMessageBox.warning(self, translate('OpenLP.ProjectorEdit', 'Name Not Set'), translate('OpenLP.ProjectorEdit', 'You must enter a name for this entry.
' 'Please enter a new name for this entry.')) valid = False return name = self.name_text.text().strip() record = self.projectordb.get_projector_by_name(name) if record is not None and record.id != self.projector.id: QtWidgets.QMessageBox.warning(self, translate('OpenLP.ProjectorEdit', 'Duplicate Name'), translate('OpenLP.ProjectorEdit', 'There is already an entry with name "{name}" in ' 'the database as ID "{record}".
' 'Please enter a different name.'.format(name=name, record=record.id))) valid = False return if self.new_projector: # Only validate a new entry - otherwise it's been previously verified adx = self.ip_text_edit.text() valid = verify_ip_address(adx) if valid: # With a valid IP - check if it's already in database so we don't duplicate ip = self.projectordb.get_projector_by_ip(adx) if ip is None: valid = True self.new_projector = True elif ip.id != self.projector.id: QtWidgets.QMessageBox.warning(self, translate('OpenLP.ProjectorWizard', 'Duplicate IP Address'), translate('OpenLP.ProjectorWizard', 'IP address "{ip}"
is already in the database ' 'as ID {data}.

Please Enter a different ' 'IP address.'.format(ip=adx, data=ip.id))) return else: QtWidgets.QMessageBox.warning(self, translate('OpenLP.ProjectorWizard', 'Invalid IP Address'), translate('OpenLP.ProjectorWizard', 'IP address "{ip}"
is not a valid IP address.' '

Please enter a valid IP address.'.format(ip=adx))) valid = False return port = int(self.port_text.text()) if port < 1000 or port > 32767: QtWidgets.QMessageBox.warning(self, translate('OpenLP.ProjectorWizard', 'Invalid Port Number'), translate('OpenLP.ProjectorWizard', 'Port numbers below 1000 are reserved for admin use only, ' '
and port numbers above 32767 are not currently usable.' '

Please enter a valid port number between ' '1000 and 32767.

' 'Default PJLink port is {port}'.format(port=PJLINK_PORT))) valid = False if valid: if self.new_projector: self.projector.ip = self.ip_text_edit.text() self.projector.pin = self.pin_text.text() self.projector.port = int(self.port_text.text()) self.projector.name = self.name_text.text() self.projector.location = self.location_text.text() self.projector.notes = self.notes_text.toPlainText() if self.new_projector: saved = self.projectordb.add_projector(self.projector) else: saved = self.projectordb.update_projector(self.projector) if not saved: QtWidgets.QMessageBox.warning(self, translate('OpenLP.ProjectorEditForm', 'Database Error'), translate('OpenLP.ProjectorEditForm', 'There was an error saving projector ' 'information. See the log for the error')) return saved if self.new_projector: self.newProjector.emit(adx) else: self.editProjector.emit(self.projector) self.close() @QtCore.pyqtSlot() def help_me(self): """ Show a help message about the input fields. """ log.debug('help_me() signal received') @QtCore.pyqtSlot() def cancel_me(self): """ Cancel button clicked - just close. """ log.debug('cancel_me() signal received') self.close()