Merge master

This commit is contained in:
Patrick Zimmermann 2012-12-17 20:54:07 +01:00
commit 34bec28074
13 changed files with 487 additions and 913 deletions

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 #
@ -37,8 +37,7 @@ import logging
import os import os
import uuid import uuid
from openlp.core.lib import build_icon, clean_tags, expand_tags, translate, \ from openlp.core.lib import build_icon, clean_tags, expand_tags, translate, ImageSource
ImageSource
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -247,12 +246,10 @@ class ServiceItem(object):
previous_pages = {} previous_pages = {}
for slide in self._raw_frames: for slide in self._raw_frames:
verse_tag = slide[u'verseTag'] verse_tag = slide[u'verseTag']
if verse_tag in previous_pages and \ if verse_tag in previous_pages and previous_pages[verse_tag][0] == slide[u'raw_slide']:
previous_pages[verse_tag][0] == slide[u'raw_slide']:
pages = previous_pages[verse_tag][1] pages = previous_pages[verse_tag][1]
else: else:
pages = \ pages = self.renderer.format_slide(slide[u'raw_slide'], self)
self.renderer.format_slide(slide[u'raw_slide'], self)
previous_pages[verse_tag] = (slide[u'raw_slide'], pages) previous_pages[verse_tag] = (slide[u'raw_slide'], pages)
for page in pages: for page in pages:
page = page.replace(u'<br>', u'{br}') page = page.replace(u'<br>', u'{br}')
@ -263,8 +260,7 @@ class ServiceItem(object):
u'html': html.replace(u'&amp;nbsp;', u'&nbsp;'), u'html': html.replace(u'&amp;nbsp;', u'&nbsp;'),
u'verseTag': verse_tag u'verseTag': verse_tag
}) })
elif self.service_item_type == ServiceItemType.Image or \ elif self.service_item_type == ServiceItemType.Image or self.service_item_type == ServiceItemType.Command:
self.service_item_type == ServiceItemType.Command:
pass pass
else: else:
log.error(u'Invalid value renderer: %s' % self.service_item_type) log.error(u'Invalid value renderer: %s' % self.service_item_type)
@ -290,8 +286,7 @@ class ServiceItem(object):
self.image_border = background self.image_border = background
self.service_item_type = ServiceItemType.Image self.service_item_type = ServiceItemType.Image
self._raw_frames.append({u'title': title, u'path': path}) self._raw_frames.append({u'title': title, u'path': path})
self.renderer.image_manager.addImage( self.renderer.image_manager.addImage(path, ImageSource.ImagePlugin, self.image_border)
path, ImageSource.ImagePlugin, self.image_border)
self._new_item() self._new_item()
def add_from_text(self, raw_slide, verse_tag=None): def add_from_text(self, raw_slide, verse_tag=None):
@ -305,8 +300,7 @@ class ServiceItem(object):
verse_tag = verse_tag.upper() verse_tag = verse_tag.upper()
self.service_item_type = ServiceItemType.Text self.service_item_type = ServiceItemType.Text
title = raw_slide[:30].split(u'\n')[0] title = raw_slide[:30].split(u'\n')[0]
self._raw_frames.append( self._raw_frames.append({u'title': title, u'raw_slide': raw_slide, u'verseTag': verse_tag})
{u'title': title, u'raw_slide': raw_slide, u'verseTag': verse_tag})
self._new_item() self._new_item()
def add_from_command(self, path, file_name, image): def add_from_command(self, path, file_name, image):
@ -323,8 +317,7 @@ class ServiceItem(object):
The command of/for the slide. The command of/for the slide.
""" """
self.service_item_type = ServiceItemType.Command self.service_item_type = ServiceItemType.Command
self._raw_frames.append( self._raw_frames.append({u'title': file_name, u'image': image, u'path': path})
{u'title': file_name, u'image': image, u'path': path})
self._new_item() self._new_item()
def get_service_repr(self, lite_save): def get_service_repr(self, lite_save):
@ -360,15 +353,12 @@ class ServiceItem(object):
elif self.service_item_type == ServiceItemType.Image: elif self.service_item_type == ServiceItemType.Image:
if lite_save: if lite_save:
for slide in self._raw_frames: for slide in self._raw_frames:
service_data.append( service_data.append({u'title': slide[u'title'], u'path': slide[u'path']})
{u'title': slide[u'title'], u'path': slide[u'path']})
else: else:
service_data = [slide[u'title'] for slide in self._raw_frames] service_data = [slide[u'title'] for slide in self._raw_frames]
elif self.service_item_type == ServiceItemType.Command: elif self.service_item_type == ServiceItemType.Command:
for slide in self._raw_frames: for slide in self._raw_frames:
service_data.append( service_data.append({u'title': slide[u'title'], u'image': slide[u'image'], u'path': slide[u'path']})
{u'title': slide[u'title'], u'image': slide[u'image'],
u'path': slide[u'path']})
return {u'header': service_header, u'data': service_data} return {u'header': service_header, u'data': service_data}
def set_from_service(self, serviceitem, path=None): def set_from_service(self, serviceitem, path=None):
@ -421,17 +411,13 @@ class ServiceItem(object):
self.add_from_image(filename, text_image) self.add_from_image(filename, text_image)
else: else:
for text_image in serviceitem[u'serviceitem'][u'data']: for text_image in serviceitem[u'serviceitem'][u'data']:
self.add_from_image(text_image[u'path'], self.add_from_image(text_image[u'path'], text_image[u'title'])
text_image[u'title'])
elif self.service_item_type == ServiceItemType.Command: elif self.service_item_type == ServiceItemType.Command:
for text_image in serviceitem[u'serviceitem'][u'data']: for text_image in serviceitem[u'serviceitem'][u'data']:
if path: if path:
self.add_from_command( self.add_from_command(path, text_image[u'title'], text_image[u'image'])
path, text_image[u'title'], text_image[u'image'])
else: else:
self.add_from_command( self.add_from_command(text_image[u'path'], text_image[u'title'], text_image[u'image'])
text_image[u'path'], text_image[u'title'],
text_image[u'image'])
self._new_item() self._new_item()
@ -505,8 +491,7 @@ class ServiceItem(object):
""" """
Confirms if the ServiceItem uses a file Confirms if the ServiceItem uses a file
""" """
return self.service_item_type == ServiceItemType.Image or \ return self.service_item_type == ServiceItemType.Image or self.service_item_type == ServiceItemType.Command
self.service_item_type == ServiceItemType.Command
def is_text(self): def is_text(self):
""" """
@ -573,7 +558,7 @@ class ServiceItem(object):
def remove_frame(self, frame): def remove_frame(self, frame):
""" """
Remove the soecified frame from the item Remove the specified frame from the item
""" """
if frame in self._raw_frames: if frame in self._raw_frames:
self._raw_frames.remove(frame) self._raw_frames.remove(frame)

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 #
@ -89,8 +89,7 @@ def get_media_players():
overridden_player = u'auto' overridden_player = u'auto'
else: else:
overridden_player = u'' overridden_player = u''
saved_players_list = saved_players.replace(u'[', u'').\ saved_players_list = saved_players.replace(u'[', u'').replace(u']',u'').split(u',')
replace(u']',u'').split(u',')
return saved_players_list, overridden_player return saved_players_list, overridden_player
@ -107,9 +106,8 @@ def set_media_players(players_list, overridden_player=u'auto'):
""" """
log.debug(u'set_media_players') log.debug(u'set_media_players')
players = u','.join(players_list) players = u','.join(players_list)
if Settings().value(u'media/override player', if Settings().value(u'media/override player', QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0] == \
QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0] == \ QtCore.Qt.Checked and overridden_player != u'auto':
QtCore.Qt.Checked and overridden_player != u'auto':
players = players.replace(overridden_player, u'[%s]' % overridden_player) players = players.replace(overridden_player, u'[%s]' % overridden_player)
Settings().setValue(u'media/players', QtCore.QVariant(players)) Settings().setValue(u'media/players', QtCore.QVariant(players))

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 #
@ -66,33 +66,21 @@ class MediaController(object):
self.timer = QtCore.QTimer() self.timer = QtCore.QTimer()
self.timer.setInterval(200) self.timer.setInterval(200)
# Signals # Signals
QtCore.QObject.connect(self.timer, QtCore.QObject.connect(self.timer, QtCore.SIGNAL("timeout()"), self.media_state)
QtCore.SIGNAL("timeout()"), self.media_state) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'playbackPlay'), self.media_play_msg)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'playbackPause'), self.media_pause_msg)
QtCore.SIGNAL(u'playbackPlay'), self.media_play_msg) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'playbackStop'), self.media_stop_msg)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'seekSlider'), self.media_seek)
QtCore.SIGNAL(u'playbackPause'), self.media_pause_msg) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'volumeSlider'), self.media_volume)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'media_hide'), self.media_hide)
QtCore.SIGNAL(u'playbackStop'), self.media_stop_msg) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'media_blank'), self.media_blank)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'media_unblank'), self.media_unblank)
QtCore.SIGNAL(u'seekSlider'), self.media_seek)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'volumeSlider'), self.media_volume)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'media_hide'), self.media_hide)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'media_blank'), self.media_blank)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'media_unblank'), self.media_unblank)
# Signals for background video # Signals for background video
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'songs_hide'), self.media_hide)
QtCore.SIGNAL(u'songs_hide'), self.media_hide) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'songs_unblank'), self.media_unblank)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'mediaitem_media_rebuild'),
QtCore.SIGNAL(u'songs_unblank'), self.media_unblank) self._set_active_players)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'mediaitem_suffixes'),
QtCore.SIGNAL(u'mediaitem_media_rebuild'), self._set_active_players)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'mediaitem_suffixes'),
self._generate_extensions_lists) self._generate_extensions_lists)
def _set_active_players(self): def _set_active_players(self):
@ -113,16 +101,14 @@ class MediaController(object):
for item in player.audio_extensions_list: for item in player.audio_extensions_list:
if not item in self.audio_extensions_list: if not item in self.audio_extensions_list:
self.audio_extensions_list.append(item) self.audio_extensions_list.append(item)
self.mainWindow.serviceManagerContents. \ self.mainWindow.serviceManagerContents.supportedSuffixes(item[2:])
supportedSuffixes(item[2:])
self.video_extensions_list = [] self.video_extensions_list = []
for player in self.mediaPlayers.values(): for player in self.mediaPlayers.values():
if player.isActive: if player.isActive:
for item in player.video_extensions_list: for item in player.video_extensions_list:
if item not in self.video_extensions_list: if item not in self.video_extensions_list:
self.video_extensions_list.extend(item) self.video_extensions_list.extend(item)
self.mainWindow.serviceManagerContents. \ self.mainWindow.serviceManagerContents.supportedSuffixes(item[2:])
supportedSuffixes(item[2:])
def register_players(self, player): def register_players(self, player):
""" """
@ -143,20 +129,17 @@ class MediaController(object):
AppLocation.get_directory(AppLocation.AppDir), AppLocation.get_directory(AppLocation.AppDir),
u'core', u'ui', u'media') u'core', u'ui', u'media')
for filename in os.listdir(controller_dir): for filename in os.listdir(controller_dir):
if filename.endswith(u'player.py') and \ if filename.endswith(u'player.py') and not filename == 'mediaplayer.py':
not filename == 'mediaplayer.py':
path = os.path.join(controller_dir, filename) path = os.path.join(controller_dir, filename)
if os.path.isfile(path): if os.path.isfile(path):
modulename = u'openlp.core.ui.media.' + \ modulename = u'openlp.core.ui.media.' + os.path.splitext(filename)[0]
os.path.splitext(filename)[0]
log.debug(u'Importing controller %s', modulename) log.debug(u'Importing controller %s', modulename)
try: try:
__import__(modulename, globals(), locals(), []) __import__(modulename, globals(), locals(), [])
# On some platforms importing vlc.py might cause # On some platforms importing vlc.py might cause
# also OSError exceptions. (e.g. Mac OS X) # also OSError exceptions. (e.g. Mac OS X)
except (ImportError, OSError): except (ImportError, OSError):
log.warn(u'Failed to import %s on path %s', log.warn(u'Failed to import %s on path %s', modulename, path)
modulename, path)
player_classes = MediaPlayer.__subclasses__() player_classes = MediaPlayer.__subclasses__()
for player_class in player_classes: for player_class in player_classes:
player = player_class(self) player = player_class(self)
@ -165,8 +148,7 @@ class MediaController(object):
return False return False
savedPlayers, overriddenPlayer = get_media_players() savedPlayers, overriddenPlayer = get_media_players()
invalidMediaPlayers = [mediaPlayer for mediaPlayer in savedPlayers invalidMediaPlayers = [mediaPlayer for mediaPlayer in savedPlayers
if not mediaPlayer in self.mediaPlayers or not if not mediaPlayer in self.mediaPlayers or not self.mediaPlayers[mediaPlayer].check_available()]
self.mediaPlayers[mediaPlayer].check_available()]
if invalidMediaPlayers: if invalidMediaPlayers:
for invalidPlayer in invalidMediaPlayers: for invalidPlayer in invalidMediaPlayers:
savedPlayers.remove(invalidPlayer) savedPlayers.remove(invalidPlayer)
@ -188,8 +170,7 @@ class MediaController(object):
display = self._define_display(self.displayControllers[source]) display = self._define_display(self.displayControllers[source])
self.currentMediaPlayer[source].resize(display) self.currentMediaPlayer[source].resize(display)
self.currentMediaPlayer[source].update_ui(display) self.currentMediaPlayer[source].update_ui(display)
if self.currentMediaPlayer[source].state == \ if self.currentMediaPlayer[source].state == MediaState.Playing:
MediaState.Playing:
any_active = True any_active = True
# There are still any active players - no need to stop timer. # There are still any active players - no need to stop timer.
if any_active: if any_active:
@ -251,28 +232,20 @@ class MediaController(object):
controller.media_info = MediaInfo() controller.media_info = MediaInfo()
# Build a Media ToolBar # Build a Media ToolBar
controller.mediabar = OpenLPToolbar(controller) controller.mediabar = OpenLPToolbar(controller)
controller.mediabar.addToolbarAction(u'playbackPlay', controller.mediabar.addToolbarAction(u'playbackPlay', text=u'media_playback_play',
text=u'media_playback_play',
icon=u':/slides/media_playback_start.png', icon=u':/slides/media_playback_start.png',
tooltip=translate('OpenLP.SlideController', 'Start playing media.'), tooltip=translate('OpenLP.SlideController', 'Start playing media.'), triggers=controller.sendToPlugins)
triggers=controller.sendToPlugins) controller.mediabar.addToolbarAction(u'playbackPause', text=u'media_playback_pause',
controller.mediabar.addToolbarAction(u'playbackPause',
text=u'media_playback_pause',
icon=u':/slides/media_playback_pause.png', icon=u':/slides/media_playback_pause.png',
tooltip=translate('OpenLP.SlideController', tooltip=translate('OpenLP.SlideController', 'Pause playing media.'), triggers=controller.sendToPlugins)
'Pause playing media.'), controller.mediabar.addToolbarAction(u'playbackStop', text=u'media_playback_stop',
triggers=controller.sendToPlugins)
controller.mediabar.addToolbarAction(u'playbackStop',
text=u'media_playback_stop',
icon=u':/slides/media_playback_stop.png', icon=u':/slides/media_playback_stop.png',
tooltip=translate('OpenLP.SlideController', 'Stop playing media.'), tooltip=translate('OpenLP.SlideController', 'Stop playing media.'), triggers=controller.sendToPlugins)
triggers=controller.sendToPlugins)
# Build the seekSlider. # Build the seekSlider.
controller.seekSlider = QtGui.QSlider(QtCore.Qt.Horizontal) controller.seekSlider = QtGui.QSlider(QtCore.Qt.Horizontal)
controller.seekSlider.setMaximum(1000) controller.seekSlider.setMaximum(1000)
controller.seekSlider.setTracking(False) controller.seekSlider.setTracking(False)
controller.seekSlider.setToolTip(translate( controller.seekSlider.setToolTip(translate('OpenLP.SlideController', 'Video position.'))
'OpenLP.SlideController', 'Video position.'))
controller.seekSlider.setGeometry(QtCore.QRect(90, 260, 221, 24)) controller.seekSlider.setGeometry(QtCore.QRect(90, 260, 221, 24))
controller.seekSlider.setObjectName(u'seekSlider') controller.seekSlider.setObjectName(u'seekSlider')
controller.mediabar.addToolbarWidget(controller.seekSlider) controller.mediabar.addToolbarWidget(controller.seekSlider)
@ -283,8 +256,7 @@ class MediaController(object):
controller.volumeSlider.setMinimum(0) controller.volumeSlider.setMinimum(0)
controller.volumeSlider.setMaximum(100) controller.volumeSlider.setMaximum(100)
controller.volumeSlider.setTracking(True) controller.volumeSlider.setTracking(True)
controller.volumeSlider.setToolTip(translate( controller.volumeSlider.setToolTip(translate('OpenLP.SlideController', 'Audio Volume.'))
'OpenLP.SlideController', 'Audio Volume.'))
controller.volumeSlider.setValue(controller.media_info.volume) controller.volumeSlider.setValue(controller.media_info.volume)
controller.volumeSlider.setGeometry(QtCore.QRect(90, 160, 221, 24)) controller.volumeSlider.setGeometry(QtCore.QRect(90, 160, 221, 24))
controller.volumeSlider.setObjectName(u'volumeSlider') controller.volumeSlider.setObjectName(u'volumeSlider')
@ -292,10 +264,8 @@ class MediaController(object):
controller.controllerLayout.addWidget(controller.mediabar) controller.controllerLayout.addWidget(controller.mediabar)
controller.mediabar.setVisible(False) controller.mediabar.setVisible(False)
# Signals # Signals
QtCore.QObject.connect(controller.seekSlider, QtCore.QObject.connect(controller.seekSlider, QtCore.SIGNAL(u'valueChanged(int)'), controller.sendToPlugins)
QtCore.SIGNAL(u'valueChanged(int)'), controller.sendToPlugins) QtCore.QObject.connect(controller.volumeSlider, QtCore.SIGNAL(u'valueChanged(int)'), controller.sendToPlugins)
QtCore.QObject.connect(controller.volumeSlider,
QtCore.SIGNAL(u'valueChanged(int)'), controller.sendToPlugins)
def setup_display(self, display, preview): def setup_display(self, display, preview):
@ -337,8 +307,7 @@ class MediaController(object):
controller.mediabar.setVisible(value) controller.mediabar.setVisible(value)
if controller.isLive and controller.display: if controller.isLive and controller.display:
if self.currentMediaPlayer and value: if self.currentMediaPlayer and value:
if self.currentMediaPlayer[controller.controllerType] != \ if self.currentMediaPlayer[controller.controllerType] != self.mediaPlayers[u'webkit']:
self.mediaPlayers[u'webkit']:
controller.display.setTransparency(False) controller.display.setTransparency(False)
def resize(self, display, player): def resize(self, display, player):
@ -382,8 +351,7 @@ class MediaController(object):
else: else:
controller.media_info.volume = controller.volumeSlider.value() controller.media_info.volume = controller.volumeSlider.value()
controller.media_info.is_background = False controller.media_info.is_background = False
controller.media_info.file_info = \ controller.media_info.file_info = QtCore.QFileInfo(serviceItem.get_frame_path())
QtCore.QFileInfo(serviceItem.get_frame_path())
display = self._define_display(controller) display = self._define_display(controller)
if controller.isLive: if controller.isLive:
isValid = self._check_file_type(controller, display, serviceItem) isValid = self._check_file_type(controller, display, serviceItem)
@ -394,45 +362,36 @@ class MediaController(object):
controller.media_info.start_time = 0 controller.media_info.start_time = 0
controller.media_info.end_time = 0 controller.media_info.end_time = 0
else: else:
controller.media_info.start_time = \ controller.media_info.start_time = display.serviceItem.start_time
display.serviceItem.start_time
controller.media_info.end_time = serviceItem.end_time controller.media_info.end_time = serviceItem.end_time
elif controller.previewDisplay: elif controller.previewDisplay:
isValid = self._check_file_type(controller, display, serviceItem) isValid = self._check_file_type(controller, display, serviceItem)
if not isValid: if not isValid:
# Media could not be loaded correctly # Media could not be loaded correctly
critical_error_message_box( critical_error_message_box(translate('MediaPlugin.MediaItem', 'Unsupported File'),
translate('MediaPlugin.MediaItem', 'Unsupported File'), unicode(translate('MediaPlugin.MediaItem', 'Unsupported File')))
unicode(translate('MediaPlugin.MediaItem',
'Unsupported File')))
return False return False
# dont care about actual theme, set a black background # dont care about actual theme, set a black background
if controller.isLive and not controller.media_info.is_background: if controller.isLive and not controller.media_info.is_background:
display.frame.evaluateJavaScript(u'show_video( \ display.frame.evaluateJavaScript(u'show_video( "setBackBoard", null, null, null,"visible");')
"setBackBoard", null, null, null,"visible");')
# now start playing - Preview is autoplay! # now start playing - Preview is autoplay!
autoplay = False autoplay = False
# Preview requested # Preview requested
if not controller.isLive: if not controller.isLive:
autoplay = True autoplay = True
# Visible or background requested or Service Item wants to autostart # Visible or background requested or Service Item wants to autostart
elif not hidden or controller.media_info.is_background or \ elif not hidden or controller.media_info.is_background or serviceItem.will_auto_start:
serviceItem.will_auto_start:
autoplay = True autoplay = True
# Unblank on load set # Unblank on load set
elif Settings().value(u'general/auto unblank', elif Settings().value(u'general/auto unblank', QtCore.QVariant(False)).toBool():
QtCore.QVariant(False)).toBool():
autoplay = True autoplay = True
if autoplay: if autoplay:
if not self.media_play(controller): if not self.media_play(controller):
critical_error_message_box( critical_error_message_box(translate('MediaPlugin.MediaItem', 'Unsupported File'),
translate('MediaPlugin.MediaItem', 'Unsupported File'), unicode(translate('MediaPlugin.MediaItem', 'Unsupported File')))
unicode(translate('MediaPlugin.MediaItem',
'Unsupported File')))
return False return False
self.set_controls_visible(controller, True) self.set_controls_visible(controller, True)
log.debug(u'use %s controller' % log.debug(u'use %s controller' % self.currentMediaPlayer[controller.controllerType])
self.currentMediaPlayer[controller.controllerType])
return True return True
def media_length(self, serviceItem): def media_length(self, serviceItem):
@ -448,26 +407,20 @@ class MediaController(object):
self.media_reset(controller) self.media_reset(controller)
controller.media_info = MediaInfo() controller.media_info = MediaInfo()
controller.media_info.volume = 0 controller.media_info.volume = 0
controller.media_info.file_info = QtCore.QFileInfo(serviceItem controller.media_info.file_info = QtCore.QFileInfo(serviceItem.get_frame_path())
.get_frame_path())
display = controller.previewDisplay display = controller.previewDisplay
if not self._check_file_type(controller, display, serviceItem): if not self._check_file_type(controller, display, serviceItem):
# Media could not be loaded correctly # Media could not be loaded correctly
critical_error_message_box( critical_error_message_box(translate('MediaPlugin.MediaItem', 'Unsupported File'),
translate('MediaPlugin.MediaItem', 'Unsupported File'), unicode(translate('MediaPlugin.MediaItem', 'Unsupported File')))
unicode(translate('MediaPlugin.MediaItem',
'Unsupported File')))
return False return False
if not self.media_play(controller): if not self.media_play(controller):
critical_error_message_box( critical_error_message_box(translate('MediaPlugin.MediaItem', 'Unsupported File'),
translate('MediaPlugin.MediaItem', 'Unsupported File'), unicode(translate('MediaPlugin.MediaItem', 'Unsupported File')))
unicode(translate('MediaPlugin.MediaItem',
'Unsupported File')))
return False return False
serviceItem.set_media_length(controller.media_info.length) serviceItem.set_media_length(controller.media_info.length)
self.media_stop(controller) self.media_stop(controller)
log.debug(u'use %s controller' % log.debug(u'use %s controller' % self.currentMediaPlayer[controller.controllerType])
self.currentMediaPlayer[controller.controllerType])
return True return True
def _check_file_type(self, controller, display, serviceItem): def _check_file_type(self, controller, display, serviceItem):
@ -484,24 +437,20 @@ class MediaController(object):
if serviceItem.title != UiStrings().Automatic: if serviceItem.title != UiStrings().Automatic:
usedPlayers = [serviceItem.title.lower()] usedPlayers = [serviceItem.title.lower()]
if controller.media_info.file_info.isFile(): if controller.media_info.file_info.isFile():
suffix = u'*.%s' % \ suffix = u'*.%s' % controller.media_info.file_info.suffix().toLower()
controller.media_info.file_info.suffix().toLower()
for title in usedPlayers: for title in usedPlayers:
player = self.mediaPlayers[title] player = self.mediaPlayers[title]
if suffix in player.video_extensions_list: if suffix in player.video_extensions_list:
if not controller.media_info.is_background or \ if not controller.media_info.is_background or controller.media_info.is_background and \
controller.media_info.is_background and \ player.canBackground:
player.canBackground:
self.resize(display, player) self.resize(display, player)
if player.load(display): if player.load(display):
self.currentMediaPlayer[controller.controllerType] \ self.currentMediaPlayer[controller.controllerType] = player
= player
controller.media_info.media_type = MediaType.Video controller.media_info.media_type = MediaType.Video
return True return True
if suffix in player.audio_extensions_list: if suffix in player.audio_extensions_list:
if player.load(display): if player.load(display):
self.currentMediaPlayer[controller.controllerType] \ self.currentMediaPlayer[controller.controllerType] = player
= player
controller.media_info.media_type = MediaType.Audio controller.media_info.media_type = MediaType.Audio
return True return True
else: else:
@ -510,8 +459,7 @@ class MediaController(object):
if player.canFolder: if player.canFolder:
self.resize(display, player) self.resize(display, player)
if player.load(display): if player.load(display):
self.currentMediaPlayer[controller.controllerType] \ self.currentMediaPlayer[controller.controllerType] = player
= player
controller.media_info.media_type = MediaType.Video controller.media_info.media_type = MediaType.Video
return True return True
# no valid player found # no valid player found
@ -541,8 +489,7 @@ class MediaController(object):
return False return False
if status: if status:
display.frame.evaluateJavaScript(u'show_blank("desktop");') display.frame.evaluateJavaScript(u'show_blank("desktop");')
self.currentMediaPlayer[controller.controllerType]\ self.currentMediaPlayer[controller.controllerType].set_visible(display, True)
.set_visible(display, True)
# Flash needs to be played and will not AutoPlay # Flash needs to be played and will not AutoPlay
if controller.media_info.is_flash: if controller.media_info.is_flash:
controller.mediabar.actions[u'playbackPlay'].setVisible(True) controller.mediabar.actions[u'playbackPlay'].setVisible(True)
@ -605,8 +552,7 @@ class MediaController(object):
if controller.controllerType in self.currentMediaPlayer: if controller.controllerType in self.currentMediaPlayer:
display.frame.evaluateJavaScript(u'show_blank("black");') display.frame.evaluateJavaScript(u'show_blank("black");')
self.currentMediaPlayer[controller.controllerType].stop(display) self.currentMediaPlayer[controller.controllerType].stop(display)
self.currentMediaPlayer[controller.controllerType] \ self.currentMediaPlayer[controller.controllerType].set_visible(display, False)
.set_visible(display, False)
controller.seekSlider.setSliderPosition(0) controller.seekSlider.setSliderPosition(0)
controller.mediabar.actions[u'playbackPlay'].setVisible(True) controller.mediabar.actions[u'playbackPlay'].setVisible(True)
controller.mediabar.actions[u'playbackStop'].setVisible(False) controller.mediabar.actions[u'playbackStop'].setVisible(False)
@ -637,8 +583,7 @@ class MediaController(object):
controller = msg[0] controller = msg[0]
seekVal = msg[1][0] seekVal = msg[1][0]
display = self._define_display(controller) display = self._define_display(controller)
self.currentMediaPlayer[controller.controllerType] \ self.currentMediaPlayer[controller.controllerType].seek(display, seekVal)
.seek(display, seekVal)
def media_reset(self, controller): def media_reset(self, controller):
""" """
@ -650,10 +595,8 @@ class MediaController(object):
if controller.controllerType in self.currentMediaPlayer: if controller.controllerType in self.currentMediaPlayer:
display.override = {} display.override = {}
self.currentMediaPlayer[controller.controllerType].reset(display) self.currentMediaPlayer[controller.controllerType].reset(display)
self.currentMediaPlayer[controller.controllerType] \ self.currentMediaPlayer[controller.controllerType].set_visible(display, False)
.set_visible(display, False) display.frame.evaluateJavaScript(u'show_video( "setBackBoard", null, null, null,"hidden");')
display.frame.evaluateJavaScript(u'show_video( \
"setBackBoard", null, null, null,"hidden");')
del self.currentMediaPlayer[controller.controllerType] del self.currentMediaPlayer[controller.controllerType]
def media_hide(self, msg): def media_hide(self, msg):
@ -668,11 +611,9 @@ class MediaController(object):
return return
controller = self.mainWindow.liveController controller = self.mainWindow.liveController
display = self._define_display(controller) display = self._define_display(controller)
if self.currentMediaPlayer[controller.controllerType].state \ if self.currentMediaPlayer[controller.controllerType].state == MediaState.Playing:
== MediaState.Playing:
self.currentMediaPlayer[controller.controllerType].pause(display) self.currentMediaPlayer[controller.controllerType].pause(display)
self.currentMediaPlayer[controller.controllerType] \ self.currentMediaPlayer[controller.controllerType].set_visible(display, False)
.set_visible(display, False)
def media_blank(self, msg): def media_blank(self, msg):
""" """
@ -689,11 +630,9 @@ class MediaController(object):
Receiver.send_message(u'live_display_hide', hide_mode) Receiver.send_message(u'live_display_hide', hide_mode)
controller = self.mainWindow.liveController controller = self.mainWindow.liveController
display = self._define_display(controller) display = self._define_display(controller)
if self.currentMediaPlayer[controller.controllerType].state \ if self.currentMediaPlayer[controller.controllerType].state == MediaState.Playing:
== MediaState.Playing:
self.currentMediaPlayer[controller.controllerType].pause(display) self.currentMediaPlayer[controller.controllerType].pause(display)
self.currentMediaPlayer[controller.controllerType] \ self.currentMediaPlayer[controller.controllerType].set_visible(display, False)
.set_visible(display, False)
def media_unblank(self, msg): def media_unblank(self, msg):
""" """

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 #

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 #
@ -102,8 +102,7 @@ class PhononPlayer(MediaPlayer):
ext = u'*%s' % extension ext = u'*%s' % extension
if ext not in list: if ext not in list:
list.append(ext) list.append(ext)
log.info(u'MediaPlugin: %s extensions: %s' % (mimetype, log.info(u'MediaPlugin: %s extensions: %s' % (mimetype, u' '.join(extensions)))
u' '.join(extensions)))
# Add extensions for this mimetype from self.additional_extensions. # Add extensions for this mimetype from self.additional_extensions.
# This hack clears mimetypes' and operating system's shortcomings # This hack clears mimetypes' and operating system's shortcomings
# by providing possibly missing extensions. # by providing possibly missing extensions.
@ -112,8 +111,8 @@ class PhononPlayer(MediaPlayer):
ext = u'*%s' % extension ext = u'*%s' % extension
if ext not in list: if ext not in list:
list.append(ext) list.append(ext)
log.info(u'MediaPlugin: %s additional extensions: %s' % (mimetype, log.info(u'MediaPlugin: %s additional extensions: %s' %
u' '.join(self.additional_extensions[mimetype]))) (mimetype, u' '.join(self.additional_extensions[mimetype])))
def setup(self, display): def setup(self, display):
display.phononWidget = Phonon.VideoWidget(display) display.phononWidget = Phonon.VideoWidget(display)
@ -121,8 +120,7 @@ class PhononPlayer(MediaPlayer):
display.mediaObject = Phonon.MediaObject(display) display.mediaObject = Phonon.MediaObject(display)
Phonon.createPath(display.mediaObject, display.phononWidget) Phonon.createPath(display.mediaObject, display.phononWidget)
if display.hasAudio: if display.hasAudio:
display.audio = Phonon.AudioOutput( display.audio = Phonon.AudioOutput(Phonon.VideoCategory, display.mediaObject)
Phonon.VideoCategory, display.mediaObject)
Phonon.createPath(display.mediaObject, display.audio) Phonon.createPath(display.mediaObject, display.audio)
display.phononWidget.raise_() display.phononWidget.raise_()
display.phononWidget.hide() display.phononWidget.hide()
@ -173,8 +171,7 @@ class PhononPlayer(MediaPlayer):
if start_time > 0: if start_time > 0:
self.seek(display, controller.media_info.start_time * 1000) self.seek(display, controller.media_info.start_time * 1000)
self.volume(display, controller.media_info.volume) self.volume(display, controller.media_info.volume)
controller.media_info.length = \ controller.media_info.length = int(display.mediaObject.totalTime() / 1000)
int(display.mediaObject.totalTime() / 1000)
controller.seekSlider.setMaximum(controller.media_info.length * 1000) controller.seekSlider.setMaximum(controller.media_info.length * 1000)
self.state = MediaState.Playing self.state = MediaState.Playing
display.phononWidget.raise_() display.phononWidget.raise_()
@ -211,13 +208,11 @@ class PhononPlayer(MediaPlayer):
display.phononWidget.setVisible(status) display.phononWidget.setVisible(status)
def update_ui(self, display): def update_ui(self, display):
if display.mediaObject.state() == Phonon.PausedState and \ if display.mediaObject.state() == Phonon.PausedState and self.state != MediaState.Paused:
self.state != MediaState.Paused:
self.stop(display) self.stop(display)
controller = display.controller controller = display.controller
if controller.media_info.end_time > 0: if controller.media_info.end_time > 0:
if display.mediaObject.currentTime() > \ if display.mediaObject.currentTime() > controller.media_info.end_time * 1000:
controller.media_info.end_time * 1000:
self.stop(display) self.stop(display)
self.set_visible(display, False) self.set_visible(display, False)
if not controller.seekSlider.isSliderDown(): if not controller.seekSlider.isSliderDown():
@ -228,14 +223,13 @@ class PhononPlayer(MediaPlayer):
""" """
Add css style sheets to htmlbuilder Add css style sheets to htmlbuilder
""" """
background = unicode(QtGui.QColor(Settings().value( background = unicode(QtGui.QColor(Settings().value(u'players/background color',
u'players/background color', QtCore.QVariant(u'#000000'))).name()) QtCore.QVariant(u'#000000'))).name())
return VIDEO_CSS % (background,background,background) return VIDEO_CSS % (background,background,background)
def get_info(self): def get_info(self):
return(translate('Media.player', 'Phonon is a media player which ' return(translate('Media.player', 'Phonon is a media player which '
'interacts with the operating system to provide media capabilities' 'interacts with the operating system to provide media capabilities.') +
'.') +
u'<br/> <strong>' + translate('Media.player', 'Audio') + u'<br/> <strong>' + translate('Media.player', 'Audio') +
u'</strong><br/>' + unicode(self.audio_extensions_list) + u'</strong><br/>' + unicode(self.audio_extensions_list) +
u'<br/><strong>' + translate('Media.player', 'Video') + u'<br/><strong>' + translate('Media.player', 'Video') +

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 #
@ -76,8 +76,7 @@ class PlayerTab(SettingsTab):
self.formLayout.addRow(self.informationLabel) self.formLayout.addRow(self.informationLabel)
self.leftLayout.addWidget(self.bgColorGroupBox) self.leftLayout.addWidget(self.bgColorGroupBox)
self.leftLayout.addStretch() self.leftLayout.addStretch()
self.rightColumn.setSizePolicy( self.rightColumn.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
self.rightLayout.addStretch() self.rightLayout.addStretch()
self.mediaPlayerGroupBox = QtGui.QGroupBox(self.leftColumn) self.mediaPlayerGroupBox = QtGui.QGroupBox(self.leftColumn)
self.mediaPlayerGroupBox.setObjectName(u'mediaPlayerGroupBox') self.mediaPlayerGroupBox.setObjectName(u'mediaPlayerGroupBox')
@ -91,28 +90,22 @@ class PlayerTab(SettingsTab):
self.playerOrderLayout.setObjectName(u'playerOrderLayout') self.playerOrderLayout.setObjectName(u'playerOrderLayout')
self.playerOrderlistWidget = QtGui.QListWidget( self.playerOrderlistWidget = QtGui.QListWidget(
self.playerOrderGroupBox) self.playerOrderGroupBox)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0) sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.playerOrderlistWidget.\ sizePolicy.setHeightForWidth(self.playerOrderlistWidget.sizePolicy().hasHeightForWidth())
sizePolicy().hasHeightForWidth())
self.playerOrderlistWidget.setSizePolicy(sizePolicy) self.playerOrderlistWidget.setSizePolicy(sizePolicy)
self.playerOrderlistWidget.setVerticalScrollBarPolicy( self.playerOrderlistWidget.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
QtCore.Qt.ScrollBarAsNeeded) self.playerOrderlistWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.playerOrderlistWidget.setHorizontalScrollBarPolicy( self.playerOrderlistWidget.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
QtCore.Qt.ScrollBarAlwaysOff)
self.playerOrderlistWidget.setEditTriggers(
QtGui.QAbstractItemView.NoEditTriggers)
self.playerOrderlistWidget.setObjectName(u'playerOrderlistWidget') self.playerOrderlistWidget.setObjectName(u'playerOrderlistWidget')
self.playerOrderLayout.addWidget(self.playerOrderlistWidget) self.playerOrderLayout.addWidget(self.playerOrderlistWidget)
self.orderingButtonLayout = QtGui.QVBoxLayout() self.orderingButtonLayout = QtGui.QVBoxLayout()
self.orderingButtonLayout.setObjectName(u'orderingButtonLayout') self.orderingButtonLayout.setObjectName(u'orderingButtonLayout')
self.orderingButtonLayout.addStretch(1) self.orderingButtonLayout.addStretch(1)
self.orderingUpButton = create_button(self, u'orderingUpButton', self.orderingUpButton = create_button(self, u'orderingUpButton', role=u'up', click=self.onUpButtonClicked)
role=u'up', click=self.onUpButtonClicked) self.orderingDownButton = create_button(self, u'orderingDownButton', role=u'down',
self.orderingDownButton = create_button(self, u'orderingDownButton', click=self.onDownButtonClicked)
role=u'down', click=self.onDownButtonClicked)
self.orderingButtonLayout.addWidget(self.orderingUpButton) self.orderingButtonLayout.addWidget(self.orderingUpButton)
self.orderingButtonLayout.addWidget(self.orderingDownButton) self.orderingButtonLayout.addWidget(self.orderingDownButton)
self.orderingButtonLayout.addStretch(1) self.orderingButtonLayout.addStretch(1)
@ -121,28 +114,23 @@ class PlayerTab(SettingsTab):
self.leftLayout.addStretch() self.leftLayout.addStretch()
self.rightLayout.addStretch() self.rightLayout.addStretch()
# Signals and slots # Signals and slots
QtCore.QObject.connect(self.backgroundColorButton, QtCore.QObject.connect(self.backgroundColorButton, QtCore.SIGNAL(u'clicked()'),
QtCore.SIGNAL(u'clicked()'), self.onbackgroundColorButtonClicked) self.onbackgroundColorButtonClicked)
def retranslateUi(self): def retranslateUi(self):
self.mediaPlayerGroupBox.setTitle( self.mediaPlayerGroupBox.setTitle(translate('OpenLP.PlayerTab', 'Available Media Players'))
translate('OpenLP.PlayerTab', 'Available Media Players')) self.playerOrderGroupBox.setTitle(translate('OpenLP.PlayerTab', 'Player Search Order'))
self.playerOrderGroupBox.setTitle(
translate('OpenLP.PlayerTab', 'Player Search Order'))
self.bgColorGroupBox.setTitle(UiStrings().BackgroundColor) self.bgColorGroupBox.setTitle(UiStrings().BackgroundColor)
self.backgroundColorLabel.setText(UiStrings().DefaultColor) self.backgroundColorLabel.setText(UiStrings().DefaultColor)
self.informationLabel.setText( self.informationLabel.setText(translate('OpenLP.PlayerTab',
translate('OpenLP.PlayerTab', 'Visible background for videos ' 'Visible background for videos with aspect ratio different to screen.'))
'with aspect ratio different to screen.'))
self.retranslatePlayers() self.retranslatePlayers()
def onbackgroundColorButtonClicked(self): def onbackgroundColorButtonClicked(self):
new_color = QtGui.QColorDialog.getColor( new_color = QtGui.QColorDialog.getColor(QtGui.QColor(self.bg_color), self)
QtGui.QColor(self.bg_color), self)
if new_color.isValid(): if new_color.isValid():
self.bg_color = new_color.name() self.bg_color = new_color.name()
self.backgroundColorButton.setStyleSheet( self.backgroundColorButton.setStyleSheet(u'background-color: %s' % self.bg_color)
u'background-color: %s' % self.bg_color)
def onPlayerCheckBoxChanged(self, check_state): def onPlayerCheckBoxChanged(self, check_state):
player = self.sender().playerName player = self.sender().playerName
@ -163,8 +151,7 @@ class PlayerTab(SettingsTab):
self.playerCheckBoxes[u'%s' % player].setEnabled(False) self.playerCheckBoxes[u'%s' % player].setEnabled(False)
else: else:
self.playerCheckBoxes[u'%s' % player].setEnabled(True) self.playerCheckBoxes[u'%s' % player].setEnabled(True)
self.playerOrderlistWidget.addItem( self.playerOrderlistWidget.addItem(self.mediaPlayers[unicode(player)].original_name)
self.mediaPlayers[unicode(player)].original_name)
def onUpButtonClicked(self): def onUpButtonClicked(self):
row = self.playerOrderlistWidget.currentRow() row = self.playerOrderlistWidget.currentRow()
@ -189,16 +176,13 @@ class PlayerTab(SettingsTab):
self.usedPlayers = self.savedUsedPlayers self.usedPlayers = self.savedUsedPlayers
self.usedPlayers = get_media_players()[0] self.usedPlayers = get_media_players()[0]
self.savedUsedPlayers = self.usedPlayers self.savedUsedPlayers = self.usedPlayers
settings = Settings() settings = Settings()
settings.beginGroup(self.settingsSection) settings.beginGroup(self.settingsSection)
self.updatePlayerList() self.updatePlayerList()
self.bg_color = unicode(settings.value( self.bg_color = unicode(settings.value(u'background color', QtCore.QVariant(u'#000000')).toString())
u'background color', QtCore.QVariant(u'#000000')).toString())
self.initial_color = self.bg_color self.initial_color = self.bg_color
settings.endGroup() settings.endGroup()
self.backgroundColorButton.setStyleSheet( self.backgroundColorButton.setStyleSheet(u'background-color: %s' % self.bg_color)
u'background-color: %s' % self.bg_color)
def save(self): def save(self):
player_string_changed = False player_string_changed = False
@ -229,8 +213,7 @@ class PlayerTab(SettingsTab):
checkbox.setToolTip(player.get_info()) checkbox.setToolTip(player.get_info())
checkbox.setPlayerName(player.name) checkbox.setPlayerName(player.name)
self.playerCheckBoxes[player.name] = checkbox self.playerCheckBoxes[player.name] = checkbox
QtCore.QObject.connect(checkbox,QtCore.SIGNAL(u'stateChanged(int)'), QtCore.QObject.connect(checkbox,QtCore.SIGNAL(u'stateChanged(int)'), self.onPlayerCheckBoxChanged)
self.onPlayerCheckBoxChanged)
self.mediaPlayerLayout.addWidget(checkbox) self.mediaPlayerLayout.addWidget(checkbox)
if player.available and player.name in self.usedPlayers: if player.available and player.name in self.usedPlayers:
checkbox.setChecked(True) checkbox.setChecked(True)
@ -250,6 +233,4 @@ class PlayerTab(SettingsTab):
if player.available: if player.available:
checkbox.setText(player.display_name) checkbox.setText(player.display_name)
else: else:
checkbox.setText( checkbox.setText(unicode(translate('OpenLP.PlayerTab', '%s (unavailable)')) % player.display_name)
unicode(translate('OpenLP.PlayerTab',
'%s (unavailable)')) % player.display_name)

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 #
@ -114,8 +114,7 @@ class VlcPlayer(MediaPlayer):
command_line_options = u'--no-video-title-show' command_line_options = u'--no-video-title-show'
if not display.hasAudio: if not display.hasAudio:
command_line_options += u' --no-audio --no-video-title-show' command_line_options += u' --no-audio --no-video-title-show'
if Settings().value(u'advanced/hide mouse', if Settings().value(u'advanced/hide mouse', QtCore.QVariant(True)).toBool() and display.controller.isLive:
QtCore.QVariant(True)).toBool() and display.controller.isLive:
command_line_options += u' --mouse-hide-timeout=0' command_line_options += u' --mouse-hide-timeout=0'
display.vlcInstance = vlc.Instance(command_line_options) display.vlcInstance = vlc.Instance(command_line_options)
display.vlcInstance.set_log_verbosity(2) display.vlcInstance.set_log_verbosity(2)
@ -148,8 +147,7 @@ class VlcPlayer(MediaPlayer):
log.debug(u'load vid in Vlc Controller') log.debug(u'load vid in Vlc Controller')
controller = display.controller controller = display.controller
volume = controller.media_info.volume volume = controller.media_info.volume
file_path = str( file_path = str(controller.media_info.file_info.absoluteFilePath().toUtf8())
controller.media_info.file_info.absoluteFilePath().toUtf8())
path = os.path.normcase(file_path) path = os.path.normcase(file_path)
# create the media # create the media
display.vlcMedia = display.vlcInstance.media_new_path(path) display.vlcMedia = display.vlcInstance.media_new_path(path)
@ -163,8 +161,7 @@ class VlcPlayer(MediaPlayer):
# and once to just get media length. # and once to just get media length.
# #
# Media plugin depends on knowing media length before playback. # Media plugin depends on knowing media length before playback.
controller.media_info.length = \ controller.media_info.length = int(display.vlcMediaPlayer.get_media().get_duration() / 1000)
int(display.vlcMediaPlayer.get_media().get_duration() / 1000)
return True return True
def media_state_wait(self, display, mediaState): def media_state_wait(self, display, mediaState):
@ -187,16 +184,14 @@ class VlcPlayer(MediaPlayer):
def play(self, display): def play(self, display):
controller = display.controller controller = display.controller
start_time = 0 start_time = 0
if self.state != MediaState.Paused and \ if self.state != MediaState.Paused and controller.media_info.start_time > 0:
controller.media_info.start_time > 0:
start_time = controller.media_info.start_time start_time = controller.media_info.start_time
display.vlcMediaPlayer.play() display.vlcMediaPlayer.play()
if not self.media_state_wait(display, vlc.State.Playing): if not self.media_state_wait(display, vlc.State.Playing):
return False return False
if start_time > 0: if start_time > 0:
self.seek(display, controller.media_info.start_time * 1000) self.seek(display, controller.media_info.start_time * 1000)
controller.media_info.length = \ controller.media_info.length = int(display.vlcMediaPlayer.get_media().get_duration() / 1000)
int(display.vlcMediaPlayer.get_media().get_duration() / 1000)
controller.seekSlider.setMaximum(controller.media_info.length * 1000) controller.seekSlider.setMaximum(controller.media_info.length * 1000)
self.state = MediaState.Playing self.state = MediaState.Playing
display.vlcWidget.raise_() display.vlcWidget.raise_()
@ -236,13 +231,11 @@ class VlcPlayer(MediaPlayer):
self.stop(display) self.stop(display)
controller = display.controller controller = display.controller
if controller.media_info.end_time > 0: if controller.media_info.end_time > 0:
if display.vlcMediaPlayer.get_time() > \ if display.vlcMediaPlayer.get_time() > controller.media_info.end_time * 1000:
controller.media_info.end_time * 1000:
self.stop(display) self.stop(display)
self.set_visible(display, False) self.set_visible(display, False)
if not controller.seekSlider.isSliderDown(): if not controller.seekSlider.isSliderDown():
controller.seekSlider.setSliderPosition( \ controller.seekSlider.setSliderPosition(display.vlcMediaPlayer.get_time())
display.vlcMediaPlayer.get_time())
def get_info(self): def get_info(self):
return(translate('Media.player', 'VLC is an external player which ' return(translate('Media.player', 'VLC is an external player which '

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 #
@ -283,8 +283,8 @@ class WebkitPlayer(MediaPlayer):
""" """
Add css style sheets to htmlbuilder Add css style sheets to htmlbuilder
""" """
background = unicode(QtGui.QColor(Settings().value( background = unicode(QtGui.QColor(Settings().value(u'players/background color',
u'players/background color', QtCore.QVariant(u'#000000'))).name()) QtCore.QVariant(u'#000000'))).name())
css = VIDEO_CSS % (background,background,background) css = VIDEO_CSS % (background,background,background)
return css + FLASH_CSS return css + FLASH_CSS
@ -324,11 +324,9 @@ class WebkitPlayer(MediaPlayer):
display.webView.setVisible(True) display.webView.setVisible(True)
if controller.media_info.file_info.suffix() == u'swf': if controller.media_info.file_info.suffix() == u'swf':
controller.media_info.is_flash = True controller.media_info.is_flash = True
js = u'show_flash("load","%s");' % \ js = u'show_flash("load","%s");' % (path.replace(u'\\', u'\\\\'))
(path.replace(u'\\', u'\\\\'))
else: else:
js = u'show_video("init", "%s", %s, %s);' % \ js = u'show_video("init", "%s", %s, %s);' % (path.replace(u'\\', u'\\\\'), str(vol), loop)
(path.replace(u'\\', u'\\\\'), str(vol), loop)
display.frame.evaluateJavaScript(js) display.frame.evaluateJavaScript(js)
return True return True
@ -340,8 +338,7 @@ class WebkitPlayer(MediaPlayer):
display.webLoaded = True display.webLoaded = True
length = 0 length = 0
start_time = 0 start_time = 0
if self.state != MediaState.Paused and \ if self.state != MediaState.Paused and controller.media_info.start_time > 0:
controller.media_info.start_time > 0:
start_time = controller.media_info.start_time start_time = controller.media_info.start_time
self.set_visible(display, True) self.set_visible(display, True)
if controller.media_info.is_flash: if controller.media_info.is_flash:
@ -407,19 +404,15 @@ class WebkitPlayer(MediaPlayer):
else: else:
is_visible = "hidden" is_visible = "hidden"
if controller.media_info.is_flash: if controller.media_info.is_flash:
display.frame.evaluateJavaScript(u'show_flash( \ display.frame.evaluateJavaScript(u'show_flash("setVisible", null, null, "%s");' % (is_visible))
"setVisible", null, null, "%s");' % (is_visible))
else: else:
display.frame.evaluateJavaScript(u'show_video( \ display.frame.evaluateJavaScript(u'show_video("setVisible", null, null, null, "%s");' % (is_visible))
"setVisible", null, null, null, "%s");' % (is_visible))
def update_ui(self, display): def update_ui(self, display):
controller = display.controller controller = display.controller
if controller.media_info.is_flash: if controller.media_info.is_flash:
currentTime = display.frame.evaluateJavaScript( currentTime = display.frame.evaluateJavaScript(u'show_flash("currentTime");').toInt()[0]
u'show_flash("currentTime");').toInt()[0] length = display.frame.evaluateJavaScript(u'show_flash("length");').toInt()[0]
length = display.frame.evaluateJavaScript(
u'show_flash("length");').toInt()[0]
else: else:
if display.frame.evaluateJavaScript( if display.frame.evaluateJavaScript(
u'show_video("isEnded");').toString() == 'true': u'show_video("isEnded");').toString() == 'true':
@ -429,8 +422,7 @@ class WebkitPlayer(MediaPlayer):
# check if conversion was ok and value is not 'NaN' # check if conversion was ok and value is not 'NaN'
if ok and currentTime != float('inf'): if ok and currentTime != float('inf'):
currentTime = int(currentTime * 1000) currentTime = int(currentTime * 1000)
(length, ok) = display.frame.evaluateJavaScript( (length, ok) = display.frame.evaluateJavaScript(u'show_video("length");').toFloat()
u'show_video("length");').toFloat()
# check if conversion was ok and value is not 'NaN' # check if conversion was ok and value is not 'NaN'
if ok and length != float('inf'): if ok and length != float('inf'):
length = int(length * 1000) length = int(length * 1000)

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 #
@ -39,17 +39,14 @@ log = logging.getLogger(__name__)
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import OpenLPToolbar, ServiceItem, Receiver, build_icon, \ from openlp.core.lib import OpenLPToolbar, ServiceItem, Receiver, build_icon, ItemCapabilities, SettingsManager, \
ItemCapabilities, SettingsManager, translate, str_to_bool, \ translate, str_to_bool, check_directory_exists
check_directory_exists
from openlp.core.lib.theme import ThemeLevel from openlp.core.lib.theme import ThemeLevel
from openlp.core.lib.settings import Settings from openlp.core.lib.settings import Settings
from openlp.core.lib.ui import UiStrings, critical_error_message_box, \ from openlp.core.lib.ui import UiStrings, critical_error_message_box, create_widget_action, find_and_set_in_combo_box
create_widget_action, find_and_set_in_combo_box
from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm
from openlp.core.ui.printserviceform import PrintServiceForm from openlp.core.ui.printserviceform import PrintServiceForm
from openlp.core.utils import AppLocation, delete_file, split_filename, \ from openlp.core.utils import AppLocation, delete_file, split_filename, format_time
format_time
from openlp.core.utils.actions import ActionList, CategoryOrder from openlp.core.utils.actions import ActionList, CategoryOrder
class ServiceManagerList(QtGui.QTreeWidget): class ServiceManagerList(QtGui.QTreeWidget):
@ -127,30 +124,21 @@ class ServiceManager(QtGui.QWidget):
self.layout.setMargin(0) self.layout.setMargin(0)
# Create the top toolbar # Create the top toolbar
self.toolbar = OpenLPToolbar(self) self.toolbar = OpenLPToolbar(self)
self.toolbar.addToolbarAction(u'newService', self.toolbar.addToolbarAction(u'newService', text=UiStrings().NewService, icon=u':/general/general_new.png',
text=UiStrings().NewService, icon=u':/general/general_new.png', tooltip=UiStrings().CreateService, triggers=self.onNewServiceClicked)
tooltip=UiStrings().CreateService, self.toolbar.addToolbarAction(u'openService', text=UiStrings().OpenService, icon=u':/general/general_open.png',
triggers=self.onNewServiceClicked) tooltip=translate('OpenLP.ServiceManager', 'Load an existing service.'), triggers=self.onLoadServiceClicked)
self.toolbar.addToolbarAction(u'openService', self.toolbar.addToolbarAction(u'saveService', text=UiStrings().SaveService, icon=u':/general/general_save.png',
text=UiStrings().OpenService, icon=u':/general/general_open.png', tooltip=translate('OpenLP.ServiceManager', 'Save this service.'), triggers=self.decideSaveMethod)
tooltip=translate('OpenLP.ServiceManager',
'Load an existing service.'), triggers=self.onLoadServiceClicked)
self.toolbar.addToolbarAction(u'saveService',
text=UiStrings().SaveService, icon=u':/general/general_save.png',
tooltip=translate('OpenLP.ServiceManager', 'Save this service.'),
triggers=self.decideSaveMethod)
self.toolbar.addSeparator() self.toolbar.addSeparator()
self.themeLabel = QtGui.QLabel(u'%s:' % UiStrings().Theme, self) self.themeLabel = QtGui.QLabel(u'%s:' % UiStrings().Theme, self)
self.themeLabel.setMargin(3) self.themeLabel.setMargin(3)
self.themeLabel.setObjectName(u'themeLabel') self.themeLabel.setObjectName(u'themeLabel')
self.toolbar.addToolbarWidget(self.themeLabel) self.toolbar.addToolbarWidget(self.themeLabel)
self.themeComboBox = QtGui.QComboBox(self.toolbar) self.themeComboBox = QtGui.QComboBox(self.toolbar)
self.themeComboBox.setToolTip(translate('OpenLP.ServiceManager', self.themeComboBox.setToolTip(translate('OpenLP.ServiceManager', 'Select a theme for the service.'))
'Select a theme for the service.')) self.themeComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToMinimumContentsLength)
self.themeComboBox.setSizeAdjustPolicy( self.themeComboBox.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
QtGui.QComboBox.AdjustToMinimumContentsLength)
self.themeComboBox.setSizePolicy(
QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
self.themeComboBox.setObjectName(u'themeComboBox') self.themeComboBox.setObjectName(u'themeComboBox')
self.toolbar.addToolbarWidget(self.themeComboBox) self.toolbar.addToolbarWidget(self.themeComboBox)
self.toolbar.setObjectName(u'toolbar') self.toolbar.setObjectName(u'toolbar')
@ -161,15 +149,12 @@ class ServiceManager(QtGui.QWidget):
QtGui.QAbstractItemView.CurrentChanged | QtGui.QAbstractItemView.CurrentChanged |
QtGui.QAbstractItemView.DoubleClicked | QtGui.QAbstractItemView.DoubleClicked |
QtGui.QAbstractItemView.EditKeyPressed) QtGui.QAbstractItemView.EditKeyPressed)
self.serviceManagerList.setDragDropMode( self.serviceManagerList.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
QtGui.QAbstractItemView.DragDrop)
self.serviceManagerList.setAlternatingRowColors(True) self.serviceManagerList.setAlternatingRowColors(True)
self.serviceManagerList.setHeaderHidden(True) self.serviceManagerList.setHeaderHidden(True)
self.serviceManagerList.setExpandsOnDoubleClick(False) self.serviceManagerList.setExpandsOnDoubleClick(False)
self.serviceManagerList.setContextMenuPolicy( self.serviceManagerList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
QtCore.Qt.CustomContextMenu) QtCore.QObject.connect(self.serviceManagerList, QtCore.SIGNAL('customContextMenuRequested(QPoint)'),
QtCore.QObject.connect(self.serviceManagerList,
QtCore.SIGNAL('customContextMenuRequested(QPoint)'),
self.contextMenu) self.contextMenu)
self.serviceManagerList.setObjectName(u'serviceManagerList') self.serviceManagerList.setObjectName(u'serviceManagerList')
# enable drop # enable drop
@ -182,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'),
@ -237,52 +205,35 @@ 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.QObject.connect(self.themeComboBox, QtCore.SIGNAL(u'activated(int)'), self.onThemeComboBoxSelected)
QtCore.SIGNAL(u'activated(int)'), self.onThemeComboBoxSelected) QtCore.QObject.connect(self.serviceManagerList, QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onMakeLive)
QtCore.QObject.connect(self.serviceManagerList, QtCore.QObject.connect(self.serviceManagerList, QtCore.SIGNAL(u'itemCollapsed(QTreeWidgetItem*)'),
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onMakeLive) self.collapsed)
QtCore.QObject.connect(self.serviceManagerList, QtCore.QObject.connect(self.serviceManagerList, QtCore.SIGNAL(u'itemExpanded(QTreeWidgetItem*)'), self.expanded)
QtCore.SIGNAL(u'itemCollapsed(QTreeWidgetItem*)'), self.collapsed) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_list'), self.updateThemeList)
QtCore.QObject.connect(self.serviceManagerList, QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'servicemanager_preview_live'), self.previewLive)
QtCore.SIGNAL(u'itemExpanded(QTreeWidgetItem*)'), self.expanded) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'servicemanager_next_item'), self.nextItem)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'servicemanager_previous_item'),
QtCore.SIGNAL(u'theme_update_list'), self.updateThemeList) self.previousItem)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'servicemanager_set_item'), self.onSetItem)
QtCore.SIGNAL(u'servicemanager_preview_live'), self.previewLive) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.configUpdated)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_screen_changed'),
QtCore.SIGNAL(u'servicemanager_next_item'), self.nextItem)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'servicemanager_previous_item'), self.previousItem)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'servicemanager_set_item'), self.onSetItem)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'config_updated'), self.configUpdated)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'config_screen_changed'),
self.regenerateServiceItems) self.regenerateServiceItems)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_global'), self.themeChange)
QtCore.SIGNAL(u'theme_update_global'), self.themeChange) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'service_item_update'), self.serviceItemUpdate)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'service_item_update'), self.serviceItemUpdate)
# Last little bits of setting up # Last little bits of setting up
self.service_theme = unicode(Settings().value( self.service_theme = unicode(Settings().value(self.mainwindow.serviceManagerSettingsSection + u'/service theme',
self.mainwindow.serviceManagerSettingsSection + u'/service theme',
QtCore.QVariant(u'')).toString()) QtCore.QVariant(u'')).toString())
self.servicePath = AppLocation.get_section_data_path(u'servicemanager') self.servicePath = AppLocation.get_section_data_path(u'servicemanager')
# build the drag and drop context menu # build the drag and drop context menu
@ -295,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,
@ -345,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):
@ -362,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):
@ -382,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):
""" """
@ -432,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()
@ -469,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):
@ -518,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
@ -546,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.
@ -565,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)
@ -589,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:
@ -630,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()
@ -656,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:
@ -682,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'':
@ -764,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'):
@ -798,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)
@ -808,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:
@ -850,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)
@ -869,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'))
@ -890,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))
@ -908,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()
@ -1155,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()
@ -1178,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()):
@ -1245,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)
@ -1273,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():
@ -1284,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:
@ -1318,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
@ -1385,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):
@ -1431,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):
@ -1449,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):
@ -1537,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:
@ -1567,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):
""" """

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 #
@ -32,12 +32,10 @@ import os
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import MediaManagerItem, build_icon, ItemCapabilities, \ from openlp.core.lib import MediaManagerItem, build_icon, ItemCapabilities, SettingsManager, translate, \
SettingsManager, translate, check_item_selected, Receiver, MediaType, \ check_item_selected, Receiver, MediaType, ServiceItem, build_html, ServiceItemContext
ServiceItem, build_html, ServiceItemContext
from openlp.core.lib.settings import Settings from openlp.core.lib.settings import Settings
from openlp.core.lib.ui import UiStrings, critical_error_message_box, \ from openlp.core.lib.ui import UiStrings, critical_error_message_box, create_horizontal_adjusting_combo_box
create_horizontal_adjusting_combo_box
from openlp.core.ui import DisplayController, Display, DisplayControllerType from openlp.core.ui import DisplayController, Display, DisplayControllerType
from openlp.core.ui.media import get_media_players, set_media_players from openlp.core.ui.media import get_media_players, set_media_players
from openlp.core.utils import locale_compare from openlp.core.utils import locale_compare
@ -67,25 +65,17 @@ class MediaMediaItem(MediaManagerItem):
self.displayController = DisplayController(parent) self.displayController = DisplayController(parent)
self.displayController.controllerLayout = QtGui.QVBoxLayout() self.displayController.controllerLayout = QtGui.QVBoxLayout()
self.plugin.mediaController.register_controller(self.displayController) self.plugin.mediaController.register_controller(self.displayController)
self.plugin.mediaController.set_controls_visible(self.displayController, self.plugin.mediaController.set_controls_visible(self.displayController, False)
False) self.displayController.previewDisplay = Display(self.displayController, False, self.displayController)
self.displayController.previewDisplay = Display(self.displayController,
False, self.displayController)
self.displayController.previewDisplay.hide() self.displayController.previewDisplay.hide()
self.displayController.previewDisplay.setGeometry( self.displayController.previewDisplay.setGeometry(QtCore.QRect(0, 0, 300, 300))
QtCore.QRect(0, 0, 300, 300)) self.displayController.previewDisplay.screen = {u'size':self.displayController.previewDisplay.geometry()}
self.displayController.previewDisplay.screen = \
{u'size':self.displayController.previewDisplay.geometry()}
self.displayController.previewDisplay.setup() self.displayController.previewDisplay.setup()
self.plugin.mediaController.setup_display( self.plugin.mediaController.setup_display(self.displayController.previewDisplay, False)
self.displayController.previewDisplay, False)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'video_background_replaced'), QtCore.SIGNAL(u'video_background_replaced'), self.videobackgroundReplaced)
self.videobackgroundReplaced) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'mediaitem_media_rebuild'), self.rebuild_players)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_screen_changed'), self.displaySetup)
QtCore.SIGNAL(u'mediaitem_media_rebuild'), self.rebuild_players)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'config_screen_changed'), self.displaySetup)
# Allow DnD from the desktop # Allow DnD from the desktop
self.listView.activateDnD() self.listView.activateDnD()
@ -96,8 +86,7 @@ class MediaMediaItem(MediaManagerItem):
self.resetAction.setText(UiStrings().ResetBG) self.resetAction.setText(UiStrings().ResetBG)
self.resetAction.setToolTip(UiStrings().ResetLiveBG) self.resetAction.setToolTip(UiStrings().ResetLiveBG)
self.automatic = UiStrings().Automatic self.automatic = UiStrings().Automatic
self.displayTypeLabel.setText( self.displayTypeLabel.setText(translate('MediaPlugin.MediaItem', 'Use Player:'))
translate('MediaPlugin.MediaItem', 'Use Player:'))
self.rebuild_players() self.rebuild_players()
def requiredIcons(self): def requiredIcons(self):
@ -112,11 +101,10 @@ class MediaMediaItem(MediaManagerItem):
def addEndHeaderBar(self): def addEndHeaderBar(self):
# Replace backgrounds do not work at present so remove functionality. # Replace backgrounds do not work at present so remove functionality.
self.replaceAction = self.toolbar.addToolbarAction(u'replaceAction', self.replaceAction = self.toolbar.addToolbarAction(u'replaceAction', icon=u':/slides/slide_blank.png',
icon=u':/slides/slide_blank.png', triggers=self.onReplaceClick) triggers=self.onReplaceClick)
self.resetAction = self.toolbar.addToolbarAction(u'resetAction', self.resetAction = self.toolbar.addToolbarAction(u'resetAction', icon=u':/system/system_close.png',
icon=u':/system/system_close.png', visible=False, visible=False, triggers=self.onResetClick)
triggers=self.onResetClick)
self.mediaWidget = QtGui.QWidget(self) self.mediaWidget = QtGui.QWidget(self)
self.mediaWidget.setObjectName(u'mediaWidget') self.mediaWidget.setObjectName(u'mediaWidget')
self.displayLayout = QtGui.QFormLayout(self.mediaWidget) self.displayLayout = QtGui.QFormLayout(self.mediaWidget)
@ -124,15 +112,12 @@ class MediaMediaItem(MediaManagerItem):
self.displayLayout.setObjectName(u'displayLayout') self.displayLayout.setObjectName(u'displayLayout')
self.displayTypeLabel = QtGui.QLabel(self.mediaWidget) self.displayTypeLabel = QtGui.QLabel(self.mediaWidget)
self.displayTypeLabel.setObjectName(u'displayTypeLabel') self.displayTypeLabel.setObjectName(u'displayTypeLabel')
self.displayTypeComboBox = create_horizontal_adjusting_combo_box( self.displayTypeComboBox = create_horizontal_adjusting_combo_box(self.mediaWidget, u'displayTypeComboBox')
self.mediaWidget, u'displayTypeComboBox')
self.displayTypeLabel.setBuddy(self.displayTypeComboBox) self.displayTypeLabel.setBuddy(self.displayTypeComboBox)
self.displayLayout.addRow(self.displayTypeLabel, self.displayLayout.addRow(self.displayTypeLabel, self.displayTypeComboBox)
self.displayTypeComboBox)
# Add the Media widget to the page layout # Add the Media widget to the page layout
self.pageLayout.addWidget(self.mediaWidget) self.pageLayout.addWidget(self.mediaWidget)
QtCore.QObject.connect(self.displayTypeComboBox, QtCore.QObject.connect(self.displayTypeComboBox, QtCore.SIGNAL(u'currentIndexChanged (int)'),
QtCore.SIGNAL(u'currentIndexChanged (int)'),
self.overridePlayerChanged) self.overridePlayerChanged)
def overridePlayerChanged(self, index): def overridePlayerChanged(self, index):
@ -171,19 +156,16 @@ class MediaMediaItem(MediaManagerItem):
service_item.shortname = service_item.title service_item.shortname = service_item.title
(path, name) = os.path.split(filename) (path, name) = os.path.split(filename)
service_item.add_from_command(path, name,CLAPPERBOARD) service_item.add_from_command(path, name,CLAPPERBOARD)
if self.plugin.liveController.mediaController.video( if self.plugin.liveController.mediaController.video(DisplayControllerType.Live, service_item,
DisplayControllerType.Live, service_item,
videoBehindText=True): videoBehindText=True):
self.resetAction.setVisible(True) self.resetAction.setVisible(True)
else: else:
critical_error_message_box(UiStrings().LiveBGError, critical_error_message_box(UiStrings().LiveBGError,
translate('MediaPlugin.MediaItem', translate('MediaPlugin.MediaItem', 'There was no display item to amend.'))
'There was no display item to amend.'))
else: else:
critical_error_message_box(UiStrings().LiveBGError, critical_error_message_box(UiStrings().LiveBGError,
unicode(translate('MediaPlugin.MediaItem', unicode(translate('MediaPlugin.MediaItem',
'There was a problem replacing your background, ' 'There was a problem replacing your background, the media file "%s" no longer exists.')) % filename)
'the media file "%s" no longer exists.')) % filename)
def generateSlideData(self, service_item, item=None, xmlVersion=False, def generateSlideData(self, service_item, item=None, xmlVersion=False,
remote=False, context=ServiceItemContext.Live): remote=False, context=ServiceItemContext.Live):
@ -197,8 +179,7 @@ class MediaMediaItem(MediaManagerItem):
# File is no longer present # File is no longer present
critical_error_message_box( critical_error_message_box(
translate('MediaPlugin.MediaItem', 'Missing Media File'), translate('MediaPlugin.MediaItem', 'Missing Media File'),
unicode(translate('MediaPlugin.MediaItem', unicode(translate('MediaPlugin.MediaItem', 'The file %s no longer exists.')) % filename)
'The file %s no longer exists.')) % filename)
return False return False
service_item.title = unicode(self.displayTypeComboBox.currentText()) service_item.title = unicode(self.displayTypeComboBox.currentText())
service_item.shortname = service_item.title service_item.shortname = service_item.title
@ -213,8 +194,7 @@ class MediaMediaItem(MediaManagerItem):
service_item.add_capability(ItemCapabilities.RequiresMedia) service_item.add_capability(ItemCapabilities.RequiresMedia)
service_item.add_capability(ItemCapabilities.HasDetailedTitleDisplay) service_item.add_capability(ItemCapabilities.HasDetailedTitleDisplay)
if Settings().value(self.settingsSection + u'/media auto start', if Settings().value(self.settingsSection + u'/media auto start',
QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0]\ QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0] == QtCore.Qt.Checked:
== QtCore.Qt.Checked:
service_item.will_auto_start = True service_item.will_auto_start = True
# force a non-existent theme # force a non-existent theme
service_item.theme = -1 service_item.theme = -1
@ -232,22 +212,19 @@ class MediaMediaItem(MediaManagerItem):
the settings the settings
""" """
self.populateDisplayTypes() self.populateDisplayTypes()
self.onNewFileMasks = unicode(translate('MediaPlugin.MediaItem', self.onNewFileMasks = unicode(translate('MediaPlugin.MediaItem', 'Videos (%s);;Audio (%s);;%s (*)')) % (
'Videos (%s);;Audio (%s);;%s (*)')) % (
u' '.join(self.plugin.mediaController.video_extensions_list), u' '.join(self.plugin.mediaController.video_extensions_list),
u' '.join(self.plugin.mediaController.audio_extensions_list), u' '.join(self.plugin.mediaController.audio_extensions_list), UiStrings().AllFiles)
UiStrings().AllFiles)
def displaySetup(self): def displaySetup(self):
self.plugin.mediaController.setup_display( self.plugin.mediaController.setup_display(self.displayController.previewDisplay, False)
self.displayController.previewDisplay, False)
def populateDisplayTypes(self): def populateDisplayTypes(self):
""" """
Load the combobox with the enabled media players, Load the combobox with the enabled media players,
allowing user to select a specific player if settings allow allowing user to select a specific player if settings allow
""" """
# block signals to avoid unnecessary overridePlayerChanged Signales # block signals to avoid unnecessary overridePlayerChanged Signals
# while combo box creation # while combo box creation
self.displayTypeComboBox.blockSignals(True) self.displayTypeComboBox.blockSignals(True)
self.displayTypeComboBox.clear() self.displayTypeComboBox.clear()
@ -273,7 +250,7 @@ class MediaMediaItem(MediaManagerItem):
Remove a media item from the list. Remove a media item from the list.
""" """
if check_item_selected(self.listView, translate('MediaPlugin.MediaItem', if check_item_selected(self.listView, translate('MediaPlugin.MediaItem',
'You must select a media file to delete.')): 'You must select a media file to delete.')):
row_list = [item.row() for item in self.listView.selectedIndexes()] row_list = [item.row() for item in self.listView.selectedIndexes()]
row_list.sort(reverse=True) row_list.sort(reverse=True)
for row in row_list: for row in row_list:
@ -284,8 +261,7 @@ class MediaMediaItem(MediaManagerItem):
def loadList(self, media): def loadList(self, media):
# Sort the media by its filename considering language specific # Sort the media by its filename considering language specific
# characters. # characters.
media.sort(cmp=locale_compare, media.sort(cmp=locale_compare, key=lambda filename: os.path.split(unicode(filename))[1])
key=lambda filename: os.path.split(unicode(filename))[1])
for track in media: for track in media:
track_info = QtCore.QFileInfo(track) track_info = QtCore.QFileInfo(track)
if not os.path.exists(track): if not os.path.exists(track):
@ -296,8 +272,7 @@ class MediaMediaItem(MediaManagerItem):
elif track_info.isFile(): elif track_info.isFile():
filename = os.path.split(unicode(track))[1] filename = os.path.split(unicode(track))[1]
item_name = QtGui.QListWidgetItem(filename) item_name = QtGui.QListWidgetItem(filename)
if u'*.%s' % (filename.split(u'.')[-1].lower()) in \ if u'*.%s' % (filename.split(u'.')[-1].lower()) in self.plugin.mediaController.audio_extensions_list:
self.plugin.mediaController.audio_extensions_list:
item_name.setIcon(AUDIO) item_name.setIcon(AUDIO)
else: else:
item_name.setIcon(VIDEO) item_name.setIcon(VIDEO)
@ -312,8 +287,7 @@ class MediaMediaItem(MediaManagerItem):
def getList(self, type=MediaType.Audio): def getList(self, type=MediaType.Audio):
media = SettingsManager.load_list(self.settingsSection, u'media') media = SettingsManager.load_list(self.settingsSection, u'media')
media.sort(cmp=locale_compare, media.sort(cmp=locale_compare, key=lambda filename: os.path.split(unicode(filename))[1])
key=lambda filename: os.path.split(unicode(filename))[1])
ext = [] ext = []
if type == MediaType.Audio: if type == MediaType.Audio:
ext = self.plugin.mediaController.audio_extensions_list ext = self.plugin.mediaController.audio_extensions_list

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 #
@ -69,34 +69,24 @@ class MediaTab(SettingsTab):
def retranslateUi(self): def retranslateUi(self):
self.advancedGroupBox.setTitle(UiStrings().Advanced) self.advancedGroupBox.setTitle(UiStrings().Advanced)
self.overridePlayerCheckBox.setText( self.overridePlayerCheckBox.setText(translate('MediaPlugin.MediaTab', 'Allow media player to be overridden'))
translate('MediaPlugin.MediaTab', self.autoStartCheckBox.setText(translate('MediaPlugin.MediaTab', 'Start Live items automatically'))
'Allow media player to be overridden'))
self.autoStartCheckBox.setText(
translate('MediaPlugin.MediaTab',
'Start Live items automatically'))
def load(self): def load(self):
self.overridePlayerCheckBox.setChecked(Settings().value( self.overridePlayerCheckBox.setChecked(Settings().value(self.settingsSection + u'/override player',
self.settingsSection + u'/override player',
QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0]) QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0])
self.autoStartCheckBox.setChecked(Settings().value( self.autoStartCheckBox.setChecked(Settings().value(self.settingsSection + u'/media auto start',
self.settingsSection + u'/media auto start',
QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0]) QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0])
def save(self): def save(self):
override_changed = False override_changed = False
setting_key = self.settingsSection + u'/override player' setting_key = self.settingsSection + u'/override player'
if Settings().value(setting_key).toInt()[0] != \ if Settings().value(setting_key).toInt()[0] != self.overridePlayerCheckBox.checkState():
self.overridePlayerCheckBox.checkState(): Settings().setValue(setting_key, QtCore.QVariant(self.overridePlayerCheckBox.checkState()))
Settings().setValue(setting_key,
QtCore.QVariant(self.overridePlayerCheckBox.checkState()))
override_changed = True override_changed = True
setting_key = self.settingsSection + u'/media auto start' setting_key = self.settingsSection + u'/media auto start'
if Settings().value(setting_key).toInt()[0] !=\ if Settings().value(setting_key).toInt()[0] != self.autoStartCheckBox.checkState():
self.autoStartCheckBox.checkState(): Settings().setValue(setting_key, QtCore.QVariant(self.autoStartCheckBox.checkState()))
Settings().setValue(setting_key,
QtCore.QVariant(self.autoStartCheckBox.checkState()))
if override_changed: if override_changed:
self.parent.resetSupportedSuffixes() self.parent.resetSupportedSuffixes()
Receiver.send_message(u'mediaitem_media_rebuild') Receiver.send_message(u'mediaitem_media_rebuild')

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 #
@ -41,8 +41,7 @@ class MediaPlugin(Plugin):
log.info(u'%s MediaPlugin loaded', __name__) log.info(u'%s MediaPlugin loaded', __name__)
def __init__(self, plugin_helpers): def __init__(self, plugin_helpers):
Plugin.__init__(self, u'media', plugin_helpers, Plugin.__init__(self, u'media', plugin_helpers, MediaMediaItem)
MediaMediaItem)
self.weight = -6 self.weight = -6
self.iconPath = u':/plugins/plugin_media.png' self.iconPath = u':/plugins/plugin_media.png'
self.icon = build_icon(self.iconPath) self.icon = build_icon(self.iconPath)
@ -54,8 +53,7 @@ class MediaPlugin(Plugin):
Create the settings Tab Create the settings Tab
""" """
visible_name = self.getString(StringContent.VisibleName) visible_name = self.getString(StringContent.VisibleName)
self.settingsTab = MediaTab(parent, self.name, visible_name[u'title'], self.settingsTab = MediaTab(parent, self.name, visible_name[u'title'], self.iconPath)
self.iconPath)
def about(self): def about(self):
about_text = translate('MediaPlugin', '<strong>Media Plugin</strong>' about_text = translate('MediaPlugin', '<strong>Media Plugin</strong>'
@ -84,8 +82,7 @@ class MediaPlugin(Plugin):
u'delete': translate('MediaPlugin', 'Delete the selected media.'), u'delete': translate('MediaPlugin', 'Delete the selected media.'),
u'preview': translate('MediaPlugin', 'Preview the selected media.'), u'preview': translate('MediaPlugin', 'Preview the selected media.'),
u'live': translate('MediaPlugin', 'Send the selected media live.'), u'live': translate('MediaPlugin', 'Send the selected media live.'),
u'service': translate('MediaPlugin', u'service': translate('MediaPlugin', 'Add the selected media to the service.')
'Add the selected media to the service.')
} }
self.setPluginUiTextStrings(tooltips) self.setPluginUiTextStrings(tooltips)
@ -131,12 +128,10 @@ class MediaPlugin(Plugin):
log.debug(u'Converting old setting to new setting') log.debug(u'Converting old setting to new setting')
new_players = [] new_players = []
if players: if players:
new_players = [player for player in players \ new_players = [player for player in players if player != u'phonon']
if player != u'phonon']
new_players.insert(0, u'phonon') new_players.insert(0, u'phonon')
self.mediaController.mediaPlayers[u'phonon'].isActive = True self.mediaController.mediaPlayers[u'phonon'].isActive = True
settings.setValue(u'players', \ settings.setValue(u'players', QtCore.QVariant(u','.join(new_players)))
QtCore.QVariant(u','.join(new_players)))
self.settingsTab.load() self.settingsTab.load()
settings.remove(u'use phonon') settings.remove(u'use phonon')
settings.endGroup() settings.endGroup()