Change projector wizard to basic edit form

This commit is contained in:
Ken Roberts 2014-10-16 11:08:44 -07:00
parent f60f8d211b
commit 645f92e7d4
5 changed files with 294 additions and 570 deletions

View File

@ -195,10 +195,22 @@ class PJLink1(QTcpSocket):
Cleanups when thread is stopped.
"""
log.debug('(%s) Thread stopped' % self.ip)
self.connected.disconnect(self.check_login)
self.disconnected.disconnect(self.disconnect_from_host)
self.error.disconnect(self.get_error)
self.projectorReceivedData.disconnect(self._send_command)
try:
self.connected.disconnect(self.check_login)
except TypeError:
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.deleteLater()
self.i_am_running = False

View File

@ -125,12 +125,12 @@ from .mediadockmanager import MediaDockManager
from .servicemanager import ServiceManager
from .thememanager import ThemeManager
from .projector.manager import ProjectorManager
from .projector.wizard import ProjectorWizard
from .projector.tab import ProjectorTab
from .projector.editform import ProjectorEditForm
__all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'MainDisplay', 'SlideController', 'ServiceManager', 'ThemeForm',
'ThemeManager', 'MediaDockManager', 'ServiceItemEditForm', 'FirstTimeForm', 'FirstTimeLanguageForm',
'Display', 'ServiceNoteForm', 'ThemeLayoutForm', 'FileRenameForm', 'StartTimeForm', 'MainDisplay',
'SlideController', 'DisplayController', 'GeneralTab', 'ThemesTab', 'AdvancedTab', 'PluginForm',
'FormattingTagForm', 'ShortcutListForm', 'FormattingTagController', 'SingleColumnTableWidget',
'ProjectorManager', 'ProjectorTab', 'ProjectorWizard']
'ProjectorManager', 'ProjectorTab',' ProjectorEditForm']

View 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()

View File

@ -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.db import ProjectorDB
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
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):
self.load_projectors()
'''
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.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)
def context_menu(self, point):
@ -446,28 +453,28 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
return
try:
projector.link.projectorNetwork.disconnect(self.update_status)
except TypeError:
except (AttributeError, TypeError):
pass
try:
projector.link.changeStatus.disconnect(self.update_status)
except TypeError:
except (AttributeError, TypeError):
pass
try:
projector.link.authentication_error.disconnect(self.authentication_error)
except TypeError:
except (AttributeError, TypeError):
pass
try:
projector.link.no_authentication_error.disconnect(self.no_authentication_error)
except TypeError:
except (AttributeError, TypeError):
pass
try:
projector.link.projectorUpdateIcons.disconnect(self.update_icons)
except TypeError:
except (AttributeError, TypeError):
pass
try:
projector.timer.stop()
projector.timer.timeout.disconnect(projector.link.poll_loop)
except TypeError:
except (AttributeError, TypeError):
pass
projector.thread.quit()
new_list = []

View File

@ -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()