SlideController and ServiceManager

This commit is contained in:
Tim Bentley 2012-12-10 18:04:58 +00:00
parent 564b2e41ae
commit 0ea45fd885
2 changed files with 269 additions and 509 deletions

View File

@ -167,54 +167,37 @@ class ServiceManager(QtGui.QWidget):
action_list = ActionList.get_instance() action_list = ActionList.get_instance()
action_list.add_category( action_list.add_category(
unicode(UiStrings().Service), CategoryOrder.standardToolbar) unicode(UiStrings().Service), CategoryOrder.standardToolbar)
self.serviceManagerList.moveTop = self.orderToolbar.addToolbarAction( self.serviceManagerList.moveTop = self.orderToolbar.addToolbarAction(u'moveTop',
u'moveTop', text=translate('OpenLP.ServiceManager', 'Move to &top'), text=translate('OpenLP.ServiceManager', 'Move to &top'), icon=u':/services/service_top.png',
icon=u':/services/service_top.png', tooltip=translate( tooltip=translate('OpenLP.ServiceManager', 'Move item to the top of the service.'),
'OpenLP.ServiceManager', 'Move item to the top of the service.'), shortcuts=[QtCore.Qt.Key_Home], category=UiStrings().Service, triggers=self.onServiceTop)
shortcuts=[QtCore.Qt.Key_Home], category=UiStrings().Service, self.serviceManagerList.moveUp = self.orderToolbar.addToolbarAction(u'moveUp',
triggers=self.onServiceTop) text=translate('OpenLP.ServiceManager', 'Move &up'), icon=u':/services/service_up.png',
self.serviceManagerList.moveUp = self.orderToolbar.addToolbarAction( tooltip=translate('OpenLP.ServiceManager', 'Move item up one position in the service.'),
u'moveUp', text=translate('OpenLP.ServiceManager', 'Move &up'), shortcuts=[QtCore.Qt.Key_PageUp], category=UiStrings().Service, triggers=self.onServiceUp)
icon=u':/services/service_up.png', self.serviceManagerList.moveDown = self.orderToolbar.addToolbarAction(u'moveDown',
tooltip=translate('OpenLP.ServiceManager', text=translate('OpenLP.ServiceManager', 'Move &down'), icon=u':/services/service_down.png',
'Move item up one position in the service.'), tooltip=translate('OpenLP.ServiceManager', 'Move item down one position in the service.'),
shortcuts=[QtCore.Qt.Key_PageUp], category=UiStrings().Service, shortcuts=[QtCore.Qt.Key_PageDown], category=UiStrings().Service, triggers=self.onServiceDown)
triggers=self.onServiceUp) self.serviceManagerList.moveBottom = self.orderToolbar.addToolbarAction(u'moveBottom',
self.serviceManagerList.moveDown = self.orderToolbar.addToolbarAction( text=translate('OpenLP.ServiceManager', 'Move to &bottom'), icon=u':/services/service_bottom.png',
u'moveDown', text=translate('OpenLP.ServiceManager', 'Move &down'), tooltip=translate('OpenLP.ServiceManager', 'Move item to the end of the service.'),
icon=u':/services/service_down.png', shortcuts=[QtCore.Qt.Key_End], category=UiStrings().Service, triggers=self.onServiceEnd)
tooltip=translate('OpenLP.ServiceManager', self.serviceManagerList.down = self.orderToolbar.addToolbarAction(u'down',
'Move item down one position in the service.'), text=translate('OpenLP.ServiceManager', 'Move &down'), tooltip=translate('OpenLP.ServiceManager',
shortcuts=[QtCore.Qt.Key_PageDown], category=UiStrings().Service, 'Moves the selection down the window.'), visible=False, shortcuts=[QtCore.Qt.Key_Down],
triggers=self.onServiceDown) triggers=self.onMoveSelectionDown)
self.serviceManagerList.moveBottom = self.orderToolbar.addToolbarAction(
u'moveBottom',
text=translate('OpenLP.ServiceManager', 'Move to &bottom'),
icon=u':/services/service_bottom.png', tooltip=translate(
'OpenLP.ServiceManager', 'Move item to the end of the service.'),
shortcuts=[QtCore.Qt.Key_End], category=UiStrings().Service,
triggers=self.onServiceEnd)
self.serviceManagerList.down = self.orderToolbar.addToolbarAction(
u'down', text=translate('OpenLP.ServiceManager', 'Move &down'),
tooltip=translate('OpenLP.ServiceManager',
'Moves the selection down the window.'), visible=False,
shortcuts=[QtCore.Qt.Key_Down], triggers=self.onMoveSelectionDown)
action_list.add_action(self.serviceManagerList.down) action_list.add_action(self.serviceManagerList.down)
self.serviceManagerList.up = self.orderToolbar.addToolbarAction( self.serviceManagerList.up = self.orderToolbar.addToolbarAction(u'up',
u'up', text=translate('OpenLP.ServiceManager', 'Move up'), text=translate('OpenLP.ServiceManager', 'Move up'), tooltip=translate('OpenLP.ServiceManager',
tooltip=translate('OpenLP.ServiceManager', 'Moves the selection up the window.'), visible=False, shortcuts=[QtCore.Qt.Key_Up],
'Moves the selection up the window.'), visible=False, triggers=self.onMoveSelectionUp)
shortcuts=[QtCore.Qt.Key_Up], triggers=self.onMoveSelectionUp)
action_list.add_action(self.serviceManagerList.up) action_list.add_action(self.serviceManagerList.up)
self.orderToolbar.addSeparator() self.orderToolbar.addSeparator()
self.serviceManagerList.delete = self.orderToolbar.addToolbarAction( self.serviceManagerList.delete = self.orderToolbar.addToolbarAction(u'delete',
u'delete', text=translate('OpenLP.ServiceManager', '&Delete From Service'), icon=u':/general/general_delete.png',
text=translate('OpenLP.ServiceManager', '&Delete From Service'), tooltip=translate('OpenLP.ServiceManager', 'Delete the selected item from the service.'),
icon=u':/general/general_delete.png', shortcuts=[QtCore.Qt.Key_Delete], triggers=self.onDeleteFromService)
tooltip=translate('OpenLP.ServiceManager',
'Delete the selected item from the service.'),
shortcuts=[QtCore.Qt.Key_Delete],
triggers=self.onDeleteFromService)
self.orderToolbar.addSeparator() self.orderToolbar.addSeparator()
self.serviceManagerList.expand = self.orderToolbar.addToolbarAction( self.serviceManagerList.expand = self.orderToolbar.addToolbarAction(
u'expand', text=translate('OpenLP.ServiceManager', '&Expand all'), u'expand', text=translate('OpenLP.ServiceManager', '&Expand all'),
@ -222,20 +205,15 @@ class ServiceManager(QtGui.QWidget):
'OpenLP.ServiceManager', 'Expand all the service items.'), 'OpenLP.ServiceManager', 'Expand all the service items.'),
shortcuts=[QtCore.Qt.Key_Plus], category=UiStrings().Service, shortcuts=[QtCore.Qt.Key_Plus], category=UiStrings().Service,
triggers=self.onExpandAll) triggers=self.onExpandAll)
self.serviceManagerList.collapse = self.orderToolbar.addToolbarAction( self.serviceManagerList.collapse = self.orderToolbar.addToolbarAction(u'collapse',
u'collapse', text=translate('OpenLP.ServiceManager', '&Collapse all'), icon=u':/services/service_collapse_all.png',
text=translate('OpenLP.ServiceManager', '&Collapse all'), tooltip=translate('OpenLP.ServiceManager', 'Collapse all the service items.'),
icon=u':/services/service_collapse_all.png', tooltip=translate( shortcuts=[QtCore.Qt.Key_Minus], category=UiStrings().Service, triggers=self.onCollapseAll)
'OpenLP.ServiceManager', 'Collapse all the service items.'),
shortcuts=[QtCore.Qt.Key_Minus], category=UiStrings().Service,
triggers=self.onCollapseAll)
self.orderToolbar.addSeparator() self.orderToolbar.addSeparator()
self.serviceManagerList.makeLive = self.orderToolbar.addToolbarAction( self.serviceManagerList.makeLive = self.orderToolbar.addToolbarAction(u'makeLive',
u'makeLive', text=translate('OpenLP.ServiceManager', 'Go Live'), text=translate('OpenLP.ServiceManager', 'Go Live'), icon=u':/general/general_live.png',
icon=u':/general/general_live.png', tooltip=translate( tooltip=translate('OpenLP.ServiceManager', 'Send the selected item to Live.'),
'OpenLP.ServiceManager', 'Send the selected item to Live.'), shortcuts=[QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return], category=UiStrings().Service, triggers=self.makeLive)
shortcuts=[QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return],
category=UiStrings().Service, triggers=self.makeLive)
self.layout.addWidget(self.orderToolbar) self.layout.addWidget(self.orderToolbar)
# Connect up our signals and slots # Connect up our signals and slots
QtCore.QObject.connect(self.themeComboBox, QtCore.SIGNAL(u'activated(int)'), self.onThemeComboBoxSelected) QtCore.QObject.connect(self.themeComboBox, QtCore.SIGNAL(u'activated(int)'), self.onThemeComboBoxSelected)
@ -268,34 +246,25 @@ class ServiceManager(QtGui.QWidget):
self.addToAction.setIcon(build_icon(u':/general/general_edit.png')) self.addToAction.setIcon(build_icon(u':/general/general_edit.png'))
# build the context menu # build the context menu
self.menu = QtGui.QMenu() self.menu = QtGui.QMenu()
self.editAction = create_widget_action(self.menu, self.editAction = create_widget_action(self.menu, text=translate('OpenLP.ServiceManager', '&Edit Item'),
text=translate('OpenLP.ServiceManager', '&Edit Item'),
icon=u':/general/general_edit.png', triggers=self.remoteEdit) icon=u':/general/general_edit.png', triggers=self.remoteEdit)
self.maintainAction = create_widget_action(self.menu, self.maintainAction = create_widget_action(self.menu, text=translate('OpenLP.ServiceManager', '&Reorder Item'),
text=translate('OpenLP.ServiceManager', '&Reorder Item'), icon=u':/general/general_edit.png', triggers=self.onServiceItemEditForm)
icon=u':/general/general_edit.png', self.notesAction = create_widget_action(self.menu, text=translate('OpenLP.ServiceManager', '&Notes'),
triggers=self.onServiceItemEditForm) icon=u':/services/service_notes.png', triggers=self.onServiceItemNoteForm)
self.notesAction = create_widget_action(self.menu, self.timeAction = create_widget_action(self.menu, text=translate('OpenLP.ServiceManager', '&Start Time'),
text=translate('OpenLP.ServiceManager', '&Notes'),
icon=u':/services/service_notes.png',
triggers=self.onServiceItemNoteForm)
self.timeAction = create_widget_action(self.menu,
text=translate('OpenLP.ServiceManager', '&Start Time'),
icon=u':/media/media_time.png', triggers=self.onStartTimeForm) icon=u':/media/media_time.png', triggers=self.onStartTimeForm)
self.autoStartAction = create_widget_action(self.menu, self.autoStartAction = create_widget_action(self.menu, text=u'',
text=u'',
icon=u':/media/auto-start_active.png', triggers=self.onAutoStart) icon=u':/media/auto-start_active.png', triggers=self.onAutoStart)
# Add already existing delete action to the menu. # Add already existing delete action to the menu.
self.menu.addAction(self.serviceManagerList.delete) self.menu.addAction(self.serviceManagerList.delete)
self.menu.addSeparator() self.menu.addSeparator()
self.previewAction = create_widget_action(self.menu, self.previewAction = create_widget_action(self.menu, text=translate('OpenLP.ServiceManager', 'Show &Preview'),
text=translate('OpenLP.ServiceManager', 'Show &Preview'),
icon=u':/general/general_preview.png', triggers=self.makePreview) icon=u':/general/general_preview.png', triggers=self.makePreview)
# Add already existing make live action to the menu. # Add already existing make live action to the menu.
self.menu.addAction(self.serviceManagerList.makeLive) self.menu.addAction(self.serviceManagerList.makeLive)
self.menu.addSeparator() self.menu.addSeparator()
self.themeMenu = QtGui.QMenu( self.themeMenu = QtGui.QMenu(translate('OpenLP.ServiceManager', '&Change Item Theme'))
translate('OpenLP.ServiceManager', '&Change Item Theme'))
self.menu.addMenu(self.themeMenu) self.menu.addMenu(self.themeMenu)
self.serviceManagerList.addActions( self.serviceManagerList.addActions(
[self.serviceManagerList.moveDown, [self.serviceManagerList.moveDown,
@ -318,8 +287,7 @@ class ServiceManager(QtGui.QWidget):
if modified: if modified:
self.serviceId += 1 self.serviceId += 1
self._modified = modified self._modified = modified
serviceFile = self.shortFileName() or translate( serviceFile = self.shortFileName() or translate('OpenLP.ServiceManager', 'Untitled Service')
'OpenLP.ServiceManager', 'Untitled Service')
self.mainwindow.setServiceModified(modified, serviceFile) self.mainwindow.setServiceModified(modified, serviceFile)
def isModified(self): def isModified(self):
@ -335,8 +303,7 @@ class ServiceManager(QtGui.QWidget):
self._fileName = unicode(fileName) self._fileName = unicode(fileName)
self.mainwindow.setServiceModified(self.isModified(), self.mainwindow.setServiceModified(self.isModified(),
self.shortFileName()) self.shortFileName())
Settings(). \ Settings().setValue(u'servicemanager/last file',QtCore.QVariant(fileName))
setValue(u'servicemanager/last file',QtCore.QVariant(fileName))
self._saveLite = True if self._fileName.endswith(u'.oszl') else False self._saveLite = True if self._fileName.endswith(u'.oszl') else False
def fileName(self): def fileName(self):
@ -355,9 +322,7 @@ class ServiceManager(QtGui.QWidget):
""" """
Triggered when Config dialog is updated. Triggered when Config dialog is updated.
""" """
self.expandTabs = Settings().value( self.expandTabs = Settings().value(u'advanced/expand service item', QtCore.QVariant(u'False')).toBool()
u'advanced/expand service item',
QtCore.QVariant(u'False')).toBool()
def resetSupportedSuffixes(self): def resetSupportedSuffixes(self):
""" """
@ -405,29 +370,23 @@ class ServiceManager(QtGui.QWidget):
elif result == QtGui.QMessageBox.Save: elif result == QtGui.QMessageBox.Save:
self.decideSaveMethod() self.decideSaveMethod()
if not loadFile: if not loadFile:
fileName = unicode(QtGui.QFileDialog.getOpenFileName( fileName = unicode(QtGui.QFileDialog.getOpenFileName(self.mainwindow,
self.mainwindow,
translate('OpenLP.ServiceManager', 'Open File'), translate('OpenLP.ServiceManager', 'Open File'),
SettingsManager.get_last_dir( SettingsManager.get_last_dir(self.mainwindow.serviceManagerSettingsSection),
self.mainwindow.serviceManagerSettingsSection), translate('OpenLP.ServiceManager', 'OpenLP Service Files (*.osz *.oszl)')))
translate('OpenLP.ServiceManager',
'OpenLP Service Files (*.osz *.oszl)')))
if not fileName: if not fileName:
return False return False
else: else:
fileName = loadFile fileName = loadFile
SettingsManager.set_last_dir( SettingsManager.set_last_dir(self.mainwindow.serviceManagerSettingsSection, split_filename(fileName)[0])
self.mainwindow.serviceManagerSettingsSection,
split_filename(fileName)[0])
self.loadFile(fileName) self.loadFile(fileName)
def saveModifiedService(self): def saveModifiedService(self):
return QtGui.QMessageBox.question(self.mainwindow, return QtGui.QMessageBox.question(self.mainwindow,
translate('OpenLP.ServiceManager', 'Modified Service'), translate('OpenLP.ServiceManager', 'Modified Service'),
translate('OpenLP.ServiceManager', 'The current service has ' translate('OpenLP.ServiceManager',
'been modified. Would you like to save this service?'), 'The current service has been modified. Would you like to save this service?'),
QtGui.QMessageBox.Save | QtGui.QMessageBox.Discard | QtGui.QMessageBox.Save | QtGui.QMessageBox.Discard | QtGui.QMessageBox.Cancel, QtGui.QMessageBox.Save)
QtGui.QMessageBox.Cancel, QtGui.QMessageBox.Save)
def onRecentServiceClicked(self): def onRecentServiceClicked(self):
sender = self.sender() sender = self.sender()
@ -442,8 +401,7 @@ class ServiceManager(QtGui.QWidget):
self.setFileName(u'') self.setFileName(u'')
self.serviceId += 1 self.serviceId += 1
self.setModified(False) self.setModified(False)
Settings(). \ Settings().setValue(u'servicemanager/last file',QtCore.QVariant(u''))
setValue(u'servicemanager/last file',QtCore.QVariant(u''))
Receiver.send_message(u'servicemanager_new_service') Receiver.send_message(u'servicemanager_new_service')
def saveFile(self): def saveFile(self):
@ -491,16 +449,12 @@ class ServiceManager(QtGui.QWidget):
write_list.append(path_from) write_list.append(path_from)
if missing_list: if missing_list:
Receiver.send_message(u'cursor_normal') Receiver.send_message(u'cursor_normal')
title = unicode(translate('OpenLP.ServiceManager', title = unicode(translate('OpenLP.ServiceManager', 'Service File(s) Missing'))
'Service File(s) Missing'))
message = unicode(translate('OpenLP.ServiceManager', message = unicode(translate('OpenLP.ServiceManager',
'The following file(s) in the service are missing:\n\t%s\n\n' 'The following file(s) in the service are missing:\n\t%s\n\n'
'These files will be removed if you continue to save.') 'These files will be removed if you continue to save.')) % "\n\t".join(missing_list)
) % "\n\t".join(missing_list) answer = QtGui.QMessageBox.critical(self, title, message,
answer = QtGui.QMessageBox.critical(self, title, QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel))
message,
QtGui.QMessageBox.StandardButtons(
QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel))
if answer == QtGui.QMessageBox.Cancel: if answer == QtGui.QMessageBox.Cancel:
self.mainwindow.finishedProgressBar() self.mainwindow.finishedProgressBar()
return False return False
@ -519,16 +473,14 @@ class ServiceManager(QtGui.QWidget):
new_file = os.path.join(u'audio', new_file = os.path.join(u'audio',
item[u'service_item']._uuid, filename) item[u'service_item']._uuid, filename)
audio_files.append((filename, new_file)) audio_files.append((filename, new_file))
service_item[u'header'][u'background_audio'][i] = \ service_item[u'header'][u'background_audio'][i] = new_file
new_file
# Add the service item to the service. # Add the service item to the service.
service.append({u'serviceitem': service_item}) service.append({u'serviceitem': service_item})
self.repaintServiceList(-1, -1) self.repaintServiceList(-1, -1)
for file in write_list: for file in write_list:
file_size = os.path.getsize(file) file_size = os.path.getsize(file)
total_size += file_size total_size += file_size
log.debug(u'ServiceManager.saveFile - ZIP contents size is %i bytes' % log.debug(u'ServiceManager.saveFile - ZIP contents size is %i bytes' % total_size)
total_size)
service_content = cPickle.dumps(service) service_content = cPickle.dumps(service)
# Usual Zip file cannot exceed 2GiB, file with Zip64 cannot be # Usual Zip file cannot exceed 2GiB, file with Zip64 cannot be
# extracted using unzip in UNIX. # extracted using unzip in UNIX.
@ -538,8 +490,7 @@ class ServiceManager(QtGui.QWidget):
success = True success = True
self.mainwindow.incrementProgressBar() self.mainwindow.incrementProgressBar()
try: try:
zip = zipfile.ZipFile(temp_file_name, 'w', zipfile.ZIP_STORED, zip = zipfile.ZipFile(temp_file_name, 'w', zipfile.ZIP_STORED, allow_zip_64)
allow_zip_64)
# First we add service contents. # First we add service contents.
# We save ALL filenames into ZIP using UTF-8. # We save ALL filenames into ZIP using UTF-8.
zip.writestr(service_file_name.encode(u'utf-8'), service_content) zip.writestr(service_file_name.encode(u'utf-8'), service_content)
@ -562,10 +513,8 @@ class ServiceManager(QtGui.QWidget):
except IOError: except IOError:
log.exception(u'Failed to save service to disk: %s', temp_file_name) log.exception(u'Failed to save service to disk: %s', temp_file_name)
Receiver.send_message(u'openlp_error_message', { Receiver.send_message(u'openlp_error_message', {
u'title': translate(u'OpenLP.ServiceManager', u'title': translate(u'OpenLP.ServiceManager', u'Error Saving File'),
u'Error Saving File'), u'message': translate(u'OpenLP.ServiceManager', u'There was an error saving your file.')
u'message': translate(u'OpenLP.ServiceManager',
u'There was an error saving your file.')
}) })
success = False success = False
finally: finally:
@ -603,17 +552,14 @@ class ServiceManager(QtGui.QWidget):
basename = os.path.splitext(file_name)[0] basename = os.path.splitext(file_name)[0]
service_file_name = '%s.osd' % basename service_file_name = '%s.osd' % basename
log.debug(u'ServiceManager.saveFile - %s', path_file_name) log.debug(u'ServiceManager.saveFile - %s', path_file_name)
SettingsManager.set_last_dir( SettingsManager.set_last_dir(self.mainwindow.serviceManagerSettingsSection, path)
self.mainwindow.serviceManagerSettingsSection,
path)
service = [] service = []
Receiver.send_message(u'cursor_busy') Receiver.send_message(u'cursor_busy')
# Number of items + 1 to zip it # Number of items + 1 to zip it
self.mainwindow.displayProgressBar(len(self.serviceItems) + 1) self.mainwindow.displayProgressBar(len(self.serviceItems) + 1)
for item in self.serviceItems: for item in self.serviceItems:
self.mainwindow.incrementProgressBar() self.mainwindow.incrementProgressBar()
service_item = item[u'service_item']. \ service_item = item[u'service_item'].get_service_repr(self._saveLite)
get_service_repr(self._saveLite)
#@todo check for file item on save. #@todo check for file item on save.
service.append({u'serviceitem': service_item}) service.append({u'serviceitem': service_item})
self.mainwindow.incrementProgressBar() self.mainwindow.incrementProgressBar()
@ -629,10 +575,8 @@ class ServiceManager(QtGui.QWidget):
except IOError: except IOError:
log.exception(u'Failed to save service to disk: %s', temp_file_name) log.exception(u'Failed to save service to disk: %s', temp_file_name)
Receiver.send_message(u'openlp_error_message', { Receiver.send_message(u'openlp_error_message', {
u'title': translate(u'OpenLP.ServiceManager', u'title': translate(u'OpenLP.ServiceManager', u'Error Saving File'),
u'Error Saving File'), u'message': translate(u'OpenLP.ServiceManager', u'There was an error saving your file.')
u'message': translate(u'OpenLP.ServiceManager',
u'There was an error saving your file.')
}) })
success = False success = False
finally: finally:
@ -655,50 +599,39 @@ class ServiceManager(QtGui.QWidget):
Get a file name and then call :func:`ServiceManager.saveFile` to Get a file name and then call :func:`ServiceManager.saveFile` to
save the file. save the file.
""" """
default_service_enabled = Settings().value( default_service_enabled = Settings().value(u'advanced/default service enabled', QtCore.QVariant(True)).toBool()
u'advanced/default service enabled', QtCore.QVariant(True)).toBool()
if default_service_enabled: if default_service_enabled:
service_day = Settings().value( service_day = Settings().value(u'advanced/default service day', 7).toInt()[0]
u'advanced/default service day', 7).toInt()[0]
if service_day == 7: if service_day == 7:
local_time = datetime.now() local_time = datetime.now()
else: else:
service_hour = Settings().value( service_hour = Settings().value(u'advanced/default service hour', 11).toInt()[0]
u'advanced/default service hour', 11).toInt()[0] service_minute = Settings().value(u'advanced/default service minute', 0).toInt()[0]
service_minute = Settings().value(
u'advanced/default service minute', 0).toInt()[0]
now = datetime.now() now = datetime.now()
day_delta = service_day - now.weekday() day_delta = service_day - now.weekday()
if day_delta < 0: if day_delta < 0:
day_delta += 7 day_delta += 7
time = now + timedelta(days=day_delta) time = now + timedelta(days=day_delta)
local_time = time.replace(hour=service_hour, minute=service_minute) local_time = time.replace(hour=service_hour, minute=service_minute)
default_pattern = unicode(Settings().value( default_pattern = unicode(Settings().value(u'advanced/default service name',
u'advanced/default service name',
translate('OpenLP.AdvancedTab', 'Service %Y-%m-%d %H-%M', translate('OpenLP.AdvancedTab', 'Service %Y-%m-%d %H-%M',
'This may not contain any of the following characters: ' 'This may not contain any of the following characters: '
'/\\?*|<>\[\]":+\nSee http://docs.python.org/library/' '/\\?*|<>\[\]":+\nSee http://docs.python.org/library/'
'datetime.html#strftime-strptime-behavior for more ' 'datetime.html#strftime-strptime-behavior for more information.')).toString())
'information.')).toString())
default_filename = format_time(default_pattern, local_time) default_filename = format_time(default_pattern, local_time)
else: else:
default_filename = u'' default_filename = u''
directory = unicode(SettingsManager.get_last_dir( directory = unicode(SettingsManager.get_last_dir(self.mainwindow.serviceManagerSettingsSection))
self.mainwindow.serviceManagerSettingsSection))
path = os.path.join(directory, default_filename) path = os.path.join(directory, default_filename)
# SaveAs from osz to oszl is not valid as the files will be deleted # SaveAs from osz to oszl is not valid as the files will be deleted
# on exit which is not sensible or usable in the long term. # on exit which is not sensible or usable in the long term.
if self._fileName.endswith(u'oszl') or not self._fileName: if self._fileName.endswith(u'oszl') or not self._fileName:
fileName = unicode(QtGui.QFileDialog.getSaveFileName( fileName = unicode(QtGui.QFileDialog.getSaveFileName(self.mainwindow, UiStrings().SaveService, path,
self.mainwindow, UiStrings().SaveService, path,
translate('OpenLP.ServiceManager', translate('OpenLP.ServiceManager',
'OpenLP Service Files (*.osz);;' 'OpenLP Service Files (*.osz);; OpenLP Service Files - lite (*.oszl)')))
'OpenLP Service Files - lite (*.oszl)')))
else: else:
fileName = unicode(QtGui.QFileDialog.getSaveFileName( fileName = unicode(QtGui.QFileDialog.getSaveFileName(self.mainwindow, UiStrings().SaveService, path,
self.mainwindow, UiStrings().SaveService, path, translate('OpenLP.ServiceManager', 'OpenLP Service Files (*.osz);;')))
translate('OpenLP.ServiceManager',
'OpenLP Service Files (*.osz);;')))
if not fileName: if not fileName:
return False return False
if os.path.splitext(fileName)[1] == u'': if os.path.splitext(fileName)[1] == u'':
@ -737,12 +670,9 @@ class ServiceManager(QtGui.QWidget):
try: try:
ucsfile = zipinfo.filename.decode(u'utf-8') ucsfile = zipinfo.filename.decode(u'utf-8')
except UnicodeDecodeError: except UnicodeDecodeError:
log.exception(u'Filename "%s" is not valid UTF-8' % log.exception(u'Filename "%s" is not valid UTF-8' % zipinfo.filename.decode(u'utf-8', u'replace'))
zipinfo.filename.decode(u'utf-8', u'replace')) critical_error_message_box(message=translate('OpenLP.ServiceManager',
critical_error_message_box( 'File is not a valid service.\n The content encoding is not UTF-8.'))
message=translate('OpenLP.ServiceManager',
'File is not a valid service.\n'
'The content encoding is not UTF-8.'))
continue continue
osfile = ucsfile.replace(u'/', os.path.sep) osfile = ucsfile.replace(u'/', os.path.sep)
if not osfile.startswith(u'audio'): if not osfile.startswith(u'audio'):
@ -771,8 +701,7 @@ class ServiceManager(QtGui.QWidget):
self.validateItem(serviceItem) self.validateItem(serviceItem)
self.load_item_uuid = 0 self.load_item_uuid = 0
if serviceItem.is_capable(ItemCapabilities.OnLoadUpdate): if serviceItem.is_capable(ItemCapabilities.OnLoadUpdate):
Receiver.send_message(u'%s_service_load' % Receiver.send_message(u'%s_service_load' % serviceItem.name.lower(), serviceItem)
serviceItem.name.lower(), serviceItem)
# if the item has been processed # if the item has been processed
if serviceItem._uuid == self.load_item_uuid: if serviceItem._uuid == self.load_item_uuid:
serviceItem.edit_id = int(self.load_item_edit_id) serviceItem.edit_id = int(self.load_item_edit_id)
@ -781,32 +710,25 @@ class ServiceManager(QtGui.QWidget):
delete_file(p_file) delete_file(p_file)
self.mainwindow.addRecentFile(fileName) self.mainwindow.addRecentFile(fileName)
self.setModified(False) self.setModified(False)
Settings().setValue( Settings().setValue(u'servicemanager/last file', QtCore.QVariant(fileName))
'servicemanager/last file', QtCore.QVariant(fileName))
else: else:
critical_error_message_box( critical_error_message_box(message=translate('OpenLP.ServiceManager', 'File is not a valid service.'))
message=translate('OpenLP.ServiceManager',
'File is not a valid service.'))
log.exception(u'File contains no service data') log.exception(u'File contains no service data')
except (IOError, NameError, zipfile.BadZipfile): except (IOError, NameError, zipfile.BadZipfile):
log.exception(u'Problem loading service file %s' % fileName) log.exception(u'Problem loading service file %s' % fileName)
critical_error_message_box( critical_error_message_box(message=translate('OpenLP.ServiceManager',
message=translate('OpenLP.ServiceManager',
'File could not be opened because it is corrupt.')) 'File could not be opened because it is corrupt.'))
except zipfile.BadZipfile: except zipfile.BadZipfile:
if os.path.getsize(fileName) == 0: if os.path.getsize(fileName) == 0:
log.exception(u'Service file is zero sized: %s' % fileName) log.exception(u'Service file is zero sized: %s' % fileName)
QtGui.QMessageBox.information(self, QtGui.QMessageBox.information(self, translate('OpenLP.ServiceManager', 'Empty File'),
translate('OpenLP.ServiceManager', 'Empty File'), translate('OpenLP.ServiceManager', 'This service file does not contain any data.'))
translate('OpenLP.ServiceManager', 'This service file '
'does not contain any data.'))
else: else:
log.exception(u'Service file is cannot be extracted as zip: ' log.exception(u'Service file is cannot be extracted as zip: '
u'%s' % fileName) u'%s' % fileName)
QtGui.QMessageBox.information(self, QtGui.QMessageBox.information(self, translate('OpenLP.ServiceManager', 'Corrupt File'),
translate('OpenLP.ServiceManager', 'Corrupt File'), translate('OpenLP.ServiceManager',
translate('OpenLP.ServiceManager', 'This file is either ' 'This file is either corrupt or it is not an OpenLP 2 service file.'))
'corrupt or it is not an OpenLP 2.0 service file.'))
return return
finally: finally:
if fileTo: if fileTo:
@ -823,8 +745,7 @@ class ServiceManager(QtGui.QWidget):
service was last closed. Can be blank if there was no service service was last closed. Can be blank if there was no service
present. present.
""" """
fileName = Settings(). \ fileName = Settings().value(u'servicemanager/last file',QtCore.QVariant(u'')).toString()
value(u'servicemanager/last file',QtCore.QVariant(u'')).toString()
if fileName: if fileName:
self.loadFile(fileName) self.loadFile(fileName)
@ -842,19 +763,15 @@ class ServiceManager(QtGui.QWidget):
self.notesAction.setVisible(False) self.notesAction.setVisible(False)
self.timeAction.setVisible(False) self.timeAction.setVisible(False)
self.autoStartAction.setVisible(False) self.autoStartAction.setVisible(False)
if serviceItem[u'service_item'].is_capable(ItemCapabilities.CanEdit)\ if serviceItem[u'service_item'].is_capable(ItemCapabilities.CanEdit) and serviceItem[u'service_item'].edit_id:
and serviceItem[u'service_item'].edit_id:
self.editAction.setVisible(True) self.editAction.setVisible(True)
if serviceItem[u'service_item']\ if serviceItem[u'service_item'].is_capable(ItemCapabilities.CanMaintain):
.is_capable(ItemCapabilities.CanMaintain):
self.maintainAction.setVisible(True) self.maintainAction.setVisible(True)
if item.parent() is None: if item.parent() is None:
self.notesAction.setVisible(True) self.notesAction.setVisible(True)
if serviceItem[u'service_item']\ if serviceItem[u'service_item'].is_capable(ItemCapabilities.HasVariableStartTime):
.is_capable(ItemCapabilities.HasVariableStartTime):
self.timeAction.setVisible(True) self.timeAction.setVisible(True)
if serviceItem[u'service_item']\ if serviceItem[u'service_item'].is_capable(ItemCapabilities.CanAutoStartForLive):
.is_capable(ItemCapabilities.CanAutoStartForLive):
self.autoStartAction.setVisible(True) self.autoStartAction.setVisible(True)
self.autoStartAction.setIcon(self.inactive) self.autoStartAction.setIcon(self.inactive)
self.autoStartAction.setText(translate('OpenLP.ServiceManager','&Auto Start - inactive')) self.autoStartAction.setText(translate('OpenLP.ServiceManager','&Auto Start - inactive'))
@ -863,15 +780,13 @@ class ServiceManager(QtGui.QWidget):
self.autoStartAction.setIcon(self.active) self.autoStartAction.setIcon(self.active)
self.themeMenu.menuAction().setVisible(False) self.themeMenu.menuAction().setVisible(False)
# Set up the theme menu. # Set up the theme menu.
if serviceItem[u'service_item'].is_text() and \ if serviceItem[u'service_item'].is_text() and self.mainwindow.renderer.theme_level == ThemeLevel.Song:
self.mainwindow.renderer.theme_level == ThemeLevel.Song:
self.themeMenu.menuAction().setVisible(True) self.themeMenu.menuAction().setVisible(True)
# The service item does not have a theme, check the "Default". # The service item does not have a theme, check the "Default".
if serviceItem[u'service_item'].theme is None: if serviceItem[u'service_item'].theme is None:
themeAction = self.themeMenu.defaultAction() themeAction = self.themeMenu.defaultAction()
else: else:
themeAction = self.themeMenu.findChild( themeAction = self.themeMenu.findChild(QtGui.QAction, serviceItem[u'service_item'].theme)
QtGui.QAction, serviceItem[u'service_item'].theme)
if themeAction is not None: if themeAction is not None:
themeAction.setChecked(True) themeAction.setChecked(True)
self.menu.exec_(self.serviceManagerList.mapToGlobal(point)) self.menu.exec_(self.serviceManagerList.mapToGlobal(point))
@ -881,8 +796,7 @@ class ServiceManager(QtGui.QWidget):
self.serviceNoteForm.textEdit.setPlainText( self.serviceNoteForm.textEdit.setPlainText(
self.serviceItems[item][u'service_item'].notes) self.serviceItems[item][u'service_item'].notes)
if self.serviceNoteForm.exec_(): if self.serviceNoteForm.exec_():
self.serviceItems[item][u'service_item'].notes = \ self.serviceItems[item][u'service_item'].notes = self.serviceNoteForm.textEdit.toPlainText()
self.serviceNoteForm.textEdit.toPlainText()
self.repaintServiceList(item, -1) self.repaintServiceList(item, -1)
self.setModified() self.setModified()
@ -1128,22 +1042,18 @@ class ServiceManager(QtGui.QWidget):
if serviceitem.is_valid: if serviceitem.is_valid:
if serviceitem.notes: if serviceitem.notes:
icon = QtGui.QImage(serviceitem.icon) icon = QtGui.QImage(serviceitem.icon)
icon = icon.scaled(80, 80, QtCore.Qt.KeepAspectRatio, icon = icon.scaled(80, 80, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
QtCore.Qt.SmoothTransformation)
overlay = QtGui.QImage(':/services/service_item_notes.png') overlay = QtGui.QImage(':/services/service_item_notes.png')
overlay = overlay.scaled(80, 80, QtCore.Qt.KeepAspectRatio, overlay = overlay.scaled(80, 80, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
QtCore.Qt.SmoothTransformation)
painter = QtGui.QPainter(icon) painter = QtGui.QPainter(icon)
painter.drawImage(0, 0, overlay) painter.drawImage(0, 0, overlay)
painter.end() painter.end()
treewidgetitem.setIcon(0, build_icon(icon)) treewidgetitem.setIcon(0, build_icon(icon))
elif serviceitem.temporary_edit: elif serviceitem.temporary_edit:
icon = QtGui.QImage(serviceitem.icon) icon = QtGui.QImage(serviceitem.icon)
icon = icon.scaled(80, 80, QtCore.Qt.KeepAspectRatio, icon = icon.scaled(80, 80, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
QtCore.Qt.SmoothTransformation)
overlay = QtGui.QImage(':/general/general_export.png') overlay = QtGui.QImage(':/general/general_export.png')
overlay = overlay.scaled(40, 40, QtCore.Qt.KeepAspectRatio, overlay = overlay.scaled(40, 40, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
QtCore.Qt.SmoothTransformation)
painter = QtGui.QPainter(icon) painter = QtGui.QPainter(icon)
painter.drawImage(40, 0, overlay) painter.drawImage(40, 0, overlay)
painter.end() painter.end()
@ -1151,29 +1061,23 @@ class ServiceManager(QtGui.QWidget):
else: else:
treewidgetitem.setIcon(0, serviceitem.iconic_representation) treewidgetitem.setIcon(0, serviceitem.iconic_representation)
else: else:
treewidgetitem.setIcon(0, treewidgetitem.setIcon(0, build_icon(u':/general/general_delete.png'))
build_icon(u':/general/general_delete.png'))
treewidgetitem.setText(0, serviceitem.get_display_title()) treewidgetitem.setText(0, serviceitem.get_display_title())
tips = [] tips = []
if serviceitem.temporary_edit: if serviceitem.temporary_edit:
tips.append(u'<strong>%s:</strong> <em>%s</em>' % tips.append(u'<strong>%s:</strong> <em>%s</em>' %
(unicode(translate('OpenLP.ServiceManager', 'Edit')), (unicode(translate('OpenLP.ServiceManager', 'Edit')),
(unicode(translate('OpenLP.ServiceManager', (unicode(translate('OpenLP.ServiceManager', 'Service copy only')))))
'Service copy only')))))
if serviceitem.theme and serviceitem.theme != -1: if serviceitem.theme and serviceitem.theme != -1:
tips.append(u'<strong>%s:</strong> <em>%s</em>' % tips.append(u'<strong>%s:</strong> <em>%s</em>' %
(unicode(translate('OpenLP.ServiceManager', 'Slide theme')), (unicode(translate('OpenLP.ServiceManager', 'Slide theme')), serviceitem.theme))
serviceitem.theme))
if serviceitem.notes: if serviceitem.notes:
tips.append(u'<strong>%s: </strong> %s' % tips.append(u'<strong>%s: </strong> %s' %
(unicode(translate('OpenLP.ServiceManager', 'Notes')), (unicode(translate('OpenLP.ServiceManager', 'Notes')), cgi.escape(unicode(serviceitem.notes))))
cgi.escape(unicode(serviceitem.notes)))) if item[u'service_item'].is_capable(ItemCapabilities.HasVariableStartTime):
if item[u'service_item'] \
.is_capable(ItemCapabilities.HasVariableStartTime):
tips.append(item[u'service_item'].get_media_time()) tips.append(item[u'service_item'].get_media_time())
treewidgetitem.setToolTip(0, u'<br>'.join(tips)) treewidgetitem.setToolTip(0, u'<br>'.join(tips))
treewidgetitem.setData(0, QtCore.Qt.UserRole, treewidgetitem.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(item[u'order']))
QtCore.QVariant(item[u'order']))
treewidgetitem.setSelected(item[u'selected']) treewidgetitem.setSelected(item[u'selected'])
# Add the children to their parent treewidgetitem. # Add the children to their parent treewidgetitem.
for count, frame in enumerate(serviceitem.get_frames()): for count, frame in enumerate(serviceitem.get_frames()):
@ -1218,9 +1122,7 @@ class ServiceManager(QtGui.QWidget):
log.debug(u'onThemeComboBoxSelected') log.debug(u'onThemeComboBoxSelected')
self.service_theme = unicode(self.themeComboBox.currentText()) self.service_theme = unicode(self.themeComboBox.currentText())
self.mainwindow.renderer.set_service_theme(self.service_theme) self.mainwindow.renderer.set_service_theme(self.service_theme)
Settings().setValue( Settings().setValue(self.mainwindow.serviceManagerSettingsSection + u'/service theme',
self.mainwindow.serviceManagerSettingsSection +
u'/service theme',
QtCore.QVariant(self.service_theme)) QtCore.QVariant(self.service_theme))
self.regenerateServiceItems(True) self.regenerateServiceItems(True)
@ -1246,8 +1148,7 @@ class ServiceManager(QtGui.QWidget):
if self.serviceItems: if self.serviceItems:
for item in self.serviceItems: for item in self.serviceItems:
item[u'selected'] = False item[u'selected'] = False
serviceIterator = QtGui.QTreeWidgetItemIterator( serviceIterator = QtGui.QTreeWidgetItemIterator(self.serviceManagerList)
self.serviceManagerList)
selectedItem = None selectedItem = None
while serviceIterator.value(): while serviceIterator.value():
if serviceIterator.value().isSelected(): if serviceIterator.value().isSelected():
@ -1257,17 +1158,15 @@ class ServiceManager(QtGui.QWidget):
if selectedItem.parent() is None: if selectedItem.parent() is None:
pos = selectedItem.data(0, QtCore.Qt.UserRole).toInt()[0] pos = selectedItem.data(0, QtCore.Qt.UserRole).toInt()[0]
else: else:
pos = selectedItem.parent().data(0, QtCore.Qt.UserRole). \ pos = selectedItem.parent().data(0, QtCore.Qt.UserRole).toInt()[0]
toInt()[0]
self.serviceItems[pos - 1][u'selected'] = True self.serviceItems[pos - 1][u'selected'] = True
tempServiceItems = self.serviceItems tempServiceItems = self.serviceItems
self.serviceManagerList.clear() self.serviceManagerList.clear()
self.serviceItems = [] self.serviceItems = []
self.isNew = True self.isNew = True
for item in tempServiceItems: for item in tempServiceItems:
self.addServiceItem( self.addServiceItem(item[u'service_item'], False, expand=item[u'expanded'], repaint=False,
item[u'service_item'], False, expand=item[u'expanded'], selected=item[u'selected'])
repaint=False, selected=item[u'selected'])
# Set to False as items may have changed rendering # Set to False as items may have changed rendering
# does not impact the saved song so True may also be valid # does not impact the saved song so True may also be valid
if changed: if changed:
@ -1291,18 +1190,15 @@ class ServiceManager(QtGui.QWidget):
if found. if found.
""" """
for itemcount, item in enumerate(self.serviceItems): for itemcount, item in enumerate(self.serviceItems):
if item[u'service_item'].edit_id == newItem.edit_id and \ if item[u'service_item'].edit_id == newItem.edit_id and item[u'service_item'].name == newItem.name:
item[u'service_item'].name == newItem.name:
newItem.render() newItem.render()
newItem.merge(item[u'service_item']) newItem.merge(item[u'service_item'])
item[u'service_item'] = newItem item[u'service_item'] = newItem
self.repaintServiceList(itemcount + 1, 0) self.repaintServiceList(itemcount + 1, 0)
self.mainwindow.liveController.replaceServiceManagerItem( self.mainwindow.liveController.replaceServiceManagerItem(newItem)
newItem)
self.setModified() self.setModified()
def addServiceItem(self, item, rebuild=False, expand=None, replace=False, def addServiceItem(self, item, rebuild=False, expand=None, replace=False, repaint=True, selected=False):
repaint=True, selected=False):
""" """
Add a Service item to the list Add a Service item to the list
@ -1358,10 +1254,9 @@ class ServiceManager(QtGui.QWidget):
self.mainwindow.previewController.addServiceManagerItem( self.mainwindow.previewController.addServiceManagerItem(
self.serviceItems[item][u'service_item'], child) self.serviceItems[item][u'service_item'], child)
else: else:
critical_error_message_box( critical_error_message_box(translate('OpenLP.ServiceManager', 'Missing Display Handler'),
translate('OpenLP.ServiceManager', 'Missing Display Handler'), translate('OpenLP.ServiceManager',
translate('OpenLP.ServiceManager', 'Your item cannot be ' 'Your item cannot be displayed as there is no handler to display it'))
'displayed as there is no handler to display it'))
Receiver.send_message(u'cursor_normal') Receiver.send_message(u'cursor_normal')
def getServiceItem(self): def getServiceItem(self):
@ -1404,17 +1299,13 @@ class ServiceManager(QtGui.QWidget):
QtCore.QVariant(False)).toBool(): QtCore.QVariant(False)).toBool():
item += 1 item += 1
if self.serviceItems and item < len(self.serviceItems) and \ if self.serviceItems and item < len(self.serviceItems) and \
self.serviceItems[item][u'service_item'].is_capable( self.serviceItems[item][u'service_item'].is_capable(ItemCapabilities.CanPreview):
ItemCapabilities.CanPreview): self.mainwindow.previewController.addServiceManagerItem(self.serviceItems[item][u'service_item'], 0)
self.mainwindow.previewController.addServiceManagerItem(
self.serviceItems[item][u'service_item'], 0)
self.mainwindow.liveController.previewListWidget.setFocus() self.mainwindow.liveController.previewListWidget.setFocus()
else: else:
critical_error_message_box( critical_error_message_box(translate('OpenLP.ServiceManager', 'Missing Display Handler'),
translate('OpenLP.ServiceManager', 'Missing Display Handler'), translate('OpenLP.ServiceManager',
translate('OpenLP.ServiceManager', 'Your item cannot be ' 'Your item cannot be displayed as the plugin required to display it is missing or inactive'))
'displayed as the plugin required to display it is missing '
'or inactive'))
Receiver.send_message(u'cursor_normal') Receiver.send_message(u'cursor_normal')
def remoteEdit(self): def remoteEdit(self):
@ -1422,10 +1313,8 @@ class ServiceManager(QtGui.QWidget):
Posts a remote edit message to a plugin to allow item to be edited. Posts a remote edit message to a plugin to allow item to be edited.
""" """
item = self.findServiceItem()[0] item = self.findServiceItem()[0]
if self.serviceItems[item][u'service_item']\ if self.serviceItems[item][u'service_item'].is_capable(ItemCapabilities.CanEdit):
.is_capable(ItemCapabilities.CanEdit): Receiver.send_message(u'%s_edit' % self.serviceItems[item][u'service_item'].name.lower(),
Receiver.send_message(u'%s_edit' %
self.serviceItems[item][u'service_item'].name.lower(),
u'L:%s' % self.serviceItems[item][u'service_item'].edit_id) u'L:%s' % self.serviceItems[item][u'service_item'].edit_id)
def findServiceItem(self): def findServiceItem(self):
@ -1510,8 +1399,7 @@ class ServiceManager(QtGui.QWidget):
pos = self._getParentItemData(item) - 1 pos = self._getParentItemData(item) - 1
serviceItem = self.serviceItems[pos] serviceItem = self.serviceItems[pos]
if (plugin == serviceItem[u'service_item'].name and if (plugin == serviceItem[u'service_item'].name and
serviceItem[u'service_item'].is_capable( serviceItem[u'service_item'].is_capable(ItemCapabilities.CanAppend)):
ItemCapabilities.CanAppend)):
action = self.dndMenu.exec_(QtGui.QCursor.pos()) action = self.dndMenu.exec_(QtGui.QCursor.pos())
# New action required # New action required
if action == self.newAction: if action == self.newAction:
@ -1540,16 +1428,15 @@ class ServiceManager(QtGui.QWidget):
themeGroup.setObjectName(u'themeGroup') themeGroup.setObjectName(u'themeGroup')
# Create a "Default" theme, which allows the user to reset the item's # Create a "Default" theme, which allows the user to reset the item's
# theme to the service theme or global theme. # theme to the service theme or global theme.
defaultTheme = create_widget_action(self.themeMenu, defaultTheme = create_widget_action(self.themeMenu, text=UiStrings().Default, checked=False,
text=UiStrings().Default, checked=False,
triggers=self.onThemeChangeAction) triggers=self.onThemeChangeAction)
self.themeMenu.setDefaultAction(defaultTheme) self.themeMenu.setDefaultAction(defaultTheme)
themeGroup.addAction(defaultTheme) themeGroup.addAction(defaultTheme)
self.themeMenu.addSeparator() self.themeMenu.addSeparator()
for theme in theme_list: for theme in theme_list:
self.themeComboBox.addItem(theme) self.themeComboBox.addItem(theme)
themeGroup.addAction(create_widget_action(self.themeMenu, theme, themeGroup.addAction(create_widget_action(self.themeMenu, theme, text=theme, checked=False,
text=theme, checked=False, triggers=self.onThemeChangeAction)) triggers=self.onThemeChangeAction))
find_and_set_in_combo_box(self.themeComboBox, self.service_theme) find_and_set_in_combo_box(self.themeComboBox, self.service_theme)
self.mainwindow.renderer.set_service_theme(self.service_theme) self.mainwindow.renderer.set_service_theme(self.service_theme)
self.regenerateServiceItems() self.regenerateServiceItems()

View File

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 # vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
############################################################################### ###############################################################################
# OpenLP - Open Source Lyrics Projection # # OpenLP - Open Source Lyrics Projection #
@ -65,8 +65,7 @@ class DisplayController(QtGui.QWidget):
created from within other plugins created from within other plugins
This function is needed to catch the current controller This function is needed to catch the current controller
""" """
sender = self.sender().objectName() if self.sender().objectName() \ sender = self.sender().objectName() if self.sender().objectName() else self.sender().text()
else self.sender().text()
controller = self controller = self
Receiver.send_message('%s' % sender, [controller, args]) Receiver.send_message('%s' % sender, [controller, args])
@ -83,8 +82,7 @@ class SlideController(DisplayController):
DisplayController.__init__(self, parent, isLive) DisplayController.__init__(self, parent, isLive)
self.screens = ScreenList() self.screens = ScreenList()
try: try:
self.ratio = float(self.screens.current[u'size'].width()) / \ self.ratio = float(self.screens.current[u'size'].width()) / float(self.screens.current[u'size'].height())
float(self.screens.current[u'size'].height())
except ZeroDivisionError: except ZeroDivisionError:
self.ratio = 1 self.ratio = 1
self.imageManager = self.parent().imageManager self.imageManager = self.parent().imageManager
@ -120,8 +118,7 @@ class SlideController(DisplayController):
self.keypress_queue = deque() self.keypress_queue = deque()
self.keypress_loop = False self.keypress_loop = False
self.category = UiStrings().LiveToolbar self.category = UiStrings().LiveToolbar
ActionList.get_instance().add_category( ActionList.get_instance().add_category(unicode(self.category), CategoryOrder.standardToolbar)
unicode(self.category), CategoryOrder.standardToolbar)
else: else:
self.typeLabel.setText(UiStrings().Preview) self.typeLabel.setText(UiStrings().Preview)
self.split = 0 self.split = 0
@ -137,9 +134,7 @@ class SlideController(DisplayController):
# Actual controller section # Actual controller section
self.controller = QtGui.QWidget(self.splitter) self.controller = QtGui.QWidget(self.splitter)
self.controller.setGeometry(QtCore.QRect(0, 0, 100, 536)) self.controller.setGeometry(QtCore.QRect(0, 0, 100, 536))
self.controller.setSizePolicy( self.controller.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Maximum))
QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
QtGui.QSizePolicy.Maximum))
self.controllerLayout = QtGui.QVBoxLayout(self.controller) self.controllerLayout = QtGui.QVBoxLayout(self.controller)
self.controllerLayout.setSpacing(0) self.controllerLayout.setSpacing(0)
self.controllerLayout.setMargin(0) self.controllerLayout.setMargin(0)
@ -150,40 +145,29 @@ class SlideController(DisplayController):
self.previewListWidget.setColumnWidth(0, self.controller.width()) self.previewListWidget.setColumnWidth(0, self.controller.width())
self.previewListWidget.isLive = self.isLive self.previewListWidget.isLive = self.isLive
self.previewListWidget.setObjectName(u'previewListWidget') self.previewListWidget.setObjectName(u'previewListWidget')
self.previewListWidget.setSelectionBehavior( self.previewListWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
QtGui.QAbstractItemView.SelectRows) self.previewListWidget.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
self.previewListWidget.setSelectionMode( self.previewListWidget.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
QtGui.QAbstractItemView.SingleSelection) self.previewListWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.previewListWidget.setEditTriggers(
QtGui.QAbstractItemView.NoEditTriggers)
self.previewListWidget.setHorizontalScrollBarPolicy(
QtCore.Qt.ScrollBarAlwaysOff)
self.previewListWidget.setAlternatingRowColors(True) self.previewListWidget.setAlternatingRowColors(True)
self.controllerLayout.addWidget(self.previewListWidget) self.controllerLayout.addWidget(self.previewListWidget)
# Build the full toolbar # Build the full toolbar
self.toolbar = OpenLPToolbar(self) self.toolbar = OpenLPToolbar(self)
sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
QtGui.QSizePolicy.Fixed)
sizeToolbarPolicy.setHorizontalStretch(0) sizeToolbarPolicy.setHorizontalStretch(0)
sizeToolbarPolicy.setVerticalStretch(0) sizeToolbarPolicy.setVerticalStretch(0)
sizeToolbarPolicy.setHeightForWidth( sizeToolbarPolicy.setHeightForWidth(self.toolbar.sizePolicy().hasHeightForWidth())
self.toolbar.sizePolicy().hasHeightForWidth())
self.toolbar.setSizePolicy(sizeToolbarPolicy) self.toolbar.setSizePolicy(sizeToolbarPolicy)
self.previousItem = create_action(self, self.previousItem = create_action(self, u'previousItem_' + self.typePrefix,
u'previousItem_' + self.typePrefix, text=translate('OpenLP.SlideController', 'Previous Slide'), icon=u':/slides/slide_previous.png',
text=translate('OpenLP.SlideController', 'Previous Slide'),
icon=u':/slides/slide_previous.png',
tooltip=translate('OpenLP.SlideController', 'Move to previous.'), tooltip=translate('OpenLP.SlideController', 'Move to previous.'),
shortcuts=[QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp], shortcuts=[QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp], context=QtCore.Qt.WidgetWithChildrenShortcut,
context=QtCore.Qt.WidgetWithChildrenShortcut,
category=self.category, triggers=self.onSlideSelectedPrevious) category=self.category, triggers=self.onSlideSelectedPrevious)
self.toolbar.addAction(self.previousItem) self.toolbar.addAction(self.previousItem)
self.nextItem = create_action(self, u'nextItem_' + self.typePrefix, self.nextItem = create_action(self, u'nextItem_' + self.typePrefix,
text=translate('OpenLP.SlideController', 'Next Slide'), text=translate('OpenLP.SlideController', 'Next Slide'), icon=u':/slides/slide_next.png',
icon=u':/slides/slide_next.png',
tooltip=translate('OpenLP.SlideController', 'Move to next.'), tooltip=translate('OpenLP.SlideController', 'Move to next.'),
shortcuts=[QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown], shortcuts=[QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown], context=QtCore.Qt.WidgetWithChildrenShortcut,
context=QtCore.Qt.WidgetWithChildrenShortcut,
category=self.category, triggers=self.onSlideSelectedNextAction) category=self.category, triggers=self.onSlideSelectedNextAction)
self.toolbar.addAction(self.nextItem) self.toolbar.addAction(self.nextItem)
self.toolbar.addSeparator() self.toolbar.addSeparator()
@ -195,24 +179,19 @@ class SlideController(DisplayController):
self.hideMenu.setObjectName(u'hideMenu') self.hideMenu.setObjectName(u'hideMenu')
self.hideMenu.setText(translate('OpenLP.SlideController', 'Hide')) self.hideMenu.setText(translate('OpenLP.SlideController', 'Hide'))
self.hideMenu.setPopupMode(QtGui.QToolButton.MenuButtonPopup) self.hideMenu.setPopupMode(QtGui.QToolButton.MenuButtonPopup)
self.hideMenu.setMenu(QtGui.QMenu( self.hideMenu.setMenu(QtGui.QMenu(translate('OpenLP.SlideController', 'Hide'), self.toolbar))
translate('OpenLP.SlideController', 'Hide'), self.toolbar))
self.toolbar.addToolbarWidget(self.hideMenu) self.toolbar.addToolbarWidget(self.hideMenu)
self.blankScreen = create_action(self, u'blankScreen', self.blankScreen = create_action(self, u'blankScreen',
text=translate('OpenLP.SlideController', 'Blank Screen'), text=translate('OpenLP.SlideController', 'Blank Screen'), icon=u':/slides/slide_blank.png',
icon=u':/slides/slide_blank.png', checked=False, checked=False, shortcuts=[QtCore.Qt.Key_Period], category=self.category, triggers=self.onBlankDisplay)
shortcuts=[QtCore.Qt.Key_Period],
category=self.category, triggers=self.onBlankDisplay)
self.themeScreen = create_action(self, u'themeScreen', self.themeScreen = create_action(self, u'themeScreen',
text=translate('OpenLP.SlideController', 'Blank to Theme'), text=translate('OpenLP.SlideController', 'Blank to Theme'), icon=u':/slides/slide_theme.png',
icon=u':/slides/slide_theme.png', checked=False, checked=False, shortcuts=[QtGui.QKeySequence(u'T')], category=self.category,
shortcuts=[QtGui.QKeySequence(u'T')], triggers=self.onThemeDisplay)
category=self.category, triggers=self.onThemeDisplay)
self.desktopScreen = create_action(self, u'desktopScreen', self.desktopScreen = create_action(self, u'desktopScreen',
text=translate('OpenLP.SlideController', 'Show Desktop'), text=translate('OpenLP.SlideController', 'Show Desktop'), icon=u':/slides/slide_desktop.png',
icon=u':/slides/slide_desktop.png', checked=False, checked=False, shortcuts=[QtGui.QKeySequence(u'D')], category=self.category,
shortcuts=[QtGui.QKeySequence(u'D')], triggers=self.onHideDisplay)
category=self.category, triggers=self.onHideDisplay)
self.hideMenu.setDefaultAction(self.blankScreen) self.hideMenu.setDefaultAction(self.blankScreen)
self.hideMenu.menu().addAction(self.blankScreen) self.hideMenu.menu().addAction(self.blankScreen)
self.hideMenu.menu().addAction(self.themeScreen) self.hideMenu.menu().addAction(self.themeScreen)
@ -221,23 +200,18 @@ class SlideController(DisplayController):
# Play Slides Menu # Play Slides Menu
self.playSlidesMenu = QtGui.QToolButton(self.toolbar) self.playSlidesMenu = QtGui.QToolButton(self.toolbar)
self.playSlidesMenu.setObjectName(u'playSlidesMenu') self.playSlidesMenu.setObjectName(u'playSlidesMenu')
self.playSlidesMenu.setText(translate('OpenLP.SlideController', self.playSlidesMenu.setText(translate('OpenLP.SlideController', 'Play Slides'))
'Play Slides'))
self.playSlidesMenu.setPopupMode(QtGui.QToolButton.MenuButtonPopup) self.playSlidesMenu.setPopupMode(QtGui.QToolButton.MenuButtonPopup)
self.playSlidesMenu.setMenu(QtGui.QMenu( self.playSlidesMenu.setMenu(QtGui.QMenu(translate('OpenLP.SlideController', 'Play Slides'), self.toolbar))
translate('OpenLP.SlideController', 'Play Slides'),
self.toolbar))
self.toolbar.addToolbarWidget(self.playSlidesMenu) self.toolbar.addToolbarWidget(self.playSlidesMenu)
self.playSlidesLoop = create_action(self, u'playSlidesLoop', self.playSlidesLoop = create_action(self, u'playSlidesLoop', text=UiStrings().PlaySlidesInLoop,
text=UiStrings().PlaySlidesInLoop, icon=u':/media/media_time.png', checked=False, shortcuts=[], category=self.category,
icon=u':/media/media_time.png', checked=False, shortcuts=[], triggers=self.onPlaySlidesLoop)
category=self.category, triggers=self.onPlaySlidesLoop) self.playSlidesOnce = create_action(self, u'playSlidesOnce', text=UiStrings().PlaySlidesToEnd,
self.playSlidesOnce = create_action(self, u'playSlidesOnce', icon=u':/media/media_time.png', checked=False, shortcuts=[], category=self.category,
text=UiStrings().PlaySlidesToEnd, triggers=self.onPlaySlidesOnce)
icon=u':/media/media_time.png', checked=False, shortcuts=[], if Settings().value(self.parent().generalSettingsSection + u'/enable slide loop',
category=self.category, triggers=self.onPlaySlidesOnce) QtCore.QVariant(True)).toBool():
if Settings().value(self.parent().generalSettingsSection +
u'/enable slide loop', QtCore.QVariant(True)).toBool():
self.playSlidesMenu.setDefaultAction(self.playSlidesLoop) self.playSlidesMenu.setDefaultAction(self.playSlidesLoop)
else: else:
self.playSlidesMenu.setDefaultAction(self.playSlidesOnce) self.playSlidesMenu.setDefaultAction(self.playSlidesOnce)
@ -248,23 +222,16 @@ class SlideController(DisplayController):
self.delaySpinBox.setObjectName(u'delaySpinBox') self.delaySpinBox.setObjectName(u'delaySpinBox')
self.delaySpinBox.setRange(1, 180) self.delaySpinBox.setRange(1, 180)
self.delaySpinBox.setSuffix(UiStrings().Seconds) self.delaySpinBox.setSuffix(UiStrings().Seconds)
self.delaySpinBox.setToolTip(translate('OpenLP.SlideController', self.delaySpinBox.setToolTip(translate('OpenLP.SlideController', 'Delay between slides in seconds.'))
'Delay between slides in seconds.'))
self.toolbar.addToolbarWidget(self.delaySpinBox) self.toolbar.addToolbarWidget(self.delaySpinBox)
else: else:
self.toolbar.addToolbarAction(u'goLive', self.toolbar.addToolbarAction(u'goLive', icon=u':/general/general_live.png',
icon=u':/general/general_live.png', tooltip=translate('OpenLP.SlideController', 'Move to live.'), triggers=self.onGoLive)
tooltip=translate('OpenLP.SlideController', 'Move to live.'), self.toolbar.addToolbarAction(u'addToService', icon=u':/general/general_add.png',
triggers=self.onGoLive) tooltip=translate('OpenLP.SlideController', 'Add to Service.'), triggers=self.onPreviewAddToService)
self.toolbar.addToolbarAction(u'addToService',
icon=u':/general/general_add.png',
tooltip=translate('OpenLP.SlideController', 'Add to Service.'),
triggers=self.onPreviewAddToService)
self.toolbar.addSeparator() self.toolbar.addSeparator()
self.toolbar.addToolbarAction(u'editSong', self.toolbar.addToolbarAction(u'editSong', icon=u':/general/general_edit.png',
icon=u':/general/general_edit.png', tooltip=translate('OpenLP.SlideController', 'Edit and reload song preview.'), triggers=self.onEditSong)
tooltip=translate('OpenLP.SlideController',
'Edit and reload song preview.'), triggers=self.onEditSong)
self.controllerLayout.addWidget(self.toolbar) self.controllerLayout.addWidget(self.toolbar)
# Build the Media Toolbar # Build the Media Toolbar
self.mediaController.register_controller(self) self.mediaController.register_controller(self)
@ -274,35 +241,27 @@ class SlideController(DisplayController):
self.songMenu.setObjectName(u'songMenu') self.songMenu.setObjectName(u'songMenu')
self.songMenu.setText(translate('OpenLP.SlideController', 'Go To')) self.songMenu.setText(translate('OpenLP.SlideController', 'Go To'))
self.songMenu.setPopupMode(QtGui.QToolButton.InstantPopup) self.songMenu.setPopupMode(QtGui.QToolButton.InstantPopup)
self.songMenu.setMenu(QtGui.QMenu( self.songMenu.setMenu(QtGui.QMenu(translate('OpenLP.SlideController', 'Go To'), self.toolbar))
translate('OpenLP.SlideController', 'Go To'), self.toolbar))
self.toolbar.addToolbarWidget(self.songMenu) self.toolbar.addToolbarWidget(self.songMenu)
# Stuff for items with background audio. # Stuff for items with background audio.
self.audioPauseItem = self.toolbar.addToolbarAction( self.audioPauseItem = self.toolbar.addToolbarAction(u'audioPauseItem',
u'audioPauseItem', icon=u':/slides/media_playback_pause.png', icon=u':/slides/media_playback_pause.png', text=translate('OpenLP.SlideController', 'Pause Audio'),
text=translate('OpenLP.SlideController', 'Pause Audio'),
tooltip=translate('OpenLP.SlideController', 'Pause audio.'), tooltip=translate('OpenLP.SlideController', 'Pause audio.'),
checked=False, visible=False, category=self.category, checked=False, visible=False, category=self.category, context=QtCore.Qt.WindowShortcut,
context=QtCore.Qt.WindowShortcut,
shortcuts=[], triggers=self.onAudioPauseClicked) shortcuts=[], triggers=self.onAudioPauseClicked)
self.audioMenu = QtGui.QMenu( self.audioMenu = QtGui.QMenu(translate('OpenLP.SlideController', 'Background Audio'), self.toolbar)
translate('OpenLP.SlideController', 'Background Audio'), self.toolbar)
self.audioPauseItem.setMenu(self.audioMenu) self.audioPauseItem.setMenu(self.audioMenu)
self.audioPauseItem.setParent(self.toolbar) self.audioPauseItem.setParent(self.toolbar)
self.toolbar.widgetForAction(self.audioPauseItem).setPopupMode( self.toolbar.widgetForAction(self.audioPauseItem).setPopupMode(
QtGui.QToolButton.MenuButtonPopup) QtGui.QToolButton.MenuButtonPopup)
self.nextTrackItem = create_action(self, u'nextTrackItem', self.nextTrackItem = create_action(self, u'nextTrackItem', text=UiStrings().NextTrack,
text=UiStrings().NextTrack, icon=u':/slides/media_playback_next.png',
icon=u':/slides/media_playback_next.png', tooltip=translate( tooltip=translate('OpenLP.SlideController', 'Go to next audio track.'),
'OpenLP.SlideController', 'Go to next audio track.'), category=self.category, shortcuts=[], triggers=self.onNextTrackClicked)
category=self.category,
shortcuts=[], triggers=self.onNextTrackClicked)
self.audioMenu.addAction(self.nextTrackItem) self.audioMenu.addAction(self.nextTrackItem)
self.trackMenu = self.audioMenu.addMenu( self.trackMenu = self.audioMenu.addMenu(translate('OpenLP.SlideController', 'Tracks'))
translate('OpenLP.SlideController', 'Tracks'))
self.audioTimeLabel = QtGui.QLabel(u' 00:00 ', self.toolbar) self.audioTimeLabel = QtGui.QLabel(u' 00:00 ', self.toolbar)
self.audioTimeLabel.setAlignment( self.audioTimeLabel.setAlignment(QtCore.Qt.AlignCenter|QtCore.Qt.AlignHCenter)
QtCore.Qt.AlignCenter|QtCore.Qt.AlignHCenter)
self.audioTimeLabel.setStyleSheet( self.audioTimeLabel.setStyleSheet(
u'background-color: palette(background); ' u'background-color: palette(background); '
u'border-top-color: palette(shadow); ' u'border-top-color: palette(shadow); '
@ -319,8 +278,7 @@ class SlideController(DisplayController):
self.previewFrame = QtGui.QFrame(self.splitter) self.previewFrame = QtGui.QFrame(self.splitter)
self.previewFrame.setGeometry(QtCore.QRect(0, 0, 300, 300 * self.ratio)) self.previewFrame.setGeometry(QtCore.QRect(0, 0, 300, 300 * self.ratio))
self.previewFrame.setMinimumHeight(100) self.previewFrame.setMinimumHeight(100)
self.previewFrame.setSizePolicy(QtGui.QSizePolicy( self.previewFrame.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored,
QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored,
QtGui.QSizePolicy.Label)) QtGui.QSizePolicy.Label))
self.previewFrame.setFrameShape(QtGui.QFrame.StyledPanel) self.previewFrame.setFrameShape(QtGui.QFrame.StyledPanel)
self.previewFrame.setFrameShadow(QtGui.QFrame.Sunken) self.previewFrame.setFrameShadow(QtGui.QFrame.Sunken)
@ -340,8 +298,7 @@ class SlideController(DisplayController):
self.previewDisplay.hide() self.previewDisplay.hide()
# Actual preview screen # Actual preview screen
self.slidePreview = QtGui.QLabel(self) self.slidePreview = QtGui.QLabel(self)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0) sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth( sizePolicy.setHeightForWidth(
@ -385,20 +342,16 @@ class SlideController(DisplayController):
self.shortcutTimer, QtCore.SIGNAL(u'timeout()'), self.shortcutTimer, QtCore.SIGNAL(u'timeout()'),
self._slideShortcutActivated) self._slideShortcutActivated)
# Signals # Signals
QtCore.QObject.connect(self.previewListWidget, QtCore.QObject.connect(self.previewListWidget, QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected)
QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected)
if self.isLive: if self.isLive:
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'slidecontroller_live_spin_delay'), QtCore.SIGNAL(u'slidecontroller_live_spin_delay'), self.receiveSpinDelay)
self.receiveSpinDelay)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'slidecontroller_toggle_display'), QtCore.SIGNAL(u'slidecontroller_toggle_display'), self.toggleDisplay)
self.toggleDisplay)
self.toolbar.setWidgetVisible(self.loopList, False) self.toolbar.setWidgetVisible(self.loopList, False)
else: else:
QtCore.QObject.connect(self.previewListWidget, QtCore.QObject.connect(self.previewListWidget,
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onGoLiveClick)
self.onGoLiveClick)
self.toolbar.setWidgetVisible([u'editSong'], False) self.toolbar.setWidgetVisible([u'editSong'], False)
if self.isLive: if self.isLive:
self.setLiveHotkeys(self) self.setLiveHotkeys(self)
@ -407,29 +360,21 @@ class SlideController(DisplayController):
self.previewListWidget.addActions( self.previewListWidget.addActions(
[self.nextItem, self.previousItem]) [self.nextItem, self.previousItem])
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'slidecontroller_%s_stop_loop' % self.typePrefix), QtCore.SIGNAL(u'slidecontroller_%s_stop_loop' % self.typePrefix), self.onStopLoop)
self.onStopLoop)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'slidecontroller_%s_next' % self.typePrefix), QtCore.SIGNAL(u'slidecontroller_%s_next' % self.typePrefix), self.onSlideSelectedNext)
self.onSlideSelectedNext)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'slidecontroller_%s_previous' % self.typePrefix), QtCore.SIGNAL(u'slidecontroller_%s_previous' % self.typePrefix), self.onSlideSelectedPrevious)
self.onSlideSelectedPrevious)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'slidecontroller_%s_change' % self.typePrefix), QtCore.SIGNAL(u'slidecontroller_%s_change' % self.typePrefix), self.onSlideChange)
self.onSlideChange)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'slidecontroller_%s_set' % self.typePrefix), QtCore.SIGNAL(u'slidecontroller_%s_set' % self.typePrefix), self.onSlideSelectedIndex)
self.onSlideSelectedIndex)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'slidecontroller_%s_blank' % self.typePrefix), QtCore.SIGNAL(u'slidecontroller_%s_blank' % self.typePrefix), self.onSlideBlank)
self.onSlideBlank)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'slidecontroller_%s_unblank' % self.typePrefix), QtCore.SIGNAL(u'slidecontroller_%s_unblank' % self.typePrefix), self.onSlideUnblank)
self.onSlideUnblank)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'slidecontroller_update_slide_limits'), QtCore.SIGNAL(u'slidecontroller_update_slide_limits'), self.updateSlideLimits)
self.updateSlideLimits)
def _slideShortcutActivated(self): def _slideShortcutActivated(self):
""" """
@ -448,30 +393,22 @@ class SlideController(DisplayController):
except ImportError: except ImportError:
SONGS_PLUGIN_AVAILABLE = False SONGS_PLUGIN_AVAILABLE = False
sender_name = unicode(self.sender().objectName()) sender_name = unicode(self.sender().objectName())
verse_type = sender_name[15:] \ verse_type = sender_name[15:] if sender_name[:15] == u'shortcutAction_' else u''
if sender_name[:15] == u'shortcutAction_' else u''
if SONGS_PLUGIN_AVAILABLE: if SONGS_PLUGIN_AVAILABLE:
if verse_type == u'V': if verse_type == u'V':
self.current_shortcut = \ self.current_shortcut = VerseType.TranslatedTags[VerseType.Verse]
VerseType.TranslatedTags[VerseType.Verse]
elif verse_type == u'C': elif verse_type == u'C':
self.current_shortcut = \ self.current_shortcut = VerseType.TranslatedTags[VerseType.Chorus]
VerseType.TranslatedTags[VerseType.Chorus]
elif verse_type == u'B': elif verse_type == u'B':
self.current_shortcut = \ self.current_shortcut = VerseType.TranslatedTags[VerseType.Bridge]
VerseType.TranslatedTags[VerseType.Bridge]
elif verse_type == u'P': elif verse_type == u'P':
self.current_shortcut = \ self.current_shortcut = VerseType.TranslatedTags[VerseType.PreChorus]
VerseType.TranslatedTags[VerseType.PreChorus]
elif verse_type == u'I': elif verse_type == u'I':
self.current_shortcut = \ self.current_shortcut = VerseType.TranslatedTags[VerseType.Intro]
VerseType.TranslatedTags[VerseType.Intro]
elif verse_type == u'E': elif verse_type == u'E':
self.current_shortcut = \ self.current_shortcut = VerseType.TranslatedTags[VerseType.Ending]
VerseType.TranslatedTags[VerseType.Ending]
elif verse_type == u'O': elif verse_type == u'O':
self.current_shortcut = \ self.current_shortcut = VerseType.TranslatedTags[VerseType.Other]
VerseType.TranslatedTags[VerseType.Other]
elif verse_type.isnumeric(): elif verse_type.isnumeric():
self.current_shortcut += verse_type self.current_shortcut += verse_type
self.current_shortcut = self.current_shortcut.upper() self.current_shortcut = self.current_shortcut.upper()
@ -495,8 +432,7 @@ class SlideController(DisplayController):
if self.current_shortcut in keys: if self.current_shortcut in keys:
# We had more than one match for example "V1" and "V10", but # We had more than one match for example "V1" and "V10", but
# "V1" was the slide we wanted to go. # "V1" was the slide we wanted to go.
self.__checkUpdateSelectedSlide( self.__checkUpdateSelectedSlide(self.slideList[self.current_shortcut])
self.slideList[self.current_shortcut])
self.slideSelected() self.slideSelected()
# Reset the shortcut. # Reset the shortcut.
self.current_shortcut = u'' self.current_shortcut = u''
@ -504,19 +440,16 @@ class SlideController(DisplayController):
def setLiveHotkeys(self, parent=None): def setLiveHotkeys(self, parent=None):
self.previousService = create_action(parent, u'previousService', self.previousService = create_action(parent, u'previousService',
text=translate('OpenLP.SlideController', 'Previous Service'), text=translate('OpenLP.SlideController', 'Previous Service'),
shortcuts=[QtCore.Qt.Key_Left], shortcuts=[QtCore.Qt.Key_Left], context=QtCore.Qt.WidgetWithChildrenShortcut, category=self.category,
context=QtCore.Qt.WidgetWithChildrenShortcut, triggers=self.servicePrevious)
category=self.category, triggers=self.servicePrevious)
self.nextService = create_action(parent, 'nextService', self.nextService = create_action(parent, 'nextService',
text=translate('OpenLP.SlideController', 'Next Service'), text=translate('OpenLP.SlideController', 'Next Service'),
shortcuts=[QtCore.Qt.Key_Right], shortcuts=[QtCore.Qt.Key_Right], context=QtCore.Qt.WidgetWithChildrenShortcut, category=self.category,
context=QtCore.Qt.WidgetWithChildrenShortcut, triggers=self.serviceNext)
category=self.category, triggers=self.serviceNext)
self.escapeItem = create_action(parent, 'escapeItem', self.escapeItem = create_action(parent, 'escapeItem',
text=translate('OpenLP.SlideController', 'Escape Item'), text=translate('OpenLP.SlideController', 'Escape Item'),
shortcuts=[QtCore.Qt.Key_Escape], shortcuts=[QtCore.Qt.Key_Escape],context=QtCore.Qt.WidgetWithChildrenShortcut, category=self.category,
context=QtCore.Qt.WidgetWithChildrenShortcut, triggers=self.liveEscape)
category=self.category, triggers=self.liveEscape)
def liveEscape(self): def liveEscape(self):
self.display.setVisible(False) self.display.setVisible(False)
@ -564,8 +497,7 @@ class SlideController(DisplayController):
Receiver.send_message('servicemanager_previous_item') Receiver.send_message('servicemanager_previous_item')
elif keypressCommand == ServiceItemAction.PreviousLastSlide: elif keypressCommand == ServiceItemAction.PreviousLastSlide:
# Go to the last slide of the previous item # Go to the last slide of the previous item
Receiver.send_message('servicemanager_previous_item', Receiver.send_message('servicemanager_previous_item', u'last slide')
u'last slide')
else: else:
Receiver.send_message('servicemanager_next_item') Receiver.send_message('servicemanager_next_item')
self.keypress_loop = False self.keypress_loop = False
@ -582,20 +514,17 @@ class SlideController(DisplayController):
self.display.setup() self.display.setup()
if self.isLive: if self.isLive:
self.__addActionsToWidget(self.display) self.__addActionsToWidget(self.display)
self.display.audioPlayer.connectSlot( self.display.audioPlayer.connectSlot(QtCore.SIGNAL(u'tick(qint64)'), self.onAudioTimeRemaining)
QtCore.SIGNAL(u'tick(qint64)'), self.onAudioTimeRemaining)
# The SlidePreview's ratio. # The SlidePreview's ratio.
try: try:
self.ratio = float(self.screens.current[u'size'].width()) / \ self.ratio = float(self.screens.current[u'size'].width()) / float(self.screens.current[u'size'].height())
float(self.screens.current[u'size'].height())
except ZeroDivisionError: except ZeroDivisionError:
self.ratio = 1 self.ratio = 1
self.mediaController.setup_display(self.display, False) self.mediaController.setup_display(self.display, False)
self.previewSizeChanged() self.previewSizeChanged()
self.previewDisplay.setup() self.previewDisplay.setup()
serviceItem = ServiceItem() serviceItem = ServiceItem()
self.previewDisplay.webView.setHtml(build_html(serviceItem, self.previewDisplay.webView.setHtml(build_html(serviceItem, self.previewDisplay.screen, None, self.isLive,
self.previewDisplay.screen, None, self.isLive,
plugins=PluginManager.get_instance().plugins)) plugins=PluginManager.get_instance().plugins))
self.mediaController.setup_display(self.previewDisplay,True) self.mediaController.setup_display(self.previewDisplay,True)
if self.serviceItem: if self.serviceItem:
@ -613,23 +542,18 @@ class SlideController(DisplayController):
splitters is moved or when the screen size is changed. Note, that this splitters is moved or when the screen size is changed. Note, that this
method is (also) called frequently from the mainwindow *paintEvent*. method is (also) called frequently from the mainwindow *paintEvent*.
""" """
if self.ratio < float(self.previewFrame.width()) / float( if self.ratio < float(self.previewFrame.width()) / float(self.previewFrame.height()):
self.previewFrame.height()):
# We have to take the height as limit. # We have to take the height as limit.
max_height = self.previewFrame.height() - self.grid.margin() * 2 max_height = self.previewFrame.height() - self.grid.margin() * 2
self.slidePreview.setFixedSize(QtCore.QSize( self.slidePreview.setFixedSize(QtCore.QSize(max_height * self.ratio, max_height))
max_height * self.ratio, max_height)) self.previewDisplay.setFixedSize(QtCore.QSize(max_height * self.ratio, max_height))
self.previewDisplay.setFixedSize(QtCore.QSize(
max_height * self.ratio, max_height))
self.previewDisplay.screen = { self.previewDisplay.screen = {
u'size': self.previewDisplay.geometry()} u'size': self.previewDisplay.geometry()}
else: else:
# We have to take the width as limit. # We have to take the width as limit.
max_width = self.previewFrame.width() - self.grid.margin() * 2 max_width = self.previewFrame.width() - self.grid.margin() * 2
self.slidePreview.setFixedSize(QtCore.QSize(max_width, self.slidePreview.setFixedSize(QtCore.QSize(max_width, max_width / self.ratio))
max_width / self.ratio)) self.previewDisplay.setFixedSize(QtCore.QSize(max_width, max_width / self.ratio))
self.previewDisplay.setFixedSize(QtCore.QSize(max_width,
max_width / self.ratio))
self.previewDisplay.screen = { self.previewDisplay.screen = {
u'size': self.previewDisplay.geometry()} u'size': self.previewDisplay.geometry()}
# Make sure that the frames have the correct size. # Make sure that the frames have the correct size.
@ -643,8 +567,7 @@ class SlideController(DisplayController):
# Sort out image heights. # Sort out image heights.
width = self.parent().controlSplitter.sizes()[self.split] width = self.parent().controlSplitter.sizes()[self.split]
for framenumber in range(len(self.serviceItem.get_frames())): for framenumber in range(len(self.serviceItem.get_frames())):
self.previewListWidget.setRowHeight( self.previewListWidget.setRowHeight(framenumber, width / self.ratio)
framenumber, width / self.ratio)
def onSongBarHandler(self): def onSongBarHandler(self):
request = unicode(self.sender().text()) request = unicode(self.sender().text())
@ -662,8 +585,7 @@ class SlideController(DisplayController):
""" """
Updates the Slide Limits variable from the settings. Updates the Slide Limits variable from the settings.
""" """
self.slide_limits = Settings().value( self.slide_limits = Settings().value(self.parent().advancedSettingsSection + u'/slide limits',
self.parent().advancedSettingsSection + u'/slide limits',
QtCore.QVariant(SlideLimits.End)).toInt()[0] QtCore.QVariant(SlideLimits.End)).toInt()[0]
def enableToolBar(self, item): def enableToolBar(self, item):
@ -692,12 +614,10 @@ class SlideController(DisplayController):
self.playSlidesLoop.setChecked(False) self.playSlidesLoop.setChecked(False)
self.playSlidesLoop.setIcon(build_icon(u':/media/media_time.png')) self.playSlidesLoop.setIcon(build_icon(u':/media/media_time.png'))
if item.is_text(): if item.is_text():
if Settings().value( if Settings().value(self.parent().songsSettingsSection + u'/display songbar',
self.parent().songsSettingsSection + u'/display songbar', QtCore.QVariant(True)).toBool() and self.slideList:
QtCore.QVariant(True)).toBool() and self.slideList:
self.songMenu.show() self.songMenu.show()
if item.is_capable(ItemCapabilities.CanLoop) and \ if item.is_capable(ItemCapabilities.CanLoop) and len(item.get_frames()) > 1:
len(item.get_frames()) > 1:
self.toolbar.setWidgetVisible(self.loopList) self.toolbar.setWidgetVisible(self.loopList)
if item.is_media(): if item.is_media():
self.mediabar.show() self.mediabar.show()
@ -785,8 +705,7 @@ class SlideController(DisplayController):
old_item = self.serviceItem old_item = self.serviceItem
# take a copy not a link to the servicemanager copy. # take a copy not a link to the servicemanager copy.
self.serviceItem = copy.copy(serviceItem) self.serviceItem = copy.copy(serviceItem)
if old_item and self.isLive and old_item.is_capable( if old_item and self.isLive and old_item.is_capable(ItemCapabilities.ProvidesOwnDisplay):
ItemCapabilities.ProvidesOwnDisplay):
self._resetBlank() self._resetBlank()
Receiver.send_message(u'%s_start' % serviceItem.name.lower(), Receiver.send_message(u'%s_start' % serviceItem.name.lower(),
[serviceItem, self.isLive, self.hideMode(), slideno]) [serviceItem, self.isLive, self.hideMode(), slideno])
@ -803,24 +722,16 @@ class SlideController(DisplayController):
# If the current item has background audio # If the current item has background audio
if self.serviceItem.is_capable(ItemCapabilities.HasBackgroundAudio): if self.serviceItem.is_capable(ItemCapabilities.HasBackgroundAudio):
log.debug(u'Starting to play...') log.debug(u'Starting to play...')
self.display.audioPlayer.addToPlaylist( self.display.audioPlayer.addToPlaylist(self.serviceItem.background_audio)
self.serviceItem.background_audio)
self.trackMenu.clear() self.trackMenu.clear()
for counter in range(len(self.serviceItem.background_audio)): for counter in range(len(self.serviceItem.background_audio)):
action = self.trackMenu.addAction(os.path.basename( action = self.trackMenu.addAction(os.path.basename(self.serviceItem.background_audio[counter]))
self.serviceItem.background_audio[counter]))
action.setData(counter) action.setData(counter)
QtCore.QObject.connect(action, QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered(bool)'), self.onTrackTriggered)
QtCore.SIGNAL(u'triggered(bool)'),
self.onTrackTriggered)
self.display.audioPlayer.repeat = Settings().value( self.display.audioPlayer.repeat = Settings().value(
self.parent().generalSettingsSection + \ self.parent().generalSettingsSection + u'/audio repeat list', QtCore.QVariant(False)).toBool()
u'/audio repeat list',
QtCore.QVariant(False)).toBool()
if Settings().value( if Settings().value(
self.parent().generalSettingsSection + \ self.parent().generalSettingsSection + u'/audio start paused', QtCore.QVariant(True)).toBool():
u'/audio start paused',
QtCore.QVariant(True)).toBool():
self.audioPauseItem.setChecked(True) self.audioPauseItem.setChecked(True)
self.display.audioPlayer.pause() self.display.audioPlayer.pause()
else: else:
@ -829,8 +740,7 @@ class SlideController(DisplayController):
row = 0 row = 0
text = [] text = []
for framenumber, frame in enumerate(self.serviceItem.get_frames()): for framenumber, frame in enumerate(self.serviceItem.get_frames()):
self.previewListWidget.setRowCount( self.previewListWidget.setRowCount(self.previewListWidget.rowCount() + 1)
self.previewListWidget.rowCount() + 1)
item = QtGui.QTableWidgetItem() item = QtGui.QTableWidgetItem()
slideHeight = 0 slideHeight = 0
if self.serviceItem.is_text(): if self.serviceItem.is_text():
@ -853,8 +763,7 @@ class SlideController(DisplayController):
label = QtGui.QLabel() label = QtGui.QLabel()
label.setMargin(4) label.setMargin(4)
if serviceItem.is_media(): if serviceItem.is_media():
label.setAlignment(QtCore.Qt.AlignHCenter | label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
QtCore.Qt.AlignVCenter)
else: else:
label.setScaledContents(True) label.setScaledContents(True)
if self.serviceItem.is_command(): if self.serviceItem.is_command():
@ -862,11 +771,9 @@ class SlideController(DisplayController):
else: else:
# If current slide set background to image # If current slide set background to image
if framenumber == slideno: if framenumber == slideno:
self.serviceItem.bg_image_bytes = \ self.serviceItem.bg_image_bytes = self.imageManager.getImageBytes(frame[u'path'],
self.imageManager.getImageBytes(frame[u'path'],
ImageSource.ImagePlugin) ImageSource.ImagePlugin)
image = self.imageManager.getImage(frame[u'path'], image = self.imageManager.getImage(frame[u'path'], ImageSource.ImagePlugin)
ImageSource.ImagePlugin)
label.setPixmap(QtGui.QPixmap.fromImage(image)) label.setPixmap(QtGui.QPixmap.fromImage(image))
self.previewListWidget.setCellWidget(framenumber, 0, label) self.previewListWidget.setCellWidget(framenumber, 0, label)
slideHeight = width * (1 / self.ratio) slideHeight = width * (1 / self.ratio)
@ -898,12 +805,10 @@ class SlideController(DisplayController):
# However opening a new item of the same type will automatically # However opening a new item of the same type will automatically
# close the previous, so make sure we don't close the new one. # close the previous, so make sure we don't close the new one.
if old_item.is_command() and not serviceItem.is_command(): if old_item.is_command() and not serviceItem.is_command():
Receiver.send_message(u'%s_stop' % Receiver.send_message(u'%s_stop' % old_item.name.lower(), [old_item, self.isLive])
old_item.name.lower(), [old_item, self.isLive])
if old_item.is_media() and not serviceItem.is_media(): if old_item.is_media() and not serviceItem.is_media():
self.onMediaClose() self.onMediaClose()
Receiver.send_message(u'slidecontroller_%s_started' % self.typePrefix, Receiver.send_message(u'slidecontroller_%s_started' % self.typePrefix, [serviceItem])
[serviceItem])
def __updatePreviewSelection(self, slideno): def __updatePreviewSelection(self, slideno):
""" """
@ -924,8 +829,7 @@ class SlideController(DisplayController):
if not self.serviceItem: if not self.serviceItem:
return return
if self.serviceItem.is_command(): if self.serviceItem.is_command():
Receiver.send_message(u'%s_slide' % self.serviceItem.name.lower(), Receiver.send_message(u'%s_slide' % self.serviceItem.name.lower(), [self.serviceItem, self.isLive, index])
[self.serviceItem, self.isLive, index])
self.updatePreview() self.updatePreview()
else: else:
self.__checkUpdateSelectedSlide(index) self.__checkUpdateSelectedSlide(index)
@ -936,11 +840,9 @@ class SlideController(DisplayController):
Allow the main display to blank the main display at startup time Allow the main display to blank the main display at startup time
""" """
log.debug(u'mainDisplaySetBackground live = %s' % self.isLive) log.debug(u'mainDisplaySetBackground live = %s' % self.isLive)
display_type = Settings().value( display_type = Settings().value(self.parent().generalSettingsSection + u'/screen blank',
self.parent().generalSettingsSection + u'/screen blank',
QtCore.QVariant(u'')).toString() QtCore.QVariant(u'')).toString()
if self.screens.which_screen(self.window()) != \ if self.screens.which_screen(self.window()) != self.screens.which_screen(self.display):
self.screens.which_screen(self.display):
# Order done to handle initial conversion # Order done to handle initial conversion
if display_type == u'themed': if display_type == u'themed':
self.onThemeDisplay(True) self.onThemeDisplay(True)
@ -977,12 +879,9 @@ class SlideController(DisplayController):
self.themeScreen.setChecked(False) self.themeScreen.setChecked(False)
self.desktopScreen.setChecked(False) self.desktopScreen.setChecked(False)
if checked: if checked:
Settings().setValue( Settings().setValue(self.parent().generalSettingsSection + u'/screen blank', QtCore.QVariant(u'blanked'))
self.parent().generalSettingsSection + u'/screen blank',
QtCore.QVariant(u'blanked'))
else: else:
Settings().remove( Settings().remove(self.parent().generalSettingsSection + u'/screen blank')
self.parent().generalSettingsSection + u'/screen blank')
self.blankPlugin() self.blankPlugin()
self.updatePreview() self.updatePreview()
@ -998,12 +897,9 @@ class SlideController(DisplayController):
self.themeScreen.setChecked(checked) self.themeScreen.setChecked(checked)
self.desktopScreen.setChecked(False) self.desktopScreen.setChecked(False)
if checked: if checked:
Settings().setValue( Settings().setValue(self.parent().generalSettingsSection + u'/screen blank', QtCore.QVariant(u'themed'))
self.parent().generalSettingsSection + u'/screen blank',
QtCore.QVariant(u'themed'))
else: else:
Settings().remove( Settings().remove(self.parent().generalSettingsSection + u'/screen blank')
self.parent().generalSettingsSection + u'/screen blank')
self.blankPlugin() self.blankPlugin()
self.updatePreview() self.updatePreview()
@ -1019,12 +915,9 @@ class SlideController(DisplayController):
self.themeScreen.setChecked(False) self.themeScreen.setChecked(False)
self.desktopScreen.setChecked(checked) self.desktopScreen.setChecked(checked)
if checked: if checked:
Settings().setValue( Settings().setValue(self.parent().generalSettingsSection + u'/screen blank', QtCore.QVariant(u'hidden'))
self.parent().generalSettingsSection + u'/screen blank',
QtCore.QVariant(u'hidden'))
else: else:
Settings().remove( Settings().remove(self.parent().generalSettingsSection + u'/screen blank')
self.parent().generalSettingsSection + u'/screen blank')
self.hidePlugin(checked) self.hidePlugin(checked)
self.updatePreview() self.updatePreview()
@ -1038,14 +931,12 @@ class SlideController(DisplayController):
if hide_mode: if hide_mode:
if not self.serviceItem.is_command(): if not self.serviceItem.is_command():
Receiver.send_message(u'live_display_hide', hide_mode) Receiver.send_message(u'live_display_hide', hide_mode)
Receiver.send_message(u'%s_blank' Receiver.send_message(u'%s_blank' % self.serviceItem.name.lower(),
% self.serviceItem.name.lower(),
[self.serviceItem, self.isLive, hide_mode]) [self.serviceItem, self.isLive, hide_mode])
else: else:
if not self.serviceItem.is_command(): if not self.serviceItem.is_command():
Receiver.send_message(u'live_display_show') Receiver.send_message(u'live_display_show')
Receiver.send_message(u'%s_unblank' Receiver.send_message(u'%s_unblank' % self.serviceItem.name.lower(),
% self.serviceItem.name.lower(),
[self.serviceItem, self.isLive]) [self.serviceItem, self.isLive])
else: else:
if hide_mode: if hide_mode:
@ -1061,14 +952,12 @@ class SlideController(DisplayController):
if self.serviceItem is not None: if self.serviceItem is not None:
if hide: if hide:
Receiver.send_message(u'live_display_hide', HideMode.Screen) Receiver.send_message(u'live_display_hide', HideMode.Screen)
Receiver.send_message(u'%s_hide' Receiver.send_message(u'%s_hide' % self.serviceItem.name.lower(),
% self.serviceItem.name.lower(),
[self.serviceItem, self.isLive]) [self.serviceItem, self.isLive])
else: else:
if not self.serviceItem.is_command(): if not self.serviceItem.is_command():
Receiver.send_message(u'live_display_show') Receiver.send_message(u'live_display_show')
Receiver.send_message(u'%s_unblank' Receiver.send_message(u'%s_unblank' % self.serviceItem.name.lower(),
% self.serviceItem.name.lower(),
[self.serviceItem, self.isLive]) [self.serviceItem, self.isLive])
else: else:
if hide: if hide:
@ -1092,8 +981,7 @@ class SlideController(DisplayController):
if -1 < row < self.previewListWidget.rowCount(): if -1 < row < self.previewListWidget.rowCount():
if self.serviceItem.is_command(): if self.serviceItem.is_command():
if self.isLive and not start: if self.isLive and not start:
Receiver.send_message( Receiver.send_message(u'%s_slide' % self.serviceItem.name.lower(),
u'%s_slide' % self.serviceItem.name.lower(),
[self.serviceItem, self.isLive, row]) [self.serviceItem, self.isLive, row])
else: else:
to_display = self.serviceItem.get_rendered_frame(row) to_display = self.serviceItem.get_rendered_frame(row)
@ -1109,8 +997,7 @@ class SlideController(DisplayController):
self.updatePreview() self.updatePreview()
self.selectedRow = row self.selectedRow = row
self.__checkUpdateSelectedSlide(row) self.__checkUpdateSelectedSlide(row)
Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, row)
row)
def onSlideChange(self, row): def onSlideChange(self, row):
""" """
@ -1118,8 +1005,7 @@ class SlideController(DisplayController):
""" """
self.__checkUpdateSelectedSlide(row) self.__checkUpdateSelectedSlide(row)
self.updatePreview() self.updatePreview()
Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, row)
row)
def updatePreview(self): def updatePreview(self):
""" """
@ -1128,7 +1014,7 @@ class SlideController(DisplayController):
""" """
log.debug(u'updatePreview %s ' % self.screens.current[u'primary']) log.debug(u'updatePreview %s ' % self.screens.current[u'primary'])
if not self.screens.current[u'primary'] and self.serviceItem and \ if not self.screens.current[u'primary'] and self.serviceItem and \
self.serviceItem.is_capable(ItemCapabilities.ProvidesOwnDisplay): self.serviceItem.is_capable(ItemCapabilities.ProvidesOwnDisplay):
# Grab now, but try again in a couple of seconds if slide change # Grab now, but try again in a couple of seconds if slide change
# is slow # is slow
QtCore.QTimer.singleShot(0.5, self.grabMainDisplay) QtCore.QTimer.singleShot(0.5, self.grabMainDisplay)
@ -1142,8 +1028,7 @@ class SlideController(DisplayController):
""" """
winid = QtGui.QApplication.desktop().winId() winid = QtGui.QApplication.desktop().winId()
rect = self.screens.current[u'size'] rect = self.screens.current[u'size']
winimg = QtGui.QPixmap.grabWindow(winid, rect.x(), winimg = QtGui.QPixmap.grabWindow(winid, rect.x(), rect.y(), rect.width(), rect.height())
rect.y(), rect.width(), rect.height())
self.slidePreview.setPixmap(winimg) self.slidePreview.setPixmap(winimg)
def onSlideSelectedNextAction(self, checked): def onSlideSelectedNextAction(self, checked):
@ -1159,8 +1044,7 @@ class SlideController(DisplayController):
""" """
if not self.serviceItem: if not self.serviceItem:
return return
Receiver.send_message(u'%s_next' % self.serviceItem.name.lower(), Receiver.send_message(u'%s_next' % self.serviceItem.name.lower(), [self.serviceItem, self.isLive])
[self.serviceItem, self.isLive])
if self.serviceItem.is_command() and self.isLive: if self.serviceItem.is_command() and self.isLive:
self.updatePreview() self.updatePreview()
else: else:
@ -1187,8 +1071,7 @@ class SlideController(DisplayController):
""" """
if not self.serviceItem: if not self.serviceItem:
return return
Receiver.send_message(u'%s_previous' % self.serviceItem.name.lower(), Receiver.send_message(u'%s_previous' % self.serviceItem.name.lower(), [self.serviceItem, self.isLive])
[self.serviceItem, self.isLive])
if self.serviceItem.is_command() and self.isLive: if self.serviceItem.is_command() and self.isLive:
self.updatePreview() self.updatePreview()
else: else:
@ -1197,8 +1080,7 @@ class SlideController(DisplayController):
if self.slide_limits == SlideLimits.Wrap: if self.slide_limits == SlideLimits.Wrap:
row = self.previewListWidget.rowCount() - 1 row = self.previewListWidget.rowCount() - 1
elif self.isLive and self.slide_limits == SlideLimits.Next: elif self.isLive and self.slide_limits == SlideLimits.Next:
self.keypress_queue.append( self.keypress_queue.append(ServiceItemAction.PreviousLastSlide)
ServiceItemAction.PreviousLastSlide)
self._process_queue() self._process_queue()
return return
else: else:
@ -1208,8 +1090,7 @@ class SlideController(DisplayController):
def __checkUpdateSelectedSlide(self, row): def __checkUpdateSelectedSlide(self, row):
if row + 1 < self.previewListWidget.rowCount(): if row + 1 < self.previewListWidget.rowCount():
self.previewListWidget.scrollToItem( self.previewListWidget.scrollToItem(self.previewListWidget.item(row + 1, 0))
self.previewListWidget.item(row + 1, 0))
self.previewListWidget.selectRow(row) self.previewListWidget.selectRow(row)
def onToggleLoop(self): def onToggleLoop(self):
@ -1226,8 +1107,7 @@ class SlideController(DisplayController):
Start the timer loop running and store the timer id Start the timer loop running and store the timer id
""" """
if self.previewListWidget.rowCount() > 1: if self.previewListWidget.rowCount() > 1:
self.timer_id = self.startTimer( self.timer_id = self.startTimer(int(self.delaySpinBox.value()) * 1000)
int(self.delaySpinBox.value()) * 1000)
def onStopLoop(self): def onStopLoop(self):
""" """
@ -1302,29 +1182,24 @@ class SlideController(DisplayController):
From the preview display requires the service Item to be editied From the preview display requires the service Item to be editied
""" """
self.songEdit = True self.songEdit = True
Receiver.send_message(u'%s_edit' % self.serviceItem.name.lower(), Receiver.send_message(u'%s_edit' % self.serviceItem.name.lower(), u'P:%s' % self.serviceItem.edit_id)
u'P:%s' % self.serviceItem.edit_id)
def onPreviewAddToService(self): def onPreviewAddToService(self):
""" """
From the preview display request the Item to be added to service From the preview display request the Item to be added to service
""" """
if self.serviceItem: if self.serviceItem:
self.parent().serviceManagerContents.addServiceItem( self.parent().serviceManagerContents.addServiceItem(self.serviceItem)
self.serviceItem)
def onGoLiveClick(self): def onGoLiveClick(self):
""" """
triggered by clicking the Preview slide items triggered by clicking the Preview slide items
""" """
if Settings().value(u'advanced/double click live', if Settings().value(u'advanced/double click live', QtCore.QVariant(False)).toBool():
QtCore.QVariant(False)).toBool():
# Live and Preview have issues if we have video or presentations # Live and Preview have issues if we have video or presentations
# playing in both at the same time. # playing in both at the same time.
if self.serviceItem.is_command(): if self.serviceItem.is_command():
Receiver.send_message(u'%s_stop' % Receiver.send_message(u'%s_stop' % self.serviceItem.name.lower(), [self.serviceItem, self.isLive])
self.serviceItem.name.lower(),
[self.serviceItem, self.isLive])
if self.serviceItem.is_media(): if self.serviceItem.is_media():
self.onMediaClose() self.onMediaClose()
self.onGoLive() self.onGoLive()
@ -1336,11 +1211,9 @@ class SlideController(DisplayController):
row = self.previewListWidget.currentRow() row = self.previewListWidget.currentRow()
if -1 < row < self.previewListWidget.rowCount(): if -1 < row < self.previewListWidget.rowCount():
if self.serviceItem.from_service: if self.serviceItem.from_service:
Receiver.send_message('servicemanager_preview_live', Receiver.send_message('servicemanager_preview_live', u'%s:%s' % (self.serviceItem._uuid, row))
u'%s:%s' % (self.serviceItem._uuid, row))
else: else:
self.parent().liveController.addServiceManagerItem( self.parent().liveController.addServiceManagerItem(self.serviceItem, row)
self.serviceItem, row)
def onMediaStart(self, item): def onMediaStart(self, item):
""" """