2014-10-16 18:08:44 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
|
|
|
|
|
|
|
|
###############################################################################
|
|
|
|
# OpenLP - Open Source Lyrics Projection #
|
|
|
|
# --------------------------------------------------------------------------- #
|
2016-12-31 11:01:36 +00:00
|
|
|
# Copyright (c) 2008-2017 OpenLP Developers #
|
2014-10-16 18:08:44 +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; version 2 of the License. #
|
|
|
|
# #
|
|
|
|
# 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, write to the Free Software Foundation, Inc., 59 #
|
|
|
|
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
|
|
|
###############################################################################
|
|
|
|
"""
|
2017-10-07 07:05:07 +00:00
|
|
|
The :mod: `openlp.core.ui.projector.editform` module provides the functions for adding/editing entries in the projector
|
|
|
|
database.
|
2014-10-16 18:08:44 +00:00
|
|
|
"""
|
|
|
|
import logging
|
|
|
|
|
2015-11-07 00:49:40 +00:00
|
|
|
from PyQt5 import QtCore, QtWidgets
|
2014-10-16 18:08:44 +00:00
|
|
|
|
2017-10-07 07:05:07 +00:00
|
|
|
from openlp.core.common import verify_ip_address
|
|
|
|
from openlp.core.common.i18n import translate
|
2014-10-16 18:08:44 +00:00
|
|
|
from openlp.core.lib import build_icon
|
2017-11-10 11:59:38 +00:00
|
|
|
from openlp.core.projectors.constants import PJLINK_PORT
|
2017-12-28 08:27:44 +00:00
|
|
|
from openlp.core.projectors.db import Projector
|
2014-10-16 18:08:44 +00:00
|
|
|
|
2017-10-07 07:05:07 +00:00
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
log.debug('editform loaded')
|
|
|
|
|
2014-10-16 18:16:08 +00:00
|
|
|
|
2014-10-16 18:08:44 +00:00
|
|
|
class Ui_ProjectorEditForm(object):
|
|
|
|
"""
|
2014-10-21 21:50:35 +00:00
|
|
|
The :class:`~openlp.core.lib.ui.projector.editform.Ui_ProjectorEditForm` class defines
|
2014-10-16 18:08:44 +00:00
|
|
|
the user interface for the ProjectorEditForm dialog.
|
|
|
|
"""
|
|
|
|
def setupUi(self, edit_projector_dialog):
|
|
|
|
"""
|
|
|
|
Create the interface layout.
|
|
|
|
"""
|
|
|
|
edit_projector_dialog.setObjectName('edit_projector_dialog')
|
2016-10-27 17:45:50 +00:00
|
|
|
edit_projector_dialog.setWindowIcon(build_icon(':/icon/openlp-logo.svg'))
|
2014-10-16 18:08:44 +00:00
|
|
|
edit_projector_dialog.setMinimumWidth(400)
|
|
|
|
edit_projector_dialog.setModal(True)
|
|
|
|
# Define the basic layout
|
2016-07-18 21:36:16 +00:00
|
|
|
self.dialog_layout = QtWidgets.QGridLayout(edit_projector_dialog)
|
2014-10-16 18:08:44 +00:00
|
|
|
self.dialog_layout.setObjectName('dialog_layout')
|
|
|
|
self.dialog_layout.setSpacing(8)
|
2014-10-16 18:16:08 +00:00
|
|
|
self.dialog_layout.setContentsMargins(8, 8, 8, 8)
|
2014-10-16 18:08:44 +00:00
|
|
|
# IP Address
|
2016-07-18 21:36:16 +00:00
|
|
|
self.ip_label = QtWidgets.QLabel(edit_projector_dialog)
|
2014-10-16 18:08:44 +00:00
|
|
|
self.ip_label.setObjectName('projector_edit_ip_label')
|
2016-07-18 21:36:16 +00:00
|
|
|
self.ip_text = QtWidgets.QLineEdit(edit_projector_dialog)
|
2014-10-16 18:08:44 +00:00
|
|
|
self.ip_text.setObjectName('projector_edit_ip_text')
|
|
|
|
self.dialog_layout.addWidget(self.ip_label, 0, 0)
|
|
|
|
self.dialog_layout.addWidget(self.ip_text, 0, 1)
|
|
|
|
# Port number
|
2016-07-18 21:36:16 +00:00
|
|
|
self.port_label = QtWidgets.QLabel(edit_projector_dialog)
|
2014-10-16 18:08:44 +00:00
|
|
|
self.port_label.setObjectName('projector_edit_ip_label')
|
2016-07-18 21:36:16 +00:00
|
|
|
self.port_text = QtWidgets.QLineEdit(edit_projector_dialog)
|
2014-10-16 18:08:44 +00:00
|
|
|
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
|
2016-07-18 21:36:16 +00:00
|
|
|
self.pin_label = QtWidgets.QLabel(edit_projector_dialog)
|
2014-10-16 18:08:44 +00:00
|
|
|
self.pin_label.setObjectName('projector_edit_pin_label')
|
2016-07-18 21:36:16 +00:00
|
|
|
self.pin_text = QtWidgets.QLineEdit(edit_projector_dialog)
|
2014-10-16 18:08:44 +00:00
|
|
|
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
|
2016-07-18 21:36:16 +00:00
|
|
|
self.name_label = QtWidgets.QLabel(edit_projector_dialog)
|
2014-10-16 18:08:44 +00:00
|
|
|
self.name_label.setObjectName('projector_edit_name_label')
|
2016-07-18 21:36:16 +00:00
|
|
|
self.name_text = QtWidgets.QLineEdit(edit_projector_dialog)
|
2014-10-16 18:08:44 +00:00
|
|
|
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
|
2016-07-18 21:36:16 +00:00
|
|
|
self.location_label = QtWidgets.QLabel(edit_projector_dialog)
|
2014-10-16 18:08:44 +00:00
|
|
|
self.location_label.setObjectName('projector_edit_location_label')
|
2016-07-18 21:36:16 +00:00
|
|
|
self.location_text = QtWidgets.QLineEdit(edit_projector_dialog)
|
2014-10-16 18:08:44 +00:00
|
|
|
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
|
2016-07-18 21:36:16 +00:00
|
|
|
self.notes_label = QtWidgets.QLabel(edit_projector_dialog)
|
2014-10-16 18:08:44 +00:00
|
|
|
self.notes_label.setObjectName('projector_edit_notes_label')
|
2016-07-18 21:36:16 +00:00
|
|
|
self.notes_text = QtWidgets.QPlainTextEdit(edit_projector_dialog)
|
2014-10-16 18:08:44 +00:00
|
|
|
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
|
2016-07-18 21:36:16 +00:00
|
|
|
self.button_box = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Help |
|
|
|
|
QtWidgets.QDialogButtonBox.Save |
|
|
|
|
QtWidgets.QDialogButtonBox.Cancel)
|
2014-10-16 18:08:44 +00:00
|
|
|
self.dialog_layout.addWidget(self.button_box, 8, 0, 1, 2)
|
|
|
|
|
|
|
|
def retranslateUi(self, edit_projector_dialog):
|
2014-10-21 20:05:35 +00:00
|
|
|
if self.new_projector:
|
2014-10-16 18:08:44 +00:00
|
|
|
title = translate('OpenLP.ProjectorEditForm', 'Add New Projector')
|
|
|
|
self.projector.port = PJLINK_PORT
|
|
|
|
else:
|
|
|
|
title = translate('OpenLP.ProjectorEditForm', 'Edit Projector')
|
|
|
|
edit_projector_dialog.setWindowTitle(title)
|
2014-10-21 21:50:35 +00:00
|
|
|
self.ip_label.setText(translate('OpenLP.ProjectorEditForm', 'IP Address'))
|
2014-10-16 18:08:44 +00:00
|
|
|
self.ip_text.setText(self.projector.ip)
|
2014-10-22 00:49:21 +00:00
|
|
|
self.ip_text.setFocus()
|
2014-10-16 18:08:44 +00:00
|
|
|
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'))
|
2015-01-05 18:36:10 +00:00
|
|
|
self.notes_text.clear()
|
2014-10-16 18:08:44 +00:00
|
|
|
self.notes_text.insertPlainText(self.projector.notes)
|
|
|
|
|
2014-10-16 18:16:08 +00:00
|
|
|
|
2016-07-18 21:36:16 +00:00
|
|
|
class ProjectorEditForm(QtWidgets.QDialog, Ui_ProjectorEditForm):
|
2014-10-16 18:08:44 +00:00
|
|
|
"""
|
|
|
|
Class to add or edit a projector entry in the database.
|
|
|
|
|
|
|
|
Fields that are editable:
|
|
|
|
ip = Column(String(100))
|
|
|
|
port = Column(String(8))
|
|
|
|
pin = Column(String(20))
|
|
|
|
name = Column(String(20))
|
|
|
|
location = Column(String(30))
|
|
|
|
notes = Column(String(200))
|
|
|
|
"""
|
2016-07-18 21:36:16 +00:00
|
|
|
newProjector = QtCore.pyqtSignal(str)
|
|
|
|
editProjector = QtCore.pyqtSignal(object)
|
2014-10-16 18:08:44 +00:00
|
|
|
|
|
|
|
def __init__(self, parent=None, projectordb=None):
|
2017-06-04 12:14:23 +00:00
|
|
|
super(ProjectorEditForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint |
|
|
|
|
QtCore.Qt.WindowCloseButtonHint)
|
2014-10-16 18:08:44 +00:00
|
|
|
self.projectordb = projectordb
|
|
|
|
self.setupUi(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)
|
|
|
|
|
2015-11-07 00:49:40 +00:00
|
|
|
def exec(self, projector=None):
|
2014-10-21 20:05:35 +00:00
|
|
|
if projector is None:
|
|
|
|
self.projector = Projector()
|
|
|
|
self.new_projector = True
|
|
|
|
else:
|
|
|
|
self.projector = projector
|
|
|
|
self.new_projector = False
|
2014-10-16 18:08:44 +00:00
|
|
|
self.retranslateUi(self)
|
2016-07-18 21:36:16 +00:00
|
|
|
reply = QtWidgets.QDialog.exec(self)
|
2014-10-16 18:08:44 +00:00
|
|
|
return reply
|
|
|
|
|
2016-07-18 21:36:16 +00:00
|
|
|
@QtCore.pyqtSlot()
|
2014-10-16 18:08:44 +00:00
|
|
|
def accept_me(self):
|
|
|
|
"""
|
|
|
|
Validate input before accepting input.
|
|
|
|
"""
|
|
|
|
log.debug('accept_me() signal received')
|
|
|
|
if len(self.name_text.text().strip()) < 1:
|
2015-11-07 00:49:40 +00:00
|
|
|
QtWidgets.QMessageBox.warning(self,
|
|
|
|
translate('OpenLP.ProjectorEdit', 'Name Not Set'),
|
|
|
|
translate('OpenLP.ProjectorEdit',
|
|
|
|
'You must enter a name for this entry.<br />'
|
|
|
|
'Please enter a new name for this entry.'))
|
2014-10-16 18:08:44 +00:00
|
|
|
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:
|
2015-11-07 00:49:40 +00:00
|
|
|
QtWidgets.QMessageBox.warning(self,
|
|
|
|
translate('OpenLP.ProjectorEdit', 'Duplicate Name'),
|
|
|
|
translate('OpenLP.ProjectorEdit',
|
2016-04-17 09:15:23 +00:00
|
|
|
'There is already an entry with name "{name}" in '
|
|
|
|
'the database as ID "{record}". <br />'
|
|
|
|
'Please enter a different name.'.format(name=name,
|
|
|
|
record=record.id)))
|
2014-10-16 18:08:44 +00:00
|
|
|
valid = False
|
|
|
|
return
|
|
|
|
adx = self.ip_text.text()
|
|
|
|
valid = verify_ip_address(adx)
|
|
|
|
if valid:
|
|
|
|
ip = self.projectordb.get_projector_by_ip(adx)
|
|
|
|
if ip is None:
|
|
|
|
valid = True
|
|
|
|
self.new_projector = True
|
|
|
|
elif ip.id != self.projector.id:
|
2015-11-07 00:49:40 +00:00
|
|
|
QtWidgets.QMessageBox.warning(self,
|
|
|
|
translate('OpenLP.ProjectorWizard', 'Duplicate IP Address'),
|
|
|
|
translate('OpenLP.ProjectorWizard',
|
2016-04-17 09:15:23 +00:00
|
|
|
'IP address "{ip}"<br />is already in the database '
|
|
|
|
'as ID {data}.<br /><br />Please Enter a different '
|
|
|
|
'IP address.'.format(ip=adx, data=ip.id)))
|
2014-10-16 18:08:44 +00:00
|
|
|
valid = False
|
|
|
|
return
|
|
|
|
else:
|
2015-11-07 00:49:40 +00:00
|
|
|
QtWidgets.QMessageBox.warning(self,
|
|
|
|
translate('OpenLP.ProjectorWizard', 'Invalid IP Address'),
|
|
|
|
translate('OpenLP.ProjectorWizard',
|
2016-04-17 09:15:23 +00:00
|
|
|
'IP address "{ip}"<br>is not a valid IP address.'
|
|
|
|
'<br /><br />Please enter a valid IP address.'.format(ip=adx)))
|
2014-10-16 18:08:44 +00:00
|
|
|
valid = False
|
|
|
|
return
|
|
|
|
port = int(self.port_text.text())
|
|
|
|
if port < 1000 or port > 32767:
|
2015-11-07 00:49:40 +00:00
|
|
|
QtWidgets.QMessageBox.warning(self,
|
|
|
|
translate('OpenLP.ProjectorWizard', 'Invalid Port Number'),
|
|
|
|
translate('OpenLP.ProjectorWizard',
|
|
|
|
'Port numbers below 1000 are reserved for admin use only, '
|
|
|
|
'<br />and port numbers above 32767 are not currently usable.'
|
|
|
|
'<br /><br />Please enter a valid port number between '
|
2016-04-17 09:15:23 +00:00
|
|
|
'1000 and 32767.<br /><br />'
|
|
|
|
'Default PJLink port is {port}'.format(port=PJLINK_PORT)))
|
2014-10-16 18:08:44 +00:00
|
|
|
valid = False
|
|
|
|
if valid:
|
|
|
|
self.projector.ip = self.ip_text.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:
|
2015-11-07 00:49:40 +00:00
|
|
|
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'))
|
2014-10-16 18:08:44 +00:00
|
|
|
return saved
|
|
|
|
if self.new_projector:
|
|
|
|
self.newProjector.emit(adx)
|
|
|
|
else:
|
|
|
|
self.editProjector.emit(self.projector)
|
|
|
|
self.close()
|
|
|
|
|
2016-07-18 21:36:16 +00:00
|
|
|
@QtCore.pyqtSlot()
|
2014-10-16 18:08:44 +00:00
|
|
|
def help_me(self):
|
|
|
|
"""
|
|
|
|
Show a help message about the input fields.
|
|
|
|
"""
|
|
|
|
log.debug('help_me() signal received')
|
|
|
|
|
2016-07-18 21:36:16 +00:00
|
|
|
@QtCore.pyqtSlot()
|
2014-10-16 18:08:44 +00:00
|
|
|
def cancel_me(self):
|
|
|
|
"""
|
|
|
|
Cancel button clicked - just close.
|
|
|
|
"""
|
|
|
|
log.debug('cancel_me() signal received')
|
|
|
|
self.close()
|