forked from openlp/openlp
Change projector wizard to basic edit form
This commit is contained in:
parent
f60f8d211b
commit
645f92e7d4
@ -195,10 +195,22 @@ class PJLink1(QTcpSocket):
|
|||||||
Cleanups when thread is stopped.
|
Cleanups when thread is stopped.
|
||||||
"""
|
"""
|
||||||
log.debug('(%s) Thread stopped' % self.ip)
|
log.debug('(%s) Thread stopped' % self.ip)
|
||||||
self.connected.disconnect(self.check_login)
|
try:
|
||||||
self.disconnected.disconnect(self.disconnect_from_host)
|
self.connected.disconnect(self.check_login)
|
||||||
self.error.disconnect(self.get_error)
|
except TypeError:
|
||||||
self.projectorReceivedData.disconnect(self._send_command)
|
pass
|
||||||
|
try:
|
||||||
|
self.disconnected.disconnect(self.disconnect_from_host)
|
||||||
|
except TypeError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
self.error.disconnect(self.get_error)
|
||||||
|
except TypeError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
self.projectorReceivedData.disconnect(self._send_command)
|
||||||
|
except TypeError:
|
||||||
|
pass
|
||||||
self.disconnect_from_host()
|
self.disconnect_from_host()
|
||||||
self.deleteLater()
|
self.deleteLater()
|
||||||
self.i_am_running = False
|
self.i_am_running = False
|
||||||
|
@ -125,12 +125,12 @@ from .mediadockmanager import MediaDockManager
|
|||||||
from .servicemanager import ServiceManager
|
from .servicemanager import ServiceManager
|
||||||
from .thememanager import ThemeManager
|
from .thememanager import ThemeManager
|
||||||
from .projector.manager import ProjectorManager
|
from .projector.manager import ProjectorManager
|
||||||
from .projector.wizard import ProjectorWizard
|
|
||||||
from .projector.tab import ProjectorTab
|
from .projector.tab import ProjectorTab
|
||||||
|
from .projector.editform import ProjectorEditForm
|
||||||
|
|
||||||
__all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'MainDisplay', 'SlideController', 'ServiceManager', 'ThemeForm',
|
__all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'MainDisplay', 'SlideController', 'ServiceManager', 'ThemeForm',
|
||||||
'ThemeManager', 'MediaDockManager', 'ServiceItemEditForm', 'FirstTimeForm', 'FirstTimeLanguageForm',
|
'ThemeManager', 'MediaDockManager', 'ServiceItemEditForm', 'FirstTimeForm', 'FirstTimeLanguageForm',
|
||||||
'Display', 'ServiceNoteForm', 'ThemeLayoutForm', 'FileRenameForm', 'StartTimeForm', 'MainDisplay',
|
'Display', 'ServiceNoteForm', 'ThemeLayoutForm', 'FileRenameForm', 'StartTimeForm', 'MainDisplay',
|
||||||
'SlideController', 'DisplayController', 'GeneralTab', 'ThemesTab', 'AdvancedTab', 'PluginForm',
|
'SlideController', 'DisplayController', 'GeneralTab', 'ThemesTab', 'AdvancedTab', 'PluginForm',
|
||||||
'FormattingTagForm', 'ShortcutListForm', 'FormattingTagController', 'SingleColumnTableWidget',
|
'FormattingTagForm', 'ShortcutListForm', 'FormattingTagController', 'SingleColumnTableWidget',
|
||||||
'ProjectorManager', 'ProjectorTab', 'ProjectorWizard']
|
'ProjectorManager', 'ProjectorTab',' ProjectorEditForm']
|
||||||
|
262
openlp/core/ui/projector/editform.py
Normal file
262
openlp/core/ui/projector/editform.py
Normal file
@ -0,0 +1,262 @@
|
|||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# OpenLP - Open Source Lyrics Projection #
|
||||||
|
# --------------------------------------------------------------------------- #
|
||||||
|
# Copyright (c) 2008-2014 Raoul Snyman #
|
||||||
|
# Portions copyright (c) 2008-2014 Tim Bentley, Gerald Britton, Jonathan #
|
||||||
|
# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, #
|
||||||
|
# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. #
|
||||||
|
# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, #
|
||||||
|
# Christian Richter, Philip Ridout, Ken Roberts, Simon Scudder, #
|
||||||
|
# Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, #
|
||||||
|
# Dave Warnock, Frode Woldsund, Martin Zibricky, Patrick Zimmermann #
|
||||||
|
# --------------------------------------------------------------------------- #
|
||||||
|
# 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 #
|
||||||
|
###############################################################################
|
||||||
|
"""
|
||||||
|
The :mod: projectormanager` module provides the functions for
|
||||||
|
the display/control of Projectors.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
log.debug('editform loaded')
|
||||||
|
|
||||||
|
from PyQt4 import QtCore, QtGui
|
||||||
|
from PyQt4.QtCore import QObject, pyqtSlot, pyqtSignal
|
||||||
|
from PyQt4.QtGui import QDialog, QFormLayout, QPlainTextEdit, QPushButton, QVBoxLayout, \
|
||||||
|
QLineEdit, QDialogButtonBox, QHBoxLayout, QLabel, QGridLayout
|
||||||
|
|
||||||
|
from openlp.core.common import translate, verify_ip_address
|
||||||
|
from openlp.core.lib import build_icon
|
||||||
|
from openlp.core.lib.projector.db import Projector
|
||||||
|
from openlp.core.lib.projector.constants import PJLINK_PORT
|
||||||
|
|
||||||
|
class Ui_ProjectorEditForm(object):
|
||||||
|
"""
|
||||||
|
The :class:`~opelp.core.lib.ui.projector.editform.Ui_ProjectorEdiForm` class defines
|
||||||
|
the user interface for the ProjectorEditForm dialog.
|
||||||
|
"""
|
||||||
|
def setupUi(self, edit_projector_dialog):
|
||||||
|
"""
|
||||||
|
Create the interface layout.
|
||||||
|
"""
|
||||||
|
edit_projector_dialog.setObjectName('edit_projector_dialog')
|
||||||
|
edit_projector_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo-32x32.png'))
|
||||||
|
edit_projector_dialog.setMinimumWidth(400)
|
||||||
|
edit_projector_dialog.setModal(True)
|
||||||
|
# Define the basic layout
|
||||||
|
self.dialog_layout = 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 = QLabel(edit_projector_dialog)
|
||||||
|
self.ip_label.setObjectName('projector_edit_ip_label')
|
||||||
|
self.ip_text = QLineEdit(edit_projector_dialog)
|
||||||
|
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
|
||||||
|
self.port_label = QLabel(edit_projector_dialog)
|
||||||
|
self.port_label.setObjectName('projector_edit_ip_label')
|
||||||
|
self.port_text = 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 = QLabel(edit_projector_dialog)
|
||||||
|
self.pin_label.setObjectName('projector_edit_pin_label')
|
||||||
|
self.pin_text = 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 = QLabel(edit_projector_dialog)
|
||||||
|
self.name_label.setObjectName('projector_edit_name_label')
|
||||||
|
self.name_text = 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 = QLabel(edit_projector_dialog)
|
||||||
|
self.location_label.setObjectName('projector_edit_location_label')
|
||||||
|
self.location_text = 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 = QLabel(edit_projector_dialog)
|
||||||
|
self.notes_label.setObjectName('projector_edit_notes_label')
|
||||||
|
self.notes_text = 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 = QDialogButtonBox(QDialogButtonBox.Help |
|
||||||
|
QDialogButtonBox.Save |
|
||||||
|
QDialogButtonBox.Cancel)
|
||||||
|
self.dialog_layout.addWidget(self.button_box, 8, 0, 1, 2)
|
||||||
|
|
||||||
|
def retranslateUi(self, edit_projector_dialog):
|
||||||
|
if self.projector.port is None:
|
||||||
|
title = translate('OpenLP.ProjectorEditForm', 'Add New Projector')
|
||||||
|
self.projector.port = PJLINK_PORT
|
||||||
|
self.new_projecor = True
|
||||||
|
else:
|
||||||
|
title = translate('OpenLP.ProjectorEditForm', 'Edit Projector')
|
||||||
|
self.new_projector = False
|
||||||
|
edit_projector_dialog.setWindowTitle(title)
|
||||||
|
self.ip_label.setText(translate('OpenLP.ProjetorEditForm', 'IP Address'))
|
||||||
|
self.ip_text.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.insertPlainText(self.projector.notes)
|
||||||
|
|
||||||
|
class ProjectorEditForm(QDialog, Ui_ProjectorEditForm):
|
||||||
|
"""
|
||||||
|
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))
|
||||||
|
"""
|
||||||
|
newProjector = pyqtSignal(str)
|
||||||
|
editProjector = pyqtSignal(object)
|
||||||
|
|
||||||
|
def __init__(self, parent=None, projectordb=None):
|
||||||
|
super(ProjectorEditForm, self).__init__(parent=parent)
|
||||||
|
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)
|
||||||
|
|
||||||
|
def exec_(self, projector=Projector()):
|
||||||
|
self.projector = projector
|
||||||
|
self.new_projector = False
|
||||||
|
self.retranslateUi(self)
|
||||||
|
reply = QDialog.exec_(self)
|
||||||
|
self.projector = None
|
||||||
|
return reply
|
||||||
|
|
||||||
|
@pyqtSlot()
|
||||||
|
def accept_me(self):
|
||||||
|
"""
|
||||||
|
Validate input before accepting input.
|
||||||
|
"""
|
||||||
|
log.debug('accept_me() signal received')
|
||||||
|
if len(self.name_text.text().strip()) < 1:
|
||||||
|
QtGui.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.'))
|
||||||
|
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:
|
||||||
|
QtGui.QMessageBox.warning(self,
|
||||||
|
translate('OpenLP.ProjectorEdit', 'Duplicate Name'),
|
||||||
|
translate('OpenLP.ProjectorEdit',
|
||||||
|
'There is already an entry with name "%s" in '
|
||||||
|
'the database as ID "%s". <br />'
|
||||||
|
'Please enter a different name.' % (name, record.id)))
|
||||||
|
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:
|
||||||
|
QtGui.QMessageBox.warning(self,
|
||||||
|
translate('OpenLP.ProjectorWizard', 'Duplicate IP Address'),
|
||||||
|
translate('OpenLP.ProjectorWizard',
|
||||||
|
'IP address "%s"<br />is already in the database as ID %s.'
|
||||||
|
'<br /><br />Please Enter a different IP address.' % (adx, ip.id)))
|
||||||
|
valid = False
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
QtGui.QMessageBox.warning(self,
|
||||||
|
translate('OpenLP.ProjectorWizard', 'Invalid IP Address'),
|
||||||
|
translate('OpenLP.ProjectorWizard',
|
||||||
|
'IP address "%s"<br>is not a valid IP address.'
|
||||||
|
'<br /><br />Please enter a valid IP address.' % adx))
|
||||||
|
valid = False
|
||||||
|
return
|
||||||
|
port = int(self.port_text.text())
|
||||||
|
if port < 1000 or port > 32767:
|
||||||
|
QtGui.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 '
|
||||||
|
' 1000 and 32767.'
|
||||||
|
'<br /><br />Default PJLink port is %s' % PJLINK_PORT))
|
||||||
|
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:
|
||||||
|
QtGui.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()
|
||||||
|
|
||||||
|
def help_me(self):
|
||||||
|
"""
|
||||||
|
Show a help message about the input fields.
|
||||||
|
"""
|
||||||
|
log.debug('help_me() signal received')
|
||||||
|
|
||||||
|
def cancel_me(self):
|
||||||
|
"""
|
||||||
|
Cancel button clicked - just close.
|
||||||
|
"""
|
||||||
|
log.debug('cancel_me() signal received')
|
||||||
|
self.close()
|
@ -45,7 +45,8 @@ from openlp.core.lib.ui import create_widget_action
|
|||||||
from openlp.core.lib.projector.constants import *
|
from openlp.core.lib.projector.constants import *
|
||||||
from openlp.core.lib.projector.db import ProjectorDB
|
from openlp.core.lib.projector.db import ProjectorDB
|
||||||
from openlp.core.lib.projector.pjlink1 import PJLink1
|
from openlp.core.lib.projector.pjlink1 import PJLink1
|
||||||
from openlp.core.ui.projector.wizard import ProjectorWizard
|
#from openlp.core.ui.projector.wizard import ProjectorWizard
|
||||||
|
from openlp.core.ui.projector.editform import ProjectorEditForm
|
||||||
|
|
||||||
# Dict for matching projector status to display icon
|
# Dict for matching projector status to display icon
|
||||||
STATUS_ICONS = {S_NOT_CONNECTED: ':/projector/projector_item_disconnect.png',
|
STATUS_ICONS = {S_NOT_CONNECTED: ':/projector/projector_item_disconnect.png',
|
||||||
@ -255,9 +256,15 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
|
|||||||
|
|
||||||
def bootstrap_post_set_up(self):
|
def bootstrap_post_set_up(self):
|
||||||
self.load_projectors()
|
self.load_projectors()
|
||||||
|
'''
|
||||||
self.projector_form = ProjectorWizard(self, projectordb=self.projectordb)
|
self.projector_form = ProjectorWizard(self, projectordb=self.projectordb)
|
||||||
self.projector_form.edit_page.newProjector.connect(self.add_projector_from_wizard)
|
self.projector_form.edit_page.newProjector.connect(self.add_projector_from_wizard)
|
||||||
self.projector_form.edit_page.editProjector.connect(self.edit_projector_from_wizard)
|
self.projector_form.edit_page.editProjector.connect(self.edit_projector_from_wizard)
|
||||||
|
'''
|
||||||
|
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)
|
self.projector_list_widget.itemSelectionChanged.connect(self.update_icons)
|
||||||
|
|
||||||
def context_menu(self, point):
|
def context_menu(self, point):
|
||||||
@ -446,28 +453,28 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
|
|||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
projector.link.projectorNetwork.disconnect(self.update_status)
|
projector.link.projectorNetwork.disconnect(self.update_status)
|
||||||
except TypeError:
|
except (AttributeError, TypeError):
|
||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
projector.link.changeStatus.disconnect(self.update_status)
|
projector.link.changeStatus.disconnect(self.update_status)
|
||||||
except TypeError:
|
except (AttributeError, TypeError):
|
||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
projector.link.authentication_error.disconnect(self.authentication_error)
|
projector.link.authentication_error.disconnect(self.authentication_error)
|
||||||
except TypeError:
|
except (AttributeError, TypeError):
|
||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
projector.link.no_authentication_error.disconnect(self.no_authentication_error)
|
projector.link.no_authentication_error.disconnect(self.no_authentication_error)
|
||||||
except TypeError:
|
except (AttributeError, TypeError):
|
||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
projector.link.projectorUpdateIcons.disconnect(self.update_icons)
|
projector.link.projectorUpdateIcons.disconnect(self.update_icons)
|
||||||
except TypeError:
|
except (AttributeError, TypeError):
|
||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
projector.timer.stop()
|
projector.timer.stop()
|
||||||
projector.timer.timeout.disconnect(projector.link.poll_loop)
|
projector.timer.timeout.disconnect(projector.link.poll_loop)
|
||||||
except TypeError:
|
except (AttributeError, TypeError):
|
||||||
pass
|
pass
|
||||||
projector.thread.quit()
|
projector.thread.quit()
|
||||||
new_list = []
|
new_list = []
|
||||||
|
@ -1,557 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# OpenLP - Open Source Lyrics Projection #
|
|
||||||
# --------------------------------------------------------------------------- #
|
|
||||||
# Copyright (c) 2008-2014 Raoul Snyman #
|
|
||||||
# Portions copyright (c) 2008-2014 Tim Bentley, Gerald Britton, Jonathan #
|
|
||||||
# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, #
|
|
||||||
# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. #
|
|
||||||
# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, #
|
|
||||||
# Christian Richter, Philip Ridout, Ken Roberts, Simon Scudder, #
|
|
||||||
# Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, #
|
|
||||||
# Dave Warnock, Frode Woldsund, Martin Zibricky, Patrick Zimmermann #
|
|
||||||
# --------------------------------------------------------------------------- #
|
|
||||||
# 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 #
|
|
||||||
###############################################################################
|
|
||||||
"""
|
|
||||||
The :mod:`projector.projectorwizard` module handles the GUI Wizard for adding
|
|
||||||
new projetor entries.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import logging
|
|
||||||
log = logging.getLogger(__name__)
|
|
||||||
log.debug('projectorwizard loaded')
|
|
||||||
|
|
||||||
from ipaddress import IPv4Address, IPv6Address, AddressValueError
|
|
||||||
|
|
||||||
from PyQt4 import QtCore, QtGui
|
|
||||||
from PyQt4.QtCore import pyqtSlot, pyqtSignal
|
|
||||||
|
|
||||||
from openlp.core.common import RegistryProperties, translate, is_macosx
|
|
||||||
from openlp.core.lib import build_icon
|
|
||||||
|
|
||||||
from openlp.core.common import verify_ip_address
|
|
||||||
from openlp.core.lib.projector.db import ProjectorDB, Projector
|
|
||||||
from openlp.core.lib.projector.pjlink1 import PJLink1
|
|
||||||
from openlp.core.lib.projector.constants import *
|
|
||||||
|
|
||||||
PAGE_COUNT = 4
|
|
||||||
(ConnectWelcome,
|
|
||||||
ConnectHost,
|
|
||||||
ConnectEdit,
|
|
||||||
ConnectFinish) = range(PAGE_COUNT)
|
|
||||||
|
|
||||||
PAGE_NEXT = {ConnectWelcome: ConnectHost,
|
|
||||||
ConnectHost: ConnectEdit,
|
|
||||||
ConnectEdit: ConnectFinish,
|
|
||||||
ConnectFinish: -1}
|
|
||||||
|
|
||||||
|
|
||||||
class ProjectorWizard(QtGui.QWizard, RegistryProperties):
|
|
||||||
"""
|
|
||||||
Wizard for adding/editing projector entries.
|
|
||||||
"""
|
|
||||||
def __init__(self, parent, projectordb):
|
|
||||||
log.debug('__init__()')
|
|
||||||
super().__init__(parent)
|
|
||||||
self.db = projectordb
|
|
||||||
self.projector = None
|
|
||||||
self.setObjectName('projector_wizard')
|
|
||||||
self.setWindowIcon(build_icon(u':/icon/openlp-logo.svg'))
|
|
||||||
self.setModal(True)
|
|
||||||
if is_macosx():
|
|
||||||
self.setPixmap(QtGui.QWizard.BackgroundPixmap, QtGui.QPixmap(':/wizards/openlp-osx-wizard.png'))
|
|
||||||
else:
|
|
||||||
self.setWizardStyle(QtGui.QWizard.ModernStyle)
|
|
||||||
self.setMinimumSize(650, 550)
|
|
||||||
self.setOption(QtGui.QWizard.NoBackButtonOnStartPage)
|
|
||||||
self.spacer = QtGui.QSpacerItem(10, 0,
|
|
||||||
QtGui.QSizePolicy.Fixed,
|
|
||||||
QtGui.QSizePolicy.Minimum)
|
|
||||||
self.setOption(self.HaveHelpButton, True)
|
|
||||||
self.welcome_page = ConnectWelcomePage(self, ConnectWelcome)
|
|
||||||
self.host_page = ConnectHostPage(self, ConnectHost)
|
|
||||||
self.edit_page = ConnectEditPage(self, ConnectEdit)
|
|
||||||
self.finish_page = ConnectFinishPage(self, ConnectFinish)
|
|
||||||
self.setPage(self.welcome_page.pageId, self.welcome_page)
|
|
||||||
self.setPage(self.host_page.pageId, self.host_page)
|
|
||||||
self.setPage(self.edit_page.pageId, self.edit_page)
|
|
||||||
self.setPage(self.finish_page.pageId, self.finish_page)
|
|
||||||
self.registerFields()
|
|
||||||
self.retranslateUi()
|
|
||||||
# Connect signals
|
|
||||||
self.button(QtGui.QWizard.HelpButton).clicked.connect(self.showHelp)
|
|
||||||
log.debug('ProjectorWizard() started')
|
|
||||||
|
|
||||||
def exec_(self, projector=None):
|
|
||||||
"""
|
|
||||||
Override function to determine whether we are called to add a new
|
|
||||||
projector or edit an old projector.
|
|
||||||
|
|
||||||
:param projector: Projector instance
|
|
||||||
:returns: None
|
|
||||||
"""
|
|
||||||
self.projector = projector
|
|
||||||
if self.projector is None:
|
|
||||||
log.debug('ProjectorWizard() Adding new projector')
|
|
||||||
self.setWindowTitle(translate('OpenLP.ProjectorWizard',
|
|
||||||
'New Projector Wizard'))
|
|
||||||
self.setStartId(ConnectWelcome)
|
|
||||||
else:
|
|
||||||
log.debug('ProjectorWizard() Editing existing projector')
|
|
||||||
self.setWindowTitle(translate('OpenLP.ProjectorWizard',
|
|
||||||
'Edit Projector Wizard'))
|
|
||||||
self.setStartId(ConnectEdit)
|
|
||||||
self.restart()
|
|
||||||
saved = QtGui.QWizard.exec_(self)
|
|
||||||
self.projector = None
|
|
||||||
return saved
|
|
||||||
|
|
||||||
def registerFields(self):
|
|
||||||
"""
|
|
||||||
Register selected fields for use by all pages.
|
|
||||||
"""
|
|
||||||
self.host_page.registerField('ip_number*', self.host_page.ip_number_text)
|
|
||||||
self.edit_page.registerField('pjlink_port', self.host_page.pjlink_port_text)
|
|
||||||
self.edit_page.registerField('pjlink_pin', self.host_page.pjlink_pin_text)
|
|
||||||
self.edit_page.registerField('projector_name*', self.edit_page.name_text)
|
|
||||||
self.edit_page.registerField('projector_location', self.edit_page.location_text)
|
|
||||||
self.edit_page.registerField('projector_notes', self.edit_page.notes_text, 'plainText')
|
|
||||||
self.edit_page.registerField('projector_make', self.host_page.manufacturer_text)
|
|
||||||
self.edit_page.registerField('projector_model', self.host_page.model_text)
|
|
||||||
|
|
||||||
@pyqtSlot()
|
|
||||||
def showHelp(self):
|
|
||||||
"""
|
|
||||||
Show the pop-up help message.
|
|
||||||
"""
|
|
||||||
page = self.currentPage()
|
|
||||||
try:
|
|
||||||
help_page = page.help_
|
|
||||||
except:
|
|
||||||
help_page = self.no_help
|
|
||||||
QtGui.QMessageBox.information(self, self.title_help, help_page)
|
|
||||||
|
|
||||||
def retranslateUi(self):
|
|
||||||
"""
|
|
||||||
Fixed-text strings used for translations
|
|
||||||
"""
|
|
||||||
self.title_help = translate('OpenLP.ProjectorWizard', 'Projector Wizard Help')
|
|
||||||
self.no_help = translate('OpenLP.ProjectorWizard',
|
|
||||||
'Sorry - no help available for this page.')
|
|
||||||
self.welcome_page.title_label.setText('<span style=\'font-size:14pt; font-weight:600;\'>%s</span>' %
|
|
||||||
translate('OpenLP.ProjectorWizard',
|
|
||||||
'Welcome to the<br />Projector Wizard'))
|
|
||||||
self.welcome_page.information_label.setText(translate('OpenLP.ProjectorWizard', 'This wizard will help you to '
|
|
||||||
'create and edit your Projector control. <br /><br />'
|
|
||||||
'Press "Next" button below to continue.'))
|
|
||||||
self.host_page.setTitle(translate('OpenLP.ProjectorWizard', 'Host Address'))
|
|
||||||
self.host_page.setSubTitle(translate('OpenLP.ProjectorWizard',
|
|
||||||
'Enter the IP address, port, and PIN used to conenct to the projector.'))
|
|
||||||
self.host_page.help_ = translate('OpenLP.ProjectorWizard',
|
|
||||||
'<b>IP Address</b>: The IP address of the projector to connect to.<br />'
|
|
||||||
'<b>Port</b>: The port number. Default is 4352.<br />'
|
|
||||||
'<b>PIN</b>: If needed, enter the PIN access code for the projector.<br />'
|
|
||||||
'<br />Once the IP address has been verified as correct and not '
|
|
||||||
'in the database, the rest of the information can be added on the next page.')
|
|
||||||
self.host_page.ip_number_label.setText(translate('OpenLP.ProjectorWizard', 'IP Address: '))
|
|
||||||
self.host_page.pjlink_port_label.setText(translate('OpenLP.ProjectorWizard', 'Port: '))
|
|
||||||
self.host_page.pjlink_pin_label.setText(translate('OpenLP.ProjectorWizard', 'PIN: '))
|
|
||||||
self.edit_page.setTitle(translate('OpenLP.ProjectorWizard', 'Add/Edit Projector Information'))
|
|
||||||
self.edit_page.setSubTitle(translate('OpenLP.ProjectorWizard',
|
|
||||||
'Enter the information below in the left panel for the projector.'))
|
|
||||||
self.edit_page.help_ = translate('OpenLP.ProjectorWizard',
|
|
||||||
'Please enter the following information:'
|
|
||||||
'<br /><br /><b>Port</b>: The network port to use. Default is %s.'
|
|
||||||
'<br /><br /><b>PIN</b>: The PJLink access PIN. Only required if '
|
|
||||||
'PJLink PIN is set in projector.<br /><br /><b>Name</b>: '
|
|
||||||
'A unique name you want to give to this projector entry. 20 characters max. '
|
|
||||||
'<br /><br /><b>Location</b>: The location of the projector. 30 characters '
|
|
||||||
'max.<br /><br /><b>Notes</b>: Any notes you want to add about this '
|
|
||||||
'projector. 200 characters max.<br /><br />The "Manufacturer" and "Model" '
|
|
||||||
'information will only be available if the projector is connected to the '
|
|
||||||
'network and can be accessed while running this wizard. '
|
|
||||||
'(Currently not implemented)' % PJLINK_PORT)
|
|
||||||
self.edit_page.ip_number_label.setText(translate('OpenLP.ProjectorWizard', 'IP Address: '))
|
|
||||||
self.edit_page.pjlink_port_label.setText(translate('OpenLP.ProjectorWizard', 'Port: '))
|
|
||||||
self.edit_page.pjlink_pin_label.setText(translate('OpenLP.ProjectorWizard', 'PIN: '))
|
|
||||||
self.edit_page.name_label.setText(translate('OpenLP.ProjectorWizard', 'Name: '))
|
|
||||||
self.edit_page.location_label.setText(translate('OpenLP.ProjectorWizard', 'Location: '))
|
|
||||||
self.edit_page.notes_label.setText(translate('OpenLP.ProjectorWizard', 'Notes: '))
|
|
||||||
self.edit_page.projector_make_label.setText(translate('OpenLP.ProjectorWizard', 'Manufacturer: '))
|
|
||||||
self.edit_page.projector_model_label.setText(translate('OpenLP.ProjectorWizard', 'Model: '))
|
|
||||||
self.finish_page.title_label.setText('<span style=\'font-size:14pt; font-weight:600;\'>%s</span>' %
|
|
||||||
translate('OpenLP.ProjectorWizard', 'Projector Added'))
|
|
||||||
self.finish_page.information_label.setText(translate('OpenLP.ProjectorWizard',
|
|
||||||
'<br />Have fun with your new projector.'))
|
|
||||||
|
|
||||||
|
|
||||||
class ConnectBase(QtGui.QWizardPage):
|
|
||||||
"""
|
|
||||||
Base class for the projector wizard pages.
|
|
||||||
"""
|
|
||||||
def __init__(self, parent=None, page=None):
|
|
||||||
super().__init__(parent)
|
|
||||||
self.pageId = page
|
|
||||||
|
|
||||||
def nextId(self):
|
|
||||||
"""
|
|
||||||
Returns next page to show.
|
|
||||||
"""
|
|
||||||
return PAGE_NEXT[self.pageId]
|
|
||||||
|
|
||||||
def setVisible(self, visible):
|
|
||||||
"""
|
|
||||||
Set buttons for bottom of page.
|
|
||||||
"""
|
|
||||||
QtGui.QWizardPage.setVisible(self, visible)
|
|
||||||
if not is_macosx():
|
|
||||||
if visible:
|
|
||||||
try:
|
|
||||||
self.myCustomButton()
|
|
||||||
except:
|
|
||||||
try:
|
|
||||||
self.wizard().setButtonLayout(self.myButtons)
|
|
||||||
except:
|
|
||||||
self.wizard().setButtonLayout([QtGui.QWizard.Stretch,
|
|
||||||
QtGui.QWizard.BackButton,
|
|
||||||
QtGui.QWizard.NextButton,
|
|
||||||
QtGui.QWizard.CancelButton])
|
|
||||||
|
|
||||||
|
|
||||||
class ConnectWelcomePage(ConnectBase):
|
|
||||||
"""
|
|
||||||
Splash screen
|
|
||||||
"""
|
|
||||||
def __init__(self, parent, page):
|
|
||||||
super().__init__(parent, page)
|
|
||||||
if is_macosx():
|
|
||||||
self.setPixmap(QtGui.QWizard.BackgroundPixmap, QtGui.QPixmap(':/wizards/openlp-osx-wizard.png'))
|
|
||||||
else:
|
|
||||||
self.setPixmap(QtGui.QWizard.WatermarkPixmap,
|
|
||||||
QtGui.QPixmap(':/wizards/wizard_createprojector.png'))
|
|
||||||
self.setObjectName('welcome_page')
|
|
||||||
self.myButtons = [QtGui.QWizard.Stretch,
|
|
||||||
QtGui.QWizard.NextButton]
|
|
||||||
self.layout = QtGui.QVBoxLayout(self)
|
|
||||||
self.layout.setObjectName('layout')
|
|
||||||
self.title_label = QtGui.QLabel(self)
|
|
||||||
self.title_label.setObjectName('title_label')
|
|
||||||
self.layout.addWidget(self.title_label)
|
|
||||||
self.layout.addSpacing(40)
|
|
||||||
self.information_label = QtGui.QLabel(self)
|
|
||||||
self.information_label.setWordWrap(True)
|
|
||||||
self.information_label.setObjectName('information_label')
|
|
||||||
self.layout.addWidget(self.information_label)
|
|
||||||
self.layout.addStretch()
|
|
||||||
|
|
||||||
|
|
||||||
class ConnectHostPage(ConnectBase):
|
|
||||||
"""
|
|
||||||
Get initial information.
|
|
||||||
"""
|
|
||||||
def __init__(self, parent, page):
|
|
||||||
super().__init__(parent, page)
|
|
||||||
self.setObjectName('host_page')
|
|
||||||
self.myButtons = [QtGui.QWizard.HelpButton,
|
|
||||||
QtGui.QWizard.Stretch,
|
|
||||||
QtGui.QWizard.NextButton,
|
|
||||||
QtGui.QWizard.CancelButton]
|
|
||||||
self.hostPageLayout = QtGui.QHBoxLayout(self)
|
|
||||||
self.hostPageLayout.setObjectName('layout')
|
|
||||||
# Projector DB information
|
|
||||||
self.localAreaBox = QtGui.QGroupBox(self)
|
|
||||||
self.localAreaBox.setObjectName('host_local_area_box')
|
|
||||||
self.localAreaForm = QtGui.QFormLayout(self.localAreaBox)
|
|
||||||
self.localAreaForm.setObjectName('host_local_area_form')
|
|
||||||
self.ip_number_label = QtGui.QLabel(self.localAreaBox)
|
|
||||||
self.ip_number_label.setObjectName('host_ip_number_label')
|
|
||||||
self.ip_number_text = QtGui.QLineEdit(self.localAreaBox)
|
|
||||||
self.ip_number_text.setObjectName('host_ip_number_text')
|
|
||||||
self.localAreaForm.addRow(self.ip_number_label, self.ip_number_text)
|
|
||||||
self.pjlink_port_label = QtGui.QLabel(self.localAreaBox)
|
|
||||||
self.pjlink_port_label.setObjectName('host_pjlink_port_label')
|
|
||||||
self.pjlink_port_text = QtGui.QLineEdit(self.localAreaBox)
|
|
||||||
self.pjlink_port_text.setMaxLength(5)
|
|
||||||
self.pjlink_port_text.setText(str(PJLINK_PORT))
|
|
||||||
self.pjlink_port_text.setObjectName('host_pjlink_port_text')
|
|
||||||
self.localAreaForm.addRow(self.pjlink_port_label, self.pjlink_port_text)
|
|
||||||
self.pjlink_pin_label = QtGui.QLabel(self.localAreaBox)
|
|
||||||
self.pjlink_pin_label.setObjectName('host_pjlink_pin_label')
|
|
||||||
self.pjlink_pin_text = QtGui.QLineEdit(self.localAreaBox)
|
|
||||||
self.pjlink_pin_text.setObjectName('host_pjlink_pin_text')
|
|
||||||
self.localAreaForm.addRow(self.pjlink_pin_label, self.pjlink_pin_text)
|
|
||||||
self.hostPageLayout.addWidget(self.localAreaBox)
|
|
||||||
self.manufacturer_text = QtGui.QLineEdit(self)
|
|
||||||
self.manufacturer_text.setVisible(False)
|
|
||||||
self.model_text = QtGui.QLineEdit(self)
|
|
||||||
self.model_text.setVisible(False)
|
|
||||||
|
|
||||||
def validatePage(self):
|
|
||||||
"""
|
|
||||||
Validate IP number/FQDN before continuing to next page.
|
|
||||||
"""
|
|
||||||
adx = self.wizard().field('ip_number')
|
|
||||||
port = self.wizard().field('pjlink_port')
|
|
||||||
pin = self.wizard().field('pjlink_pin')
|
|
||||||
log.debug('ip="%s" port="%s" pin="%s"' % (adx, port, pin))
|
|
||||||
valid = verify_ip_address(adx)
|
|
||||||
if valid:
|
|
||||||
ip = self.wizard().db.get_projector_by_ip(adx)
|
|
||||||
if ip is None:
|
|
||||||
valid = True
|
|
||||||
else:
|
|
||||||
QtGui.QMessageBox.warning(self,
|
|
||||||
translate('OpenLP.ProjectorWizard', 'Duplicate IP Address'),
|
|
||||||
translate('OpenLP.ProjectorWizard',
|
|
||||||
'IP address "%s"<br />is already in the database as ID %s.'
|
|
||||||
'<br /><br />Please Enter a different IP address.' % (adx, ip.id)))
|
|
||||||
valid = False
|
|
||||||
else:
|
|
||||||
QtGui.QMessageBox.warning(self,
|
|
||||||
translate('OpenLP.ProjectorWizard', 'Invalid IP Address'),
|
|
||||||
translate('OpenLP.ProjectorWizard',
|
|
||||||
'IP address "%s"<br>is not a valid IP address.'
|
|
||||||
'<br /><br />Please enter a valid IP address.' % adx))
|
|
||||||
valid = False
|
|
||||||
"""
|
|
||||||
TODO - Future plan to retrieve manufacture/model input source information. Not implemented yet.
|
|
||||||
new = PJLink(host=adx, port=port, pin=pin if pin.strip() != '' else None)
|
|
||||||
if new.connect():
|
|
||||||
mfg = new.get_manufacturer()
|
|
||||||
log.debug('Setting manufacturer_text to %s' % mfg)
|
|
||||||
self.manufacturer_text.setText(mfg)
|
|
||||||
model = new.get_model()
|
|
||||||
log.debug('Setting model_text to %s' % model)
|
|
||||||
self.model_text.setText(model)
|
|
||||||
else:
|
|
||||||
if new.status_error == E_AUTHENTICATION:
|
|
||||||
QtGui.QMessageBox.warning(self,
|
|
||||||
translate('OpenLP.ProjectorWizard', 'Requires Authorization'),
|
|
||||||
translate('OpenLP.ProjectorWizard',
|
|
||||||
'Projector requires authorization and either PIN not set '
|
|
||||||
'or invalid PIN set.'
|
|
||||||
'<br />Enter a valid PIN before hitting "NEXT"')
|
|
||||||
)
|
|
||||||
elif new.status_error == E_NO_AUTHENTICATION:
|
|
||||||
QtGui.QMessageBox.warning(self,
|
|
||||||
translate('OpenLP.ProjectorWizard', 'No Authorization Required'),
|
|
||||||
translate('OpenLP.ProjectorWizard',
|
|
||||||
'Projector does not require authorization and PIN set.'
|
|
||||||
'<br />Remove PIN entry before hitting "NEXT"')
|
|
||||||
)
|
|
||||||
valid = False
|
|
||||||
new.disconnect()
|
|
||||||
del(new)
|
|
||||||
"""
|
|
||||||
return valid
|
|
||||||
|
|
||||||
|
|
||||||
class ConnectEditPage(ConnectBase):
|
|
||||||
"""
|
|
||||||
Full information page.
|
|
||||||
"""
|
|
||||||
newProjector = QtCore.pyqtSignal(str)
|
|
||||||
editProjector = QtCore.pyqtSignal(object)
|
|
||||||
|
|
||||||
def __init__(self, parent, page):
|
|
||||||
super().__init__(parent, page)
|
|
||||||
self.setObjectName('edit_page')
|
|
||||||
self.editPageLayout = QtGui.QHBoxLayout(self)
|
|
||||||
self.editPageLayout.setObjectName('layout')
|
|
||||||
# Projector DB information
|
|
||||||
self.localAreaBox = QtGui.QGroupBox(self)
|
|
||||||
self.localAreaBox.setObjectName('edit_local_area_box')
|
|
||||||
self.localAreaForm = QtGui.QFormLayout(self.localAreaBox)
|
|
||||||
self.localAreaForm.setObjectName('edit_local_area_form')
|
|
||||||
self.ip_number_label = QtGui.QLabel(self.localAreaBox)
|
|
||||||
self.ip_number_label.setObjectName('edit_ip_number_label')
|
|
||||||
self.ip_number_text = QtGui.QLineEdit(self.localAreaBox)
|
|
||||||
self.ip_number_text.setObjectName('edit_ip_number_text')
|
|
||||||
self.localAreaForm.addRow(self.ip_number_label, self.ip_number_text)
|
|
||||||
self.pjlink_port_label = QtGui.QLabel(self.localAreaBox)
|
|
||||||
self.pjlink_port_label.setObjectName('edit_pjlink_port_label')
|
|
||||||
self.pjlink_port_text = QtGui.QLineEdit(self.localAreaBox)
|
|
||||||
self.pjlink_port_text.setMaxLength(5)
|
|
||||||
self.pjlink_port_text.setObjectName('edit_pjlink_port_text')
|
|
||||||
self.localAreaForm.addRow(self.pjlink_port_label, self.pjlink_port_text)
|
|
||||||
self.pjlink_pin_label = QtGui.QLabel(self.localAreaBox)
|
|
||||||
self.pjlink_pin_label.setObjectName('pjlink_pin_label')
|
|
||||||
self.pjlink_pin_text = QtGui.QLineEdit(self.localAreaBox)
|
|
||||||
self.pjlink_pin_text.setObjectName('pjlink_pin_text')
|
|
||||||
self.localAreaForm.addRow(self.pjlink_pin_label, self.pjlink_pin_text)
|
|
||||||
self.name_label = QtGui.QLabel(self.localAreaBox)
|
|
||||||
self.name_label.setObjectName('name_label')
|
|
||||||
self.name_text = QtGui.QLineEdit(self.localAreaBox)
|
|
||||||
self.name_text.setObjectName('name_label')
|
|
||||||
self.name_text.setMaxLength(20)
|
|
||||||
self.localAreaForm.addRow(self.name_label, self.name_text)
|
|
||||||
self.location_label = QtGui.QLabel(self.localAreaBox)
|
|
||||||
self.location_label.setObjectName('location_label')
|
|
||||||
self.location_text = QtGui.QLineEdit(self.localAreaBox)
|
|
||||||
self.location_text.setObjectName('location_text')
|
|
||||||
self.location_text.setMaxLength(30)
|
|
||||||
self.localAreaForm.addRow(self.location_label, self.location_text)
|
|
||||||
self.notes_label = QtGui.QLabel(self.localAreaBox)
|
|
||||||
self.notes_label.setObjectName('notes_label')
|
|
||||||
self.notes_text = QtGui.QPlainTextEdit(self.localAreaBox)
|
|
||||||
self.notes_text.setObjectName('notes_text')
|
|
||||||
self.localAreaForm.addRow(self.notes_label, self.notes_text)
|
|
||||||
self.editPageLayout.addWidget(self.localAreaBox)
|
|
||||||
# Projector retrieved information
|
|
||||||
self.remoteAreaBox = QtGui.QGroupBox(self)
|
|
||||||
self.remoteAreaBox.setObjectName('edit_remote_area_box')
|
|
||||||
self.remoteAreaForm = QtGui.QFormLayout(self.remoteAreaBox)
|
|
||||||
self.remoteAreaForm.setObjectName('edit_remote_area_form')
|
|
||||||
self.projector_make_label = QtGui.QLabel(self.remoteAreaBox)
|
|
||||||
self.projector_make_label.setObjectName('projector_make_label')
|
|
||||||
self.projector_make_text = QtGui.QLabel(self.remoteAreaBox)
|
|
||||||
self.projector_make_text.setObjectName('projector_make_text')
|
|
||||||
self.remoteAreaForm.addRow(self.projector_make_label, self.projector_make_text)
|
|
||||||
self.projector_model_label = QtGui.QLabel(self.remoteAreaBox)
|
|
||||||
self.projector_model_label.setObjectName('projector_model_text')
|
|
||||||
self.projector_model_text = QtGui.QLabel(self.remoteAreaBox)
|
|
||||||
self.projector_model_text.setObjectName('projector_model_text')
|
|
||||||
self.remoteAreaForm.addRow(self.projector_model_label, self.projector_model_text)
|
|
||||||
self.editPageLayout.addWidget(self.remoteAreaBox)
|
|
||||||
|
|
||||||
def initializePage(self):
|
|
||||||
"""
|
|
||||||
Fill in the blanks for information from previous page/projector to edit.
|
|
||||||
"""
|
|
||||||
if self.wizard().projector is not None:
|
|
||||||
log.debug('ConnectEditPage.initializePage() Editing existing projector')
|
|
||||||
self.ip_number_text.setText(self.wizard().projector.ip)
|
|
||||||
self.pjlink_port_text.setText(str(self.wizard().projector.port))
|
|
||||||
self.pjlink_pin_text.setText(self.wizard().projector.pin)
|
|
||||||
self.name_text.setText(self.wizard().projector.name)
|
|
||||||
self.location_text.setText(self.wizard().projector.location)
|
|
||||||
self.notes_text.insertPlainText(self.wizard().projector.notes)
|
|
||||||
self.myButtons = [QtGui.QWizard.HelpButton,
|
|
||||||
QtGui.QWizard.Stretch,
|
|
||||||
QtGui.QWizard.FinishButton,
|
|
||||||
QtGui.QWizard.CancelButton]
|
|
||||||
else:
|
|
||||||
log.debug('Retrieving information from host page')
|
|
||||||
self.ip_number_text.setText(self.wizard().field('ip_number'))
|
|
||||||
self.pjlink_port_text.setText(self.wizard().field('pjlink_port'))
|
|
||||||
self.pjlink_pin_text.setText(self.wizard().field('pjlink_pin'))
|
|
||||||
make = self.wizard().field('projector_make')
|
|
||||||
model = self.wizard().field('projector_model')
|
|
||||||
if make is None or make.strip() == '':
|
|
||||||
self.projector_make_text.setText(translate('OpenLP.ProjectorWizard',
|
|
||||||
'Unavailable '))
|
|
||||||
else:
|
|
||||||
self.projector_make_text.setText(make)
|
|
||||||
if model is None or model.strip() == '':
|
|
||||||
self.projector_model_text.setText(translate('OpenLP.ProjectorWizard',
|
|
||||||
'Unavailable '))
|
|
||||||
else:
|
|
||||||
self.projector_model_text.setText(model)
|
|
||||||
self.myButtons = [QtGui.QWizard.HelpButton,
|
|
||||||
QtGui.QWizard.Stretch,
|
|
||||||
QtGui.QWizard.BackButton,
|
|
||||||
QtGui.QWizard.NextButton,
|
|
||||||
QtGui.QWizard.CancelButton]
|
|
||||||
|
|
||||||
def validatePage(self):
|
|
||||||
"""
|
|
||||||
Last verification if editiing existing entry in case of IP change. Add entry to DB.
|
|
||||||
"""
|
|
||||||
log.debug('ConnectEditPage().validatePage()')
|
|
||||||
if self.wizard().projector is not None:
|
|
||||||
ip = self.ip_number_text.text()
|
|
||||||
port = self.pjlink_port_text.text()
|
|
||||||
name = self.name_text.text()
|
|
||||||
location = self.location_text.text()
|
|
||||||
notes = self.notes_text.toPlainText()
|
|
||||||
pin = self.pjlink_pin_text.text()
|
|
||||||
log.debug('edit-page() Verifying info : ip="%s"' % ip)
|
|
||||||
valid = verify_ip_address(ip)
|
|
||||||
if not valid:
|
|
||||||
QtGui.QMessageBox.warning(self,
|
|
||||||
translate('OpenLP.ProjectorWizard', 'Invalid IP Address'),
|
|
||||||
translate('OpenLP.ProjectorWizard',
|
|
||||||
'IP address "%s"<br>is not a valid IP address.'
|
|
||||||
'<br /><br />Please enter a valid IP address.' % ip))
|
|
||||||
return False
|
|
||||||
log.debug('Saving edited projector %s' % ip)
|
|
||||||
self.wizard().projector.ip = ip
|
|
||||||
self.wizard().projector.port = port
|
|
||||||
self.wizard().projector.name = name
|
|
||||||
self.wizard().projector.location = location
|
|
||||||
self.wizard().projector.notes = notes
|
|
||||||
self.wizard().projector.pin = pin
|
|
||||||
saved = self.wizard().db.update_projector(self.wizard().projector)
|
|
||||||
if not saved:
|
|
||||||
QtGui.QMessageBox.error(self, translate('OpenLP.ProjectorWizard', 'Database Error'),
|
|
||||||
translate('OpenLP.ProjectorWizard', 'There was an error saving projector '
|
|
||||||
'information. See the log for the error'))
|
|
||||||
return False
|
|
||||||
self.editProjector.emit(self.wizard().projector)
|
|
||||||
else:
|
|
||||||
projector = Projector(ip=self.wizard().field('ip_number'),
|
|
||||||
port=self.wizard().field('pjlink_port'),
|
|
||||||
name=self.wizard().field('projector_name'),
|
|
||||||
location=self.wizard().field('projector_location'),
|
|
||||||
notes=self.wizard().field('projector_notes'),
|
|
||||||
pin=self.wizard().field('pjlink_pin'))
|
|
||||||
log.debug('Adding new projector %s' % projector.ip)
|
|
||||||
if self.wizard().db.get_projector_by_ip(projector.ip) is None:
|
|
||||||
saved = self.wizard().db.add_projector(projector)
|
|
||||||
if not saved:
|
|
||||||
QtGui.QMessageBox.error(self, translate('OpenLP.ProjectorWizard', 'Database Error'),
|
|
||||||
translate('OpenLP.ProjectorWizard', 'There was an error saving projector '
|
|
||||||
'information. See the log for the error'))
|
|
||||||
return False
|
|
||||||
self.newProjector.emit('%s' % projector.ip)
|
|
||||||
return True
|
|
||||||
|
|
||||||
def nextId(self):
|
|
||||||
"""
|
|
||||||
Returns the next page ID if new entry or end of wizard if editing entry.
|
|
||||||
"""
|
|
||||||
if self.wizard().projector is None:
|
|
||||||
return PAGE_NEXT[self.pageId]
|
|
||||||
else:
|
|
||||||
return -1
|
|
||||||
|
|
||||||
|
|
||||||
class ConnectFinishPage(ConnectBase):
|
|
||||||
"""
|
|
||||||
Buh-Bye page
|
|
||||||
"""
|
|
||||||
def __init__(self, parent, page):
|
|
||||||
super().__init__(parent, page)
|
|
||||||
self.setObjectName('connect_finish_page')
|
|
||||||
if is_macosx():
|
|
||||||
self.setPixmap(QtGui.QWizard.BackgroundPixmap, QtGui.QPixmap(':/wizards/openlp-osx-wizard.png'))
|
|
||||||
else:
|
|
||||||
self.setPixmap(QtGui.QWizard.WatermarkPixmap, QtGui.QPixmap(':/wizards/wizard_createprojector.png'))
|
|
||||||
self.myButtons = [QtGui.QWizard.Stretch,
|
|
||||||
QtGui.QWizard.FinishButton]
|
|
||||||
self.isFinalPage()
|
|
||||||
self.layout = QtGui.QVBoxLayout(self)
|
|
||||||
self.layout.setObjectName('layout')
|
|
||||||
self.title_label = QtGui.QLabel(self)
|
|
||||||
self.title_label.setObjectName('title_label')
|
|
||||||
self.layout.addWidget(self.title_label)
|
|
||||||
self.layout.addSpacing(40)
|
|
||||||
self.information_label = QtGui.QLabel(self)
|
|
||||||
self.information_label.setWordWrap(True)
|
|
||||||
self.information_label.setObjectName('information_label')
|
|
||||||
self.layout.addWidget(self.information_label)
|
|
||||||
self.layout.addStretch()
|
|
Loading…
Reference in New Issue
Block a user