Docstrings cleanup

This commit is contained in:
Ken Roberts 2014-10-17 10:28:12 -07:00
parent d8f94ac3df
commit 10c415cf1a
6 changed files with 217 additions and 74 deletions

View File

@ -27,7 +27,9 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
""" """
The :mod:`projector` module :mod:`openlp.core.lib.projector.constants` module
Provides the constants used for projector errors/status/defaults
""" """
import logging import logging

View File

@ -27,8 +27,18 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
""" """
The :mod:`projector.db` module provides the database functions for the :mod:`openlp.core.lib.projector.db` module
Projector module.
Provides the database functions for the Projector module.
The Manufacturer, Model, Source tables keep track of the video source
strings used for display of input sources. The Source table maps
manufacturer-defined or user-defined strings from PJLink default strings
to end-user readable strings; ex: PJLink code 11 would map "RGB 1"
default string to "RGB PC (analog)" string.
(Future feature).
The Projector table keeps track of entries for controlled projectors.
""" """
import logging import logging
@ -37,12 +47,10 @@ log.debug('projector.lib.db module loaded')
from os import path from os import path
from sqlalchemy import Column, ForeignKey, Integer, MetaData, String, and_ from sqlalchemy import Column, ForeignKey, Integer, MetaData, String
from sqlalchemy.ext.declarative import declarative_base, declared_attr from sqlalchemy.ext.declarative import declarative_base, declared_attr
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
from openlp.core.common import translate
from openlp.core.lib.db import Manager, init_db, init_url from openlp.core.lib.db import Manager, init_db, init_url
from openlp.core.lib.projector.constants import PJLINK_DEFAULT_SOURCES from openlp.core.lib.projector.constants import PJLINK_DEFAULT_SOURCES
@ -57,16 +65,26 @@ class CommonBase(object):
@declared_attr @declared_attr
def __tablename__(cls): def __tablename__(cls):
return cls.__name__.lower() return cls.__name__.lower()
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
class Manufacturer(CommonBase, Base): class Manufacturer(CommonBase, Base):
""" """
Manufacturer table. Projector manufacturer table.
Manufacturer:
name: Column(String(30))
models: Relationship(Model.id)
Model table is related. Model table is related.
""" """
def __repr__(self): def __repr__(self):
"""
Returns a basic representation of a Manufacturer table entry.
"""
return '<Manufacturer(name="%s")>' % self.name return '<Manufacturer(name="%s")>' % self.name
name = Column(String(30)) name = Column(String(30))
models = relationship('Model', models = relationship('Model',
order_by='Model.name', order_by='Model.name',
@ -78,12 +96,22 @@ class Manufacturer(CommonBase, Base):
class Model(CommonBase, Base): class Model(CommonBase, Base):
""" """
Model table. Projector model table.
Model:
name: Column(String(20))
sources: Relationship(Source.id)
manufacturer_id: Foreign_key(Manufacturer.id)
Manufacturer table links here. Manufacturer table links here.
Source table is related. Source table is related.
""" """
def __repr__(self): def __repr__(self):
"""
Returns a basic representation of a Model table entry.
"""
return '<Model(name=%s)>' % self.name return '<Model(name=%s)>' % self.name
manufacturer_id = Column(Integer, ForeignKey('manufacturer.id')) manufacturer_id = Column(Integer, ForeignKey('manufacturer.id'))
name = Column(String(20)) name = Column(String(20))
sources = relationship('Source', sources = relationship('Source',
@ -96,12 +124,22 @@ class Model(CommonBase, Base):
class Source(CommonBase, Base): class Source(CommonBase, Base):
""" """
Input source table. Projector video source table.
Source:
pjlink_name: Column(String(15))
pjlink_code: Column(String(2))
text: Column(String(30))
model_id: Foreign_key(Model.id)
Model table links here. Model table links here.
These entries map PJLink source codes to text strings. These entries map PJLink input video source codes to text strings.
""" """
def __repr__(self): def __repr__(self):
"""
Return basic representation of Source table entry.
"""
return '<Source(pjlink_name="%s", pjlink_code="%s", text="%s")>' % \ return '<Source(pjlink_name="%s", pjlink_code="%s", text="%s")>' % \
(self.pjlink_name, self.pjlink_code, self.text) (self.pjlink_name, self.pjlink_code, self.text)
model_id = Column(Integer, ForeignKey('model.id')) model_id = Column(Integer, ForeignKey('model.id'))
@ -114,7 +152,18 @@ class Projector(CommonBase, Base):
""" """
Projector table. Projector table.
No relation. This keeps track of installed projectors. Projector:
ip: Column(String(100)) # Allow for IPv6 or FQDN
port: Column(String(8))
pin: Column(String(20)) # Allow for test strings
name: Column(String(20))
location: Column(String(30))
notes: Column(String(200))
pjlink_name: Column(String(128)) # From projector (future)
manufacturer: Column(String(128)) # From projector (future)
model: Column(String(128)) # From projector (future)
other: Column(String(128)) # From projector (future)
sources: Column(String(128)) # From projector (future)
""" """
ip = Column(String(100)) ip = Column(String(100))
port = Column(String(8)) port = Column(String(8))
@ -143,7 +192,7 @@ class ProjectorDB(Manager):
""" """
Setup the projector database and initialize the schema. Setup the projector database and initialize the schema.
Change to Declarative means we really don't do much here. Declarative uses table classes to define schema.
""" """
url = init_url('projector') url = init_url('projector')
session, metadata = init_db(url, base=Base) session, metadata = init_db(url, base=Base)
@ -154,7 +203,7 @@ class ProjectorDB(Manager):
""" """
Locate a DB record by record ID. Locate a DB record by record ID.
:param dbid: DB record :param dbid: DB record id
:returns: Projector() instance :returns: Projector() instance
""" """
log.debug('get_projector_by_id(id="%s")' % dbid) log.debug('get_projector_by_id(id="%s")' % dbid)
@ -168,8 +217,9 @@ class ProjectorDB(Manager):
def get_projector_all(self): def get_projector_all(self):
""" """
Retrieve all projector entries so they can be added to the Projector Retrieve all projector entries.
Manager list pane.
:returns: List with Projector() instances used in Manager() QListWidget.
""" """
log.debug('get_all() called') log.debug('get_all() called')
return_list = [] return_list = []
@ -217,10 +267,10 @@ class ProjectorDB(Manager):
""" """
Add a new projector entry Add a new projector entry
NOTE: Will not add new entry if IP is the same as already in the table.
:param projector: Projector() instance to add :param projector: Projector() instance to add
:returns: bool :returns: bool
True if entry added
False if entry already in DB or db error
""" """
old_projector = self.get_object_filtered(Projector, Projector.ip == projector.ip) old_projector = self.get_object_filtered(Projector, Projector.ip == projector.ip)
if old_projector is not None: if old_projector is not None:
@ -239,6 +289,8 @@ class ProjectorDB(Manager):
:param projector: Projector() instance with new information :param projector: Projector() instance with new information
:returns: bool :returns: bool
True if DB record updated
False if entry not in DB or DB error
""" """
if projector is None: if projector is None:
log.error('No Projector() instance to update - cancelled') log.error('No Projector() instance to update - cancelled')
@ -266,6 +318,8 @@ class ProjectorDB(Manager):
:param projector: Projector() instance to delete :param projector: Projector() instance to delete
:returns: bool :returns: bool
True if record deleted
False if DB error
""" """
deleted = self.delete_object(Projector, projector.id) deleted = self.delete_object(Projector, projector.id)
if deleted: if deleted:
@ -282,7 +336,10 @@ class ProjectorDB(Manager):
:param make: Manufacturer name as retrieved from projector :param make: Manufacturer name as retrieved from projector
:param model: Manufacturer model as retrieved from projector :param model: Manufacturer model as retrieved from projector
:param sources: List of available sources (from projector)
:returns: dict :returns: dict
key: (str) PJLink code for source
value: (str) From Sources table or default PJLink strings
""" """
source_dict = {} source_dict = {}
model_list = self.get_all_objects(Model, Model.name == model) model_list = self.get_all_objects(Model, Model.name == model)

View File

@ -27,19 +27,19 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
""" """
The :mod:`projector.pjlink1` module provides the necessary functions :mod:`openlp.core.lib.projector.pjlink1` module
for connecting to a PJLink-capable projector. Provides the necessary functions for connecting to a PJLink-capable projector.
See PJLink Specifications for Class 1 for details. See PJLink Class 1 Specifications for details.
http://pjlink.jbmia.or.jp/english/dl.html
Section 5-1 PJLink Specifications
Section 5-5 Guidelines for Input Terminals
NOTE: NOTE:
Function names follow the following syntax: Function names follow the following syntax:
def process_CCCC(...): def process_CCCC(...):
WHERE: WHERE:
CCCC = PJLink command being processed. CCCC = PJLink command being processed.
See PJLINK_FUNC(...) for command returned from projector.
""" """
import logging import logging
@ -49,11 +49,10 @@ log.debug('rpjlink1 loaded')
__all__ = ['PJLink1'] __all__ = ['PJLink1']
from time import sleep from codecs import decode
from codecs import decode, encode
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import QObject, pyqtSignal, pyqtSlot from PyQt4.QtCore import pyqtSignal, pyqtSlot
from PyQt4.QtNetwork import QAbstractSocket, QTcpSocket from PyQt4.QtNetwork import QAbstractSocket, QTcpSocket
from openlp.core.common import translate, qmd5_hash from openlp.core.common import translate, qmd5_hash
@ -73,6 +72,7 @@ class PJLink1(QTcpSocket):
""" """
Socket service for connecting to a PJLink-capable projector. Socket service for connecting to a PJLink-capable projector.
""" """
# Signals sent by this module
changeStatus = pyqtSignal(str, int, str) changeStatus = pyqtSignal(str, int, str)
projectorNetwork = pyqtSignal(int) # Projector network activity projectorNetwork = pyqtSignal(int) # Projector network activity
projectorStatus = pyqtSignal(int) # Status update projectorStatus = pyqtSignal(int) # Status update
@ -151,7 +151,7 @@ class PJLink1(QTcpSocket):
self.send_queue = [] self.send_queue = []
self.send_busy = False self.send_busy = False
self.socket_timer = None # Test for send_busy and brain-dead projectors self.socket_timer = None # Test for send_busy and brain-dead projectors
# Map command returned to function # Map command to function
self.PJLINK1_FUNC = {'AVMT': self.process_avmt, self.PJLINK1_FUNC = {'AVMT': self.process_avmt,
'CLSS': self.process_clss, 'CLSS': self.process_clss,
'ERST': self.process_erst, 'ERST': self.process_erst,
@ -167,6 +167,9 @@ class PJLink1(QTcpSocket):
} }
def reset_information(self): def reset_information(self):
"""
Reset projector-specific information to default
"""
log.debug('(%s) reset_information() connect status is %s' % (self.ip, self.state())) log.debug('(%s) reset_information() connect status is %s' % (self.ip, self.state()))
self.power = S_OFF self.power = S_OFF
self.pjlink_name = None self.pjlink_name = None
@ -224,14 +227,15 @@ class PJLink1(QTcpSocket):
def socket_abort(self): def socket_abort(self):
""" """
Aborts connection and closes socket in case of brain-dead projectors. Aborts connection and closes socket in case of brain-dead projectors.
Should normally be called by socket_timer().
""" """
log.debug('(%s) socket_abort() - Killing connection' % self.ip) log.debug('(%s) socket_abort() - Killing connection' % self.ip)
self.disconnect_from_host(abort=True) self.disconnect_from_host(abort=True)
def poll_loop(self): def poll_loop(self):
""" """
Called by QTimer in ProjectorManager.ProjectorItem. Retrieve information from projector that changes.
Retrieves status information. Normally called by timer().
""" """
if self.state() != self.ConnectedState: if self.state() != self.ConnectedState:
return return
@ -260,8 +264,10 @@ class PJLink1(QTcpSocket):
def _get_status(self, status): def _get_status(self, status):
""" """
Helper to retrieve status/error codes and convert to strings. Helper to retrieve status/error codes and convert to strings.
:param status: Status/Error code
:returns: (Status/Error code, String)
""" """
# Return the status code as a string
if status in ERROR_STRING: if status in ERROR_STRING:
return (ERROR_STRING[status], ERROR_MSG[status]) return (ERROR_STRING[status], ERROR_MSG[status])
elif status in STATUS_STRING: elif status in STATUS_STRING:
@ -273,6 +279,9 @@ class PJLink1(QTcpSocket):
""" """
Check connection/error status, set status for projector, then emit status change signal Check connection/error status, set status for projector, then emit status change signal
for gui to allow changing the icons. for gui to allow changing the icons.
:param status: Status code
:param msg: Optional message
""" """
message = translate('OpenLP.PJLink1', 'No message') if msg is None else msg message = translate('OpenLP.PJLink1', 'No message') if msg is None else msg
(code, message) = self._get_status(status) (code, message) = self._get_status(status)
@ -298,6 +307,11 @@ class PJLink1(QTcpSocket):
def check_command(self, cmd): def check_command(self, cmd):
""" """
Verifies command is valid based on PJLink class. Verifies command is valid based on PJLink class.
:param cmd: PJLink command to validate.
:returns: bool
True if command is valid PJLink command
False if command is not a valid PJLink command
""" """
return self.pjlink_class in PJLINK_VALID_CMD and \ return self.pjlink_class in PJLINK_VALID_CMD and \
cmd in PJLINK_VALID_CMD[self.pjlink_class] cmd in PJLINK_VALID_CMD[self.pjlink_class]
@ -306,6 +320,9 @@ class PJLink1(QTcpSocket):
def check_login(self, data=None): def check_login(self, data=None):
""" """
Processes the initial connection and authentication (if needed). Processes the initial connection and authentication (if needed).
Starts poll timer if connection is established.
:param data: Optional data if called from another routine
""" """
log.debug('(%s) check_login(data="%s")' % (self.ip, data)) log.debug('(%s) check_login(data="%s")' % (self.ip, data))
if data is None: if data is None:
@ -426,7 +443,10 @@ class PJLink1(QTcpSocket):
@pyqtSlot(int) @pyqtSlot(int)
def get_error(self, err): def get_error(self, err):
""" """
Process error from SocketError signal Process error from SocketError signal.
Remaps system error codes to projector error codes.
:param err: Error code
""" """
log.debug('(%s) get_error(err=%s): %s' % (self.ip, err, self.errorString())) log.debug('(%s) get_error(err=%s): %s' % (self.ip, err, self.errorString()))
if err <= 18: if err <= 18:
@ -449,7 +469,12 @@ class PJLink1(QTcpSocket):
def send_command(self, cmd, opts='?', salt=None, queue=False): def send_command(self, cmd, opts='?', salt=None, queue=False):
""" """
Add command to output queue if not already in queue Add command to output queue if not already in queue.
:param cmd: Command to send
:param opts: Optional command option - defaults to '?' (get information)
:param salt: Optional salt for md5 hash for initial authentication
:param queue: Option to force add to queue rather than sending directly
""" """
if self.state() != self.ConnectedState: if self.state() != self.ConnectedState:
log.warn('(%s) send_command(): Not connected - returning' % self.ip) log.warn('(%s) send_command(): Not connected - returning' % self.ip)
@ -484,7 +509,6 @@ class PJLink1(QTcpSocket):
Socket interface to send data. If data=None, then check queue. Socket interface to send data. If data=None, then check queue.
:param data: Immediate data to send :param data: Immediate data to send
:returns: None
""" """
log.debug('(%s) _send_string()' % self.ip) log.debug('(%s) _send_string()' % self.ip)
log.debug('(%s) _send_string(): Connection status: %s' % (self.ip, self.state())) log.debug('(%s) _send_string(): Connection status: %s' % (self.ip, self.state()))
@ -526,6 +550,9 @@ class PJLink1(QTcpSocket):
def process_command(self, cmd, data): def process_command(self, cmd, data):
""" """
Verifies any return error code. Calls the appropriate command handler. Verifies any return error code. Calls the appropriate command handler.
:param cmd: Command to process
:param data: Data being processed
""" """
log.debug('(%s) Processing command "%s"' % (self.ip, cmd)) log.debug('(%s) Processing command "%s"' % (self.ip, cmd))
if data in PJLINK_ERRORS: if data in PJLINK_ERRORS:
@ -575,6 +602,10 @@ class PJLink1(QTcpSocket):
def process_lamp(self, data): def process_lamp(self, data):
""" """
Lamp(s) status. See PJLink Specifications for format. Lamp(s) status. See PJLink Specifications for format.
Data may have more than 1 lamp to process.
Update self.lamp dictionary with lamp status.
:param data: Lamp(s) status.
""" """
lamps = [] lamps = []
data_dict = data.split() data_dict = data.split()
@ -594,6 +625,9 @@ class PJLink1(QTcpSocket):
def process_powr(self, data): def process_powr(self, data):
""" """
Power status. See PJLink specification for format. Power status. See PJLink specification for format.
Update self.power with status. Update icons if change from previous setting.
:param data: Power status
""" """
if data in PJLINK_POWR_STATUS: if data in PJLINK_POWR_STATUS:
power = PJLINK_POWR_STATUS[data] power = PJLINK_POWR_STATUS[data]
@ -612,7 +646,10 @@ class PJLink1(QTcpSocket):
def process_avmt(self, data): def process_avmt(self, data):
""" """
Shutter open/closed. See PJLink specification for format. Process shutter and speaker status. See PJLink specification for format.
Update self.mute (audio) and self.shutter (video shutter).
:param data: Shutter and audio status
""" """
shutter = self.shutter shutter = self.shutter
mute = self.mute mute = self.mute
@ -641,6 +678,9 @@ class PJLink1(QTcpSocket):
def process_inpt(self, data): def process_inpt(self, data):
""" """
Current source input selected. See PJLink specification for format. Current source input selected. See PJLink specification for format.
Update self.source
:param data: Currently selected source
""" """
self.source = data self.source = data
return return
@ -648,6 +688,9 @@ class PJLink1(QTcpSocket):
def process_clss(self, data): def process_clss(self, data):
""" """
PJLink class that this projector supports. See PJLink specification for format. PJLink class that this projector supports. See PJLink specification for format.
Updates self.class.
:param data: Class that projector supports.
""" """
self.pjlink_class = data self.pjlink_class = data
log.debug('(%s) Setting pjlink_class for this projector to "%s"' % (self.ip, self.pjlink_class)) log.debug('(%s) Setting pjlink_class for this projector to "%s"' % (self.ip, self.pjlink_class))
@ -655,28 +698,40 @@ class PJLink1(QTcpSocket):
def process_name(self, data): def process_name(self, data):
""" """
Projector name set by customer. Projector name set in projector.
Updates self.pjlink_name
:param data: Projector name
""" """
self.pjlink_name = data self.pjlink_name = data
return return
def process_inf1(self, data): def process_inf1(self, data):
""" """
Manufacturer name set by manufacturer. Manufacturer name set in projector.
Updates self.manufacturer
:param data: Projector manufacturer
""" """
self.manufacturer = data self.manufacturer = data
return return
def process_inf2(self, data): def process_inf2(self, data):
""" """
Projector Model set by manufacturer. Projector Model set in projector.
Updates self.model.
:param data: Model name
""" """
self.model = data self.model = data
return return
def process_info(self, data): def process_info(self, data):
""" """
Any extra info set by manufacturer. Any extra info set in projector.
Updates self.other_info.
:param data: Projector other info
""" """
self.other_info = data self.other_info = data
return return
@ -684,6 +739,9 @@ class PJLink1(QTcpSocket):
def process_inst(self, data): def process_inst(self, data):
""" """
Available source inputs. See PJLink specification for format. Available source inputs. See PJLink specification for format.
Updates self.source_available
:param data: Sources list
""" """
sources = [] sources = []
check = data.split() check = data.split()
@ -696,6 +754,9 @@ class PJLink1(QTcpSocket):
def process_erst(self, data): def process_erst(self, data):
""" """
Error status. See PJLink Specifications for format. Error status. See PJLink Specifications for format.
Updates self.projector_errors
:param data: Error status
""" """
try: try:
datacheck = int(data) datacheck = int(data)
@ -734,7 +795,7 @@ class PJLink1(QTcpSocket):
def connect_to_host(self): def connect_to_host(self):
""" """
Initiate connection. Initiate connection to projector.
""" """
if self.state() == self.ConnectedState: if self.state() == self.ConnectedState:
log.warn('(%s) connect_to_host(): Already connected - returning' % self.ip) log.warn('(%s) connect_to_host(): Already connected - returning' % self.ip)
@ -832,6 +893,8 @@ class PJLink1(QTcpSocket):
""" """
Verify input source available as listed in 'INST' command, Verify input source available as listed in 'INST' command,
then send the command to select the input source. then send the command to select the input source.
:param src: Video source to select in projector
""" """
if self.source_available is None: if self.source_available is None:
return return

View File

@ -28,8 +28,9 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
""" """
The :mod: `editform` module provides the functions for adding/editing the :mod: `openlp.core.ui.projector.editform` module
list of controlled projectors.
Provides the functions for adding/editing entries in the projector database.
""" """
import logging import logging

View File

@ -27,8 +27,9 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
""" """
The :mod: projectormanager` module provides the functions for :mod: openlp.core.ui.projector.manager` module
the display/control of Projectors.
Provides the functions for the display/control of Projectors.
""" """
import logging import logging
@ -232,6 +233,12 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
Manage the projectors. Manage the projectors.
""" """
def __init__(self, parent=None, projectordb=None): def __init__(self, parent=None, projectordb=None):
"""
Basic initialization.
:param parent: Who I belong to.
:param projectordb: Database session inherited from superclass.
"""
log.debug('__init__()') log.debug('__init__()')
super().__init__(parent) super().__init__(parent)
self.settings_section = 'projector' self.settings_section = 'projector'
@ -239,6 +246,9 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
self.projector_list = [] self.projector_list = []
def bootstrap_initialise(self): def bootstrap_initialise(self):
"""
Pre-initialize setups.
"""
self.setup_ui(self) self.setup_ui(self)
if self.projectordb is None: if self.projectordb is None:
# Work around for testing creating a ~/.openlp.data.projector.projector.sql file # Work around for testing creating a ~/.openlp.data.projector.projector.sql file
@ -255,12 +265,10 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
del(settings) del(settings)
def bootstrap_post_set_up(self): def bootstrap_post_set_up(self):
"""
Post-initialize setups.
"""
self.load_projectors() 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 = ProjectorEditForm(self, projectordb=self.projectordb)
self.projector_form.newProjector.connect(self.add_projector_from_wizard) self.projector_form.newProjector.connect(self.add_projector_from_wizard)
self.projector_form.editProjector.connect(self.edit_projector_from_wizard) self.projector_form.editProjector.connect(self.edit_projector_from_wizard)
@ -273,7 +281,7 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
:param point: The position of the mouse so the correct item can be found. :param point: The position of the mouse so the correct item can be found.
""" """
# QListWidgetItem # QListWidgetItem to build menu for.
item = self.projector_list_widget.itemAt(point) item = self.projector_list_widget.itemAt(point)
if item is None: if item is None:
return return
@ -340,7 +348,6 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
item to change input source. item to change input source.
:param opt: Needed by PyQt4 :param opt: Needed by PyQt4
:returns: None
""" """
list_item = self.projector_list_widget.item(self.projector_list_widget.currentRow()) list_item = self.projector_list_widget.item(self.projector_list_widget.currentRow())
projector = list_item.data(QtCore.Qt.UserRole) projector = list_item.data(QtCore.Qt.UserRole)
@ -386,10 +393,9 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
def on_add_projector(self, opt=None): def on_add_projector(self, opt=None):
""" """
Calls wizard to add a new projector to the database Calls edit dialog to add a new projector to the database
:param opt: Needed by PyQt4 :param opt: Needed by PyQt4
:returns: None
""" """
self.projector_form.exec_() self.projector_form.exec_()
@ -398,7 +404,6 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
Calls projector thread to send blank screen command Calls projector thread to send blank screen command
:param opt: Needed by PyQt4 :param opt: Needed by PyQt4
:returns: None
""" """
try: try:
ip = opt.link.ip ip = opt.link.ip
@ -415,6 +420,12 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
continue continue
def on_doubleclick_item(self, item, opt=None): def on_doubleclick_item(self, item, opt=None):
"""
When item is doubleclicked, will connect to projector.
:param item: List widget item for connection.
:param opt: Needed by PyQt4
"""
projector = item.data(QtCore.Qt.UserRole) projector = item.data(QtCore.Qt.UserRole)
if projector.link.state() != projector.link.ConnectedState: if projector.link.state() != projector.link.ConnectedState:
try: try:
@ -428,7 +439,6 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
Calls projector thread to connect to projector Calls projector thread to connect to projector
:param opt: Needed by PyQt4 :param opt: Needed by PyQt4
:returns: None
""" """
try: try:
ip = opt.link.ip ip = opt.link.ip
@ -449,7 +459,6 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
Deletes a projector from the list and the database Deletes a projector from the list and the database
:param opt: Needed by PyQt4 :param opt: Needed by PyQt4
:returns: None
""" """
list_item = self.projector_list_widget.item(self.projector_list_widget.currentRow()) list_item = self.projector_list_widget.item(self.projector_list_widget.currentRow())
if list_item is None: if list_item is None:
@ -511,7 +520,6 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
Calls projector thread to disconnect from projector Calls projector thread to disconnect from projector
:param opt: Needed by PyQt4 :param opt: Needed by PyQt4
:returns: None
""" """
try: try:
ip = opt.link.ip ip = opt.link.ip
@ -529,10 +537,9 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
def on_edit_projector(self, opt=None): def on_edit_projector(self, opt=None):
""" """
Calls wizard with selected projector to edit information Calls edit dialog with selected projector to edit information
:param opt: Needed by PyQt4 :param opt: Needed by PyQt4
:returns: None
""" """
list_item = self.projector_list_widget.item(self.projector_list_widget.currentRow()) list_item = self.projector_list_widget.item(self.projector_list_widget.currentRow())
projector = list_item.data(QtCore.Qt.UserRole) projector = list_item.data(QtCore.Qt.UserRole)
@ -549,7 +556,6 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
Calls projector link to send Power Off command Calls projector link to send Power Off command
:param opt: Needed by PyQt4 :param opt: Needed by PyQt4
:returns: None
""" """
try: try:
ip = opt.link.ip ip = opt.link.ip
@ -570,7 +576,6 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
Calls projector link to send Power On command Calls projector link to send Power On command
:param opt: Needed by PyQt4 :param opt: Needed by PyQt4
:returns: None
""" """
try: try:
ip = opt.link.ip ip = opt.link.ip
@ -591,7 +596,6 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
Calls projector thread to send open shutter command Calls projector thread to send open shutter command
:param opt: Needed by PyQt4 :param opt: Needed by PyQt4
:returns: None
""" """
try: try:
ip = opt.link.ip ip = opt.link.ip
@ -612,7 +616,6 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
Builds message box with projector status information Builds message box with projector status information
:param opt: Needed by PyQt4 :param opt: Needed by PyQt4
:returns: None
""" """
lwi = self.projector_list_widget.item(self.projector_list_widget.currentRow()) lwi = self.projector_list_widget.item(self.projector_list_widget.currentRow())
projector = lwi.data(QtCore.Qt.UserRole) projector = lwi.data(QtCore.Qt.UserRole)
@ -670,7 +673,7 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
Helper app to build a projector instance Helper app to build a projector instance
:param p: Dict of projector database information :param p: Dict of projector database information
:returns: PJLink() instance :returns: PJLink1() instance
""" """
log.debug('_add_projector()') log.debug('_add_projector()')
return PJLink1(dbid=projector.id, return PJLink1(dbid=projector.id,
@ -698,9 +701,8 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
We are not concerned with the wizard instance, We are not concerned with the wizard instance,
just the projector item just the projector item
:param opt1: See docstring :param opt1: See above
:param opt2: See docstring :param opt2: See above
:returns: None
""" """
if opt1 is None: if opt1 is None:
return return
@ -751,11 +753,10 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
@pyqtSlot(str) @pyqtSlot(str)
def add_projector_from_wizard(self, ip, opts=None): def add_projector_from_wizard(self, ip, opts=None):
""" """
Add a projector from the wizard Add a projector from the edit dialog
:param ip: IP address of new record item :param ip: IP address of new record item to find
:param opts: Needed by PyQt4 :param opts: Needed by PyQt4
:returns: None
""" """
log.debug('load_projector(ip=%s)' % ip) log.debug('load_projector(ip=%s)' % ip)
item = self.projectordb.get_projector_by_ip(ip) item = self.projectordb.get_projector_by_ip(ip)
@ -768,7 +769,6 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
:param projector: Projector() instance of projector with updated information :param projector: Projector() instance of projector with updated information
:param opts: Needed by PyQt4 :param opts: Needed by PyQt4
:returns: None
""" """
self.old_projector.link.name = projector.name self.old_projector.link.name = projector.name
@ -804,7 +804,6 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
:param ip: IP address of projector :param ip: IP address of projector
:param status: Optional status code :param status: Optional status code
:param msg: Optional status message :param msg: Optional status message
:returns: None
""" """
if status is None: if status is None:
return return
@ -903,6 +902,11 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
@pyqtSlot(str) @pyqtSlot(str)
def authentication_error(self, name): def authentication_error(self, name):
"""
Display warning dialog when attempting to connect with invalid pin
:param name: Name from QListWidgetItem
"""
QtGui.QMessageBox.warning(self, translate('OpenLP.ProjectorManager', QtGui.QMessageBox.warning(self, translate('OpenLP.ProjectorManager',
'"%s" Authentication Error' % name), '"%s" Authentication Error' % name),
'<br />There was an authentictaion error while trying to connect.' '<br />There was an authentictaion error while trying to connect.'
@ -911,6 +915,12 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ProjectorMa
@pyqtSlot(str) @pyqtSlot(str)
def no_authentication_error(self, name): def no_authentication_error(self, name):
"""
Display warning dialog when pin saved for item but projector does not
require pin.
:param name: Name from QListWidgetItem
"""
QtGui.QMessageBox.warning(self, translate('OpenLP.ProjectorManager', QtGui.QMessageBox.warning(self, translate('OpenLP.ProjectorManager',
'"%s" No Authentication Error' % name), '"%s" No Authentication Error' % name),
'<br />PIN is set and projector does not require authentication.' '<br />PIN is set and projector does not require authentication.'
@ -924,6 +934,11 @@ class ProjectorItem(QObject):
NOTE: Actual PJLink class instance should be saved as self.link NOTE: Actual PJLink class instance should be saved as self.link
""" """
def __init__(self, link=None): def __init__(self, link=None):
"""
Initialization for ProjectorItem instance
:param link: PJLink1 instance for QListWidgetItem
"""
self.link = link self.link = link
self.thread = None self.thread = None
self.icon = None self.icon = None
@ -942,7 +957,6 @@ def not_implemented(function):
Temporary function to build an information message box indicating function not implemented yet Temporary function to build an information message box indicating function not implemented yet
:param func: Function name :param func: Function name
:returns: None
""" """
QtGui.QMessageBox.information(None, QtGui.QMessageBox.information(None,
translate('OpenLP.ProjectorManager', 'Not Implemented Yet'), translate('OpenLP.ProjectorManager', 'Not Implemented Yet'),

View File

@ -27,8 +27,9 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
""" """
The :mod:`projector.ui.projectortab` module provides the settings tab in the :mod:`openlp.core.ui.projector.tab`
settings dialog.
Provides the settings tab in the settings dialog.
""" """
import logging import logging
@ -46,6 +47,11 @@ class ProjectorTab(SettingsTab):
Openlp Settings -> Projector settings Openlp Settings -> Projector settings
""" """
def __init__(self, parent): def __init__(self, parent):
"""
ProjectorTab initialization
:param parent: Parent widget
"""
self.icon_path = ':/projector/projector_manager.png' self.icon_path = ':/projector/projector_manager.png'
projector_translated = translate('OpenLP.ProjectorTab', 'Projector') projector_translated = translate('OpenLP.ProjectorTab', 'Projector')
super(ProjectorTab, self).__init__(parent, 'Projector', projector_translated) super(ProjectorTab, self).__init__(parent, 'Projector', projector_translated)