From a9dd3336fbae3274699d8477fdfd4d26d9148c2a Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 9 Sep 2012 07:06:44 +0100 Subject: [PATCH 01/58] Move media files around --- openlp/core/ui/media/__init__.py | 4 +-- openlp/core/ui/media/mediacontroller.py | 2 +- openlp/core/{lib => ui/media}/mediaplayer.py | 0 openlp/core/ui/media/phononplayer.py | 2 +- openlp/core/ui/media/vendor/__init__.py | 27 ++++++++++++++++++++ openlp/core/ui/media/{ => vendor}/vlc.py | 0 openlp/core/ui/media/vlcplayer.py | 4 +-- openlp/core/ui/media/webkitplayer.py | 2 +- 8 files changed, 34 insertions(+), 7 deletions(-) rename openlp/core/{lib => ui/media}/mediaplayer.py (100%) create mode 100644 openlp/core/ui/media/vendor/__init__.py rename openlp/core/ui/media/{ => vendor}/vlc.py (100%) diff --git a/openlp/core/ui/media/__init__.py b/openlp/core/ui/media/__init__.py index c5e5d9a9c..1880d6454 100644 --- a/openlp/core/ui/media/__init__.py +++ b/openlp/core/ui/media/__init__.py @@ -46,7 +46,7 @@ class MediaState(object): class MediaType(object): """ - An enumeration of possibible Media Types + An enumeration of possible Media Types """ Unused = 0 Audio = 1 @@ -58,7 +58,7 @@ class MediaType(object): class MediaInfo(object): """ - This class hold the media related infos + This class hold the media related info """ file_info = None volume = 100 diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 5e9671f64..90775848c 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -32,10 +32,10 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import OpenLPToolbar, Receiver, translate from openlp.core.lib.settings import Settings -from openlp.core.lib.mediaplayer import MediaPlayer from openlp.core.lib.ui import critical_error_message_box from openlp.core.ui.media import MediaState, MediaInfo, MediaType, \ get_media_players, set_media_players +from openlp.core.ui.media.mediaplayer import MediaPlayer from openlp.core.utils import AppLocation log = logging.getLogger(__name__) diff --git a/openlp/core/lib/mediaplayer.py b/openlp/core/ui/media/mediaplayer.py similarity index 100% rename from openlp/core/lib/mediaplayer.py rename to openlp/core/ui/media/mediaplayer.py diff --git a/openlp/core/ui/media/phononplayer.py b/openlp/core/ui/media/phononplayer.py index 94865d16b..48c51d419 100644 --- a/openlp/core/ui/media/phononplayer.py +++ b/openlp/core/ui/media/phononplayer.py @@ -33,8 +33,8 @@ from datetime import datetime from PyQt4.phonon import Phonon from openlp.core.lib import Receiver -from openlp.core.lib.mediaplayer import MediaPlayer from openlp.core.ui.media import MediaState +from openlp.core.ui.media.mediaplayer import MediaPlayer log = logging.getLogger(__name__) diff --git a/openlp/core/ui/media/vendor/__init__.py b/openlp/core/ui/media/vendor/__init__.py new file mode 100644 index 000000000..170b609de --- /dev/null +++ b/openlp/core/ui/media/vendor/__init__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, Frode Woldsund # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### diff --git a/openlp/core/ui/media/vlc.py b/openlp/core/ui/media/vendor/vlc.py similarity index 100% rename from openlp/core/ui/media/vlc.py rename to openlp/core/ui/media/vendor/vlc.py diff --git a/openlp/core/ui/media/vlcplayer.py b/openlp/core/ui/media/vlcplayer.py index bf1e7a920..70853cd64 100644 --- a/openlp/core/ui/media/vlcplayer.py +++ b/openlp/core/ui/media/vlcplayer.py @@ -36,14 +36,14 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver from openlp.core.lib.settings import Settings -from openlp.core.lib.mediaplayer import MediaPlayer from openlp.core.ui.media import MediaState +from openlp.core.ui.media.mediaplayer import MediaPlayer log = logging.getLogger(__name__) VLC_AVAILABLE = False try: - import vlc + from openlp.core.ui.media.vendor import vlc VLC_AVAILABLE = bool(vlc.get_default_instance()) except (ImportError, NameError, NotImplementedError): pass diff --git a/openlp/core/ui/media/webkitplayer.py b/openlp/core/ui/media/webkitplayer.py index ecf39dfbe..aad9710c0 100644 --- a/openlp/core/ui/media/webkitplayer.py +++ b/openlp/core/ui/media/webkitplayer.py @@ -28,8 +28,8 @@ import logging -from openlp.core.lib.mediaplayer import MediaPlayer from openlp.core.ui.media import MediaState +from openlp.core.ui.media.mediaplayer import MediaPlayer log = logging.getLogger(__name__) From 6ef5fa88d28e64f02d87508c79a526c553fd0520 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 9 Sep 2012 07:27:53 +0100 Subject: [PATCH 02/58] Split media tabs, update ServiceItem and add auto start feature --- openlp/core/lib/serviceitem.py | 27 +++- openlp/core/ui/mainwindow.py | 2 +- openlp/core/ui/media/__init__.py | 1 + openlp/core/ui/servicemanager.py | 21 +++ openlp/core/ui/settingsform.py | 7 +- openlp/plugins/media/lib/mediatab.py | 149 ++---------------- openlp/plugins/media/mediaplugin.py | 2 +- .../presentations/lib/messagelistener.py | 2 +- 8 files changed, 74 insertions(+), 137 deletions(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index a5b9c524b..10a7c4639 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -69,6 +69,7 @@ class ItemCapabilities(object): CanSoftBreak = 13 CanWordSplit = 14 HasBackgroundAudio = 15 + CanAutoStartForLive = 16 class ServiceItem(object): @@ -122,6 +123,7 @@ class ServiceItem(object): self.background_audio = [] self.theme_overwritten = False self.temporary_edit = False + self.will_auto_start = False self._new_item() def _new_item(self): @@ -279,7 +281,8 @@ class ServiceItem(object): u'end_time': self.end_time, u'media_length': self.media_length, u'background_audio': self.background_audio, - u'theme_overwritten': self.theme_overwritten + u'theme_overwritten': self.theme_overwritten, + u'will_auto_start': self.will_auto_start } service_data = [] if self.service_item_type == ServiceItemType.Text: @@ -323,6 +326,7 @@ class ServiceItem(object): self.start_time = header.get(u'start_time', 0) self.end_time = header.get(u'end_time', 0) self.media_length = header.get(u'media_length', 0) + self.will_auto_start = header.get(u'will_auto_start', False) if u'background_audio' in header: self.background_audio = [] for filename in header[u'background_audio']: @@ -422,6 +426,24 @@ class ServiceItem(object): """ return self.service_item_type == ServiceItemType.Text + def set_media_length(self, length): + """ + Stores the media length of the item + + ``length`` + The length of the media item + """ + self.media_length = length + if length > 0: + self.add_capability(ItemCapabilities.HasVariableStartTime) + + def get_filename(self): + """ + Returns the full filename + """ + return os.path.join(self.get_frame_path(), self.get_frame_title()) + + def get_frames(self): """ Returns the frames for the ServiceItem @@ -434,6 +456,9 @@ class ServiceItem(object): def get_rendered_frame(self, row): """ Returns the correct frame for a given list and renders it if required. + + ``row`` + The service item slide to be returned """ if self.service_item_type == ServiceItemType.Text: return self._display_frames[row][u'html'].split(u'\n')[0] diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 585aba15b..845617d55 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -575,6 +575,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.headerSection = u'SettingsImport' self.serviceNotSaved = False self.aboutForm = AboutForm(self) + self.mediaController = MediaController(self) self.settingsForm = SettingsForm(self, self) self.formattingTagForm = FormattingTagForm(self) self.shortcutForm = ShortcutListForm(self) @@ -584,7 +585,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.pluginManager = PluginManager(plugin_path) self.pluginHelpers = {} self.imageManager = ImageManager() - self.mediaController = MediaController(self) # Set up the interface self.setupUi(self) # Load settings after setupUi so default UI sizes are overwritten diff --git a/openlp/core/ui/media/__init__.py b/openlp/core/ui/media/__init__.py index 1880d6454..f37d71288 100644 --- a/openlp/core/ui/media/__init__.py +++ b/openlp/core/ui/media/__init__.py @@ -117,3 +117,4 @@ def set_media_players(players_list, overridden_player=u'auto'): Settings().setValue(u'media/players', QtCore.QVariant(players)) from mediacontroller import MediaController +from playertab import PlayerTab diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index d49c988c6..de6132845 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -305,6 +305,9 @@ class ServiceManager(QtGui.QWidget): self.timeAction = create_widget_action(self.menu, text=translate('OpenLP.ServiceManager', '&Start Time'), icon=u':/media/media_time.png', triggers=self.onStartTimeForm) + self.autoStartAction = create_widget_action(self.menu, + text=u'', + icon=u':/media/media_time.png', triggers=self.onAutoStart) # Add already existing delete action to the menu. self.menu.addAction(self.serviceManagerList.delete) self.menu.addSeparator() @@ -755,6 +758,7 @@ class ServiceManager(QtGui.QWidget): self.maintainAction.setVisible(False) self.notesAction.setVisible(False) self.timeAction.setVisible(False) + self.autoStartAction.setVisible(False) if serviceItem[u'service_item'].is_capable(ItemCapabilities.CanEdit)\ and serviceItem[u'service_item'].edit_id: self.editAction.setVisible(True) @@ -766,6 +770,14 @@ class ServiceManager(QtGui.QWidget): if serviceItem[u'service_item']\ .is_capable(ItemCapabilities.HasVariableStartTime): self.timeAction.setVisible(True) + if serviceItem[u'service_item']\ + .is_capable(ItemCapabilities.CanAutoStartForLive): + self.autoStartAction.setVisible(True) + self.autoStartAction.setText(translate('OpenLP.ServiceManager', + '&Auto Start - Disabled')) + if serviceItem[u'service_item'].will_auto_start: + self.autoStartAction.setText(translate('OpenLP.ServiceManager', + '&Auto Start - Enabled')) self.themeMenu.menuAction().setVisible(False) # Set up the theme menu. if serviceItem[u'service_item'].is_text() and \ @@ -800,6 +812,15 @@ class ServiceManager(QtGui.QWidget): if self.startTimeForm.exec_(): self.repaintServiceList(item, -1) + def onAutoStart(self): + """ + Toggles to Auto Start Setting. + """ + item = self.findServiceItem()[0] + self.serviceItems[item][u'service_item'].will_auto_start = \ + not self.serviceItems[item][u'service_item'].will_auto_start + + def onServiceItemEditForm(self): """ Opens a dialog to edit the service item and update the service diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py index 550ebac4b..475963aff 100644 --- a/openlp/core/ui/settingsform.py +++ b/openlp/core/ui/settingsform.py @@ -34,6 +34,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver, build_icon, PluginStatus from openlp.core.ui import AdvancedTab, GeneralTab, ThemesTab +from openlp.core.ui.media import PlayerTab from settingsdialog import Ui_SettingsDialog log = logging.getLogger(__name__) @@ -54,6 +55,9 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): self.themesTab = ThemesTab(self, mainWindow) # Advanced tab self.advancedTab = AdvancedTab(self) + # Advanced tab + self.playerTab = PlayerTab(self, mainWindow.mediaController + .mediaPlayers) def exec_(self): # load all the settings @@ -64,7 +68,8 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): self.insertTab(self.generalTab, 0, PluginStatus.Active) self.insertTab(self.themesTab, 1, PluginStatus.Active) self.insertTab(self.advancedTab, 2, PluginStatus.Active) - count = 3 + self.insertTab(self.playerTab, 3, PluginStatus.Active) + count = 4 for plugin in self.plugins: if plugin.settingsTab: self.insertTab(plugin.settingsTab, count, plugin.status) diff --git a/openlp/plugins/media/lib/mediatab.py b/openlp/plugins/media/lib/mediatab.py index 4ac258ed9..f0c3999f3 100644 --- a/openlp/plugins/media/lib/mediatab.py +++ b/openlp/plugins/media/lib/mediatab.py @@ -32,6 +32,7 @@ from openlp.core.lib import SettingsTab, translate, Receiver from openlp.core.lib.ui import UiStrings, create_button from openlp.core.lib.settings import Settings from openlp.core.ui.media import get_media_players, set_media_players + class MediaQCheckBox(QtGui.QCheckBox): """ MediaQCheckBox adds an extra property, playerName to the QCheckBox class. @@ -44,60 +45,12 @@ class MediaTab(SettingsTab): """ MediaTab is the Media settings tab in the settings dialog. """ - def __init__(self, parent, title, visible_title, media_players, icon_path): - self.mediaPlayers = media_players - self.savedUsedPlayers = None + def __init__(self, parent, title, visible_title, icon_path): SettingsTab.__init__(self, parent, title, visible_title, icon_path) def setupUi(self): self.setObjectName(u'MediaTab') SettingsTab.setupUi(self) - self.mediaPlayerGroupBox = QtGui.QGroupBox(self.leftColumn) - self.mediaPlayerGroupBox.setObjectName(u'mediaPlayerGroupBox') - self.mediaPlayerLayout = QtGui.QVBoxLayout(self.mediaPlayerGroupBox) - self.mediaPlayerLayout.setObjectName(u'mediaPlayerLayout') - self.playerCheckBoxes = {} - for key, player in self.mediaPlayers.iteritems(): - player = self.mediaPlayers[key] - checkbox = MediaQCheckBox(self.mediaPlayerGroupBox) - checkbox.setEnabled(player.available) - checkbox.setObjectName(player.name + u'CheckBox') - self.playerCheckBoxes[player.name] = checkbox - self.mediaPlayerLayout.addWidget(checkbox) - self.leftLayout.addWidget(self.mediaPlayerGroupBox) - self.playerOrderGroupBox = QtGui.QGroupBox(self.leftColumn) - self.playerOrderGroupBox.setObjectName(u'playerOrderGroupBox') - self.playerOrderLayout = QtGui.QHBoxLayout(self.playerOrderGroupBox) - self.playerOrderLayout.setObjectName(u'playerOrderLayout') - self.playerOrderlistWidget = QtGui.QListWidget( \ - self.playerOrderGroupBox) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.playerOrderlistWidget. \ - sizePolicy().hasHeightForWidth()) - self.playerOrderlistWidget.setSizePolicy(sizePolicy) - self.playerOrderlistWidget.setVerticalScrollBarPolicy( \ - QtCore.Qt.ScrollBarAsNeeded) - self.playerOrderlistWidget.setHorizontalScrollBarPolicy( \ - QtCore.Qt.ScrollBarAlwaysOff) - self.playerOrderlistWidget.setEditTriggers( \ - QtGui.QAbstractItemView.NoEditTriggers) - self.playerOrderlistWidget.setObjectName(u'playerOrderlistWidget') - self.playerOrderLayout.addWidget(self.playerOrderlistWidget) - self.orderingButtonLayout = QtGui.QVBoxLayout() - self.orderingButtonLayout.setObjectName(u'orderingButtonLayout') - self.orderingButtonLayout.addStretch(1) - self.orderingUpButton = create_button(self, u'orderingUpButton', - role=u'up', click=self.onUpButtonClicked) - self.orderingDownButton = create_button(self, u'orderingDownButton', - role=u'down', click=self.onDownButtonClicked) - self.orderingButtonLayout.addWidget(self.orderingUpButton) - self.orderingButtonLayout.addWidget(self.orderingDownButton) - self.orderingButtonLayout.addStretch(1) - self.playerOrderLayout.addLayout(self.orderingButtonLayout) - self.leftLayout.addWidget(self.playerOrderGroupBox) self.advancedGroupBox = QtGui.QGroupBox(self.leftColumn) self.advancedGroupBox.setObjectName(u'advancedGroupBox') self.advancedLayout = QtGui.QVBoxLayout(self.advancedGroupBox) @@ -105,110 +58,42 @@ class MediaTab(SettingsTab): self.overridePlayerCheckBox = QtGui.QCheckBox(self.advancedGroupBox) self.overridePlayerCheckBox.setObjectName(u'overridePlayerCheckBox') self.advancedLayout.addWidget(self.overridePlayerCheckBox) + self.autoStartCheckBox = QtGui.QCheckBox(self.advancedGroupBox) + self.autoStartCheckBox.setObjectName(u'autoStartCheckBox') + self.advancedLayout.addWidget(self.autoStartCheckBox) self.leftLayout.addWidget(self.advancedGroupBox) self.leftLayout.addStretch() self.rightLayout.addStretch() - for key in self.mediaPlayers: - player = self.mediaPlayers[key] - checkbox = self.playerCheckBoxes[player.name] - QtCore.QObject.connect(checkbox, - QtCore.SIGNAL(u'stateChanged(int)'), - self.onPlayerCheckBoxChanged) def retranslateUi(self): - self.mediaPlayerGroupBox.setTitle( - translate('MediaPlugin.MediaTab', 'Available Media Players')) - for key in self.mediaPlayers: - player = self.mediaPlayers[key] - checkbox = self.playerCheckBoxes[player.name] - checkbox.setPlayerName(player.name) - if player.available: - checkbox.setText(player.display_name) - else: - checkbox.setText( - unicode(translate('MediaPlugin.MediaTab', - '%s (unavailable)')) % player.display_name) - self.playerOrderGroupBox.setTitle( - translate('MediaPlugin.MediaTab', 'Player Order')) self.advancedGroupBox.setTitle(UiStrings().Advanced) self.overridePlayerCheckBox.setText( translate('MediaPlugin.MediaTab', 'Allow media player to be overridden')) - - def onPlayerCheckBoxChanged(self, check_state): - player = self.sender().playerName - if check_state == QtCore.Qt.Checked: - if player not in self.usedPlayers: - self.usedPlayers.append(player) - else: - if player in self.usedPlayers: - self.usedPlayers.remove(player) - self.updatePlayerList() - - def updatePlayerList(self): - self.playerOrderlistWidget.clear() - for player in self.usedPlayers: - if player in self.playerCheckBoxes.keys(): - if len(self.usedPlayers) == 1: - # At least one media player has to stay active - self.playerCheckBoxes[u'%s' % player].setEnabled(False) - else: - self.playerCheckBoxes[u'%s' % player].setEnabled(True) - self.playerOrderlistWidget.addItem( - self.mediaPlayers[unicode(player)].original_name) - - def onUpButtonClicked(self): - row = self.playerOrderlistWidget.currentRow() - if row <= 0: - return - item = self.playerOrderlistWidget.takeItem(row) - self.playerOrderlistWidget.insertItem(row - 1, item) - self.playerOrderlistWidget.setCurrentRow(row - 1) - self.usedPlayers.insert(row - 1, self.usedPlayers.pop(row)) - - def onDownButtonClicked(self): - row = self.playerOrderlistWidget.currentRow() - if row == -1 or row > self.playerOrderlistWidget.count() - 1: - return - item = self.playerOrderlistWidget.takeItem(row) - self.playerOrderlistWidget.insertItem(row + 1, item) - self.playerOrderlistWidget.setCurrentRow(row + 1) - self.usedPlayers.insert(row + 1, self.usedPlayers.pop(row)) + self.autoStartCheckBox.setText( + translate('MediaPlugin.MediaTab', + 'Start Live items automatically')) def load(self): - if self.savedUsedPlayers: - self.usedPlayers = self.savedUsedPlayers - self.usedPlayers = get_media_players()[0] - self.savedUsedPlayers = self.usedPlayers - for key in self.mediaPlayers: - player = self.mediaPlayers[key] - checkbox = self.playerCheckBoxes[player.name] - if player.available and player.name in self.usedPlayers: - checkbox.setChecked(True) - else: - checkbox.setChecked(False) - self.updatePlayerList() self.overridePlayerCheckBox.setChecked(Settings().value( self.settingsSection + u'/override player', QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0]) + self.autoStartCheckBox.setChecked(Settings().value( + self.settingsSection + u'/media auto start', + QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0]) def save(self): override_changed = False - player_string_changed = False - old_players, override_player = get_media_players() - if self.usedPlayers != old_players: - # clean old Media stuff - set_media_players(self.usedPlayers, override_player) - player_string_changed = True - override_changed = True setting_key = self.settingsSection + u'/override player' if Settings().value(setting_key).toInt()[0] != \ self.overridePlayerCheckBox.checkState(): Settings().setValue(setting_key, QtCore.QVariant(self.overridePlayerCheckBox.checkState())) override_changed = True + setting_key = self.settingsSection + u'/media auto start' + if Settings().value(setting_key).toInt()[0] !=\ + self.autoStartCheckBox.checkState(): + Settings().setValue(setting_key, + QtCore.QVariant(self.autoStartCheckBox.checkState())) if override_changed: - Receiver.send_message(u'mediaitem_media_rebuild') - if player_string_changed: - Receiver.send_message(u'mediaitem_media_rebuild') - Receiver.send_message(u'config_screen_changed') + Receiver.send_message(u'mediaitem_media_rebuild') \ No newline at end of file diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index b4dc96742..5d50a8f4b 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -62,7 +62,7 @@ class MediaPlugin(Plugin): """ visible_name = self.getString(StringContent.VisibleName) self.settingsTab = MediaTab(parent, self.name, visible_name[u'title'], - self.mediaController.mediaPlayers, self.iconPath) + self.iconPath) def about(self): about_text = translate('MediaPlugin', 'Media Plugin' diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index cb8f7b7b8..6eb8d56fc 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -278,7 +278,7 @@ class MessageListener(object): item = message[0] log.debug(u'Startup called with message %s' % message) hide_mode = message[2] - file = os.path.join(item.get_frame_path(), item.get_frame_title()) + file = item.get_filename() self.handler = item.title if self.handler == self.mediaitem.Automatic: self.handler = self.mediaitem.findControllerByType(file) From 1df6934bdacdc0f712667957a0f23f4e1f7ed8d2 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 9 Sep 2012 07:54:09 +0100 Subject: [PATCH 03/58] Refactor video length --- openlp/core/ui/media/mediacontroller.py | 31 +++++++++++++ openlp/plugins/media/lib/mediaitem.py | 59 +++++++++++++------------ 2 files changed, 61 insertions(+), 29 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 90775848c..5f0597991 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -356,6 +356,37 @@ class MediaController(object): log.debug(u'use %s controller' % self.curDisplayMediaPlayer[display]) return True + def media_length(self, controller, service_item): + """ + Loads and starts a video to run with the option of sound + """ + print controller + log.debug(u'media_length') + # stop running videos + self.video_reset(controller) + controller.media_info = MediaInfo() + controller.media_info.volume = controller.volumeSlider.value() + controller.media_info.file_info = QtCore.QFileInfo(service_item + .get_filename()) + display = controller.previewDisplay + if not self.check_file_type(controller, display): + # Media could not be loaded correctly + critical_error_message_box( + translate('MediaPlugin.MediaItem', 'Unsupported File'), + unicode(translate('MediaPlugin.MediaItem', + 'Unsupported File'))) + return False + # set a black background by default no theme is needed. + if not self.video_play([controller]): + critical_error_message_box( + translate('MediaPlugin.MediaItem', 'Unsupported File'), + unicode(translate('MediaPlugin.MediaItem', + 'Unsupported File'))) + return False + self.video_stop([controller]) + log.debug(u'use %s controller' % self.curDisplayMediaPlayer[display]) + return True + def check_file_type(self, controller, display): """ Select the correct media Player type from the prioritized Player list diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index fe66b90d8..8af923738 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -35,6 +35,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, build_icon, ItemCapabilities, \ SettingsManager, translate, check_item_selected, Receiver, MediaType, \ ServiceItem, build_html +from openlp.core.lib.settings import Settings from openlp.core.lib.ui import UiStrings, critical_error_message_box, \ create_horizontal_adjusting_combo_box from openlp.core.ui import Controller, Display @@ -63,11 +64,11 @@ class MediaMediaItem(MediaManagerItem): self.mediaObject = None self.mediaController = Controller(parent) self.mediaController.controllerLayout = QtGui.QVBoxLayout() - self.plugin.mediaController.add_controller_items(self.mediaController, \ + self.plugin.mediaController.add_controller_items(self.mediaController, self.mediaController.controllerLayout) - self.plugin.mediaController.set_controls_visible(self.mediaController, \ + self.plugin.mediaController.set_controls_visible(self.mediaController, False) - self.mediaController.previewDisplay = Display(self.mediaController, \ + self.mediaController.previewDisplay = Display(self.mediaController, False, self.mediaController) self.mediaController.previewDisplay.setGeometry( QtCore.QRect(0, 0, 300, 300)) @@ -75,11 +76,11 @@ class MediaMediaItem(MediaManagerItem): {u'size':self.mediaController.previewDisplay.geometry()} self.mediaController.previewDisplay.setup() serviceItem = ServiceItem() - self.mediaController.previewDisplay.webView.setHtml(build_html( \ - serviceItem, self.mediaController.previewDisplay.screen, None, \ + self.mediaController.previewDisplay.webView.setHtml(build_html( + serviceItem, self.mediaController.previewDisplay.screen, None, False, None)) self.mediaController.previewDisplay.setup() - self.plugin.mediaController.setup_display( \ + self.plugin.mediaController.setup_display( self.mediaController.previewDisplay) self.mediaController.previewDisplay.hide() @@ -154,7 +155,7 @@ class MediaMediaItem(MediaManagerItem): """ Called to reset the Live background with the media selected, """ - self.plugin.liveController.mediaController.video_reset( \ + self.plugin.liveController.mediaController.video_reset( self.plugin.liveController) self.resetAction.setVisible(False) @@ -174,7 +175,7 @@ class MediaMediaItem(MediaManagerItem): item = self.listView.currentItem() filename = unicode(item.data(QtCore.Qt.UserRole).toString()) if os.path.exists(filename): - if self.plugin.liveController.mediaController.video( \ + if self.plugin.liveController.mediaController.video( self.plugin.liveController, filename, True, True): self.resetAction.setVisible(True) else: @@ -188,7 +189,7 @@ class MediaMediaItem(MediaManagerItem): 'the media file "%s" no longer exists.')) % filename) def generateSlideData(self, service_item, item=None, xmlVersion=False, - remote=False): + remote=False): if item is None: item = self.listView.currentItem() if item is None: @@ -199,28 +200,28 @@ class MediaMediaItem(MediaManagerItem): # File is no longer present critical_error_message_box( translate('MediaPlugin.MediaItem', 'Missing Media File'), - unicode(translate('MediaPlugin.MediaItem', - 'The file %s no longer exists.')) % filename) + unicode(translate('MediaPlugin.MediaItem', + 'The file %s no longer exists.')) % filename) return False self.mediaLength = 0 - if self.plugin.mediaController.video( \ - self.mediaController, filename, False, False): - self.mediaLength = self.mediaController.media_info.length - service_item.media_length = self.mediaLength - self.plugin.mediaController.video_reset(self.mediaController) - if self.mediaLength > 0: - service_item.add_capability( - ItemCapabilities.HasVariableStartTime) - else: - return False - service_item.media_length = self.mediaLength - service_item.title = unicode(self.plugin.nameStrings[u'singular']) - service_item.add_capability(ItemCapabilities.RequiresMedia) - # force a non-existent theme - service_item.theme = -1 - frame = u':/media/image_clapperboard.png' + service_item.title = unicode(self.displayTypeComboBox.currentText()) + service_item.shortname = service_item.title (path, name) = os.path.split(filename) - service_item.add_from_command(path, name, frame) + service_item.add_from_command(path, name, + u':/media/image_clapperboard.png') + # Start media and obtain the length + if not self.plugin.mediaController.media_length( + self.mediaController, service_item): + return False + service_item.add_capability(ItemCapabilities.CanAutoStartForLive) + service_item.add_capability(ItemCapabilities.RequiresMedia) + + if Settings().value(self.settingsSection + u'/media auto start', + QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0]\ + == QtCore.Qt.Checked: + service_item.will_auto_start = True + # force a non-existent theme + service_item.theme = -1 return True def initialise(self): @@ -241,7 +242,7 @@ class MediaMediaItem(MediaManagerItem): u' '.join(self.plugin.audio_extensions_list), UiStrings().AllFiles) def displaySetup(self): - self.plugin.mediaController.setup_display( \ + self.plugin.mediaController.setup_display( self.mediaController.previewDisplay) def populateDisplayTypes(self): From a3b2fcd113a33cb83cc2f2e326ee37a2d468f8c3 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 14 Sep 2012 17:35:07 +0100 Subject: [PATCH 04/58] Video lenght 2 --- openlp/core/lib/mediamanageritem.py | 1 + openlp/core/ui/media/__init__.py | 24 +++---- openlp/core/ui/media/mediacontroller.py | 31 ++++++--- openlp/core/ui/servicemanager.py | 92 +++++++++++++++++++++++-- openlp/core/ui/slidecontroller.py | 7 +- openlp/plugins/media/lib/mediaitem.py | 5 +- resources/openlp.xml | 5 ++ 7 files changed, 128 insertions(+), 37 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index ce0797240..40c11ddb7 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -334,6 +334,7 @@ class MediaManagerItem(QtGui.QWidget): """ Add a file to the list widget to make it available for showing """ + print self.onNewFileMasks files = QtGui.QFileDialog.getOpenFileNames( self, self.onNewPrompt, SettingsManager.get_last_dir(self.settingsSection), diff --git a/openlp/core/ui/media/__init__.py b/openlp/core/ui/media/__init__.py index f37d71288..1799b2983 100644 --- a/openlp/core/ui/media/__init__.py +++ b/openlp/core/ui/media/__init__.py @@ -71,30 +71,26 @@ class MediaInfo(object): def get_media_players(): """ - This method extract the configured media players and overridden player from - the settings. - - ``players_list`` - A list with all active media players. - - ``overridden_player`` - Here an special media player is chosen for all media actions. + This method extracts the configured media players and overridden player + from the settings. """ log.debug(u'get_media_players') - players = unicode(Settings().value(u'media/players').toString()) - if not players: - players = u'webkit' + saved_players = unicode(Settings().value(u'media/players').toString()) + if not saved_players: + # we must always have a player and Webkit is the core one. + saved_players = u'webkit' reg_ex = QtCore.QRegExp(".*\[(.*)\].*") if Settings().value(u'media/override player', QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0] == QtCore.Qt.Checked: - if reg_ex.exactMatch(players): + if reg_ex.exactMatch(saved_players): overridden_player = u'%s' % reg_ex.cap(1) else: overridden_player = u'auto' else: overridden_player = u'' - players_list = players.replace(u'[', u'').replace(u']', u'').split(u',') - return players_list, overridden_player + saved_players_list = saved_players.replace(u'[', u'').\ + replace(u']',u'').split(u',') + return saved_players_list, overridden_player def set_media_players(players_list, overridden_player=u'auto'): diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 5f0597991..8af81b060 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -47,6 +47,8 @@ class MediaController(object): """ def __init__(self, parent): + print "Media Controller " + print parent self.parent = parent self.mediaPlayers = {} self.controller = [] @@ -106,7 +108,7 @@ class MediaController(object): u'core', u'ui', u'media') for filename in os.listdir(controller_dir): if filename.endswith(u'player.py') and not \ - filename == 'media_player.py': + filename == 'mediaplayer.py': path = os.path.join(controller_dir, filename) if os.path.isfile(path): modulename = u'openlp.core.ui.media.' + \ @@ -287,11 +289,13 @@ class MediaController(object): """ player.resize(display) - def video(self, controller, file, muted, isBackground, hidden=False): + def video(self, controller, serviceItem, muted, isBackground, + hidden=False): """ Loads and starts a video to run with the option of sound """ log.debug(u'video') + print "hallo mum" isValid = False # stop running videos self.video_reset(controller) @@ -300,7 +304,7 @@ class MediaController(object): controller.media_info.volume = 0 else: controller.media_info.volume = controller.volumeSlider.value() - controller.media_info.file_info = QtCore.QFileInfo(file) + controller.media_info.file_info = QtCore.QFileInfo(serviceItem.get_filename()) controller.media_info.is_background = isBackground display = None if controller.isLive: @@ -318,7 +322,7 @@ class MediaController(object): else: controller.media_info.start_time = \ display.serviceItem.start_time - controller.media_info.end_time = display.serviceItem.end_time + controller.media_info.end_time = serviceItem.end_time elif controller.previewDisplay: display = controller.previewDisplay isValid = self.check_file_type(controller, display) @@ -338,8 +342,9 @@ class MediaController(object): # Preview requested if not controller.isLive: autoplay = True - # Visible or background requested - elif not hidden or controller.media_info.is_background: + # Visible or background requested or Service Item wants autostart + elif not hidden or controller.media_info.is_background or \ + serviceItem.will_auto_start: autoplay = True # Unblank on load set elif Settings().value(u'general/auto unblank', @@ -356,9 +361,15 @@ class MediaController(object): log.debug(u'use %s controller' % self.curDisplayMediaPlayer[display]) return True - def media_length(self, controller, service_item): + def media_length(self, controller, serviceItem): """ - Loads and starts a video to run with the option of sound + Loads and starts a media item to obtain the media length + + ``msg`` + First element is the controller which should be used + + ``serviceItem`` + The ServiceItem containing the details to be played. """ print controller log.debug(u'media_length') @@ -366,7 +377,7 @@ class MediaController(object): self.video_reset(controller) controller.media_info = MediaInfo() controller.media_info.volume = controller.volumeSlider.value() - controller.media_info.file_info = QtCore.QFileInfo(service_item + controller.media_info.file_info = QtCore.QFileInfo(serviceItem .get_filename()) display = controller.previewDisplay if not self.check_file_type(controller, display): @@ -376,13 +387,13 @@ class MediaController(object): unicode(translate('MediaPlugin.MediaItem', 'Unsupported File'))) return False - # set a black background by default no theme is needed. if not self.video_play([controller]): critical_error_message_box( translate('MediaPlugin.MediaItem', 'Unsupported File'), unicode(translate('MediaPlugin.MediaItem', 'Unsupported File'))) return False + serviceItem.set_media_length(controller.media_info.length) self.video_stop([controller]) log.debug(u'use %s controller' % self.curDisplayMediaPlayer[display]) return True diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index de6132845..00ac3eafb 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -97,8 +97,8 @@ class ServiceManager(QtGui.QWidget): """ Manages the services. This involves taking text strings from plugins and adding them to the service. This service can then be zipped up with all - the resources used into one OSZ file for use on any OpenLP v2 installation. - Also handles the UI tasks of moving things up and down etc. + the resources used into one OSZ or oszl file for use on any OpenLP v2 + installation. Also handles the UI tasks of moving things up and down etc. """ def __init__(self, mainwindow, parent=None): """ @@ -425,7 +425,7 @@ class ServiceManager(QtGui.QWidget): SettingsManager.get_last_dir( self.mainwindow.serviceManagerSettingsSection), translate('OpenLP.ServiceManager', - 'OpenLP Service Files (*.osz)'))) + 'OpenLP Service Files (*.osz *.ozl)'))) if not fileName: return False else: @@ -594,6 +594,75 @@ class ServiceManager(QtGui.QWidget): delete_file(temp_file_name) return success + def saveLocalFile(self): + """ + Save the current service file. + + A temporary file is created so that we don't overwrite the existing one + and leave a mangled service file should there be an error when saving. + Audio files are also copied into the service manager directory, and + then packaged into the zip file. + """ + if not self.fileName(): + return self.saveFileAs() + temp_file, temp_file_name = mkstemp(u'.oszl', u'openlp_') + # We don't need the file handle. + os.close(temp_file) + log.debug(temp_file_name) + path_file_name = unicode(self.fileName()) + path, file_name = os.path.split(path_file_name) + basename = os.path.splitext(file_name)[0] + service_file_name = '%s.osd' % basename + log.debug(u'ServiceManager.saveFile - %s', path_file_name) + SettingsManager.set_last_dir( + self.mainwindow.serviceManagerSettingsSection, + path) + service = [] + total_size = 0 + Receiver.send_message(u'cursor_busy') + # Number of items + 1 to zip it + self.mainwindow.displayProgressBar(len(self.serviceItems) + 1) + for item in self.serviceItems: + self.mainwindow.incrementProgressBar() + service_item = item[u'service_item'].get_service_repr() + service.append({u'serviceitem': service_item}) + service_content = cPickle.dumps(service) + # Usual Zip file cannot exceed 2GiB, file with Zip64 cannot be + # extracted using unzip in UNIX. + allow_zip_64 = (total_size > 2147483648 + len(service_content)) + log.debug(u'ServiceManager.saveFile - allowZip64 is %s' % allow_zip_64) + zip = None + success = True + self.mainwindow.incrementProgressBar() + try: + zip = zipfile.ZipFile(temp_file_name, 'w', zipfile.ZIP_STORED, + allow_zip_64) + # First we add service contents. + zip.writestr(service_file_name.encode(u'utf-8'), service_content) + except IOError: + log.exception(u'Failed to save service to disk: %s', temp_file_name) + Receiver.send_message(u'openlp_error_message', { + u'title': translate(u'OpenLP.ServiceManager', + u'Error Saving File'), + u'message': translate(u'OpenLP.ServiceManager', + u'There was an error saving your file.') + }) + success = False + finally: + if zip: + zip.close() + self.mainwindow.finishedProgressBar() + Receiver.send_message(u'cursor_normal') + if success: + try: + shutil.copy(temp_file_name, path_file_name) + except: + return self.saveFileAs() + self.mainwindow.addRecentFile(path_file_name) + self.setModified(False) + delete_file(temp_file_name) + return success + def saveFileAs(self): """ Get a file name and then call :func:`ServiceManager.saveFile` to @@ -632,7 +701,9 @@ class ServiceManager(QtGui.QWidget): path = os.path.join(directory, default_filename) fileName = unicode(QtGui.QFileDialog.getSaveFileName(self.mainwindow, UiStrings().SaveService, path, - translate('OpenLP.ServiceManager', 'OpenLP Service Files (*.osz)'))) + translate('OpenLP.ServiceManager', + 'OpenLP Service Files (*.osz);;' + 'OpenLP Service Files - light (*.oszl)'))) if not fileName: return False if os.path.splitext(fileName)[1] == u'': @@ -641,7 +712,10 @@ class ServiceManager(QtGui.QWidget): ext = os.path.splitext(fileName)[1] fileName.replace(ext, u'.osz') self.setFileName(fileName) - return self.saveFile() + if suffix == u'.oszl': + return self.saveLocalFile() + else: + return self.saveFile() def loadFile(self, fileName): if not fileName: @@ -774,10 +848,10 @@ class ServiceManager(QtGui.QWidget): .is_capable(ItemCapabilities.CanAutoStartForLive): self.autoStartAction.setVisible(True) self.autoStartAction.setText(translate('OpenLP.ServiceManager', - '&Auto Start - Disabled')) + '&Auto Start - inactive')) if serviceItem[u'service_item'].will_auto_start: self.autoStartAction.setText(translate('OpenLP.ServiceManager', - '&Auto Start - Enabled')) + '&Auto Start - active')) self.themeMenu.menuAction().setVisible(False) # Set up the theme menu. if serviceItem[u'service_item'].is_text() and \ @@ -819,6 +893,7 @@ class ServiceManager(QtGui.QWidget): item = self.findServiceItem()[0] self.serviceItems[item][u'service_item'].will_auto_start = \ not self.serviceItems[item][u'service_item'].will_auto_start + a=1 def onServiceItemEditForm(self): @@ -1395,6 +1470,9 @@ class ServiceManager(QtGui.QWidget): filename = unicode(url.toLocalFile()) if filename.endswith(u'.osz'): self.onLoadServiceClicked(filename) + elif filename.endswith(u'.oszl'): + # todo correct + self.onLoadServiceClicked(filename) elif link.hasText(): plugin = unicode(link.text()) item = self.serviceManagerList.itemAt(event.pos()) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 2d108e72c..aee409ed9 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -54,13 +54,15 @@ class SlideList(QtGui.QTableWidget): class Controller(QtGui.QWidget): """ - Controller is a general controller widget. + Controller is a general display controller widget. """ def __init__(self, parent, isLive=False): """ Set up the general Controller. """ QtGui.QWidget.__init__(self, parent) + print "Controller" + print parent self.isLive = isLive self.display = None @@ -1346,8 +1348,7 @@ class SlideController(Controller): Respond to the arrival of a media service item """ log.debug(u'SlideController onMediaStart') - file = os.path.join(item.get_frame_path(), item.get_frame_title()) - self.mediaController.video(self, file, False, False, self.hideMode()) + self.mediaController.video(self, item, False, False, self.hideMode()) if not self.isLive or self.mediaController.withLivePreview: self.previewDisplay.show() self.slidePreview.hide() diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 8af923738..0f5308104 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -169,6 +169,7 @@ class MediaMediaItem(MediaManagerItem): """ Called to replace Live background with the media selected. """ + # Todo fix me up if check_item_selected(self.listView, translate('MediaPlugin.MediaItem', 'You must select a media file to replace the background with.')): @@ -203,7 +204,6 @@ class MediaMediaItem(MediaManagerItem): unicode(translate('MediaPlugin.MediaItem', 'The file %s no longer exists.')) % filename) return False - self.mediaLength = 0 service_item.title = unicode(self.displayTypeComboBox.currentText()) service_item.shortname = service_item.title (path, name) = os.path.split(filename) @@ -215,10 +215,9 @@ class MediaMediaItem(MediaManagerItem): return False service_item.add_capability(ItemCapabilities.CanAutoStartForLive) service_item.add_capability(ItemCapabilities.RequiresMedia) - if Settings().value(self.settingsSection + u'/media auto start', QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0]\ - == QtCore.Qt.Checked: + == QtCore.Qt.Checked: service_item.will_auto_start = True # force a non-existent theme service_item.theme = -1 diff --git a/resources/openlp.xml b/resources/openlp.xml index 215fa2b6e..e8f31dc0d 100644 --- a/resources/openlp.xml +++ b/resources/openlp.xml @@ -17,6 +17,11 @@ Notes: OpenLP Service File + + + + OpenLP Service File + From 795d11849dab557bdabf65b4cba78771ecbdc8b8 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 15 Sep 2012 06:57:03 +0100 Subject: [PATCH 05/58] Local save works --- openlp/core/ui/servicemanager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 00ac3eafb..56bb979f5 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -425,7 +425,7 @@ class ServiceManager(QtGui.QWidget): SettingsManager.get_last_dir( self.mainwindow.serviceManagerSettingsSection), translate('OpenLP.ServiceManager', - 'OpenLP Service Files (*.osz *.ozl)'))) + 'OpenLP Service Files (*.osz *.oszl)'))) if not fileName: return False else: @@ -712,7 +712,7 @@ class ServiceManager(QtGui.QWidget): ext = os.path.splitext(fileName)[1] fileName.replace(ext, u'.osz') self.setFileName(fileName) - if suffix == u'.oszl': + if fileName.endswith(u'.oszl'): return self.saveLocalFile() else: return self.saveFile() From c8f54a44aec68426bcb30fe398fab0af1c888c7e Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 15 Sep 2012 15:27:09 +0100 Subject: [PATCH 06/58] Titles --- openlp/core/ui/media/playertab.py | 193 ++++++++++++++++++++++++++ openlp/core/ui/servicemanager.py | 4 +- openlp/plugins/media/lib/mediaitem.py | 1 + 3 files changed, 196 insertions(+), 2 deletions(-) create mode 100644 openlp/core/ui/media/playertab.py diff --git a/openlp/core/ui/media/playertab.py b/openlp/core/ui/media/playertab.py new file mode 100644 index 000000000..fce38b2da --- /dev/null +++ b/openlp/core/ui/media/playertab.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2012 Raoul Snyman # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, Frode Woldsund # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +from PyQt4 import QtCore, QtGui + +from openlp.core.lib import SettingsTab, translate, Receiver +from openlp.core.lib.ui import UiStrings, create_button +from openlp.core.lib.settings import Settings +from openlp.core.ui.media import get_media_players, set_media_players +class MediaQCheckBox(QtGui.QCheckBox): + """ + MediaQCheckBox adds an extra property, playerName to the QCheckBox class. + """ + def setPlayerName(self, name): + self.playerName = name + + +class PlayerTab(SettingsTab): + """ + MediaTab is the Media settings tab in the settings dialog. + """ + def __init__(self, parent, mediaPlayers): + self.mediaPlayers = mediaPlayers + self.savedUsedPlayers = None + self.iconPath = u':/system/system_settings.png' + player_translated = translate('OpenLP.PlayerTab', 'Players') + SettingsTab.__init__(self, parent, u'Players', player_translated) + + + def setupUi(self): + self.setObjectName(u'MediaTab') + SettingsTab.setupUi(self) + self.mediaPlayerGroupBox = QtGui.QGroupBox(self.leftColumn) + self.mediaPlayerGroupBox.setObjectName(u'mediaPlayerGroupBox') + self.mediaPlayerLayout = QtGui.QVBoxLayout(self.mediaPlayerGroupBox) + self.mediaPlayerLayout.setObjectName(u'mediaPlayerLayout') + self.playerCheckBoxes = {} + for key, player in self.mediaPlayers.iteritems(): + player = self.mediaPlayers[key] + checkbox = MediaQCheckBox(self.mediaPlayerGroupBox) + checkbox.setEnabled(player.available) + checkbox.setObjectName(player.name + u'CheckBox') + self.playerCheckBoxes[player.name] = checkbox + self.mediaPlayerLayout.addWidget(checkbox) + self.leftLayout.addWidget(self.mediaPlayerGroupBox) + self.playerOrderGroupBox = QtGui.QGroupBox(self.leftColumn) + self.playerOrderGroupBox.setObjectName(u'playerOrderGroupBox') + self.playerOrderLayout = QtGui.QHBoxLayout(self.playerOrderGroupBox) + self.playerOrderLayout.setObjectName(u'playerOrderLayout') + self.playerOrderlistWidget = QtGui.QListWidget( + self.playerOrderGroupBox) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, + QtGui.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.playerOrderlistWidget.\ + sizePolicy().hasHeightForWidth()) + self.playerOrderlistWidget.setSizePolicy(sizePolicy) + self.playerOrderlistWidget.setVerticalScrollBarPolicy( + QtCore.Qt.ScrollBarAsNeeded) + self.playerOrderlistWidget.setHorizontalScrollBarPolicy( + QtCore.Qt.ScrollBarAlwaysOff) + self.playerOrderlistWidget.setEditTriggers( + QtGui.QAbstractItemView.NoEditTriggers) + self.playerOrderlistWidget.setObjectName(u'playerOrderlistWidget') + self.playerOrderLayout.addWidget(self.playerOrderlistWidget) + self.orderingButtonLayout = QtGui.QVBoxLayout() + self.orderingButtonLayout.setObjectName(u'orderingButtonLayout') + self.orderingButtonLayout.addStretch(1) + self.orderingUpButton = create_button(self, u'orderingUpButton', + role=u'up', click=self.onUpButtonClicked) + self.orderingDownButton = create_button(self, u'orderingDownButton', + role=u'down', click=self.onDownButtonClicked) + self.orderingButtonLayout.addWidget(self.orderingUpButton) + self.orderingButtonLayout.addWidget(self.orderingDownButton) + self.orderingButtonLayout.addStretch(1) + self.playerOrderLayout.addLayout(self.orderingButtonLayout) + self.leftLayout.addWidget(self.playerOrderGroupBox) + self.leftLayout.addStretch() + self.rightLayout.addStretch() + for key in self.mediaPlayers: + player = self.mediaPlayers[key] + checkbox = self.playerCheckBoxes[player.name] + QtCore.QObject.connect(checkbox, + QtCore.SIGNAL(u'stateChanged(int)'), + self.onPlayerCheckBoxChanged) + + def retranslateUi(self): + self.mediaPlayerGroupBox.setTitle( + translate('OpenLP.PlayerTab', 'Available Media Players')) + for key in self.mediaPlayers: + player = self.mediaPlayers[key] + checkbox = self.playerCheckBoxes[player.name] + checkbox.setPlayerName(player.name) + if player.available: + checkbox.setText(player.display_name) + else: + checkbox.setText( + unicode(translate('OpenLP.PlayerTab', + '%s (unavailable)')) % player.display_name) + self.playerOrderGroupBox.setTitle( + translate('OpenLP.PlayerTab', 'Player Search Order')) + + def onPlayerCheckBoxChanged(self, check_state): + player = self.sender().playerName + if check_state == QtCore.Qt.Checked: + if player not in self.usedPlayers: + self.usedPlayers.append(player) + else: + if player in self.usedPlayers: + self.usedPlayers.remove(player) + self.updatePlayerList() + + def updatePlayerList(self): + self.playerOrderlistWidget.clear() + for player in self.usedPlayers: + if player in self.playerCheckBoxes.keys(): + if len(self.usedPlayers) == 1: + # At least one media player has to stay active + self.playerCheckBoxes[u'%s' % player].setEnabled(False) + else: + self.playerCheckBoxes[u'%s' % player].setEnabled(True) + self.playerOrderlistWidget.addItem( + self.mediaPlayers[unicode(player)].original_name) + + def onUpButtonClicked(self): + row = self.playerOrderlistWidget.currentRow() + if row <= 0: + return + item = self.playerOrderlistWidget.takeItem(row) + self.playerOrderlistWidget.insertItem(row - 1, item) + self.playerOrderlistWidget.setCurrentRow(row - 1) + self.usedPlayers.insert(row - 1, self.usedPlayers.pop(row)) + + def onDownButtonClicked(self): + row = self.playerOrderlistWidget.currentRow() + if row == -1 or row > self.playerOrderlistWidget.count() - 1: + return + item = self.playerOrderlistWidget.takeItem(row) + self.playerOrderlistWidget.insertItem(row + 1, item) + self.playerOrderlistWidget.setCurrentRow(row + 1) + self.usedPlayers.insert(row + 1, self.usedPlayers.pop(row)) + + def load(self): + if self.savedUsedPlayers: + self.usedPlayers = self.savedUsedPlayers + self.usedPlayers = get_media_players()[0] + self.savedUsedPlayers = self.usedPlayers + for key in self.mediaPlayers: + player = self.mediaPlayers[key] + checkbox = self.playerCheckBoxes[player.name] + if player.available and player.name in self.usedPlayers: + checkbox.setChecked(True) + else: + checkbox.setChecked(False) + self.updatePlayerList() + + def save(self): + player_string_changed = False + old_players, override_player = get_media_players() + if self.usedPlayers != old_players: + # clean old Media stuff + set_media_players(self.usedPlayers, override_player) + player_string_changed = True + if player_string_changed: + Receiver.send_message(u'mediaitem_media_rebuild') + Receiver.send_message(u'config_screen_changed') + diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 56bb979f5..05d1344bf 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -600,8 +600,8 @@ class ServiceManager(QtGui.QWidget): A temporary file is created so that we don't overwrite the existing one and leave a mangled service file should there be an error when saving. - Audio files are also copied into the service manager directory, and - then packaged into the zip file. + No files are added to this version of the service as it is deisgned + to only work on the machine it was save on if there are files. """ if not self.fileName(): return self.saveFileAs() diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 0f5308104..604bf5952 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -215,6 +215,7 @@ class MediaMediaItem(MediaManagerItem): return False service_item.add_capability(ItemCapabilities.CanAutoStartForLive) service_item.add_capability(ItemCapabilities.RequiresMedia) + service_item.add_capability(ItemCapabilities.HasDetailedTitleDisplay) if Settings().value(self.settingsSection + u'/media auto start', QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0]\ == QtCore.Qt.Checked: From a3e41b1ee7f89052e0edf2b7dac78861d6cc560d Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 29 Sep 2012 17:27:55 +0100 Subject: [PATCH 07/58] Fix video injection and have black backgrounds --- openlp/core/ui/media/webkitplayer.py | 2 ++ openlp/plugins/media/lib/mediaitem.py | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/openlp/core/ui/media/webkitplayer.py b/openlp/core/ui/media/webkitplayer.py index aad9710c0..e3ac5012e 100644 --- a/openlp/core/ui/media/webkitplayer.py +++ b/openlp/core/ui/media/webkitplayer.py @@ -39,9 +39,11 @@ VIDEO_CSS = u""" background-color: black; } #video1 { + background-color: black; z-index:4; } #video2 { + background-color: black; z-index:4; } """ diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 604bf5952..507663e12 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -176,8 +176,14 @@ class MediaMediaItem(MediaManagerItem): item = self.listView.currentItem() filename = unicode(item.data(QtCore.Qt.UserRole).toString()) if os.path.exists(filename): + service_item = ServiceItem() + service_item.title = unicode(self.displayTypeComboBox.currentText()) + service_item.shortname = service_item.title + (path, name) = os.path.split(filename) + service_item.add_from_command(path, name, + u':/media/image_clapperboard.png') if self.plugin.liveController.mediaController.video( - self.plugin.liveController, filename, True, True): + self.plugin.liveController, service_item, True, True): self.resetAction.setVisible(True) else: critical_error_message_box(UiStrings().LiveBGError, From ee126c9924216b792c47bd211b8d9665d897b9d9 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 29 Sep 2012 19:36:30 +0100 Subject: [PATCH 08/58] Change background color of video --- openlp/core/ui/media/mediacontroller.py | 1 - openlp/core/ui/media/playertab.py | 55 +++++++++++++++++++++++++ openlp/core/ui/media/webkitplayer.py | 14 +++++-- 3 files changed, 65 insertions(+), 5 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 8af81b060..4677b1396 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -295,7 +295,6 @@ class MediaController(object): Loads and starts a video to run with the option of sound """ log.debug(u'video') - print "hallo mum" isValid = False # stop running videos self.video_reset(controller) diff --git a/openlp/core/ui/media/playertab.py b/openlp/core/ui/media/playertab.py index fce38b2da..d69624b59 100644 --- a/openlp/core/ui/media/playertab.py +++ b/openlp/core/ui/media/playertab.py @@ -55,6 +55,28 @@ class PlayerTab(SettingsTab): def setupUi(self): self.setObjectName(u'MediaTab') SettingsTab.setupUi(self) + self.bgColorGroupBox = QtGui.QGroupBox(self.leftColumn) + self.bgColorGroupBox.setObjectName(u'FontGroupBox') + self.formLayout = QtGui.QFormLayout(self.bgColorGroupBox) + self.formLayout.setObjectName(u'FormLayout') + self.colorLayout = QtGui.QHBoxLayout() + self.backgroundColorLabel = QtGui.QLabel(self.bgColorGroupBox) + self.backgroundColorLabel.setObjectName(u'BackgroundColorLabel') + self.colorLayout.addWidget(self.backgroundColorLabel) + self.backgroundColorButton = QtGui.QPushButton(self.bgColorGroupBox) + self.backgroundColorButton.setObjectName(u'BackgroundColorButton') + self.colorLayout.addWidget(self.backgroundColorButton) + self.formLayout.addRow(self.colorLayout) + self.informationLabel = QtGui.QLabel(self.bgColorGroupBox) + self.informationLabel.setObjectName(u'InformationLabel') + self.informationLabel.setWordWrap(True) + self.formLayout.addRow(self.informationLabel) + self.leftLayout.addWidget(self.bgColorGroupBox) + self.leftLayout.addStretch() + self.rightColumn.setSizePolicy( + QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) + self.rightLayout.addStretch() + self.mediaPlayerGroupBox = QtGui.QGroupBox(self.leftColumn) self.mediaPlayerGroupBox.setObjectName(u'mediaPlayerGroupBox') self.mediaPlayerLayout = QtGui.QVBoxLayout(self.mediaPlayerGroupBox) @@ -109,6 +131,9 @@ class PlayerTab(SettingsTab): QtCore.QObject.connect(checkbox, QtCore.SIGNAL(u'stateChanged(int)'), self.onPlayerCheckBoxChanged) + # Signals and slots + QtCore.QObject.connect(self.backgroundColorButton, + QtCore.SIGNAL(u'clicked()'), self.onbackgroundColorButtonClicked) def retranslateUi(self): self.mediaPlayerGroupBox.setTitle( @@ -125,6 +150,22 @@ class PlayerTab(SettingsTab): '%s (unavailable)')) % player.display_name) self.playerOrderGroupBox.setTitle( translate('OpenLP.PlayerTab', 'Player Search Order')) + self.bgColorGroupBox.setTitle( + translate('ImagesPlugin.ImageTab', 'Background Color')) + self.backgroundColorLabel.setText( + translate('ImagesPlugin.ImageTab', 'Default Color:')) + self.informationLabel.setText( + translate('ImagesPlugin.ImageTab', 'Visible background for images ' + 'with aspect ratio different to screen.')) + + + def onbackgroundColorButtonClicked(self): + new_color = QtGui.QColorDialog.getColor( + QtGui.QColor(self.bg_color), self) + if new_color.isValid(): + self.bg_color = new_color.name() + self.backgroundColorButton.setStyleSheet( + u'background-color: %s' % self.bg_color) def onPlayerCheckBoxChanged(self, check_state): player = self.sender().playerName @@ -178,10 +219,24 @@ class PlayerTab(SettingsTab): checkbox.setChecked(True) else: checkbox.setChecked(False) + settings = Settings() + settings.beginGroup(self.settingsSection) self.updatePlayerList() + self.bg_color = unicode(settings.value( + u'background color', QtCore.QVariant(u'#000000')).toString()) + self.initial_color = self.bg_color + settings.endGroup() + self.backgroundColorButton.setStyleSheet( + u'background-color: %s' % self.bg_color) def save(self): player_string_changed = False + settings = Settings() + settings.beginGroup(self.settingsSection) + settings.setValue(u'background color', QtCore.QVariant(self.bg_color)) + settings.endGroup() + if self.initial_color != self.bg_color: + Receiver.send_message(u'image_updated') old_players, override_player = get_media_players() if self.usedPlayers != old_players: # clean old Media stuff diff --git a/openlp/core/ui/media/webkitplayer.py b/openlp/core/ui/media/webkitplayer.py index e3ac5012e..d8abb994d 100644 --- a/openlp/core/ui/media/webkitplayer.py +++ b/openlp/core/ui/media/webkitplayer.py @@ -26,24 +26,27 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +from PyQt4 import QtCore, QtGui + import logging from openlp.core.ui.media import MediaState from openlp.core.ui.media.mediaplayer import MediaPlayer +from openlp.core.lib.settings import Settings log = logging.getLogger(__name__) VIDEO_CSS = u""" #videobackboard { z-index:3; - background-color: black; + background-color: %s; } #video1 { - background-color: black; + background-color: %s; z-index:4; } #video2 { - background-color: black; + background-color: %s; z-index:4; } """ @@ -278,7 +281,10 @@ class WebkitPlayer(MediaPlayer): """ Add css style sheets to htmlbuilder """ - return VIDEO_CSS + FLASH_CSS + background = unicode(QtGui.QColor(Settings().value( + u'players/background color', QtCore.QVariant(u'#000000'))).name()) + css = VIDEO_CSS % (background,background,background) + return css + FLASH_CSS def get_media_display_javascript(self): """ From d58efe2282c8cd2efd0267c3eb283597bd3465dc Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 29 Sep 2012 19:58:18 +0100 Subject: [PATCH 09/58] Remove unused varable --- openlp/core/ui/media/mediacontroller.py | 6 +----- openlp/core/ui/slidecontroller.py | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 4677b1396..0a66da681 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -56,7 +56,6 @@ class MediaController(object): # Timer for video state self.timer = QtCore.QTimer() self.timer.setInterval(200) - self.withLivePreview = False self.check_available_media_players() # Signals QtCore.QObject.connect(self.timer, @@ -260,9 +259,6 @@ class MediaController(object): # update player status self.set_active_players() display.hasAudio = True - if not self.withLivePreview and \ - display == self.parent.liveController.previewDisplay: - return if display == self.parent.previewController.previewDisplay or \ display == self.parent.liveController.previewDisplay: display.hasAudio = False @@ -307,7 +303,7 @@ class MediaController(object): controller.media_info.is_background = isBackground display = None if controller.isLive: - if self.withLivePreview and controller.previewDisplay: + if controller.previewDisplay: display = controller.previewDisplay isValid = self.check_file_type(controller, display) display = controller.display diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index aee409ed9..fe407b84f 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -1349,7 +1349,7 @@ class SlideController(Controller): """ log.debug(u'SlideController onMediaStart') self.mediaController.video(self, item, False, False, self.hideMode()) - if not self.isLive or self.mediaController.withLivePreview: + if not self.isLive: self.previewDisplay.show() self.slidePreview.hide() From 45849803aaf197a9c5ff624d445e63e453bbba86 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 4 Oct 2012 18:28:49 +0100 Subject: [PATCH 10/58] Cleanups --- openlp/core/ui/media/mediacontroller.py | 17 ++++++++-------- openlp/core/ui/media/phononplayer.py | 26 +++++++++++++++++++++++++ openlp/core/ui/slidecontroller.py | 2 -- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 0a66da681..501d56c21 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -47,12 +47,11 @@ class MediaController(object): """ def __init__(self, parent): - print "Media Controller " - print parent - self.parent = parent + self.mainWindow = parent self.mediaPlayers = {} self.controller = [] self.curDisplayMediaPlayer = {} + self.currentPlayer = None # Timer for video state self.timer = QtCore.QTimer() self.timer.setInterval(200) @@ -259,8 +258,8 @@ class MediaController(object): # update player status self.set_active_players() display.hasAudio = True - if display == self.parent.previewController.previewDisplay or \ - display == self.parent.liveController.previewDisplay: + if display == self.mainWindow.previewController.previewDisplay or \ + display == self.mainWindow.liveController.previewDisplay: display.hasAudio = False for player in self.mediaPlayers.values(): if player.isActive: @@ -302,6 +301,7 @@ class MediaController(object): controller.media_info.file_info = QtCore.QFileInfo(serviceItem.get_filename()) controller.media_info.is_background = isBackground display = None + #self.curDisplayMediaPlayer[u'current'] = serviceItem.name if controller.isLive: if controller.previewDisplay: display = controller.previewDisplay @@ -366,7 +366,6 @@ class MediaController(object): ``serviceItem`` The ServiceItem containing the details to be played. """ - print controller log.debug(u'media_length') # stop running videos self.video_reset(controller) @@ -539,7 +538,7 @@ class MediaController(object): isLive = msg[1] if not isLive: return - controller = self.parent.liveController + controller = self.mainWindow.liveController for display in self.curDisplayMediaPlayer.keys(): if display.controller != controller or \ self.curDisplayMediaPlayer[display].state != MediaState.Playing: @@ -560,7 +559,7 @@ class MediaController(object): if not isLive: return Receiver.send_message(u'live_display_hide', hide_mode) - controller = self.parent.liveController + controller = self.mainWindow.liveController for display in self.curDisplayMediaPlayer.keys(): if display.controller != controller or \ self.curDisplayMediaPlayer[display].state != MediaState.Playing: @@ -580,7 +579,7 @@ class MediaController(object): isLive = msg[1] if not isLive: return - controller = self.parent.liveController + controller = self.mainWindow.liveController for display in self.curDisplayMediaPlayer.keys(): if display.controller != controller or \ self.curDisplayMediaPlayer[display].state != MediaState.Paused: diff --git a/openlp/core/ui/media/phononplayer.py b/openlp/core/ui/media/phononplayer.py index 48c51d419..1ab68e96a 100644 --- a/openlp/core/ui/media/phononplayer.py +++ b/openlp/core/ui/media/phononplayer.py @@ -30,12 +30,16 @@ import logging import mimetypes from datetime import datetime +from PyQt4 import QtCore, QtGui from PyQt4.phonon import Phonon from openlp.core.lib import Receiver +from openlp.core.lib.settings import Settings + from openlp.core.ui.media import MediaState from openlp.core.ui.media.mediaplayer import MediaPlayer + log = logging.getLogger(__name__) ADDITIONAL_EXT = { @@ -55,6 +59,20 @@ ADDITIONAL_EXT = { u'video/mpeg' : [u'.mp4', u'.mts'], u'video/x-ms-wmv': [u'.wmv']} +VIDEO_CSS = u""" +#videobackboard { + z-index:3; + background-color: %s; +} +#video1 { + background-color: %s; + z-index:4; +} +#video2 { + background-color: %s; + z-index:4; +} +""" class PhononPlayer(MediaPlayer): """ @@ -204,3 +222,11 @@ class PhononPlayer(MediaPlayer): if not controller.seekSlider.isSliderDown(): controller.seekSlider.setSliderPosition( display.mediaObject.currentTime()) + + def get_media_display_css(self): + """ + Add css style sheets to htmlbuilder + """ + background = unicode(QtGui.QColor(Settings().value( + u'players/background color', QtCore.QVariant(u'#000000'))).name()) + return VIDEO_CSS % (background,background,background) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index fe407b84f..1118cf605 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -61,8 +61,6 @@ class Controller(QtGui.QWidget): Set up the general Controller. """ QtGui.QWidget.__init__(self, parent) - print "Controller" - print parent self.isLive = isLive self.display = None From e141ff1c24a214e75287dcf47826c1452210c393 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 4 Oct 2012 21:12:09 +0100 Subject: [PATCH 11/58] Cleanups --- openlp/core/ui/media/mediacontroller.py | 41 ++++++++++++++++--------- openlp/core/ui/slidecontroller.py | 2 +- openlp/plugins/media/lib/mediaitem.py | 4 +-- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 501d56c21..d65316d00 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -88,12 +88,15 @@ class MediaController(object): for player in self.mediaPlayers.keys(): self.mediaPlayers[player].isActive = player in savedPlayers - def register_controllers(self, controller): + def register_players(self, player): """ Register each media Player controller (Webkit, Phonon, etc) and store for later use + + ``player`` + Individual player class which has been enabled """ - self.mediaPlayers[controller.name] = controller + self.mediaPlayers[player.name] = player def check_available_media_players(self): """ @@ -117,10 +120,10 @@ class MediaController(object): except ImportError: log.warn(u'Failed to import %s on path %s', modulename, path) - controller_classes = MediaPlayer.__subclasses__() - for controller_class in controller_classes: - controller = controller_class(self) - self.register_controllers(controller) + player_classes = MediaPlayer.__subclasses__() + for player_class in player_classes: + player = player_class(self) + self.register_players(player) if not self.mediaPlayers: return False savedPlayers, overriddenPlayer = get_media_players() @@ -184,14 +187,28 @@ class MediaController(object): html += player.get_media_display_html() return html - def add_controller_items(self, controller, control_panel): + def register_controller(self, controller, control_panel): + """ + Registers media controls where the players will be placed to run. + + ``controller`` + The controller where a player will be placed + + ``controller_panel`` + The controllers toolbar where the widgets reside + """ self.controller.append(controller) self.setup_generic_controls(controller, control_panel) - self.setup_special_controls(controller, control_panel) def setup_generic_controls(self, controller, control_panel): """ - Add generic media control items (valid for all types of medias) + Set up controls on the control_panel for a given controller + + ``controller`` + First element is the controller which should be used + + ``controller_panel`` + First element is the controller which should be used """ controller.media_info = MediaInfo() # Build a Media ToolBar @@ -241,12 +258,6 @@ class MediaController(object): QtCore.QObject.connect(controller.volumeSlider, QtCore.SIGNAL(u'valueChanged(int)'), controller.sendToPlugins) - def setup_special_controls(self, controller, control_panel): - """ - Special media Toolbars will be created here (e.g. for DVD Playback) - """ - controller.media_info = MediaInfo() - # TODO: add Toolbar for DVD, ... def setup_display(self, display): """ diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 1118cf605..33c0b14e2 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -270,7 +270,7 @@ class SlideController(Controller): 'Edit and reload song preview.'), triggers=self.onEditSong) self.controllerLayout.addWidget(self.toolbar) # Build the Media Toolbar - self.mediaController.add_controller_items(self, self.controllerLayout) + self.mediaController.register_controller(self, self.controllerLayout) if self.isLive: # Build the Song Toolbar self.songMenu = QtGui.QToolButton(self.toolbar) diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 507663e12..c25d2622c 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -64,8 +64,8 @@ class MediaMediaItem(MediaManagerItem): self.mediaObject = None self.mediaController = Controller(parent) self.mediaController.controllerLayout = QtGui.QVBoxLayout() - self.plugin.mediaController.add_controller_items(self.mediaController, - self.mediaController.controllerLayout) + self.plugin.mediaController.register_controller(self + .mediaController, self.mediaController.controllerLayout) self.plugin.mediaController.set_controls_visible(self.mediaController, False) self.mediaController.previewDisplay = Display(self.mediaController, From 2dadfbd17af713ea853b2a2aa27d35518bac1724 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 6 Oct 2012 09:10:28 +0100 Subject: [PATCH 12/58] More Code cleanups --- openlp/core/ui/__init__.py | 2 +- openlp/core/ui/media/mediacontroller.py | 22 ++++++++++++---------- openlp/core/ui/slidecontroller.py | 6 +++--- openlp/plugins/media/lib/mediaitem.py | 4 ++-- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index adcd669ed..dc9cb1dc6 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -81,7 +81,7 @@ from screen import ScreenList from maindisplay import MainDisplay, Display from servicenoteform import ServiceNoteForm from serviceitemeditform import ServiceItemEditForm -from slidecontroller import SlideController, Controller +from slidecontroller import SlideController, DisplayController from splashscreen import SplashScreen from generaltab import GeneralTab from themestab import ThemesTab diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index d65316d00..fd3f3735e 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -51,7 +51,6 @@ class MediaController(object): self.mediaPlayers = {} self.controller = [] self.curDisplayMediaPlayer = {} - self.currentPlayer = None # Timer for video state self.timer = QtCore.QTimer() self.timer.setInterval(200) @@ -284,9 +283,6 @@ class MediaController(object): if self.curDisplayMediaPlayer[controller.display] != \ self.mediaPlayers[u'webkit']: controller.display.setTransparency(False) - # Special controls: Here media type specific Controls will be enabled - # (e.g. for DVD control, ...) - # TODO def resize(self, controller, display, player): """ @@ -316,9 +312,9 @@ class MediaController(object): if controller.isLive: if controller.previewDisplay: display = controller.previewDisplay - isValid = self.check_file_type(controller, display) + isValid = self._check_file_type(controller, display) display = controller.display - isValid = self.check_file_type(controller, display) + isValid = self._check_file_type(controller, display) display.override[u'theme'] = u'' display.override[u'video'] = True if controller.media_info.is_background: @@ -331,7 +327,7 @@ class MediaController(object): controller.media_info.end_time = serviceItem.end_time elif controller.previewDisplay: display = controller.previewDisplay - isValid = self.check_file_type(controller, display) + isValid = self._check_file_type(controller, display) if not isValid: # Media could not be loaded correctly critical_error_message_box( @@ -371,7 +367,7 @@ class MediaController(object): """ Loads and starts a media item to obtain the media length - ``msg`` + ``controller`` First element is the controller which should be used ``serviceItem`` @@ -385,7 +381,7 @@ class MediaController(object): controller.media_info.file_info = QtCore.QFileInfo(serviceItem .get_filename()) display = controller.previewDisplay - if not self.check_file_type(controller, display): + if not self._check_file_type(controller, display): # Media could not be loaded correctly critical_error_message_box( translate('MediaPlugin.MediaItem', 'Unsupported File'), @@ -403,9 +399,15 @@ class MediaController(object): log.debug(u'use %s controller' % self.curDisplayMediaPlayer[display]) return True - def check_file_type(self, controller, display): + def _check_file_type(self, controller, display): """ Select the correct media Player type from the prioritized Player list + + ``controller`` + First element is the controller which should be used + + ``serviceItem`` + The ServiceItem containing the details to be played. """ usedPlayers, overriddenPlayer = get_media_players() if overriddenPlayer and overriddenPlayer != u'auto': diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 33c0b14e2..641dfade2 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -52,7 +52,7 @@ class SlideList(QtGui.QTableWidget): QtGui.QTableWidget.__init__(self, parent.controller) -class Controller(QtGui.QWidget): +class DisplayController(QtGui.QWidget): """ Controller is a general display controller widget. """ @@ -76,7 +76,7 @@ class Controller(QtGui.QWidget): Receiver.send_message('%s' % sender, [controller, args]) -class SlideController(Controller): +class SlideController(DisplayController): """ SlideController is the slide controller widget. This widget is what the user uses to control the displaying of verses/slides/etc on the screen. @@ -85,7 +85,7 @@ class SlideController(Controller): """ Set up the Slide Controller. """ - Controller.__init__(self, parent, isLive) + DisplayController.__init__(self, parent, isLive) self.screens = ScreenList() try: self.ratio = float(self.screens.current[u'size'].width()) / \ diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index c25d2622c..27eac230e 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -38,7 +38,7 @@ from openlp.core.lib import MediaManagerItem, build_icon, ItemCapabilities, \ from openlp.core.lib.settings import Settings from openlp.core.lib.ui import UiStrings, critical_error_message_box, \ create_horizontal_adjusting_combo_box -from openlp.core.ui import Controller, Display +from openlp.core.ui import DisplayController, Display from openlp.core.ui.media import get_media_players, set_media_players log = logging.getLogger(__name__) @@ -62,7 +62,7 @@ class MediaMediaItem(MediaManagerItem): self.singleServiceItem = False self.hasSearch = True self.mediaObject = None - self.mediaController = Controller(parent) + self.mediaController = DisplayController(parent) self.mediaController.controllerLayout = QtGui.QVBoxLayout() self.plugin.mediaController.register_controller(self .mediaController, self.mediaController.controllerLayout) From 66728c52cdfaea197c26aa0c1b6dff0ff1cb0557 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 6 Oct 2012 09:35:37 +0100 Subject: [PATCH 13/58] Renames --- openlp/core/ui/media/mediacontroller.py | 14 +++++++------- openlp/plugins/media/lib/mediaitem.py | 1 - 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index fd3f3735e..879842b35 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -54,7 +54,7 @@ class MediaController(object): # Timer for video state self.timer = QtCore.QTimer() self.timer.setInterval(200) - self.check_available_media_players() + self._check_available_media_players() # Signals QtCore.QObject.connect(self.timer, QtCore.SIGNAL("timeout()"), self.video_state) @@ -80,9 +80,9 @@ class MediaController(object): QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'songs_unblank'), self.video_unblank) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'mediaitem_media_rebuild'), self.set_active_players) + QtCore.SIGNAL(u'mediaitem_media_rebuild'), self._set_active_players) - def set_active_players(self): + def _set_active_players(self): savedPlayers = get_media_players()[0] for player in self.mediaPlayers.keys(): self.mediaPlayers[player].isActive = player in savedPlayers @@ -97,12 +97,12 @@ class MediaController(object): """ self.mediaPlayers[player.name] = player - def check_available_media_players(self): + def _check_available_media_players(self): """ Check to see if we have any media Player's available. If Not do not install the plugin. """ - log.debug(u'check_available_media_players') + log.debug(u'_check_available_media_players') controller_dir = os.path.join( AppLocation.get_directory(AppLocation.AppDir), u'core', u'ui', u'media') @@ -133,7 +133,7 @@ class MediaController(object): for invalidPlayer in invalidMediaPlayers: savedPlayers.remove(invalidPlayer) set_media_players(savedPlayers, overriddenPlayer) - self.set_active_players() + self._set_active_players() return True def video_state(self): @@ -266,7 +266,7 @@ class MediaController(object): # clean up possible running old media files self.finalise() # update player status - self.set_active_players() + self._set_active_players() display.hasAudio = True if display == self.mainWindow.previewController.previewDisplay or \ display == self.mainWindow.liveController.previewDisplay: diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 27eac230e..3f7277dc3 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -44,7 +44,6 @@ from openlp.core.ui.media import get_media_players, set_media_players log = logging.getLogger(__name__) CLAPPERBOARD = QtGui.QImage(u':/media/media_video.png') -#TODO: Add an appropriate Icon for DVDs, CDs, ... DVD_ICON = QtGui.QImage(u':/media/media_video.png') class MediaMediaItem(MediaManagerItem): From 1c0685d08bc0ec0ad1c99f7b2da7e1fe86942728 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 6 Oct 2012 11:01:04 +0100 Subject: [PATCH 14/58] Iconise the media plugin items correctly --- openlp/plugins/media/lib/mediaitem.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 3f7277dc3..3eebbdf75 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -43,8 +43,9 @@ from openlp.core.ui.media import get_media_players, set_media_players log = logging.getLogger(__name__) -CLAPPERBOARD = QtGui.QImage(u':/media/media_video.png') -DVD_ICON = QtGui.QImage(u':/media/media_video.png') +CLAPPERICON = build_icon(QtGui.QImage(u':/media/image_clapperboard.png')) +AUDIOICON = build_icon(QtGui.QImage(u':/songs/song_search_all.png')) +DVDICON = QtGui.QImage(u':/media/media_video.png') class MediaMediaItem(MediaManagerItem): """ @@ -55,7 +56,6 @@ class MediaMediaItem(MediaManagerItem): def __init__(self, parent, plugin, icon): self.iconPath = u'images/image' self.background = False - self.previewFunction = CLAPPERBOARD self.automatic = u'' MediaManagerItem.__init__(self, parent, plugin, icon) self.singleServiceItem = False @@ -231,7 +231,7 @@ class MediaMediaItem(MediaManagerItem): def initialise(self): self.listView.clear() - self.listView.setIconSize(QtCore.QSize(88, 50)) + self.listView.setIconSize(QtCore.QSize(44, 25)) self.loadList(SettingsManager.load_list(self.settingsSection, u'media')) self.populateDisplayTypes() @@ -296,16 +296,19 @@ class MediaMediaItem(MediaManagerItem): key=lambda filename: os.path.split(unicode(filename))[1].lower()) for track in media: track_info = QtCore.QFileInfo(track) - if not track_info.isFile(): + if track_info.isFile(): filename = os.path.split(unicode(track))[1] item_name = QtGui.QListWidgetItem(filename) - item_name.setIcon(build_icon(CLAPPERBOARD)) + if u'*.%s' % (filename.split(u'.')[-1].lower()) in \ + self.plugin.audio_extensions_list: + item_name.setIcon(AUDIOICON) + else: + item_name.setIcon(CLAPPERICON) item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(track)) else: filename = os.path.split(unicode(track))[1] item_name = QtGui.QListWidgetItem(filename) - #TODO: add the appropriate Icon - #item_name.setIcon(build_icon(DVD_ICON)) + item_name.setIcon(build_icon(DVDICON)) item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(track)) item_name.setToolTip(track) self.listView.addItem(item_name) From 34284ea8aedb554071070aaf80aa7949e7ca6a3d Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 7 Oct 2012 08:25:55 +0100 Subject: [PATCH 15/58] Clean up media extension lists and move the controller. Fix reload of suffixes to happen after media or presentaions changes --- openlp/core/ui/mainwindow.py | 2 ++ openlp/core/ui/media/mediacontroller.py | 18 ++++++++++++++++-- openlp/core/ui/media/playertab.py | 8 +++++--- openlp/core/ui/servicemanager.py | 10 +++++++++- openlp/core/ui/settingsform.py | 15 +++++++++++++-- openlp/plugins/media/lib/mediaitem.py | 15 ++++++++------- openlp/plugins/media/lib/mediatab.py | 4 +++- openlp/plugins/media/mediaplugin.py | 8 -------- openlp/plugins/presentations/lib/mediaitem.py | 13 ++++--------- .../presentations/lib/presentationtab.py | 3 +++ 10 files changed, 63 insertions(+), 33 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index d8c1d319b..ed27e82b1 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -587,6 +587,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.imageManager = ImageManager() # Set up the interface self.setupUi(self) + # Register the active media players and suffixes + self.mediaController.check_available_media_players() # Load settings after setupUi so default UI sizes are overwritten self.loadSettings() # Once settings are loaded update the menu with the recent files. diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 362c1684e..632766ed1 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -55,7 +55,6 @@ class MediaController(object): # Timer for video state self.timer = QtCore.QTimer() self.timer.setInterval(200) - self._check_available_media_players() # Signals QtCore.QObject.connect(self.timer, QtCore.SIGNAL("timeout()"), self.video_state) @@ -82,12 +81,26 @@ class MediaController(object): QtCore.SIGNAL(u'songs_unblank'), self.video_unblank) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'mediaitem_media_rebuild'), self._set_active_players) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'mediaitem_suffexes'), + self._generate_extensions_lists) def _set_active_players(self): + """ + Set the active players and available media files + """ savedPlayers = get_media_players()[0] for player in self.mediaPlayers.keys(): self.mediaPlayers[player].isActive = player in savedPlayers + def _generate_extensions_lists(self): + self.audio_extensions_list = self.get_audio_extensions_list() + for ext in self.audio_extensions_list: + self.mainWindow.serviceManagerContents.supportedSuffixes(ext[2:]) + self.video_extensions_list = self.get_video_extensions_list() + for ext in self.video_extensions_list: + self.mainWindow.serviceManagerContents.supportedSuffixes(ext[2:]) + def register_players(self, player): """ Register each media Player controller (Webkit, Phonon, etc) and store @@ -98,7 +111,7 @@ class MediaController(object): """ self.mediaPlayers[player.name] = player - def _check_available_media_players(self): + def check_available_media_players(self): """ Check to see if we have any media Player's available. If Not do not install the plugin. @@ -142,6 +155,7 @@ class MediaController(object): savedPlayers.remove(invalidPlayer) set_media_players(savedPlayers, overriddenPlayer) self._set_active_players() + self._generate_extensions_lists() return True def video_state(self): diff --git a/openlp/core/ui/media/playertab.py b/openlp/core/ui/media/playertab.py index d69624b59..3dedca7fb 100644 --- a/openlp/core/ui/media/playertab.py +++ b/openlp/core/ui/media/playertab.py @@ -44,14 +44,15 @@ class PlayerTab(SettingsTab): """ MediaTab is the Media settings tab in the settings dialog. """ - def __init__(self, parent, mediaPlayers): - self.mediaPlayers = mediaPlayers + def __init__(self, parent, mainWindow): + self.settingsForm = parent + self.mainWindow = mainWindow + self.mediaPlayers = mainWindow.mediaController.mediaPlayers self.savedUsedPlayers = None self.iconPath = u':/system/system_settings.png' player_translated = translate('OpenLP.PlayerTab', 'Players') SettingsTab.__init__(self, parent, u'Players', player_translated) - def setupUi(self): self.setObjectName(u'MediaTab') SettingsTab.setupUi(self) @@ -243,6 +244,7 @@ class PlayerTab(SettingsTab): set_media_players(self.usedPlayers, override_player) player_string_changed = True if player_string_changed: + self.settingsForm.resetSupportedSuffixes() Receiver.send_message(u'mediaitem_media_rebuild') Receiver.send_message(u'config_screen_changed') diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 9cedca87d..9ef57e86e 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -382,6 +382,13 @@ class ServiceManager(QtGui.QWidget): u'advanced/expand service item', QtCore.QVariant(u'False')).toBool() + def resetSupportedSuffixes(self): + """ + Resets the Suffexes list. + + """ + self.suffixes = [] + def supportedSuffixes(self, suffix): """ Adds Suffixes supported to the master list. Called from Plugins. @@ -389,7 +396,8 @@ class ServiceManager(QtGui.QWidget): ``suffix`` New Suffix to be supported """ - self.suffixes.append(suffix) + if not suffix in self.suffixes: + self.suffixes.append(suffix) def onNewServiceClicked(self): """ diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py index 475963aff..492d6de03 100644 --- a/openlp/core/ui/settingsform.py +++ b/openlp/core/ui/settingsform.py @@ -47,6 +47,7 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): """ Initialise the settings form """ + self.mainWindow = mainWindow QtGui.QDialog.__init__(self, parent) self.setupUi(self) # General tab @@ -56,8 +57,7 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): # Advanced tab self.advancedTab = AdvancedTab(self) # Advanced tab - self.playerTab = PlayerTab(self, mainWindow.mediaController - .mediaPlayers) + self.playerTab = PlayerTab(self, mainWindow) def exec_(self): # load all the settings @@ -98,6 +98,7 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): """ Process the form saving the settings """ + self.resetSuffexes = True for tabIndex in range(self.stackedLayout.count()): self.stackedLayout.widget(tabIndex).save() # Must go after all settings are save @@ -129,3 +130,13 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): """ self.stackedLayout.setCurrentIndex(tabIndex) self.stackedLayout.currentWidget().tabVisible() + + def resetSupportedSuffixes(self): + """ + Control the resetting of the serviceManager suffex list as can be + called by a number of settings tab and only needs to be called once + per save. + """ + if self.resetSuffexes: + self.mainWindow.serviceManagerContents.resetSupportedSuffixes() + self.resetSuffexes = False \ No newline at end of file diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 3eebbdf75..65d616ca8 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -87,7 +87,7 @@ class MediaMediaItem(MediaManagerItem): QtCore.SIGNAL(u'video_background_replaced'), self.videobackgroundReplaced) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'mediaitem_media_rebuild'), self.rebuild) + 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 @@ -95,10 +95,11 @@ class MediaMediaItem(MediaManagerItem): def retranslateUi(self): self.onNewPrompt = translate('MediaPlugin.MediaItem', 'Select Media') - self.onNewFileMasks = unicode(translate('MediaPlugin.MediaItem', - 'Videos (%s);;Audio (%s);;%s (*)')) % ( - u' '.join(self.plugin.video_extensions_list), - u' '.join(self.plugin.audio_extensions_list), UiStrings().AllFiles) + #self.onNewFileMasks = unicode(translate('MediaPlugin.MediaItem', + # 'Videos (%s);;Audio (%s);;%s (*)')) % ( + # u' '.join(self.plugin.video_extensions_list), + # u' '.join(self.plugin.audio_extensions_list), + # UiStrings().AllFiles) self.replaceAction.setText(UiStrings().ReplaceBG) self.replaceAction.setToolTip(UiStrings().ReplaceLiveBG) self.resetAction.setText(UiStrings().ResetBG) @@ -235,7 +236,7 @@ class MediaMediaItem(MediaManagerItem): self.loadList(SettingsManager.load_list(self.settingsSection, u'media')) self.populateDisplayTypes() - def rebuild(self): + def rebuild_players(self): """ Rebuild the tab in the media manager when changes are made in the settings @@ -300,7 +301,7 @@ class MediaMediaItem(MediaManagerItem): filename = os.path.split(unicode(track))[1] item_name = QtGui.QListWidgetItem(filename) if u'*.%s' % (filename.split(u'.')[-1].lower()) in \ - self.plugin.audio_extensions_list: + self.plugin.mediaController.audio_extensions_list: item_name.setIcon(AUDIOICON) else: item_name.setIcon(CLAPPERICON) diff --git a/openlp/plugins/media/lib/mediatab.py b/openlp/plugins/media/lib/mediatab.py index f0c3999f3..52fdef4bb 100644 --- a/openlp/plugins/media/lib/mediatab.py +++ b/openlp/plugins/media/lib/mediatab.py @@ -96,4 +96,6 @@ class MediaTab(SettingsTab): Settings().setValue(setting_key, QtCore.QVariant(self.autoStartCheckBox.checkState())) if override_changed: - Receiver.send_message(u'mediaitem_media_rebuild') \ No newline at end of file + self.settingsForm.resetSupportedSuffixes() + Receiver.send_message(u'mediaitem_media_rebuild') + Receiver.send_message(u'mediaitem_suffexes') \ No newline at end of file diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index 5d50a8f4b..9de5e9a31 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -47,14 +47,6 @@ class MediaPlugin(Plugin): self.icon = build_icon(self.iconPath) # passed with drag and drop messages self.dnd_id = u'Media' - self.audio_extensions_list = \ - self.mediaController.get_audio_extensions_list() - for ext in self.audio_extensions_list: - self.serviceManager.supportedSuffixes(ext[2:]) - self.video_extensions_list = \ - self.mediaController.get_video_extensions_list() - for ext in self.video_extensions_list: - self.serviceManager.supportedSuffixes(ext[2:]) def createSettingsTab(self, parent): """ diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index 290882e26..cbf2d73b1 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -61,7 +61,10 @@ class PresentationMediaItem(MediaManagerItem): self.hasSearch = True self.singleServiceItem = False QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'mediaitem_presentation_rebuild'), self.rebuild) + QtCore.SIGNAL(u'mediaitem_presentation_rebuild'), + self.populateDisplayTypes) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'mediaitem_suffexes'), self.buildFileMaskString) # Allow DnD from the desktop self.listView.activateDnD() @@ -130,14 +133,6 @@ class PresentationMediaItem(MediaManagerItem): self.loadList(files, True) self.populateDisplayTypes() - def rebuild(self): - """ - Rebuild the tab in the media manager when changes are made in - the settings - """ - self.populateDisplayTypes() - self.buildFileMaskString() - def populateDisplayTypes(self): """ Load the combobox with the enabled presentation controllers, diff --git a/openlp/plugins/presentations/lib/presentationtab.py b/openlp/plugins/presentations/lib/presentationtab.py index a09e19a94..bf6d020f9 100644 --- a/openlp/plugins/presentations/lib/presentationtab.py +++ b/openlp/plugins/presentations/lib/presentationtab.py @@ -40,6 +40,7 @@ class PresentationTab(SettingsTab): """ Constructor """ + self.settingsForm = parent self.controllers = controllers SettingsTab.__init__(self, parent, title, visible_title, icon_path) self.activated = False @@ -141,7 +142,9 @@ class PresentationTab(SettingsTab): QtCore.QVariant(self.OverrideAppCheckBox.checkState())) changed = True if changed: + self.settingsForm.resetSupportedSuffixes() Receiver.send_message(u'mediaitem_presentation_rebuild') + Receiver.send_message(u'mediaitem_suffexes') def tabVisible(self): """ From 77ddd4f3851a3b87e8fdf3d21284de9bd879cc37 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 13 Oct 2012 21:54:56 +0100 Subject: [PATCH 16/58] Fixes --- openlp/core/ui/media/mediacontroller.py | 34 ++++++++++++++++++++++++- openlp/plugins/media/lib/mediaitem.py | 12 +++------ 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 632766ed1..4d3f9bfe2 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -284,6 +284,9 @@ class MediaController(object): """ After a new display is configured, all media related widget will be created too + + ``display`` + Display on which the output is to be played """ # clean up possible running old media files self.finalise() @@ -298,6 +301,16 @@ class MediaController(object): player.setup(display) def set_controls_visible(self, controller, value): + """ + After a new display is configured, all media related widget will be + created too + + ``controller`` + The controller on which controls act. + + ``value`` + control name to be changed. + """ # Generic controls controller.mediabar.setVisible(value) if controller.isLive and controller.display: @@ -310,6 +323,12 @@ class MediaController(object): """ After Mainwindow changes or Splitter moved all related media widgets have to be resized + + ``display`` + The display on which output is playing. + + ``player`` + The player which is doing the playing. """ player.resize(display) @@ -317,6 +336,18 @@ class MediaController(object): hidden=False): """ Loads and starts a video to run with the option of sound + + ``serviceItem`` + The player which is doing the playing + + ``muted`` + The player which is doing the playing + + ``isBackground`` + The player which is doing the playing + + ``hidden`` + The player which is doing the playing """ log.debug(u'video') isValid = False @@ -327,7 +358,8 @@ class MediaController(object): controller.media_info.volume = 0 else: controller.media_info.volume = controller.volumeSlider.value() - controller.media_info.file_info = QtCore.QFileInfo(serviceItem.get_filename()) + controller.media_info.file_info = \ + QtCore.QFileInfo(serviceItem.get_filename()) controller.media_info.is_background = isBackground display = None #self.curDisplayMediaPlayer[u'current'] = serviceItem.name diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index ac3fc3fbb..64ec08d9d 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -44,9 +44,9 @@ from openlp.core.ui.media import get_media_players, set_media_players log = logging.getLogger(__name__) CLAPPERBOARD = u':/media/slidecontroller_multimedia.png' -VIDEO = QtGui.QImage(u':/media/media_video.png') -AUDIO = QtGui.QImage(u':/media/media_audio.png') -DVDICON = QtGui.QImage(u':/media/media_video.png') +VIDEO = build_icon(QtGui.QImage(u':/media/media_video.png')) +AUDIO = build_icon(QtGui.QImage(u':/media/media_audio.png')) +DVDICON = build_icon(QtGui.QImage(u':/media/media_video.png')) class MediaMediaItem(MediaManagerItem): @@ -215,8 +215,7 @@ class MediaMediaItem(MediaManagerItem): service_item.title = unicode(self.displayTypeComboBox.currentText()) service_item.shortname = service_item.title (path, name) = os.path.split(filename) - service_item.add_from_command(path, name, - u':/media/image_clapperboard.png') + service_item.add_from_command(path, name, CLAPPERBOARD) # Start media and obtain the length if not self.plugin.mediaController.media_length( self.mediaController, service_item): @@ -230,9 +229,6 @@ class MediaMediaItem(MediaManagerItem): service_item.will_auto_start = True # force a non-existent theme service_item.theme = -1 - frame = CLAPPERBOARD - (path, name) = os.path.split(filename) - service_item.add_from_command(path, name, frame) return True def initialise(self): From aea75e6c73fef97dad186f3be41d8972609a99af Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 14 Oct 2012 16:58:04 +0100 Subject: [PATCH 17/58] fix up player tab after setup changes and start to fix light save --- openlp/core/lib/serviceitem.py | 14 +++-- openlp/core/ui/mainwindow.py | 2 +- openlp/core/ui/media/mediacontroller.py | 42 +++++++-------- openlp/core/ui/media/playertab.py | 69 +++++++++++++------------ openlp/core/ui/servicemanager.py | 27 ++++++++-- openlp/core/ui/settingsform.py | 1 + 6 files changed, 90 insertions(+), 65 deletions(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 10a7c4639..2227fb8fb 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -292,7 +292,8 @@ class ServiceItem(object): elif self.service_item_type == ServiceItemType.Command: for slide in self._raw_frames: service_data.append( - {u'title': slide[u'title'], u'image': slide[u'image']}) + {u'title': slide[u'title'], u'image': slide[u'image'], + u'path': slide[u'path']}) return {u'header': service_header, u'data': service_data} def set_from_service(self, serviceitem, path=None): @@ -342,9 +343,14 @@ class ServiceItem(object): self.add_from_image(filename, text_image) elif self.service_item_type == ServiceItemType.Command: for text_image in serviceitem[u'serviceitem'][u'data']: - filename = os.path.join(path, text_image[u'title']) - self.add_from_command( - path, text_image[u'title'], text_image[u'image']) + if path: + self.add_from_command( + path, text_image[u'title'], text_image[u'image']) + else: + self.add_from_command( + text_image[u'path'], text_image[u'title'], + text_image[u'image']) + self._new_item() def get_display_title(self): diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index ed27e82b1..90abe03a4 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -1167,7 +1167,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): if self.serviceManagerContents.isModified(): ret = self.serviceManagerContents.saveModifiedService() if ret == QtGui.QMessageBox.Save: - if self.serviceManagerContents.saveFile(): + if self.serviceManagerContents.decideSaveMethod(): self.cleanUp() event.accept() else: diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 4d3f9bfe2..e0ebd6b4a 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -94,12 +94,25 @@ class MediaController(object): self.mediaPlayers[player].isActive = player in savedPlayers def _generate_extensions_lists(self): - self.audio_extensions_list = self.get_audio_extensions_list() - for ext in self.audio_extensions_list: - self.mainWindow.serviceManagerContents.supportedSuffixes(ext[2:]) - self.video_extensions_list = self.get_video_extensions_list() - for ext in self.video_extensions_list: - self.mainWindow.serviceManagerContents.supportedSuffixes(ext[2:]) + """ + Set the active players and available media files + """ + self.audio_extensions_list = [] + for player in self.mediaPlayers.values(): + if player.isActive: + for item in player.audio_extensions_list: + if not item in self.audio_extensions_list: + self.audio_extensions_list.append(item) + self.mainWindow.serviceManagerContents. \ + supportedSuffixes(item[2:]) + self.video_extensions_list = [] + for player in self.mediaPlayers.values(): + if player.isActive: + for item in player.video_extensions_list: + if item not in self.video_extensions_list: + self.video_extensions_list.extend(item) + self.mainWindow.serviceManagerContents. \ + supportedSuffixes(item[2:]) def register_players(self, player): """ @@ -657,23 +670,6 @@ class MediaController(object): if not self.timer.isActive(): self.timer.start() - def get_audio_extensions_list(self): - audio_list = [] - for player in self.mediaPlayers.values(): - if player.isActive: - for item in player.audio_extensions_list: - if not item in audio_list: - audio_list.append(item) - return audio_list - - def get_video_extensions_list(self): - video_list = [] - for player in self.mediaPlayers.values(): - if player.isActive: - video_list.extend([item for item in player.video_extensions_list - if item not in video_list]) - return video_list - def finalise(self): self.timer.stop() for controller in self.controller: diff --git a/openlp/core/ui/media/playertab.py b/openlp/core/ui/media/playertab.py index 3dedca7fb..7fb7c64f0 100644 --- a/openlp/core/ui/media/playertab.py +++ b/openlp/core/ui/media/playertab.py @@ -83,13 +83,6 @@ class PlayerTab(SettingsTab): self.mediaPlayerLayout = QtGui.QVBoxLayout(self.mediaPlayerGroupBox) self.mediaPlayerLayout.setObjectName(u'mediaPlayerLayout') self.playerCheckBoxes = {} - for key, player in self.mediaPlayers.iteritems(): - player = self.mediaPlayers[key] - checkbox = MediaQCheckBox(self.mediaPlayerGroupBox) - checkbox.setEnabled(player.available) - checkbox.setObjectName(player.name + u'CheckBox') - self.playerCheckBoxes[player.name] = checkbox - self.mediaPlayerLayout.addWidget(checkbox) self.leftLayout.addWidget(self.mediaPlayerGroupBox) self.playerOrderGroupBox = QtGui.QGroupBox(self.leftColumn) self.playerOrderGroupBox.setObjectName(u'playerOrderGroupBox') @@ -126,12 +119,6 @@ class PlayerTab(SettingsTab): self.leftLayout.addWidget(self.playerOrderGroupBox) self.leftLayout.addStretch() self.rightLayout.addStretch() - for key in self.mediaPlayers: - player = self.mediaPlayers[key] - checkbox = self.playerCheckBoxes[player.name] - QtCore.QObject.connect(checkbox, - QtCore.SIGNAL(u'stateChanged(int)'), - self.onPlayerCheckBoxChanged) # Signals and slots QtCore.QObject.connect(self.backgroundColorButton, QtCore.SIGNAL(u'clicked()'), self.onbackgroundColorButtonClicked) @@ -139,16 +126,6 @@ class PlayerTab(SettingsTab): def retranslateUi(self): self.mediaPlayerGroupBox.setTitle( translate('OpenLP.PlayerTab', 'Available Media Players')) - for key in self.mediaPlayers: - player = self.mediaPlayers[key] - checkbox = self.playerCheckBoxes[player.name] - checkbox.setPlayerName(player.name) - if player.available: - checkbox.setText(player.display_name) - else: - checkbox.setText( - unicode(translate('OpenLP.PlayerTab', - '%s (unavailable)')) % player.display_name) self.playerOrderGroupBox.setTitle( translate('OpenLP.PlayerTab', 'Player Search Order')) self.bgColorGroupBox.setTitle( @@ -157,8 +134,8 @@ class PlayerTab(SettingsTab): translate('ImagesPlugin.ImageTab', 'Default Color:')) self.informationLabel.setText( translate('ImagesPlugin.ImageTab', 'Visible background for images ' - 'with aspect ratio different to screen.')) - + 'with aspect ratio different to screen.')) + self.retranslatePlayers() def onbackgroundColorButtonClicked(self): new_color = QtGui.QColorDialog.getColor( @@ -213,13 +190,7 @@ class PlayerTab(SettingsTab): self.usedPlayers = self.savedUsedPlayers self.usedPlayers = get_media_players()[0] self.savedUsedPlayers = self.usedPlayers - for key in self.mediaPlayers: - player = self.mediaPlayers[key] - checkbox = self.playerCheckBoxes[player.name] - if player.available and player.name in self.usedPlayers: - checkbox.setChecked(True) - else: - checkbox.setChecked(False) + settings = Settings() settings.beginGroup(self.settingsSection) self.updatePlayerList() @@ -248,3 +219,37 @@ class PlayerTab(SettingsTab): Receiver.send_message(u'mediaitem_media_rebuild') Receiver.send_message(u'config_screen_changed') + def postSetUp(self, postUpdate=False): + """ + Late stup for players as the MediaController has to be initialised + firest. + """ + for key, player in self.mediaPlayers.iteritems(): + player = self.mediaPlayers[key] + checkbox = MediaQCheckBox(self.mediaPlayerGroupBox) + checkbox.setEnabled(player.available) + checkbox.setObjectName(player.name + u'CheckBox') + self.playerCheckBoxes[player.name] = checkbox + QtCore.QObject.connect(checkbox,QtCore.SIGNAL(u'stateChanged(int)'), + self.onPlayerCheckBoxChanged) + self.mediaPlayerLayout.addWidget(checkbox) + if player.available and player.name in self.usedPlayers: + checkbox.setChecked(True) + else: + checkbox.setChecked(False) + self.retranslatePlayers() + + def retranslatePlayers(self): + """ + Translations for players is dependent on their setup as well + """ + for key in self.mediaPlayers: + player = self.mediaPlayers[key] + checkbox = self.playerCheckBoxes[player.name] + checkbox.setPlayerName(player.name) + if player.available: + checkbox.setText(player.display_name) + else: + checkbox.setText( + unicode(translate('OpenLP.PlayerTab', + '%s (unavailable)')) % player.display_name) \ No newline at end of file diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 9ef57e86e..acd44f147 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -135,7 +135,7 @@ class ServiceManager(QtGui.QWidget): self.toolbar.addToolbarAction(u'saveService', text=UiStrings().SaveService, icon=u':/general/general_save.png', tooltip=translate('OpenLP.ServiceManager', 'Save this service.'), - triggers=self.saveFile) + triggers=self.decideSaveMethod) self.toolbar.addSeparator() self.themeLabel = QtGui.QLabel(u'%s:' % UiStrings().Theme, self) self.themeLabel.setMargin(3) @@ -361,6 +361,7 @@ class ServiceManager(QtGui.QWidget): self.shortFileName()) Settings(). \ setValue(u'servicemanager/last file',QtCore.QVariant(fileName)) + self._saveLight = True if self._fileName.endswith(u'.oszl') else False def fileName(self): """ @@ -408,7 +409,7 @@ class ServiceManager(QtGui.QWidget): if result == QtGui.QMessageBox.Cancel: return False elif result == QtGui.QMessageBox.Save: - if not self.saveFile(): + if not self.decideSaveMethod(): return False self.newFile() @@ -426,7 +427,7 @@ class ServiceManager(QtGui.QWidget): if result == QtGui.QMessageBox.Cancel: return False elif result == QtGui.QMessageBox.Save: - self.saveFile() + self.decideSaveMethod() if not loadFile: fileName = unicode(QtGui.QFileDialog.getOpenFileName( self.mainwindow, @@ -721,12 +722,24 @@ class ServiceManager(QtGui.QWidget): ext = os.path.splitext(fileName)[1] fileName.replace(ext, u'.osz') self.setFileName(fileName) - if fileName.endswith(u'.oszl'): + self.decideSaveMethod() + + def decideSaveMethod(self): + """ + Determine which type of save method to use. + """ + if not self.fileName(): + return self.saveFileAs() + print "decideSaveMethod",self._saveLight + if self._saveLight: return self.saveLocalFile() else: return self.saveFile() def loadFile(self, fileName): + """ + Load an existing service file + """ if not fileName: return False fileName = unicode(fileName) @@ -766,7 +779,11 @@ class ServiceManager(QtGui.QWidget): self.mainwindow.incrementProgressBar() serviceItem = ServiceItem() serviceItem.renderer = self.mainwindow.renderer - serviceItem.set_from_service(item, self.servicePath) + print self._saveLight + if self._saveLight: + serviceItem.set_from_service(item) + else: + serviceItem.set_from_service(item, self.servicePath) self.validateItem(serviceItem) self.load_item_uuid = 0 if serviceItem.is_capable(ItemCapabilities.OnLoadUpdate): diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py index 492d6de03..91a6c0fb6 100644 --- a/openlp/core/ui/settingsform.py +++ b/openlp/core/ui/settingsform.py @@ -120,6 +120,7 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): self.generalTab.postSetUp() self.themesTab.postSetUp() self.advancedTab.postSetUp() + self.playerTab.postSetUp() for plugin in self.plugins: if plugin.settingsTab: plugin.settingsTab.postSetUp() From c29cf8ce707d99a723b355a87661f8297dbe165e Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 14 Oct 2012 17:21:47 +0100 Subject: [PATCH 18/58] Lite Save for Media working --- openlp/core/ui/servicemanager.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index acd44f147..d1a274a14 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -361,7 +361,7 @@ class ServiceManager(QtGui.QWidget): self.shortFileName()) Settings(). \ setValue(u'servicemanager/last file',QtCore.QVariant(fileName)) - self._saveLight = True if self._fileName.endswith(u'.oszl') else False + self._saveLite = True if self._fileName.endswith(u'.oszl') else False def fileName(self): """ @@ -730,8 +730,8 @@ class ServiceManager(QtGui.QWidget): """ if not self.fileName(): return self.saveFileAs() - print "decideSaveMethod",self._saveLight - if self._saveLight: + print "decideSaveMethod",self._saveLite + if self._saveLite: return self.saveLocalFile() else: return self.saveFile() @@ -774,13 +774,13 @@ class ServiceManager(QtGui.QWidget): items = cPickle.load(fileTo) fileTo.close() self.newFile() + self.setFileName(fileName) self.mainwindow.displayProgressBar(len(items)) for item in items: self.mainwindow.incrementProgressBar() serviceItem = ServiceItem() serviceItem.renderer = self.mainwindow.renderer - print self._saveLight - if self._saveLight: + if self._saveLite: serviceItem.set_from_service(item) else: serviceItem.set_from_service(item, self.servicePath) @@ -795,7 +795,6 @@ class ServiceManager(QtGui.QWidget): serviceItem.temporary_edit = self.load_item_temporary self.addServiceItem(serviceItem, repaint=False) delete_file(p_file) - self.setFileName(fileName) self.mainwindow.addRecentFile(fileName) self.setModified(False) Settings().setValue( From a5824120c3088c8147bc3f0e8831dcf7716ed67b Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 15 Oct 2012 17:20:23 +0100 Subject: [PATCH 19/58] Lite save works --- openlp/core/lib/serviceitem.py | 20 +++++++++++++++----- openlp/core/ui/servicemanager.py | 8 +++++--- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 2227fb8fb..5c606740e 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -257,7 +257,7 @@ class ServiceItem(object): {u'title': file_name, u'image': image, u'path': path}) self._new_item() - def get_service_repr(self): + def get_service_repr(self, lite_save): """ This method returns some text which can be saved into the service file to represent this item. @@ -288,7 +288,12 @@ class ServiceItem(object): if self.service_item_type == ServiceItemType.Text: service_data = [slide for slide in self._raw_frames] elif self.service_item_type == ServiceItemType.Image: - service_data = [slide[u'title'] for slide in self._raw_frames] + if lite_save: + for slide in self._raw_frames: + service_data.append( + {u'title': slide[u'title'], u'path': slide[u'path']}) + else: + service_data = [slide[u'title'] for slide in self._raw_frames] elif self.service_item_type == ServiceItemType.Command: for slide in self._raw_frames: service_data.append( @@ -338,9 +343,14 @@ class ServiceItem(object): for slide in serviceitem[u'serviceitem'][u'data']: self._raw_frames.append(slide) elif self.service_item_type == ServiceItemType.Image: - for text_image in serviceitem[u'serviceitem'][u'data']: - filename = os.path.join(path, text_image) - self.add_from_image(filename, text_image) + if path: + for text_image in serviceitem[u'serviceitem'][u'data']: + filename = os.path.join(path, text_image) + self.add_from_image(filename, text_image) + else: + for text_image in serviceitem[u'serviceitem'][u'data']: + self.add_from_image(text_image[u'path'], + text_image[u'title']) elif self.service_item_type == ServiceItemType.Command: for text_image in serviceitem[u'serviceitem'][u'data']: if path: diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index d1a274a14..0f06317f6 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -502,7 +502,8 @@ class ServiceManager(QtGui.QWidget): self.mainwindow.displayProgressBar(len(self.serviceItems) + 1) for item in self.serviceItems: self.mainwindow.incrementProgressBar() - service_item = item[u'service_item'].get_service_repr() + service_item = item[u'service_item']. \ + get_service_repr(self._saveLite) # Get all the audio files, and ready them for embedding in the # service file. if service_item[u'header'][u'background_audio']: @@ -634,7 +635,8 @@ class ServiceManager(QtGui.QWidget): self.mainwindow.displayProgressBar(len(self.serviceItems) + 1) for item in self.serviceItems: self.mainwindow.incrementProgressBar() - service_item = item[u'service_item'].get_service_repr() + service_item = item[u'service_item']. \ + get_service_repr(self._saveLite) service.append({u'serviceitem': service_item}) service_content = cPickle.dumps(service) # Usual Zip file cannot exceed 2GiB, file with Zip64 cannot be @@ -713,7 +715,7 @@ class ServiceManager(QtGui.QWidget): UiStrings().SaveService, path, translate('OpenLP.ServiceManager', 'OpenLP Service Files (*.osz);;' - 'OpenLP Service Files - light (*.oszl)'))) + 'OpenLP Service Files - lite (*.oszl)'))) if not fileName: return False if os.path.splitext(fileName)[1] == u'': From 8fb1ede03f27d23757e7d6f1b343d89629af8bff Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 15 Oct 2012 18:35:14 +0100 Subject: [PATCH 20/58] Media Players help text --- openlp/core/ui/media/mediaplayer.py | 10 ++++++++-- openlp/core/ui/media/phononplayer.py | 11 ++++++++++- openlp/core/ui/media/playertab.py | 2 ++ openlp/core/ui/media/vlcplayer.py | 9 ++++++++- openlp/core/ui/media/webkitplayer.py | 10 ++++++++++ 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/openlp/core/ui/media/mediaplayer.py b/openlp/core/ui/media/mediaplayer.py index 75f2c71d3..3a45aeb55 100644 --- a/openlp/core/ui/media/mediaplayer.py +++ b/openlp/core/ui/media/mediaplayer.py @@ -30,8 +30,8 @@ from openlp.core.ui.media import MediaState class MediaPlayer(object): """ - This is the base class media Player class to provide OpenLP with a pluggable media display - framework. + This is the base class media Player class to provide OpenLP with a + pluggable media display framework. """ def __init__(self, parent, name=u'media_player'): @@ -136,3 +136,9 @@ class MediaPlayer(object): Add html code to htmlbuilder """ return u'' + + def get_info(self): + """ + Returns Information about the player + """ + return u'' diff --git a/openlp/core/ui/media/phononplayer.py b/openlp/core/ui/media/phononplayer.py index 1ab68e96a..4834e3e6f 100644 --- a/openlp/core/ui/media/phononplayer.py +++ b/openlp/core/ui/media/phononplayer.py @@ -33,7 +33,7 @@ from datetime import datetime from PyQt4 import QtCore, QtGui from PyQt4.phonon import Phonon -from openlp.core.lib import Receiver +from openlp.core.lib import Receiver, translate from openlp.core.lib.settings import Settings from openlp.core.ui.media import MediaState @@ -230,3 +230,12 @@ class PhononPlayer(MediaPlayer): background = unicode(QtGui.QColor(Settings().value( u'players/background color', QtCore.QVariant(u'#000000'))).name()) return VIDEO_CSS % (background,background,background) + + def get_info(self): + return(translate('Media.player', 'Phonon is a media player which ' + 'interacts with the operating system to provide media capabilities' + '.') + + u'
' + translate('Media.player', 'Audio') + + u'
' + unicode(self.audio_extensions_list) + + u'
' + translate('Media.player', 'Video') + + u'
' + unicode(self.video_extensions_list) + u'
') \ No newline at end of file diff --git a/openlp/core/ui/media/playertab.py b/openlp/core/ui/media/playertab.py index 7fb7c64f0..a688298bd 100644 --- a/openlp/core/ui/media/playertab.py +++ b/openlp/core/ui/media/playertab.py @@ -32,6 +32,7 @@ from openlp.core.lib import SettingsTab, translate, Receiver from openlp.core.lib.ui import UiStrings, create_button from openlp.core.lib.settings import Settings from openlp.core.ui.media import get_media_players, set_media_players + class MediaQCheckBox(QtGui.QCheckBox): """ MediaQCheckBox adds an extra property, playerName to the QCheckBox class. @@ -229,6 +230,7 @@ class PlayerTab(SettingsTab): checkbox = MediaQCheckBox(self.mediaPlayerGroupBox) checkbox.setEnabled(player.available) checkbox.setObjectName(player.name + u'CheckBox') + checkbox.setToolTip(player.get_info()) self.playerCheckBoxes[player.name] = checkbox QtCore.QObject.connect(checkbox,QtCore.SIGNAL(u'stateChanged(int)'), self.onPlayerCheckBoxChanged) diff --git a/openlp/core/ui/media/vlcplayer.py b/openlp/core/ui/media/vlcplayer.py index 879bfca82..f7242b0a5 100644 --- a/openlp/core/ui/media/vlcplayer.py +++ b/openlp/core/ui/media/vlcplayer.py @@ -34,7 +34,7 @@ import sys from PyQt4 import QtCore, QtGui -from openlp.core.lib import Receiver +from openlp.core.lib import Receiver, translate from openlp.core.lib.settings import Settings from openlp.core.ui.media import MediaState from openlp.core.ui.media.mediaplayer import MediaPlayer @@ -231,3 +231,10 @@ class VlcPlayer(MediaPlayer): controller.seekSlider.setSliderPosition( \ display.vlcMediaPlayer.get_time()) + def get_info(self): + return(translate('Media.player', 'VLC is an external player which ' + 'supports a number of different formats.') + + u'
' + translate('Media.player', 'Audio') + + u'
' + unicode(AUDIO_EXT) + u'
' + + translate('Media.player', 'Video') + u'
' + + unicode(VIDEO_EXT) + u'
') \ No newline at end of file diff --git a/openlp/core/ui/media/webkitplayer.py b/openlp/core/ui/media/webkitplayer.py index d8abb994d..f0299fb9c 100644 --- a/openlp/core/ui/media/webkitplayer.py +++ b/openlp/core/ui/media/webkitplayer.py @@ -30,6 +30,7 @@ from PyQt4 import QtCore, QtGui import logging +from openlp.core.lib import translate from openlp.core.ui.media import MediaState from openlp.core.ui.media.mediaplayer import MediaPlayer from openlp.core.lib.settings import Settings @@ -438,3 +439,12 @@ class WebkitPlayer(MediaPlayer): controller.seekSlider.setMaximum(length) if not controller.seekSlider.isSliderDown(): controller.seekSlider.setSliderPosition(currentTime) + + def get_info(self): + return(translate('Media.player', 'Webkit is a media player which runs ' + 'inside a web browser. This player allows text over video to be ' + 'rendered.') + + u'
' + translate('Media.player', 'Audio') + + u'
' + unicode(AUDIO_EXT) + u'
' + + translate('Media.player', 'Video') + u'
' + + unicode(VIDEO_EXT) + u'
') \ No newline at end of file From 057a1fe415806c8b978c406539568592c949aca0 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 15 Oct 2012 19:38:58 +0100 Subject: [PATCH 21/58] Rename methods --- openlp/core/ui/maindisplay.py | 6 +-- openlp/core/ui/media/mediacontroller.py | 66 ++++++++++++------------- openlp/core/ui/slidecontroller.py | 4 +- openlp/plugins/media/lib/mediaitem.py | 2 +- 4 files changed, 39 insertions(+), 39 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index a1cc0215d..2a2650c0f 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -52,8 +52,8 @@ log = logging.getLogger(__name__) class Display(QtGui.QGraphicsView): """ This is a general display screen class. Here the general display settings - will done. It will be used as specialized classes by Main Display and - Preview display. + will done. It will be used as specialized classes by Main Display and + Preview display. """ def __init__(self, parent, live, controller): if live: @@ -326,7 +326,7 @@ class MainDisplay(Display): """ log.debug(u'image to display') image = self.imageManager.getImageBytes(path, ImageSource.ImagePlugin) - self.controller.mediaController.video_reset(self.controller) + self.controller.mediaController.media_reset(self.controller) self.displayImage(image) def displayImage(self, image): diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index e0ebd6b4a..d0d5779c7 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -57,28 +57,28 @@ class MediaController(object): self.timer.setInterval(200) # Signals QtCore.QObject.connect(self.timer, - QtCore.SIGNAL("timeout()"), self.video_state) + QtCore.SIGNAL("timeout()"), self.media_state) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'playbackPlay'), self.video_play) + QtCore.SIGNAL(u'playbackPlay'), self.media_play) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'playbackPause'), self.video_pause) + QtCore.SIGNAL(u'playbackPause'), self.media_pause) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'playbackStop'), self.video_stop) + QtCore.SIGNAL(u'playbackStop'), self.media_stop) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'seekSlider'), self.video_seek) + QtCore.SIGNAL(u'seekSlider'), self.media_seek) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'volumeSlider'), self.video_volume) + QtCore.SIGNAL(u'volumeSlider'), self.media_volume) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'media_hide'), self.video_hide) + QtCore.SIGNAL(u'media_hide'), self.media_hide) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'media_blank'), self.video_blank) + QtCore.SIGNAL(u'media_blank'), self.media_blank) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'media_unblank'), self.video_unblank) + QtCore.SIGNAL(u'media_unblank'), self.media_unblank) # Signals for background video QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'songs_hide'), self.video_hide) + QtCore.SIGNAL(u'songs_hide'), self.media_hide) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'songs_unblank'), self.video_unblank) + QtCore.SIGNAL(u'songs_unblank'), self.media_unblank) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'mediaitem_media_rebuild'), self._set_active_players) QtCore.QObject.connect(Receiver.get_receiver(), @@ -171,7 +171,7 @@ class MediaController(object): self._generate_extensions_lists() return True - def video_state(self): + def media_state(self): """ Check if there is a running media Player and do updating stuff (e.g. update the UI) @@ -365,7 +365,7 @@ class MediaController(object): log.debug(u'video') isValid = False # stop running videos - self.video_reset(controller) + self.media_reset(controller) controller.media_info = MediaInfo() if muted: controller.media_info.volume = 0 @@ -420,7 +420,7 @@ class MediaController(object): QtCore.QVariant(False)).toBool(): autoplay = True if autoplay: - if not self.video_play([controller]): + if not self.media_play([controller]): critical_error_message_box( translate('MediaPlugin.MediaItem', 'Unsupported File'), unicode(translate('MediaPlugin.MediaItem', @@ -442,7 +442,7 @@ class MediaController(object): """ log.debug(u'media_length') # stop running videos - self.video_reset(controller) + self.media_reset(controller) controller.media_info = MediaInfo() controller.media_info.volume = controller.volumeSlider.value() controller.media_info.file_info = QtCore.QFileInfo(serviceItem @@ -455,14 +455,14 @@ class MediaController(object): unicode(translate('MediaPlugin.MediaItem', 'Unsupported File'))) return False - if not self.video_play([controller]): + if not self.media_play([controller]): critical_error_message_box( translate('MediaPlugin.MediaItem', 'Unsupported File'), unicode(translate('MediaPlugin.MediaItem', 'Unsupported File'))) return False serviceItem.set_media_length(controller.media_info.length) - self.video_stop([controller]) + self.media_stop([controller]) log.debug(u'use %s controller' % self.curDisplayMediaPlayer[display]) return True @@ -510,14 +510,14 @@ class MediaController(object): # no valid player found return False - def video_play(self, msg, status=True): + def media_play(self, msg, status=True): """ Responds to the request to play a loaded video ``msg`` First element is the controller which should be used """ - log.debug(u'video_play') + log.debug(u'media_play') controller = msg[0] for display in self.curDisplayMediaPlayer.keys(): if display.controller == controller: @@ -535,27 +535,27 @@ class MediaController(object): self.timer.start() return True - def video_pause(self, msg): + def media_pause(self, msg): """ Responds to the request to pause a loaded video ``msg`` First element is the controller which should be used """ - log.debug(u'video_pause') + log.debug(u'media_pause') controller = msg[0] for display in self.curDisplayMediaPlayer.keys(): if display.controller == controller: self.curDisplayMediaPlayer[display].pause(display) - def video_stop(self, msg): + def media_stop(self, msg): """ Responds to the request to stop a loaded video ``msg`` First element is the controller which should be used """ - log.debug(u'video_stop') + log.debug(u'media_stop') controller = msg[0] for display in self.curDisplayMediaPlayer.keys(): if display.controller == controller: @@ -564,7 +564,7 @@ class MediaController(object): self.curDisplayMediaPlayer[display].set_visible(display, False) controller.seekSlider.setSliderPosition(0) - def video_volume(self, msg): + def media_volume(self, msg): """ Changes the volume of a running video @@ -573,12 +573,12 @@ class MediaController(object): """ controller = msg[0] vol = msg[1][0] - log.debug(u'video_volume %d' % vol) + log.debug(u'media_volume %d' % vol) for display in self.curDisplayMediaPlayer.keys(): if display.controller == controller: self.curDisplayMediaPlayer[display].volume(display, vol) - def video_seek(self, msg): + def media_seek(self, msg): """ Responds to the request to change the seek Slider of a loaded video @@ -586,18 +586,18 @@ class MediaController(object): First element is the controller which should be used Second element is a list with the seek Value as first element """ - log.debug(u'video_seek') + log.debug(u'media_seek') controller = msg[0] seekVal = msg[1][0] for display in self.curDisplayMediaPlayer.keys(): if display.controller == controller: self.curDisplayMediaPlayer[display].seek(display, seekVal) - def video_reset(self, controller): + def media_reset(self, controller): """ Responds to the request to reset a loaded video """ - log.debug(u'video_reset') + log.debug(u'media_reset') self.set_controls_visible(controller, False) for display in self.curDisplayMediaPlayer.keys(): if display.controller == controller: @@ -608,7 +608,7 @@ class MediaController(object): "setBackBoard", null, null, null,"hidden");') del self.curDisplayMediaPlayer[display] - def video_hide(self, msg): + def media_hide(self, msg): """ Hide the related video Widget @@ -626,7 +626,7 @@ class MediaController(object): self.curDisplayMediaPlayer[display].pause(display) self.curDisplayMediaPlayer[display].set_visible(display, False) - def video_blank(self, msg): + def media_blank(self, msg): """ Blank the related video Widget @@ -647,7 +647,7 @@ class MediaController(object): self.curDisplayMediaPlayer[display].pause(display) self.curDisplayMediaPlayer[display].set_visible(display, False) - def video_unblank(self, msg): + def media_unblank(self, msg): """ Unblank the related video Widget @@ -673,4 +673,4 @@ class MediaController(object): def finalise(self): self.timer.stop() for controller in self.controller: - self.video_reset(controller) + self.media_reset(controller) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index b83ddb160..ccd165f3c 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -523,7 +523,7 @@ class SlideController(DisplayController): def liveEscape(self): self.display.setVisible(False) - self.mediaController.video_stop([self]) + self.mediaController.media_stop([self]) def toggleDisplay(self, action): """ @@ -1360,7 +1360,7 @@ class SlideController(DisplayController): Respond to a request to close the Video """ log.debug(u'SlideController onMediaClose') - self.mediaController.video_reset(self) + self.mediaController.media_reset(self) self.previewDisplay.hide() self.slidePreview.show() diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 6503c78a7..0d4da5fbe 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -157,7 +157,7 @@ class MediaMediaItem(MediaManagerItem): """ Called to reset the Live background with the media selected, """ - self.plugin.liveController.mediaController.video_reset( + self.plugin.liveController.mediaController.media_reset( self.plugin.liveController) self.resetAction.setVisible(False) From 464480fc341facaab40ecf69c9d675c2558c7173 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 18 Oct 2012 21:38:01 +0100 Subject: [PATCH 22/58] fix up settings tab --- openlp/core/lib/mediamanageritem.py | 2 ++ openlp/core/ui/media/playertab.py | 2 +- openlp/plugins/media/lib/mediaitem.py | 5 +++-- openlp/plugins/media/lib/mediatab.py | 3 ++- openlp/plugins/presentations/lib/presentationtab.py | 4 ++-- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 40c11ddb7..d0c64f497 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -519,6 +519,8 @@ class MediaManagerItem(QtGui.QWidget): if serviceItem: if not item_id: serviceItem.from_plugin = True + if remote: + serviceItem.will_auto_start = True self.plugin.liveController.addServiceItem(serviceItem) def createItemFromId(self, item_id): diff --git a/openlp/core/ui/media/playertab.py b/openlp/core/ui/media/playertab.py index a688298bd..85d3daa1c 100644 --- a/openlp/core/ui/media/playertab.py +++ b/openlp/core/ui/media/playertab.py @@ -216,7 +216,7 @@ class PlayerTab(SettingsTab): set_media_players(self.usedPlayers, override_player) player_string_changed = True if player_string_changed: - self.settingsForm.resetSupportedSuffixes() + self.parent.resetSupportedSuffixes() Receiver.send_message(u'mediaitem_media_rebuild') Receiver.send_message(u'config_screen_changed') diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 0d4da5fbe..6cf46cd6e 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -245,8 +245,9 @@ class MediaMediaItem(MediaManagerItem): self.populateDisplayTypes() self.onNewFileMasks = unicode(translate('MediaPlugin.MediaItem', 'Videos (%s);;Audio (%s);;%s (*)')) % ( - u' '.join(self.plugin.video_extensions_list), - u' '.join(self.plugin.audio_extensions_list), UiStrings().AllFiles) + u' '.join(self.plugin.mediaController.video_extensions_list), + u' '.join(self.plugin.mediaController.audio_extensions_list), + UiStrings().AllFiles) def displaySetup(self): self.plugin.mediaController.setup_display( diff --git a/openlp/plugins/media/lib/mediatab.py b/openlp/plugins/media/lib/mediatab.py index 52fdef4bb..7ad70e595 100644 --- a/openlp/plugins/media/lib/mediatab.py +++ b/openlp/plugins/media/lib/mediatab.py @@ -46,6 +46,7 @@ class MediaTab(SettingsTab): MediaTab is the Media settings tab in the settings dialog. """ def __init__(self, parent, title, visible_title, icon_path): + self.parent = parent SettingsTab.__init__(self, parent, title, visible_title, icon_path) def setupUi(self): @@ -96,6 +97,6 @@ class MediaTab(SettingsTab): Settings().setValue(setting_key, QtCore.QVariant(self.autoStartCheckBox.checkState())) if override_changed: - self.settingsForm.resetSupportedSuffixes() + self.parent.resetSupportedSuffixes() Receiver.send_message(u'mediaitem_media_rebuild') Receiver.send_message(u'mediaitem_suffexes') \ No newline at end of file diff --git a/openlp/plugins/presentations/lib/presentationtab.py b/openlp/plugins/presentations/lib/presentationtab.py index bf6d020f9..51829861e 100644 --- a/openlp/plugins/presentations/lib/presentationtab.py +++ b/openlp/plugins/presentations/lib/presentationtab.py @@ -40,7 +40,7 @@ class PresentationTab(SettingsTab): """ Constructor """ - self.settingsForm = parent + self.parent = parent self.controllers = controllers SettingsTab.__init__(self, parent, title, visible_title, icon_path) self.activated = False @@ -142,7 +142,7 @@ class PresentationTab(SettingsTab): QtCore.QVariant(self.OverrideAppCheckBox.checkState())) changed = True if changed: - self.settingsForm.resetSupportedSuffixes() + self.parent.resetSupportedSuffixes() Receiver.send_message(u'mediaitem_presentation_rebuild') Receiver.send_message(u'mediaitem_suffexes') From cf635c14595b5017e3edc9ebfb4ace99da76fd43 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 20 Oct 2012 09:20:11 +0100 Subject: [PATCH 23/58] Stop service item generation running media twice --- openlp/core/lib/__init__.py | 10 +++++++++- openlp/core/lib/mediamanageritem.py | 15 ++++++++++----- openlp/plugins/bibles/lib/mediaitem.py | 4 ++-- openlp/plugins/custom/lib/mediaitem.py | 4 ++-- openlp/plugins/images/lib/mediaitem.py | 4 ++-- openlp/plugins/media/lib/mediaitem.py | 14 ++++++++------ openlp/plugins/presentations/lib/mediaitem.py | 4 ++-- openlp/plugins/songs/lib/mediaitem.py | 4 ++-- 8 files changed, 37 insertions(+), 22 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 5966e39f9..ecefca5a0 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -36,6 +36,14 @@ from PyQt4 import QtCore, QtGui, Qt log = logging.getLogger(__name__) +class ServiceItemContext(object): + """ + The context in which a Service Item is being generated + """ + Preview = 0 + Live = 1 + Service = 2 + class ImageSource(object): """ @@ -394,4 +402,4 @@ from dockwidget import OpenLPDockWidget from imagemanager import ImageManager from renderer import Renderer from mediamanageritem import MediaManagerItem -from openlp.core.utils.actions import ActionList + diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index d0c64f497..dc93c1a9e 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -35,7 +35,8 @@ import re from PyQt4 import QtCore, QtGui from openlp.core.lib import SettingsManager, OpenLPToolbar, ServiceItem, \ - StringContent, build_icon, translate, Receiver, ListWidgetWithDnD + StringContent, build_icon, translate, Receiver, ListWidgetWithDnD, \ + ServiceItemContext from openlp.core.lib.searchedit import SearchEdit from openlp.core.lib.ui import UiStrings, create_widget_action, \ critical_error_message_box @@ -43,6 +44,7 @@ from openlp.core.lib.settings import Settings log = logging.getLogger(__name__) + class MediaManagerItem(QtGui.QWidget): """ MediaManagerItem is a helper widget for plugins. @@ -457,7 +459,7 @@ class MediaManagerItem(QtGui.QWidget): pass def generateSlideData(self, serviceItem, item=None, xmlVersion=False, - remote=False): + remote=False, context=ServiceItemContext.Live): raise NotImplementedError(u'MediaManagerItem.generateSlideData needs ' u'to be defined by the plugin') @@ -548,7 +550,8 @@ class MediaManagerItem(QtGui.QWidget): self.addToService(item) def addToService(self, item=None, replace=None, remote=False): - serviceItem = self.buildServiceItem(item, True, remote=remote) + serviceItem = self.buildServiceItem(item, True, remote=remote, + context=ServiceItemContext.Service) if serviceItem: serviceItem.from_plugin = False self.plugin.serviceManager.addServiceItem(serviceItem, @@ -581,13 +584,15 @@ class MediaManagerItem(QtGui.QWidget): unicode(translate('OpenLP.MediaManagerItem', 'You must select a %s service item.')) % self.title) - def buildServiceItem(self, item=None, xmlVersion=False, remote=False): + def buildServiceItem(self, item=None, xmlVersion=False, remote=False, + context=ServiceItemContext.Live): """ Common method for generating a service item """ serviceItem = ServiceItem(self.plugin) serviceItem.add_icon(self.plugin.iconPath) - if self.generateSlideData(serviceItem, item, xmlVersion, remote): + if self.generateSlideData(serviceItem, item, xmlVersion, remote, + context): return serviceItem else: return None diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 0647076c8..6787029fa 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -31,7 +31,7 @@ import logging from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ - translate, create_separated_list + translate, create_separated_list, ServiceItemContext from openlp.core.lib.searchedit import SearchEdit from openlp.core.lib.settings import Settings from openlp.core.lib.ui import UiStrings, set_case_insensitive_completer, \ @@ -893,7 +893,7 @@ class BibleMediaItem(MediaManagerItem): return items def generateSlideData(self, service_item, item=None, xmlVersion=False, - remote=False): + remote=False,context=ServiceItemContext.Service): """ Generates and formats the slides for the service item as well as the service item's title. diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 10a3ec056..9fbefc8a1 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -32,7 +32,7 @@ from PyQt4 import QtCore, QtGui from sqlalchemy.sql import or_, func from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ - check_item_selected, translate + check_item_selected, translate, ServiceItemContext from openlp.core.lib.ui import UiStrings from openlp.core.lib.settings import Settings from openlp.plugins.custom.forms import EditCustomForm @@ -194,7 +194,7 @@ class CustomMediaItem(MediaManagerItem): self.searchTextEdit.setFocus() def generateSlideData(self, service_item, item=None, xmlVersion=False, - remote=False): + remote=False, context=ServiceItemContext.Service): item_id = self._getIdOfItemToGenerate(item, self.remoteCustom) service_item.add_capability(ItemCapabilities.CanEdit) service_item.add_capability(ItemCapabilities.CanPreview) diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 9239f8d72..4394fc363 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -33,7 +33,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, build_icon, ItemCapabilities, \ SettingsManager, translate, check_item_selected, check_directory_exists, \ - Receiver, create_thumb, validate_thumb + Receiver, create_thumb, validate_thumb, ServiceItemContext from openlp.core.lib.ui import UiStrings, critical_error_message_box from openlp.core.lib.settings import Settings from openlp.core.utils import AppLocation, delete_file, locale_compare, \ @@ -152,7 +152,7 @@ class ImageMediaItem(MediaManagerItem): Receiver.send_message(u'cursor_normal') def generateSlideData(self, service_item, item=None, xmlVersion=False, - remote=False): + remote=False,context=ServiceItemContext.Service): background = QtGui.QColor(Settings().value(self.settingsSection + u'/background color', QtCore.QVariant(u'#000000'))) if item: diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 6cf46cd6e..319ff861a 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -33,7 +33,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, build_icon, ItemCapabilities, \ SettingsManager, translate, check_item_selected, Receiver, MediaType, \ - ServiceItem, build_html + ServiceItem, build_html, ServiceItemContext from openlp.core.lib.settings import Settings from openlp.core.lib.ui import UiStrings, critical_error_message_box, \ create_horizontal_adjusting_combo_box @@ -198,7 +198,7 @@ class MediaMediaItem(MediaManagerItem): 'the media file "%s" no longer exists.')) % filename) def generateSlideData(self, service_item, item=None, xmlVersion=False, - remote=False): + remote=False, context=ServiceItemContext.Live): if item is None: item = self.listView.currentItem() if item is None: @@ -216,10 +216,12 @@ class MediaMediaItem(MediaManagerItem): service_item.shortname = service_item.title (path, name) = os.path.split(filename) service_item.add_from_command(path, name, CLAPPERBOARD) - # Start media and obtain the length - if not self.plugin.mediaController.media_length( - self.mediaController, service_item): - return False + # Only get start and end times if going to a service + if context == ServiceItemContext.Service: + # Start media and obtain the length + if not self.plugin.mediaController.media_length( + self.mediaController, service_item): + return False service_item.add_capability(ItemCapabilities.CanAutoStartForLive) service_item.add_capability(ItemCapabilities.RequiresMedia) service_item.add_capability(ItemCapabilities.HasDetailedTitleDisplay) diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index e52d66f1e..c0ca98a7f 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -33,7 +33,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, build_icon, SettingsManager, \ translate, check_item_selected, Receiver, ItemCapabilities, create_thumb, \ - validate_thumb + validate_thumb, ServiceItemContext from openlp.core.lib.ui import UiStrings, critical_error_message_box, \ create_horizontal_adjusting_combo_box from openlp.core.lib.settings import Settings @@ -243,7 +243,7 @@ class PresentationMediaItem(MediaManagerItem): u'presentations', self.getFileList()) def generateSlideData(self, service_item, item=None, xmlVersion=False, - remote=False): + remote=False, context=ServiceItemContext.Service): """ Load the relevant information for displaying the presentation in the slidecontroller. In the case of powerpoints, an image diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 0808bcba0..adf7d68aa 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -36,7 +36,7 @@ from sqlalchemy.sql import or_ from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ translate, check_item_selected, PluginStatus, create_separated_list, \ - check_directory_exists + check_directory_exists, ServiceItemContext from openlp.core.lib.ui import UiStrings, create_widget_action from openlp.core.lib.settings import Settings from openlp.core.utils import AppLocation @@ -449,7 +449,7 @@ class SongMediaItem(MediaManagerItem): self.onSongListLoad() def generateSlideData(self, service_item, item=None, xmlVersion=False, - remote=False): + remote=False, context=ServiceItemContext.Service): log.debug(u'generateSlideData: %s, %s, %s' % (service_item, item, self.remoteSong)) item_id = self._getIdOfItemToGenerate(item, self.remoteSong) From 8e5dafb7159142b4291f4950a5321d34fd16e90b Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 20 Oct 2012 20:52:04 +0100 Subject: [PATCH 24/58] Fix bugs and more simplifications --- openlp/core/lib/mediamanageritem.py | 1 - openlp/core/lib/serviceitem.py | 6 ++++-- openlp/core/ui/__init__.py | 19 +++++++++++++++++++ openlp/core/ui/media/mediacontroller.py | 18 +++++++++++------- openlp/core/ui/media/playertab.py | 8 +++++--- openlp/core/ui/slidecontroller.py | 12 ++++++++---- openlp/plugins/media/lib/mediaitem.py | 23 ++++++----------------- 7 files changed, 53 insertions(+), 34 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index dc93c1a9e..afe53fe13 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -44,7 +44,6 @@ from openlp.core.lib.settings import Settings log = logging.getLogger(__name__) - class MediaManagerItem(QtGui.QWidget): """ MediaManagerItem is a helper widget for plugins. diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 5c606740e..05a206660 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -52,7 +52,7 @@ class ServiceItemType(object): class ItemCapabilities(object): """ - Provides an enumeration of a serviceitem's capabilities + Provides an enumeration of a service item's capabilities """ CanPreview = 1 CanEdit = 2 @@ -310,7 +310,9 @@ class ServiceItem(object): The item to extract data from. ``path`` - Defaults to *None*. Any path data, usually for images. + Defaults to *None*. This is the service manager path for things + which have their files saved with them or None when the saved + service is lite and the original file paths need to be preserved.. """ log.debug(u'set_from_service called with path %s' % path) header = serviceitem[u'serviceitem'][u'header'] diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index dc9cb1dc6..0bf983b74 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -71,6 +71,25 @@ class AlertLocation(object): Middle = 1 Bottom = 2 +class DisplayControllerType(object): + """ + This is an enumeration class which controls where Alerts are placed on the + screen. + + ``Top`` + Place the text at the top of the screen. + + ``Middle`` + Place the text in the middle of the screen. + + ``Bottom`` + Place the text at the bottom of the screen. + """ + Live = 0 + Preview = 1 + Plugin = 2 + + from firsttimeform import FirstTimeForm from firsttimelanguageform import FirstTimeLanguageForm from themelayoutform import ThemeLayoutForm diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index d0d5779c7..fbd4ffc22 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -38,6 +38,7 @@ from openlp.core.ui.media import MediaState, MediaInfo, MediaType, \ get_media_players, set_media_players from openlp.core.ui.media.mediaplayer import MediaPlayer from openlp.core.utils import AppLocation +from openlp.core.ui import DisplayControllerType log = logging.getLogger(__name__) @@ -51,6 +52,7 @@ class MediaController(object): self.mainWindow = parent self.mediaPlayers = {} self.controller = [] + self.displayControllers = {} self.curDisplayMediaPlayer = {} # Timer for video state self.timer = QtCore.QTimer() @@ -116,7 +118,7 @@ class MediaController(object): def register_players(self, player): """ - Register each media Player controller (Webkit, Phonon, etc) and store + Register each media Player (Webkit, Phonon, etc) and store for later use ``player`` @@ -126,8 +128,7 @@ class MediaController(object): def check_available_media_players(self): """ - Check to see if we have any media Player's available. If Not do not - install the plugin. + Check to see if we have any media Player's available. """ log.debug(u'_check_available_media_players') controller_dir = os.path.join( @@ -221,7 +222,7 @@ class MediaController(object): html += player.get_media_display_html() return html - def register_controller(self, controller, control_panel): + def register_controller(self, controller ,source, control_panel): """ Registers media controls where the players will be placed to run. @@ -231,6 +232,7 @@ class MediaController(object): ``controller_panel`` The controllers toolbar where the widgets reside """ + #self.displayControllers[source] = controller self.controller.append(controller) self.setup_generic_controls(controller, control_panel) @@ -293,21 +295,23 @@ class MediaController(object): QtCore.SIGNAL(u'valueChanged(int)'), controller.sendToPlugins) - def setup_display(self, display): + def setup_display(self, display, preview): """ After a new display is configured, all media related widget will be created too ``display`` Display on which the output is to be played + + ``preview`` + Whether the display is a main or preview display """ # clean up possible running old media files self.finalise() # update player status self._set_active_players() display.hasAudio = True - if display == self.mainWindow.previewController.previewDisplay or \ - display == self.mainWindow.liveController.previewDisplay: + if preview: display.hasAudio = False for player in self.mediaPlayers.values(): if player.isActive: diff --git a/openlp/core/ui/media/playertab.py b/openlp/core/ui/media/playertab.py index 85d3daa1c..f84bd6316 100644 --- a/openlp/core/ui/media/playertab.py +++ b/openlp/core/ui/media/playertab.py @@ -46,7 +46,7 @@ class PlayerTab(SettingsTab): MediaTab is the Media settings tab in the settings dialog. """ def __init__(self, parent, mainWindow): - self.settingsForm = parent + self.parent = parent self.mainWindow = mainWindow self.mediaPlayers = mainWindow.mediaController.mediaPlayers self.savedUsedPlayers = None @@ -222,8 +222,8 @@ class PlayerTab(SettingsTab): def postSetUp(self, postUpdate=False): """ - Late stup for players as the MediaController has to be initialised - firest. + Late setup for players as the MediaController has to be initialised + first. """ for key, player in self.mediaPlayers.iteritems(): player = self.mediaPlayers[key] @@ -231,6 +231,7 @@ class PlayerTab(SettingsTab): checkbox.setEnabled(player.available) checkbox.setObjectName(player.name + u'CheckBox') checkbox.setToolTip(player.get_info()) + checkbox.setPlayerName(player.name) self.playerCheckBoxes[player.name] = checkbox QtCore.QObject.connect(checkbox,QtCore.SIGNAL(u'stateChanged(int)'), self.onPlayerCheckBoxChanged) @@ -239,6 +240,7 @@ class PlayerTab(SettingsTab): checkbox.setChecked(True) else: checkbox.setChecked(False) + self.updatePlayerList() self.retranslatePlayers() def retranslatePlayers(self): diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index ccd165f3c..0a99960d5 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -38,7 +38,8 @@ from openlp.core.lib import OpenLPToolbar, Receiver, ItemCapabilities, \ from openlp.core.lib.ui import UiStrings, create_action from openlp.core.lib.settings import Settings from openlp.core.lib import SlideLimits, ServiceItemAction -from openlp.core.ui import HideMode, MainDisplay, Display, ScreenList +from openlp.core.ui import HideMode, MainDisplay, Display, ScreenList, \ + DisplayControllerType from openlp.core.utils.actions import ActionList, CategoryOrder log = logging.getLogger(__name__) @@ -192,7 +193,9 @@ class SlideController(DisplayController): category=self.category, triggers=self.onSlideSelectedNextAction) self.toolbar.addAction(self.nextItem) self.toolbar.addSeparator() + self.controllerType = DisplayControllerType.Preview if self.isLive: + self.controllerType = DisplayControllerType.Live # Hide Menu self.hideMenu = QtGui.QToolButton(self.toolbar) self.hideMenu.setObjectName(u'hideMenu') @@ -270,7 +273,8 @@ class SlideController(DisplayController): 'Edit and reload song preview.'), triggers=self.onEditSong) self.controllerLayout.addWidget(self.toolbar) # Build the Media Toolbar - self.mediaController.register_controller(self, self.controllerLayout) + self.mediaController.register_controller(self, + self.controllerType, self.controllerLayout) if self.isLive: # Build the Song Toolbar self.songMenu = QtGui.QToolButton(self.toolbar) @@ -593,14 +597,14 @@ class SlideController(DisplayController): float(self.screens.current[u'size'].height()) except ZeroDivisionError: self.ratio = 1 - self.mediaController.setup_display(self.display) + self.mediaController.setup_display(self.display, False) self.previewSizeChanged() self.previewDisplay.setup() serviceItem = ServiceItem() self.previewDisplay.webView.setHtml(build_html(serviceItem, self.previewDisplay.screen, None, self.isLive, plugins=PluginManager.get_instance().plugins)) - self.mediaController.setup_display(self.previewDisplay) + self.mediaController.setup_display(self.previewDisplay,True) if self.serviceItem: self.refreshServiceItem() diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 319ff861a..77afade60 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -37,7 +37,7 @@ from openlp.core.lib import MediaManagerItem, build_icon, ItemCapabilities, \ from openlp.core.lib.settings import Settings from openlp.core.lib.ui import UiStrings, critical_error_message_box, \ create_horizontal_adjusting_combo_box -from openlp.core.ui import DisplayController, Display +from openlp.core.ui import DisplayController, Display, DisplayControllerType from openlp.core.ui.media import get_media_players, set_media_players from openlp.core.utils import locale_compare @@ -65,8 +65,9 @@ class MediaMediaItem(MediaManagerItem): self.mediaObject = None self.mediaController = DisplayController(parent) self.mediaController.controllerLayout = QtGui.QVBoxLayout() - self.plugin.mediaController.register_controller(self - .mediaController, self.mediaController.controllerLayout) + self.plugin.mediaController.register_controller(self.mediaController, + DisplayControllerType.Plugin, + self.mediaController.controllerLayout) self.plugin.mediaController.set_controls_visible(self.mediaController, False) self.mediaController.previewDisplay = Display(self.mediaController, @@ -76,15 +77,8 @@ class MediaMediaItem(MediaManagerItem): self.mediaController.previewDisplay.screen = \ {u'size':self.mediaController.previewDisplay.geometry()} self.mediaController.previewDisplay.setup() - serviceItem = ServiceItem() - self.mediaController.previewDisplay.webView.setHtml(build_html( - serviceItem, self.mediaController.previewDisplay.screen, None, - False, None)) - self.mediaController.previewDisplay.setup() self.plugin.mediaController.setup_display( - self.mediaController.previewDisplay) - self.mediaController.previewDisplay.hide() - + self.mediaController.previewDisplay, False) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'video_background_replaced'), self.videobackgroundReplaced) @@ -97,11 +91,6 @@ class MediaMediaItem(MediaManagerItem): def retranslateUi(self): self.onNewPrompt = translate('MediaPlugin.MediaItem', 'Select Media') - #self.onNewFileMasks = unicode(translate('MediaPlugin.MediaItem', - # 'Videos (%s);;Audio (%s);;%s (*)')) % ( - # u' '.join(self.plugin.video_extensions_list), - # u' '.join(self.plugin.audio_extensions_list), - # UiStrings().AllFiles) self.replaceAction.setText(UiStrings().ReplaceBG) self.replaceAction.setToolTip(UiStrings().ReplaceLiveBG) self.resetAction.setText(UiStrings().ResetBG) @@ -253,7 +242,7 @@ class MediaMediaItem(MediaManagerItem): def displaySetup(self): self.plugin.mediaController.setup_display( - self.mediaController.previewDisplay) + self.mediaController.previewDisplay, False) def populateDisplayTypes(self): """ From a997bfa001b6bfbc2e1856f75eb3aec7681df314 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 25 Oct 2012 20:16:56 +0100 Subject: [PATCH 25/58] Fix player selection and simplify media_length --- openlp/core/ui/media/mediacontroller.py | 24 +++++++++++------------- openlp/plugins/media/lib/mediaitem.py | 3 +-- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index fbd4ffc22..f632a6dc9 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -232,7 +232,7 @@ class MediaController(object): ``controller_panel`` The controllers toolbar where the widgets reside """ - #self.displayControllers[source] = controller + self.displayControllers[source] = controller self.controller.append(controller) self.setup_generic_controls(controller, control_panel) @@ -383,9 +383,9 @@ class MediaController(object): if controller.isLive: if controller.previewDisplay: display = controller.previewDisplay - isValid = self._check_file_type(controller, display) + isValid = self._check_file_type(controller, display, serviceItem) display = controller.display - isValid = self._check_file_type(controller, display) + isValid = self._check_file_type(controller, display, serviceItem) display.override[u'theme'] = u'' display.override[u'video'] = True if controller.media_info.is_background: @@ -398,7 +398,7 @@ class MediaController(object): controller.media_info.end_time = serviceItem.end_time elif controller.previewDisplay: display = controller.previewDisplay - isValid = self._check_file_type(controller, display) + isValid = self._check_file_type(controller, display, serviceItem) if not isValid: # Media could not be loaded correctly critical_error_message_box( @@ -434,16 +434,14 @@ class MediaController(object): log.debug(u'use %s controller' % self.curDisplayMediaPlayer[display]) return True - def media_length(self, controller, serviceItem): + def media_length(self, serviceItem): """ Loads and starts a media item to obtain the media length - ``controller`` - First element is the controller which should be used - ``serviceItem`` The ServiceItem containing the details to be played. """ + controller = self.displayControllers[DisplayControllerType.Plugin] log.debug(u'media_length') # stop running videos self.media_reset(controller) @@ -452,7 +450,7 @@ class MediaController(object): controller.media_info.file_info = QtCore.QFileInfo(serviceItem .get_filename()) display = controller.previewDisplay - if not self._check_file_type(controller, display): + if not self._check_file_type(controller, display, serviceItem): # Media could not be loaded correctly critical_error_message_box( translate('MediaPlugin.MediaItem', 'Unsupported File'), @@ -470,7 +468,7 @@ class MediaController(object): log.debug(u'use %s controller' % self.curDisplayMediaPlayer[display]) return True - def _check_file_type(self, controller, display): + def _check_file_type(self, controller, display, serviceItem): """ Select the correct media Player type from the prioritized Player list @@ -480,9 +478,9 @@ class MediaController(object): ``serviceItem`` The ServiceItem containing the details to be played. """ - usedPlayers, overriddenPlayer = get_media_players() - if overriddenPlayer and overriddenPlayer != u'auto': - usedPlayers = [overriddenPlayer] + usedPlayers = get_media_players()[0] + if serviceItem.title != u'Automatic': + usedPlayers = [serviceItem.title.lower()] if controller.media_info.file_info.isFile(): suffix = u'*.%s' % \ controller.media_info.file_info.suffix().toLower() diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 77afade60..80894fb69 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -208,8 +208,7 @@ class MediaMediaItem(MediaManagerItem): # Only get start and end times if going to a service if context == ServiceItemContext.Service: # Start media and obtain the length - if not self.plugin.mediaController.media_length( - self.mediaController, service_item): + if not self.plugin.mediaController.media_length(service_item): return False service_item.add_capability(ItemCapabilities.CanAutoStartForLive) service_item.add_capability(ItemCapabilities.RequiresMedia) From 34b4828c307ad4342555f28f827d25e5ba0264a5 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 25 Oct 2012 20:38:12 +0100 Subject: [PATCH 26/58] convert video api to registered controller --- openlp/core/ui/media/mediacontroller.py | 3 ++- openlp/core/ui/slidecontroller.py | 3 ++- openlp/plugins/media/lib/mediaitem.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index ab800aa6b..dd7bb3f8f 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -350,7 +350,7 @@ class MediaController(object): """ player.resize(display) - def video(self, controller, serviceItem, muted, isBackground, + def video(self, source, serviceItem, muted, isBackground, hidden=False): """ Loads and starts a video to run with the option of sound @@ -369,6 +369,7 @@ class MediaController(object): """ log.debug(u'video') isValid = False + controller = self.displayControllers[source] # stop running videos self.media_reset(controller) controller.media_info = MediaInfo() diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index f491d8780..bb6c29d8b 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -1355,7 +1355,8 @@ class SlideController(DisplayController): Respond to the arrival of a media service item """ log.debug(u'SlideController onMediaStart') - self.mediaController.video(self, item, False, False, self.hideMode()) + self.mediaController.video(self.controllerType, item, False, False, \ + self.hideMode()) if not self.isLive: self.previewDisplay.show() self.slidePreview.hide() diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 22691399e..1d0f101b1 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -175,7 +175,7 @@ class MediaMediaItem(MediaManagerItem): (path, name) = os.path.split(filename) service_item.add_from_command(path, name,CLAPPERBOARD) if self.plugin.liveController.mediaController.video( - self.plugin.liveController, service_item, True, True): + DisplayControllerType.Live, service_item, True, True): self.resetAction.setVisible(True) else: critical_error_message_box(UiStrings().LiveBGError, From 90a3493d89ed6e78954a880ab91ee22aa707e440 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 25 Oct 2012 21:33:28 +0100 Subject: [PATCH 27/58] Clean up video api --- openlp/core/ui/media/mediacontroller.py | 17 +++++++---------- openlp/core/ui/slidecontroller.py | 3 +-- openlp/plugins/media/lib/mediaitem.py | 3 +-- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index dd7bb3f8f..ec1d47433 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -350,20 +350,16 @@ class MediaController(object): """ player.resize(display) - def video(self, source, serviceItem, muted, isBackground, - hidden=False): + def video(self, source, serviceItem, hidden=False): """ Loads and starts a video to run with the option of sound + ``source`` + Where the call originated form + ``serviceItem`` The player which is doing the playing - ``muted`` - The player which is doing the playing - - ``isBackground`` - The player which is doing the playing - ``hidden`` The player which is doing the playing """ @@ -373,13 +369,14 @@ class MediaController(object): # stop running videos self.media_reset(controller) controller.media_info = MediaInfo() - if muted: + if source == DisplayControllerType.Plugin: controller.media_info.volume = 0 + controller.media_info.is_background = False else: controller.media_info.volume = controller.volumeSlider.value() + controller.media_info.is_background = True controller.media_info.file_info = \ QtCore.QFileInfo(serviceItem.get_filename()) - controller.media_info.is_background = isBackground display = None #self.curDisplayMediaPlayer[u'current'] = serviceItem.name if controller.isLive: diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index bb6c29d8b..25459cb47 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -1355,8 +1355,7 @@ class SlideController(DisplayController): Respond to the arrival of a media service item """ log.debug(u'SlideController onMediaStart') - self.mediaController.video(self.controllerType, item, False, False, \ - self.hideMode()) + self.mediaController.video(self.controllerType, item, self.hideMode()) if not self.isLive: self.previewDisplay.show() self.slidePreview.hide() diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 1d0f101b1..78ad801f2 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -161,7 +161,6 @@ class MediaMediaItem(MediaManagerItem): """ Called to replace Live background with the media selected. """ - # Todo fix me up if check_item_selected(self.listView, translate('MediaPlugin.MediaItem', 'You must select a media file to replace the background with.')): @@ -175,7 +174,7 @@ class MediaMediaItem(MediaManagerItem): (path, name) = os.path.split(filename) service_item.add_from_command(path, name,CLAPPERBOARD) if self.plugin.liveController.mediaController.video( - DisplayControllerType.Live, service_item, True, True): + DisplayControllerType.Live, service_item): self.resetAction.setVisible(True) else: critical_error_message_box(UiStrings().LiveBGError, From a5fc3ea3f762de3a9df9625a411e7405f898a0cd Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 25 Oct 2012 22:03:12 +0100 Subject: [PATCH 28/58] Fix bug --- openlp/core/ui/media/mediacontroller.py | 11 +++++++---- openlp/plugins/media/lib/mediaitem.py | 3 ++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index ec1d47433..0ebcf123e 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -350,7 +350,7 @@ class MediaController(object): """ player.resize(display) - def video(self, source, serviceItem, hidden=False): + def video(self, source, serviceItem, hidden=False, videoBehindText=False): """ Loads and starts a video to run with the option of sound @@ -362,6 +362,9 @@ class MediaController(object): ``hidden`` The player which is doing the playing + + ``videoBehindText`` + Is the video to be played behind text. """ log.debug(u'video') isValid = False @@ -369,12 +372,12 @@ class MediaController(object): # stop running videos self.media_reset(controller) controller.media_info = MediaInfo() - if source == DisplayControllerType.Plugin: + if videoBehindText: controller.media_info.volume = 0 - controller.media_info.is_background = False + controller.media_info.is_background = True else: controller.media_info.volume = controller.volumeSlider.value() - controller.media_info.is_background = True + controller.media_info.is_background = False controller.media_info.file_info = \ QtCore.QFileInfo(serviceItem.get_filename()) display = None diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 78ad801f2..1c6ebcd74 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -174,7 +174,8 @@ class MediaMediaItem(MediaManagerItem): (path, name) = os.path.split(filename) service_item.add_from_command(path, name,CLAPPERBOARD) if self.plugin.liveController.mediaController.video( - DisplayControllerType.Live, service_item): + DisplayControllerType.Live, service_item, + videoBehindText=True): self.resetAction.setVisible(True) else: critical_error_message_box(UiStrings().LiveBGError, From f645ab962c968977420bd7cd45d79b42517ca977 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 26 Oct 2012 21:20:23 +0100 Subject: [PATCH 29/58] Api cleanup --- openlp/core/ui/media/mediacontroller.py | 56 ++++++++++++++++++------- openlp/core/ui/slidecontroller.py | 2 +- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 0ebcf123e..6c10e824f 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -62,11 +62,11 @@ class MediaController(object): QtCore.QObject.connect(self.timer, QtCore.SIGNAL("timeout()"), self.media_state) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'playbackPlay'), self.media_play) + QtCore.SIGNAL(u'playbackPlay'), self.media_play_msg) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'playbackPause'), self.media_pause) + QtCore.SIGNAL(u'playbackPause'), self.media_pause_msg) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'playbackStop'), self.media_stop) + QtCore.SIGNAL(u'playbackStop'), self.media_stop_msg) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'seekSlider'), self.media_seek) QtCore.QObject.connect(Receiver.get_receiver(), @@ -381,11 +381,11 @@ class MediaController(object): controller.media_info.file_info = \ QtCore.QFileInfo(serviceItem.get_filename()) display = None - #self.curDisplayMediaPlayer[u'current'] = serviceItem.name if controller.isLive: if controller.previewDisplay: display = controller.previewDisplay - isValid = self._check_file_type(controller, display, serviceItem) + isValid = self._check_file_type(controller, display, + serviceItem) display = controller.display isValid = self._check_file_type(controller, display, serviceItem) display.override[u'theme'] = u'' @@ -426,7 +426,7 @@ class MediaController(object): QtCore.QVariant(False)).toBool(): autoplay = True if autoplay: - if not self.media_play([controller]): + if not self.media_play(controller): critical_error_message_box( translate('MediaPlugin.MediaItem', 'Unsupported File'), unicode(translate('MediaPlugin.MediaItem', @@ -459,14 +459,14 @@ class MediaController(object): unicode(translate('MediaPlugin.MediaItem', 'Unsupported File'))) return False - if not self.media_play([controller]): + if not self.media_play(controller): critical_error_message_box( translate('MediaPlugin.MediaItem', 'Unsupported File'), unicode(translate('MediaPlugin.MediaItem', 'Unsupported File'))) return False serviceItem.set_media_length(controller.media_info.length) - self.media_stop([controller]) + self.media_stop(controller) log.debug(u'use %s controller' % self.curDisplayMediaPlayer[display]) return True @@ -514,15 +514,25 @@ class MediaController(object): # no valid player found return False - def media_play(self, msg, status=True): + def media_play_msg(self, msg, status=True): """ Responds to the request to play a loaded video ``msg`` First element is the controller which should be used """ + log.debug(u'media_play_msg') + self.media_play(msg[0],status) + + + def media_play(self, controller, status=True): + """ + Responds to the request to play a loaded video + + ``controller`` + First element is the controller which should be used + """ log.debug(u'media_play') - controller = msg[0] for display in self.curDisplayMediaPlayer.keys(): if display.controller == controller: if not self.curDisplayMediaPlayer[display].play(display): @@ -539,7 +549,17 @@ class MediaController(object): self.timer.start() return True - def media_pause(self, msg): + def media_pause_msg(self, msg): + """ + Responds to the request to pause a loaded video + + ``msg`` + First element is the controller which should be used + """ + log.debug(u'media_pause_msg') + self.media_pause( msg[0]) + + def media_pause(self, controller): """ Responds to the request to pause a loaded video @@ -547,12 +567,21 @@ class MediaController(object): First element is the controller which should be used """ log.debug(u'media_pause') - controller = msg[0] for display in self.curDisplayMediaPlayer.keys(): if display.controller == controller: self.curDisplayMediaPlayer[display].pause(display) - def media_stop(self, msg): + def media_stop_msg(self, msg): + """ + Responds to the request to stop a loaded video + + ``msg`` + First element is the controller which should be used + """ + log.debug(u'media_stop_msg') + self.media_stop( msg[0]) + + def media_stop(self, controller): """ Responds to the request to stop a loaded video @@ -560,7 +589,6 @@ class MediaController(object): First element is the controller which should be used """ log.debug(u'media_stop') - controller = msg[0] for display in self.curDisplayMediaPlayer.keys(): if display.controller == controller: display.frame.evaluateJavaScript(u'show_blank("black");') diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 25459cb47..553d10c17 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -528,7 +528,7 @@ class SlideController(DisplayController): def liveEscape(self): self.display.setVisible(False) - self.mediaController.media_stop([self]) + self.mediaController.media_stop(self) def toggleDisplay(self, action): """ From a106244aba6fce214c09e8e20386a0cd3627384c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 28 Oct 2012 22:00:28 +0000 Subject: [PATCH 30/58] Zeoo Vol for preview and fix start / stop buttons --- openlp/core/ui/media/mediacontroller.py | 36 +++++++++++++++++++------ 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 6c10e824f..5706fb8fe 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -258,7 +258,8 @@ class MediaController(object): controller.mediabar.addToolbarAction(u'playbackPause', text=u'media_playback_pause', icon=u':/slides/media_playback_pause.png', - tooltip=translate('OpenLP.SlideController', 'Pause playing media.'), + tooltip=translate('OpenLP.SlideController', + 'Pause playing media.'), triggers=controller.sendToPlugins) controller.mediabar.addToolbarAction(u'playbackStop', text=u'media_playback_stop', @@ -382,10 +383,10 @@ class MediaController(object): QtCore.QFileInfo(serviceItem.get_filename()) display = None if controller.isLive: - if controller.previewDisplay: - display = controller.previewDisplay - isValid = self._check_file_type(controller, display, - serviceItem) + ##if controller.previewDisplay: + # display = controller.previewDisplay + # isValid = self._check_file_type(controller, display, + # serviceItem) display = controller.display isValid = self._check_file_type(controller, display, serviceItem) display.override[u'theme'] = u'' @@ -448,9 +449,9 @@ class MediaController(object): # stop running videos self.media_reset(controller) controller.media_info = MediaInfo() - controller.media_info.volume = controller.volumeSlider.value() + controller.media_info.volume = 0 controller.media_info.file_info = QtCore.QFileInfo(serviceItem - .get_filename()) + .get_filename()) display = controller.previewDisplay if not self._check_file_type(controller, display, serviceItem): # Media could not be loaded correctly @@ -480,6 +481,7 @@ class MediaController(object): ``serviceItem`` The ServiceItem containing the details to be played. """ + print display usedPlayers = get_media_players()[0] if serviceItem.title != u'Automatic': usedPlayers = [serviceItem.title.lower()] @@ -541,6 +543,12 @@ class MediaController(object): display.frame.evaluateJavaScript(u'show_blank("desktop");') self.curDisplayMediaPlayer[display].set_visible(display, True) + controller.mediabar.actions[u'playbackPlay']\ + .setVisible(False) + controller.mediabar.actions[u'playbackStop']\ + .setVisible(True) + controller.mediabar.actions[u'playbackPause']\ + .setVisible(True) if controller.isLive: if controller.hideMenu.defaultAction().isChecked(): controller.hideMenu.defaultAction().trigger() @@ -570,6 +578,12 @@ class MediaController(object): for display in self.curDisplayMediaPlayer.keys(): if display.controller == controller: self.curDisplayMediaPlayer[display].pause(display) + controller.mediabar.actions[u'playbackPlay']\ + .setVisible(True) + controller.mediabar.actions[u'playbackStop']\ + .setVisible(True) + controller.mediabar.actions[u'playbackPause']\ + .setVisible(False) def media_stop_msg(self, msg): """ @@ -579,7 +593,7 @@ class MediaController(object): First element is the controller which should be used """ log.debug(u'media_stop_msg') - self.media_stop( msg[0]) + self.media_stop(msg[0]) def media_stop(self, controller): """ @@ -595,6 +609,12 @@ class MediaController(object): self.curDisplayMediaPlayer[display].stop(display) self.curDisplayMediaPlayer[display].set_visible(display, False) controller.seekSlider.setSliderPosition(0) + controller.mediabar.actions[u'playbackPlay']\ + .setVisible(True) + controller.mediabar.actions[u'playbackStop']\ + .setVisible(False) + controller.mediabar.actions[u'playbackPause']\ + .setVisible(False) def media_volume(self, msg): """ From a1bd9013cb4975017f9cf72fdfa262567ca40b47 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 29 Oct 2012 17:25:08 +0000 Subject: [PATCH 31/58] Reference tidy up --- openlp/core/ui/media/mediacontroller.py | 126 ++++++++++++------------ openlp/core/ui/media/vlcplayer.py | 5 +- openlp/plugins/media/lib/mediaitem.py | 24 ++--- 3 files changed, 81 insertions(+), 74 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 5706fb8fe..012464cd3 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -370,6 +370,8 @@ class MediaController(object): log.debug(u'video') isValid = False controller = self.displayControllers[source] + print "video" + print source, controller # stop running videos self.media_reset(controller) controller.media_info = MediaInfo() @@ -381,13 +383,9 @@ class MediaController(object): controller.media_info.is_background = False controller.media_info.file_info = \ QtCore.QFileInfo(serviceItem.get_filename()) - display = None + display = self._define_display(controller) if controller.isLive: - ##if controller.previewDisplay: - # display = controller.previewDisplay - # isValid = self._check_file_type(controller, display, - # serviceItem) - display = controller.display + #display = controller.display isValid = self._check_file_type(controller, display, serviceItem) display.override[u'theme'] = u'' display.override[u'video'] = True @@ -400,7 +398,7 @@ class MediaController(object): display.serviceItem.start_time controller.media_info.end_time = serviceItem.end_time elif controller.previewDisplay: - display = controller.previewDisplay + #display = controller.previewDisplay isValid = self._check_file_type(controller, display, serviceItem) if not isValid: # Media could not be loaded correctly @@ -481,7 +479,7 @@ class MediaController(object): ``serviceItem`` The ServiceItem containing the details to be played. """ - print display + print "_check_file_type", controller,display usedPlayers = get_media_players()[0] if serviceItem.title != u'Automatic': usedPlayers = [serviceItem.title.lower()] @@ -532,26 +530,26 @@ class MediaController(object): Responds to the request to play a loaded video ``controller`` - First element is the controller which should be used + The controller to be played """ log.debug(u'media_play') - for display in self.curDisplayMediaPlayer.keys(): - if display.controller == controller: - if not self.curDisplayMediaPlayer[display].play(display): - return False - if status: - display.frame.evaluateJavaScript(u'show_blank("desktop");') - self.curDisplayMediaPlayer[display].set_visible(display, - True) - controller.mediabar.actions[u'playbackPlay']\ - .setVisible(False) - controller.mediabar.actions[u'playbackStop']\ - .setVisible(True) - controller.mediabar.actions[u'playbackPause']\ - .setVisible(True) - if controller.isLive: - if controller.hideMenu.defaultAction().isChecked(): - controller.hideMenu.defaultAction().trigger() + + display = self._define_display(controller) + if not self.curDisplayMediaPlayer[display].play(display): + return False + if status: + display.frame.evaluateJavaScript(u'show_blank("desktop");') + self.curDisplayMediaPlayer[display].set_visible(display, + True) + controller.mediabar.actions[u'playbackPlay']\ + .setVisible(False) + controller.mediabar.actions[u'playbackStop']\ + .setVisible(True) + controller.mediabar.actions[u'playbackPause']\ + .setVisible(True) + if controller.isLive: + if controller.hideMenu.defaultAction().isChecked(): + controller.hideMenu.defaultAction().trigger() # Start Timer for ui updates if not self.timer.isActive(): self.timer.start() @@ -571,19 +569,18 @@ class MediaController(object): """ Responds to the request to pause a loaded video - ``msg`` - First element is the controller which should be used + ``controller`` + The Controller to be paused """ log.debug(u'media_pause') - for display in self.curDisplayMediaPlayer.keys(): - if display.controller == controller: - self.curDisplayMediaPlayer[display].pause(display) - controller.mediabar.actions[u'playbackPlay']\ - .setVisible(True) - controller.mediabar.actions[u'playbackStop']\ - .setVisible(True) - controller.mediabar.actions[u'playbackPause']\ - .setVisible(False) + display = self._define_display(controller) + self.curDisplayMediaPlayer[display].pause(display) + controller.mediabar.actions[u'playbackPlay']\ + .setVisible(True) + controller.mediabar.actions[u'playbackStop']\ + .setVisible(True) + controller.mediabar.actions[u'playbackPause']\ + .setVisible(False) def media_stop_msg(self, msg): """ @@ -599,22 +596,22 @@ class MediaController(object): """ Responds to the request to stop a loaded video - ``msg`` - First element is the controller which should be used + ``controller`` + The controller that needs to be stopped """ log.debug(u'media_stop') - for display in self.curDisplayMediaPlayer.keys(): - if display.controller == controller: - display.frame.evaluateJavaScript(u'show_blank("black");') - self.curDisplayMediaPlayer[display].stop(display) - self.curDisplayMediaPlayer[display].set_visible(display, False) - controller.seekSlider.setSliderPosition(0) - controller.mediabar.actions[u'playbackPlay']\ - .setVisible(True) - controller.mediabar.actions[u'playbackStop']\ - .setVisible(False) - controller.mediabar.actions[u'playbackPause']\ - .setVisible(False) + display = self._define_display(controller) + if display in self.curDisplayMediaPlayer: + display.frame.evaluateJavaScript(u'show_blank("black");') + self.curDisplayMediaPlayer[display].stop(display) + self.curDisplayMediaPlayer[display].set_visible(display, False) + controller.seekSlider.setSliderPosition(0) + controller.mediabar.actions[u'playbackPlay']\ + .setVisible(True) + controller.mediabar.actions[u'playbackStop']\ + .setVisible(False) + controller.mediabar.actions[u'playbackPause']\ + .setVisible(False) def media_volume(self, msg): """ @@ -626,9 +623,8 @@ class MediaController(object): controller = msg[0] vol = msg[1][0] log.debug(u'media_volume %d' % vol) - for display in self.curDisplayMediaPlayer.keys(): - if display.controller == controller: - self.curDisplayMediaPlayer[display].volume(display, vol) + display = self._define_display(controller) + self.curDisplayMediaPlayer[display].volume(display, vol) def media_seek(self, msg): """ @@ -651,14 +647,14 @@ class MediaController(object): """ log.debug(u'media_reset') self.set_controls_visible(controller, False) - for display in self.curDisplayMediaPlayer.keys(): - if display.controller == controller: - display.override = {} - self.curDisplayMediaPlayer[display].reset(display) - self.curDisplayMediaPlayer[display].set_visible(display, False) - display.frame.evaluateJavaScript(u'show_video( \ + display = self._define_display(controller) + if display in self.curDisplayMediaPlayer: + display.override = {} + self.curDisplayMediaPlayer[display].reset(display) + self.curDisplayMediaPlayer[display].set_visible(display, False) + display.frame.evaluateJavaScript(u'show_video( \ "setBackBoard", null, null, null,"hidden");') - del self.curDisplayMediaPlayer[display] + del self.curDisplayMediaPlayer[display] def media_hide(self, msg): """ @@ -726,3 +722,11 @@ class MediaController(object): self.timer.stop() for controller in self.controller: self.media_reset(controller) + + def _define_display(self, controller): + """ + Extract the correct display for a given controller + """ + if controller.isLive: + return controller.display + return controller.previewDisplay diff --git a/openlp/core/ui/media/vlcplayer.py b/openlp/core/ui/media/vlcplayer.py index a90478fc1..fd619ffbc 100644 --- a/openlp/core/ui/media/vlcplayer.py +++ b/openlp/core/ui/media/vlcplayer.py @@ -175,9 +175,12 @@ class VlcPlayer(MediaPlayer): display.vlcWidget.resize(display.size()) def play(self, display): + print "vlc play",display controller = display.controller + print controller start_time = 0 - if controller.media_info.start_time > 0: + if self.state != MediaState.Paused and\ + controller.media_info.start_time > 0: start_time = controller.media_info.start_time display.vlcMediaPlayer.play() if not self.media_state_wait(display, vlc.State.Playing): diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 1c6ebcd74..0ef5dd2f5 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -64,22 +64,22 @@ class MediaMediaItem(MediaManagerItem): self.singleServiceItem = False self.hasSearch = True self.mediaObject = None - self.mediaController = DisplayController(parent) - self.mediaController.controllerLayout = QtGui.QVBoxLayout() - self.plugin.mediaController.register_controller(self.mediaController, + self.displayController = DisplayController(parent) + self.displayController.controllerLayout = QtGui.QVBoxLayout() + self.plugin.mediaController.register_controller(self.displayController, DisplayControllerType.Plugin, - self.mediaController.controllerLayout) - self.plugin.mediaController.set_controls_visible(self.mediaController, + self.displayController.controllerLayout) + self.plugin.mediaController.set_controls_visible(self.displayController, False) - self.mediaController.previewDisplay = Display(self.mediaController, - False, self.mediaController) - self.mediaController.previewDisplay.setGeometry( + self.displayController.previewDisplay = Display(self.displayController, + False, self.displayController) + self.displayController.previewDisplay.setGeometry( QtCore.QRect(0, 0, 300, 300)) - self.mediaController.previewDisplay.screen = \ - {u'size':self.mediaController.previewDisplay.geometry()} - self.mediaController.previewDisplay.setup() + self.displayController.previewDisplay.screen = \ + {u'size':self.displayController.previewDisplay.geometry()} + self.displayController.previewDisplay.setup() self.plugin.mediaController.setup_display( - self.mediaController.previewDisplay, False) + self.displayController.previewDisplay, False) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'video_background_replaced'), self.videobackgroundReplaced) From 5b7b2ecfb97d066c1c8d50b2311d6ed8d1401d8f Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 29 Oct 2012 16:54:39 +0000 Subject: [PATCH 32/58] Api clean up --- openlp/core/ui/media/mediacontroller.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 012464cd3..63fa16c24 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -338,7 +338,7 @@ class MediaController(object): self.mediaPlayers[u'webkit']: controller.display.setTransparency(False) - def resize(self, controller, display, player): + def resize(self, display, player): """ After Mainwindow changes or Splitter moved all related media widgets have to be resized @@ -492,7 +492,7 @@ class MediaController(object): if not controller.media_info.is_background or \ controller.media_info.is_background and \ player.canBackground: - self.resize(controller, display, player) + self.resize(display, player) if player.load(display): self.curDisplayMediaPlayer[display] = player controller.media_info.media_type = MediaType.Video From 29ec487d5880b75de5d58a381859e6cc8c18b8f8 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 30 Oct 2012 19:38:48 +0000 Subject: [PATCH 33/58] Remove old controller stack --- openlp/core/ui/media/mediacontroller.py | 6 ++---- openlp/core/ui/media/vlcplayer.py | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 63fa16c24..3e2f34fcd 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -52,7 +52,6 @@ class MediaController(object): def __init__(self, parent): self.mainWindow = parent self.mediaPlayers = {} - self.controller = [] self.displayControllers = {} self.curDisplayMediaPlayer = {} # Timer for video state @@ -234,7 +233,6 @@ class MediaController(object): The controllers toolbar where the widgets reside """ self.displayControllers[source] = controller - self.controller.append(controller) self.setup_generic_controls(controller, control_panel) def setup_generic_controls(self, controller, control_panel): @@ -720,8 +718,8 @@ class MediaController(object): def finalise(self): self.timer.stop() - for controller in self.controller: - self.media_reset(controller) + for controller in self.displayControllers: + self.media_reset(self.displayControllers[controller]) def _define_display(self, controller): """ diff --git a/openlp/core/ui/media/vlcplayer.py b/openlp/core/ui/media/vlcplayer.py index fd619ffbc..55da7fc34 100644 --- a/openlp/core/ui/media/vlcplayer.py +++ b/openlp/core/ui/media/vlcplayer.py @@ -179,7 +179,7 @@ class VlcPlayer(MediaPlayer): controller = display.controller print controller start_time = 0 - if self.state != MediaState.Paused and\ + if self.state != MediaState.Paused and \ controller.media_info.start_time > 0: start_time = controller.media_info.start_time display.vlcMediaPlayer.play() From 6c121bda1a3f900f352451660c5696571e16a4bc Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 31 Oct 2012 18:04:24 +0000 Subject: [PATCH 34/58] Api simplifications and removal of unneeded variables --- openlp/core/ui/media/mediacontroller.py | 99 +++++++++++-------------- openlp/core/ui/media/vlcplayer.py | 2 - openlp/core/ui/media/webkitplayer.py | 2 +- openlp/core/ui/slidecontroller.py | 4 +- openlp/plugins/media/lib/mediaitem.py | 4 +- 5 files changed, 49 insertions(+), 62 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 3e2f34fcd..21c2b343b 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -53,7 +53,7 @@ class MediaController(object): self.mainWindow = parent self.mediaPlayers = {} self.displayControllers = {} - self.curDisplayMediaPlayer = {} + self.currentMediaPlayer = {} # Timer for video state self.timer = QtCore.QTimer() self.timer.setInterval(200) @@ -177,18 +177,18 @@ class MediaController(object): Check if there is a running media Player and do updating stuff (e.g. update the UI) """ - if not self.curDisplayMediaPlayer.keys(): + if not self.currentMediaPlayer.keys(): self.timer.stop() else: - for display in self.curDisplayMediaPlayer.keys(): - self.curDisplayMediaPlayer[display].resize(display) - self.curDisplayMediaPlayer[display].update_ui(display) - if self.curDisplayMediaPlayer[display].state == \ + for display in self.currentMediaPlayer.keys(): + self.currentMediaPlayer[display].resize(display) + self.currentMediaPlayer[display].update_ui(display) + if self.currentMediaPlayer[display].state == \ MediaState.Playing: return # no players are active anymore - for display in self.curDisplayMediaPlayer.keys(): - if self.curDisplayMediaPlayer[display].state != MediaState.Paused: + for display in self.currentMediaPlayer.keys(): + if self.currentMediaPlayer[display].state != MediaState.Paused: display.controller.seekSlider.setSliderPosition(0) self.timer.stop() @@ -222,28 +222,22 @@ class MediaController(object): html += player.get_media_display_html() return html - def register_controller(self, controller ,source, control_panel): + def register_controller(self, controller): """ Registers media controls where the players will be placed to run. ``controller`` The controller where a player will be placed - - ``controller_panel`` - The controllers toolbar where the widgets reside """ - self.displayControllers[source] = controller - self.setup_generic_controls(controller, control_panel) + self.displayControllers[controller.controllerType] = controller + self.setup_generic_controls(controller) - def setup_generic_controls(self, controller, control_panel): + def setup_generic_controls(self, controller): """ Set up controls on the control_panel for a given controller ``controller`` First element is the controller which should be used - - ``controller_panel`` - First element is the controller which should be used """ controller.media_info = MediaInfo() # Build a Media ToolBar @@ -286,7 +280,7 @@ class MediaController(object): controller.volumeSlider.setGeometry(QtCore.QRect(90, 160, 221, 24)) controller.volumeSlider.setObjectName(u'volumeSlider') controller.mediabar.addToolbarWidget(controller.volumeSlider) - control_panel.addWidget(controller.mediabar) + controller.controllerLayout.addWidget(controller.mediabar) controller.mediabar.setVisible(False) # Signals QtCore.QObject.connect(controller.seekSlider, @@ -331,8 +325,8 @@ class MediaController(object): # Generic controls controller.mediabar.setVisible(value) if controller.isLive and controller.display: - if self.curDisplayMediaPlayer and value: - if self.curDisplayMediaPlayer[controller.display] != \ + if self.currentMediaPlayer and value: + if self.currentMediaPlayer[controller.display] != \ self.mediaPlayers[u'webkit']: controller.display.setTransparency(False) @@ -368,8 +362,6 @@ class MediaController(object): log.debug(u'video') isValid = False controller = self.displayControllers[source] - print "video" - print source, controller # stop running videos self.media_reset(controller) controller.media_info = MediaInfo() @@ -430,7 +422,7 @@ class MediaController(object): 'Unsupported File'))) return False self.set_controls_visible(controller, True) - log.debug(u'use %s controller' % self.curDisplayMediaPlayer[display]) + log.debug(u'use %s controller' % self.currentMediaPlayer[display]) return True def media_length(self, serviceItem): @@ -464,7 +456,7 @@ class MediaController(object): return False serviceItem.set_media_length(controller.media_info.length) self.media_stop(controller) - log.debug(u'use %s controller' % self.curDisplayMediaPlayer[display]) + log.debug(u'use %s controller' % self.currentMediaPlayer[display]) return True def _check_file_type(self, controller, display, serviceItem): @@ -477,7 +469,6 @@ class MediaController(object): ``serviceItem`` The ServiceItem containing the details to be played. """ - print "_check_file_type", controller,display usedPlayers = get_media_players()[0] if serviceItem.title != u'Automatic': usedPlayers = [serviceItem.title.lower()] @@ -492,12 +483,12 @@ class MediaController(object): player.canBackground: self.resize(display, player) if player.load(display): - self.curDisplayMediaPlayer[display] = player + self.currentMediaPlayer[display] = player controller.media_info.media_type = MediaType.Video return True if suffix in player.audio_extensions_list: if player.load(display): - self.curDisplayMediaPlayer[display] = player + self.currentMediaPlayer[display] = player controller.media_info.media_type = MediaType.Audio return True else: @@ -506,7 +497,7 @@ class MediaController(object): if player.canFolder: self.resize(controller, display, player) if player.load(display): - self.curDisplayMediaPlayer[display] = player + self.currentMediaPlayer[display] = player controller.media_info.media_type = MediaType.Video return True # no valid player found @@ -533,11 +524,11 @@ class MediaController(object): log.debug(u'media_play') display = self._define_display(controller) - if not self.curDisplayMediaPlayer[display].play(display): + if not self.currentMediaPlayer[display].play(display): return False if status: display.frame.evaluateJavaScript(u'show_blank("desktop");') - self.curDisplayMediaPlayer[display].set_visible(display, + self.currentMediaPlayer[display].set_visible(display, True) controller.mediabar.actions[u'playbackPlay']\ .setVisible(False) @@ -572,7 +563,7 @@ class MediaController(object): """ log.debug(u'media_pause') display = self._define_display(controller) - self.curDisplayMediaPlayer[display].pause(display) + self.currentMediaPlayer[display].pause(display) controller.mediabar.actions[u'playbackPlay']\ .setVisible(True) controller.mediabar.actions[u'playbackStop']\ @@ -599,10 +590,10 @@ class MediaController(object): """ log.debug(u'media_stop') display = self._define_display(controller) - if display in self.curDisplayMediaPlayer: + if display in self.currentMediaPlayer: display.frame.evaluateJavaScript(u'show_blank("black");') - self.curDisplayMediaPlayer[display].stop(display) - self.curDisplayMediaPlayer[display].set_visible(display, False) + self.currentMediaPlayer[display].stop(display) + self.currentMediaPlayer[display].set_visible(display, False) controller.seekSlider.setSliderPosition(0) controller.mediabar.actions[u'playbackPlay']\ .setVisible(True) @@ -622,7 +613,7 @@ class MediaController(object): vol = msg[1][0] log.debug(u'media_volume %d' % vol) display = self._define_display(controller) - self.curDisplayMediaPlayer[display].volume(display, vol) + self.currentMediaPlayer[display].volume(display, vol) def media_seek(self, msg): """ @@ -635,9 +626,9 @@ class MediaController(object): log.debug(u'media_seek') controller = msg[0] seekVal = msg[1][0] - for display in self.curDisplayMediaPlayer.keys(): + for display in self.currentMediaPlayer.keys(): if display.controller == controller: - self.curDisplayMediaPlayer[display].seek(display, seekVal) + self.currentMediaPlayer[display].seek(display, seekVal) def media_reset(self, controller): """ @@ -646,13 +637,13 @@ class MediaController(object): log.debug(u'media_reset') self.set_controls_visible(controller, False) display = self._define_display(controller) - if display in self.curDisplayMediaPlayer: + if display in self.currentMediaPlayer: display.override = {} - self.curDisplayMediaPlayer[display].reset(display) - self.curDisplayMediaPlayer[display].set_visible(display, False) + self.currentMediaPlayer[display].reset(display) + self.currentMediaPlayer[display].set_visible(display, False) display.frame.evaluateJavaScript(u'show_video( \ "setBackBoard", null, null, null,"hidden");') - del self.curDisplayMediaPlayer[display] + del self.currentMediaPlayer[display] def media_hide(self, msg): """ @@ -665,12 +656,12 @@ class MediaController(object): if not isLive: return controller = self.mainWindow.liveController - for display in self.curDisplayMediaPlayer.keys(): + for display in self.currentMediaPlayer.keys(): if display.controller != controller or \ - self.curDisplayMediaPlayer[display].state != MediaState.Playing: + self.currentMediaPlayer[display].state != MediaState.Playing: continue - self.curDisplayMediaPlayer[display].pause(display) - self.curDisplayMediaPlayer[display].set_visible(display, False) + self.currentMediaPlayer[display].pause(display) + self.currentMediaPlayer[display].set_visible(display, False) def media_blank(self, msg): """ @@ -686,12 +677,12 @@ class MediaController(object): return Receiver.send_message(u'live_display_hide', hide_mode) controller = self.mainWindow.liveController - for display in self.curDisplayMediaPlayer.keys(): + for display in self.currentMediaPlayer.keys(): if display.controller != controller or \ - self.curDisplayMediaPlayer[display].state != MediaState.Playing: + self.currentMediaPlayer[display].state != MediaState.Playing: continue - self.curDisplayMediaPlayer[display].pause(display) - self.curDisplayMediaPlayer[display].set_visible(display, False) + self.currentMediaPlayer[display].pause(display) + self.currentMediaPlayer[display].set_visible(display, False) def media_unblank(self, msg): """ @@ -706,12 +697,12 @@ class MediaController(object): if not isLive: return controller = self.mainWindow.liveController - for display in self.curDisplayMediaPlayer.keys(): + for display in self.currentMediaPlayer.keys(): if display.controller != controller or \ - self.curDisplayMediaPlayer[display].state != MediaState.Paused: + self.currentMediaPlayer[display].state != MediaState.Paused: continue - if self.curDisplayMediaPlayer[display].play(display): - self.curDisplayMediaPlayer[display].set_visible(display, True) + if self.currentMediaPlayer[display].play(display): + self.currentMediaPlayer[display].set_visible(display, True) # Start Timer for ui updates if not self.timer.isActive(): self.timer.start() diff --git a/openlp/core/ui/media/vlcplayer.py b/openlp/core/ui/media/vlcplayer.py index 55da7fc34..007b2dd74 100644 --- a/openlp/core/ui/media/vlcplayer.py +++ b/openlp/core/ui/media/vlcplayer.py @@ -175,9 +175,7 @@ class VlcPlayer(MediaPlayer): display.vlcWidget.resize(display.size()) def play(self, display): - print "vlc play",display controller = display.controller - print controller start_time = 0 if self.state != MediaState.Paused and \ controller.media_info.start_time > 0: diff --git a/openlp/core/ui/media/webkitplayer.py b/openlp/core/ui/media/webkitplayer.py index d65c90d55..d96b03cd3 100644 --- a/openlp/core/ui/media/webkitplayer.py +++ b/openlp/core/ui/media/webkitplayer.py @@ -333,7 +333,7 @@ class WebkitPlayer(MediaPlayer): return True def resize(self, display): - controller = display.controller + #controller = display.controller display.webView.resize(display.size()) def play(self, display): diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 553d10c17..628a3ea7d 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -65,6 +65,7 @@ class DisplayController(QtGui.QWidget): QtGui.QWidget.__init__(self, parent) self.isLive = isLive self.display = None + self.controllerType = DisplayControllerType.Plugin def sendToPlugins(self, *args): """ @@ -274,8 +275,7 @@ class SlideController(DisplayController): 'Edit and reload song preview.'), triggers=self.onEditSong) self.controllerLayout.addWidget(self.toolbar) # Build the Media Toolbar - self.mediaController.register_controller(self, - self.controllerType, self.controllerLayout) + self.mediaController.register_controller(self) if self.isLive: # Build the Song Toolbar self.songMenu = QtGui.QToolButton(self.toolbar) diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 0ef5dd2f5..d6cef76cb 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -66,9 +66,7 @@ class MediaMediaItem(MediaManagerItem): self.mediaObject = None self.displayController = DisplayController(parent) self.displayController.controllerLayout = QtGui.QVBoxLayout() - self.plugin.mediaController.register_controller(self.displayController, - DisplayControllerType.Plugin, - self.displayController.controllerLayout) + self.plugin.mediaController.register_controller(self.displayController) self.plugin.mediaController.set_controls_visible(self.displayController, False) self.displayController.previewDisplay = Display(self.displayController, From 1145d661a5265aae474fa62be9436fe5ce038dcb Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 31 Oct 2012 18:27:24 +0000 Subject: [PATCH 35/58] more tidyups --- openlp/core/ui/media/mediacontroller.py | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 21c2b343b..0f41eb8fb 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -656,10 +656,8 @@ class MediaController(object): if not isLive: return controller = self.mainWindow.liveController - for display in self.currentMediaPlayer.keys(): - if display.controller != controller or \ - self.currentMediaPlayer[display].state != MediaState.Playing: - continue + display = self._define_display(controller) + if self.currentMediaPlayer[display].state == MediaState.Playing: self.currentMediaPlayer[display].pause(display) self.currentMediaPlayer[display].set_visible(display, False) @@ -677,10 +675,8 @@ class MediaController(object): return Receiver.send_message(u'live_display_hide', hide_mode) controller = self.mainWindow.liveController - for display in self.currentMediaPlayer.keys(): - if display.controller != controller or \ - self.currentMediaPlayer[display].state != MediaState.Playing: - continue + display = self._define_display(controller) + if self.currentMediaPlayer[display].state == MediaState.Playing: self.currentMediaPlayer[display].pause(display) self.currentMediaPlayer[display].set_visible(display, False) @@ -697,10 +693,8 @@ class MediaController(object): if not isLive: return controller = self.mainWindow.liveController - for display in self.currentMediaPlayer.keys(): - if display.controller != controller or \ - self.currentMediaPlayer[display].state != MediaState.Paused: - continue + display = self._define_display(controller) + if self.currentMediaPlayer[display].state != MediaState.Playing: if self.currentMediaPlayer[display].play(display): self.currentMediaPlayer[display].set_visible(display, True) # Start Timer for ui updates @@ -715,6 +709,9 @@ class MediaController(object): def _define_display(self, controller): """ Extract the correct display for a given controller + + ``controller`` + Controller to be used """ if controller.isLive: return controller.display From b01fd0b293b598eb5e59839cef652c51a15e95a4 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 1 Nov 2012 16:36:45 +0000 Subject: [PATCH 36/58] SaveAs lite validation --- openlp/core/ui/servicemanager.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 0000bf0f1..9ea908f0c 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -630,7 +630,6 @@ class ServiceManager(QtGui.QWidget): self.mainwindow.serviceManagerSettingsSection, path) service = [] - total_size = 0 Receiver.send_message(u'cursor_busy') # Number of items + 1 to zip it self.mainwindow.displayProgressBar(len(self.serviceItems) + 1) @@ -638,18 +637,16 @@ class ServiceManager(QtGui.QWidget): self.mainwindow.incrementProgressBar() service_item = item[u'service_item']. \ get_service_repr(self._saveLite) + #@todo check for file item on save. service.append({u'serviceitem': service_item}) + self.mainwindow.incrementProgressBar() service_content = cPickle.dumps(service) - # Usual Zip file cannot exceed 2GiB, file with Zip64 cannot be - # extracted using unzip in UNIX. - allow_zip_64 = (total_size > 2147483648 + len(service_content)) - log.debug(u'ServiceManager.saveFile - allowZip64 is %s' % allow_zip_64) zip = None success = True self.mainwindow.incrementProgressBar() try: zip = zipfile.ZipFile(temp_file_name, 'w', zipfile.ZIP_STORED, - allow_zip_64) + True) # First we add service contents. zip.writestr(service_file_name.encode(u'utf-8'), service_content) except IOError: @@ -712,11 +709,17 @@ class ServiceManager(QtGui.QWidget): directory = unicode(SettingsManager.get_last_dir( self.mainwindow.serviceManagerSettingsSection)) path = os.path.join(directory, default_filename) - fileName = unicode(QtGui.QFileDialog.getSaveFileName(self.mainwindow, - UiStrings().SaveService, path, - translate('OpenLP.ServiceManager', - 'OpenLP Service Files (*.osz);;' - 'OpenLP Service Files - lite (*.oszl)'))) + if self._fileName.endswith(u'oszl'): + fileName = unicode(QtGui.QFileDialog.getSaveFileName( + self.mainwindow, UiStrings().SaveService, path, + translate('OpenLP.ServiceManager', + 'OpenLP Service Files (*.osz);;' + 'OpenLP Service Files - lite (*.oszl)'))) + else: + fileName = unicode(QtGui.QFileDialog.getSaveFileName( + self.mainwindow, UiStrings().SaveService, path, + translate('OpenLP.ServiceManager', + 'OpenLP Service Files (*.osz);;'))) if not fileName: return False if os.path.splitext(fileName)[1] == u'': @@ -733,7 +736,6 @@ class ServiceManager(QtGui.QWidget): """ if not self.fileName(): return self.saveFileAs() - print "decideSaveMethod",self._saveLite if self._saveLite: return self.saveLocalFile() else: @@ -1214,10 +1216,12 @@ class ServiceManager(QtGui.QWidget): Validates the service item and if the suffix matches an accepted one it allows the item to be displayed. """ + #@todo check file items exist if serviceItem.is_command(): type = serviceItem._raw_frames[0][u'title'].split(u'.')[-1] if type.lower() not in self.suffixes: serviceItem.is_valid = False + #@todo check file items exist def cleanUp(self): """ From a91dc027d23d97166eae515c380c9cfe95bd26bd Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 1 Nov 2012 16:54:37 +0000 Subject: [PATCH 37/58] Documentation --- openlp/core/ui/media/mediacontroller.py | 8 ++++++++ openlp/core/ui/servicemanager.py | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 0f41eb8fb..3ef662fa2 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -47,6 +47,14 @@ class MediaController(object): """ The implementation of the Media Controller. The Media Controller adds an own class for every Player. Currently these are QtWebkit, Phonon and Vlc. + + displayControllers are an array of controllers keyed on the + slidecontroller or plugin which built them. ControllerType is the class + containing the keys. + + mediaPlayers are an array of media players keyed on player name + + currentMediaPlayer is an array of player instances keyed on fix me. """ def __init__(self, parent): diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 9ea908f0c..109b86ac9 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -709,7 +709,9 @@ class ServiceManager(QtGui.QWidget): directory = unicode(SettingsManager.get_last_dir( self.mainwindow.serviceManagerSettingsSection)) path = os.path.join(directory, default_filename) - if self._fileName.endswith(u'oszl'): + # 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. + if self._fileName.endswith(u'oszl') or not self._fileName: fileName = unicode(QtGui.QFileDialog.getSaveFileName( self.mainwindow, UiStrings().SaveService, path, translate('OpenLP.ServiceManager', From 604765774126d842fe2e8452a4aa0198f6691cfe Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 1 Nov 2012 18:45:12 +0000 Subject: [PATCH 38/58] cleanups and minor fixes --- openlp/core/ui/media/mediacontroller.py | 37 ++++++++++++------------- openlp/core/ui/media/playertab.py | 3 -- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 3ef662fa2..924f2a9d6 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -50,11 +50,12 @@ class MediaController(object): displayControllers are an array of controllers keyed on the slidecontroller or plugin which built them. ControllerType is the class - containing the keys. + containing the key values. - mediaPlayers are an array of media players keyed on player name + mediaPlayers are an array of media players keyed on player name. + + currentMediaPlayer is an array of player instances keyed on @fixme. - currentMediaPlayer is an array of player instances keyed on fix me. """ def __init__(self, parent): @@ -148,8 +149,8 @@ class MediaController(object): if sys.platform == 'darwin' and filename == 'vlcplayer.py': log.warn(u'Disabling vlc media player') continue - if filename.endswith(u'player.py')and not\ - filename == 'mediaplayer.py': + if filename.endswith(u'player.py') and \ + not filename == 'mediaplayer.py': path = os.path.join(controller_dir, filename) if os.path.isfile(path): modulename = u'openlp.core.ui.media.' + \ @@ -503,7 +504,7 @@ class MediaController(object): for title in usedPlayers: player = self.mediaPlayers[title] if player.canFolder: - self.resize(controller, display, player) + self.resize(display, player) if player.load(display): self.currentMediaPlayer[display] = player controller.media_info.media_type = MediaType.Video @@ -530,7 +531,6 @@ class MediaController(object): The controller to be played """ log.debug(u'media_play') - display = self._define_display(controller) if not self.currentMediaPlayer[display].play(display): return False @@ -538,11 +538,11 @@ class MediaController(object): display.frame.evaluateJavaScript(u'show_blank("desktop");') self.currentMediaPlayer[display].set_visible(display, True) - controller.mediabar.actions[u'playbackPlay']\ + controller.mediabar.actions[u'playbackPlay'] \ .setVisible(False) - controller.mediabar.actions[u'playbackStop']\ + controller.mediabar.actions[u'playbackStop'] \ .setVisible(True) - controller.mediabar.actions[u'playbackPause']\ + controller.mediabar.actions[u'playbackPause'] \ .setVisible(True) if controller.isLive: if controller.hideMenu.defaultAction().isChecked(): @@ -572,11 +572,11 @@ class MediaController(object): log.debug(u'media_pause') display = self._define_display(controller) self.currentMediaPlayer[display].pause(display) - controller.mediabar.actions[u'playbackPlay']\ + controller.mediabar.actions[u'playbackPlay'] \ .setVisible(True) - controller.mediabar.actions[u'playbackStop']\ + controller.mediabar.actions[u'playbackStop'] \ .setVisible(True) - controller.mediabar.actions[u'playbackPause']\ + controller.mediabar.actions[u'playbackPause'] \ .setVisible(False) def media_stop_msg(self, msg): @@ -603,11 +603,11 @@ class MediaController(object): self.currentMediaPlayer[display].stop(display) self.currentMediaPlayer[display].set_visible(display, False) controller.seekSlider.setSliderPosition(0) - controller.mediabar.actions[u'playbackPlay']\ + controller.mediabar.actions[u'playbackPlay'] \ .setVisible(True) - controller.mediabar.actions[u'playbackStop']\ + controller.mediabar.actions[u'playbackStop'] \ .setVisible(False) - controller.mediabar.actions[u'playbackPause']\ + controller.mediabar.actions[u'playbackPause'] \ .setVisible(False) def media_volume(self, msg): @@ -634,9 +634,8 @@ class MediaController(object): log.debug(u'media_seek') controller = msg[0] seekVal = msg[1][0] - for display in self.currentMediaPlayer.keys(): - if display.controller == controller: - self.currentMediaPlayer[display].seek(display, seekVal) + display = self._define_display(controller) + self.currentMediaPlayer[display].seek(display, seekVal) def media_reset(self, controller): """ diff --git a/openlp/core/ui/media/playertab.py b/openlp/core/ui/media/playertab.py index f84bd6316..3844975db 100644 --- a/openlp/core/ui/media/playertab.py +++ b/openlp/core/ui/media/playertab.py @@ -78,7 +78,6 @@ class PlayerTab(SettingsTab): self.rightColumn.setSizePolicy( QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) self.rightLayout.addStretch() - self.mediaPlayerGroupBox = QtGui.QGroupBox(self.leftColumn) self.mediaPlayerGroupBox.setObjectName(u'mediaPlayerGroupBox') self.mediaPlayerLayout = QtGui.QVBoxLayout(self.mediaPlayerGroupBox) @@ -208,8 +207,6 @@ class PlayerTab(SettingsTab): settings.beginGroup(self.settingsSection) settings.setValue(u'background color', QtCore.QVariant(self.bg_color)) settings.endGroup() - if self.initial_color != self.bg_color: - Receiver.send_message(u'image_updated') old_players, override_player = get_media_players() if self.usedPlayers != old_players: # clean old Media stuff From 8cd8d07d2c9456ebb6c7afc4c7204a5f37842118 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 1 Nov 2012 18:57:07 +0000 Subject: [PATCH 39/58] missing rename --- openlp/core/ui/media/mediacontroller.py | 1 - openlp/plugins/media/lib/mediaitem.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 924f2a9d6..7903900a5 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -57,7 +57,6 @@ class MediaController(object): currentMediaPlayer is an array of player instances keyed on @fixme. """ - def __init__(self, parent): self.mainWindow = parent self.mediaPlayers = {} diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index d6cef76cb..8508664e2 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -240,7 +240,7 @@ class MediaMediaItem(MediaManagerItem): def displaySetup(self): self.plugin.mediaController.setup_display( - self.mediaController.previewDisplay, False) + self.displayController.previewDisplay, False) def populateDisplayTypes(self): """ From 751246ce0c247260df2aa4493ef67483021ca308 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 4 Nov 2012 20:11:10 +0000 Subject: [PATCH 40/58] Merge cleanups --- openlp/core/lib/mediamanageritem.py | 1 - openlp/core/lib/serviceitem.py | 2 -- openlp/core/ui/__init__.py | 15 +++------------ openlp/core/ui/media/__init__.py | 2 +- openlp/core/ui/media/mediacontroller.py | 4 +--- openlp/core/ui/media/playertab.py | 9 +++++---- openlp/core/ui/media/vendor/__init__.py | 13 +++++++------ openlp/core/ui/media/webkitplayer.py | 1 - openlp/core/ui/servicemanager.py | 2 -- openlp/plugins/media/lib/mediaitem.py | 2 +- 10 files changed, 18 insertions(+), 33 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 059c92ecc..38caef805 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -336,7 +336,6 @@ class MediaManagerItem(QtGui.QWidget): """ Add a file to the list widget to make it available for showing """ - print self.onNewFileMasks files = QtGui.QFileDialog.getOpenFileNames( self, self.onNewPrompt, SettingsManager.get_last_dir(self.settingsSection), diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index c37ae1d2e..6d4843333 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -462,7 +462,6 @@ class ServiceItem(object): """ return os.path.join(self.get_frame_path(), self.get_frame_title()) - def get_frames(self): """ Returns the frames for the ServiceItem @@ -475,7 +474,6 @@ class ServiceItem(object): def get_rendered_frame(self, row): """ Returns the correct frame for a given list and renders it if required. - ``row`` The service item slide to be returned """ diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index ef9f6ea9a..c2f3f1e3c 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -74,17 +74,8 @@ class AlertLocation(object): class DisplayControllerType(object): """ - This is an enumeration class which controls where Alerts are placed on the - screen. - - ``Top`` - Place the text at the top of the screen. - - ``Middle`` - Place the text in the middle of the screen. - - ``Bottom`` - Place the text at the bottom of the screen. + This is an enumeration class which says where a display controller + originated from. """ Live = 0 Preview = 1 @@ -117,4 +108,4 @@ from thememanager import ThemeManager __all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'MainDisplay', 'SlideController', 'ServiceManager', 'ThemeManager', 'MediaDockManager', - 'ServiceItemEditForm', u'FirstTimeForm'] + 'ServiceItemEditForm', 'FirstTimeForm'] diff --git a/openlp/core/ui/media/__init__.py b/openlp/core/ui/media/__init__.py index e41d3369a..1e067b64c 100644 --- a/openlp/core/ui/media/__init__.py +++ b/openlp/core/ui/media/__init__.py @@ -90,7 +90,7 @@ def get_media_players(): else: overridden_player = 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 diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 7903900a5..aab68f017 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -383,7 +383,6 @@ class MediaController(object): QtCore.QFileInfo(serviceItem.get_filename()) display = self._define_display(controller) if controller.isLive: - #display = controller.display isValid = self._check_file_type(controller, display, serviceItem) display.override[u'theme'] = u'' display.override[u'video'] = True @@ -396,7 +395,6 @@ class MediaController(object): display.serviceItem.start_time controller.media_info.end_time = serviceItem.end_time elif controller.previewDisplay: - #display = controller.previewDisplay isValid = self._check_file_type(controller, display, serviceItem) if not isValid: # Media could not be loaded correctly @@ -414,7 +412,7 @@ class MediaController(object): # Preview requested if not controller.isLive: autoplay = True - # Visible or background requested or Service Item wants autostart + # Visible or background requested or Service Item wants to autostart elif not hidden or controller.media_info.is_background or \ serviceItem.will_auto_start: autoplay = True diff --git a/openlp/core/ui/media/playertab.py b/openlp/core/ui/media/playertab.py index 3844975db..a326612d9 100644 --- a/openlp/core/ui/media/playertab.py +++ b/openlp/core/ui/media/playertab.py @@ -7,10 +7,11 @@ # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # -# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # -# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # -# Tibble, Dave Warnock, Frode Woldsund # +# Meinert Jordan, Armin Köhler, Eric Ludin, Edwin Lunando, Brian T. Meyer, # +# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, # +# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # +# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, # +# Erode Woldsund, Martin Zibricky # # --------------------------------------------------------------------------- # # This program is free software; you can redistribute it and/or modify it # # under the terms of the GNU General Public License as published by the Free # diff --git a/openlp/core/ui/media/vendor/__init__.py b/openlp/core/ui/media/vendor/__init__.py index 170b609de..005d9543f 100644 --- a/openlp/core/ui/media/vendor/__init__.py +++ b/openlp/core/ui/media/vendor/__init__.py @@ -4,13 +4,14 @@ ############################################################################### # OpenLP - Open Source Lyrics Projection # # --------------------------------------------------------------------------- # -# Copyright (c) 2008-2011 Raoul Snyman # -# Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # +# Copyright (c) 2008-2012 Raoul Snyman # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # -# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # -# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # -# Tibble, Dave Warnock, Frode Woldsund # +# Meinert Jordan, Armin Köhler, Eric Ludin, Edwin Lunando, Brian T. Meyer, # +# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, # +# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # +# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, # +# Erode Woldsund, Martin Zibricky # # --------------------------------------------------------------------------- # # This program is free software; you can redistribute it and/or modify it # # under the terms of the GNU General Public License as published by the Free # diff --git a/openlp/core/ui/media/webkitplayer.py b/openlp/core/ui/media/webkitplayer.py index d96b03cd3..5827b77fc 100644 --- a/openlp/core/ui/media/webkitplayer.py +++ b/openlp/core/ui/media/webkitplayer.py @@ -333,7 +333,6 @@ class WebkitPlayer(MediaPlayer): return True def resize(self, display): - #controller = display.controller display.webView.resize(display.size()) def play(self, display): diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 109b86ac9..e9dcdb4aa 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -925,8 +925,6 @@ class ServiceManager(QtGui.QWidget): item = self.findServiceItem()[0] self.serviceItems[item][u'service_item'].will_auto_start = \ not self.serviceItems[item][u'service_item'].will_auto_start - a=1 - def onServiceItemEditForm(self): """ diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 8508664e2..e4d22c151 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -222,7 +222,7 @@ class MediaMediaItem(MediaManagerItem): def initialise(self): self.listView.clear() - self.listView.setIconSize(QtCore.QSize(44, 25)) + self.listView.setIconSize(QtCore.QSize(88, 50)) self.loadList(SettingsManager.load_list(self.settingsSection, u'media')) self.populateDisplayTypes() From 431a5fbb158e7ac7a63be6a5aa333a5bad289dec Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 10 Nov 2012 16:51:23 +0000 Subject: [PATCH 41/58] Fix from misalignment --- openlp/core/lib/serviceitem.py | 6 ------ openlp/core/ui/media/mediacontroller.py | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index df0dfb169..ab8d92c5e 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -456,12 +456,6 @@ class ServiceItem(object): if length > 0: self.add_capability(ItemCapabilities.HasVariableStartTime) - def get_filename(self): - """ - Returns the full filename - """ - return os.path.join(self.get_frame_path(), self.get_frame_title()) - def get_frames(self): """ Returns the frames for the ServiceItem diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 55aa1d02a..24612d9b4 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -379,7 +379,7 @@ class MediaController(object): controller.media_info.volume = controller.volumeSlider.value() controller.media_info.is_background = False controller.media_info.file_info = \ - QtCore.QFileInfo(serviceItem.get_filename()) + QtCore.QFileInfo(serviceItem.get_frame_path()) display = self._define_display(controller) if controller.isLive: isValid = self._check_file_type(controller, display, serviceItem) From 9eb3757c9f5241964c4cb9669c451dfeeb780150 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 16 Nov 2012 21:46:17 +0000 Subject: [PATCH 42/58] Stop indexing arrays with objects --- openlp/core/ui/media/mediacontroller.py | 66 +++++++++++++------------ 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 24612d9b4..800a85cba 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -54,7 +54,7 @@ class MediaController(object): mediaPlayers are an array of media players keyed on player name. - currentMediaPlayer is an array of player instances keyed on @fixme. + currentMediaPlayer is an array of player instances keyed on ControllerType. """ def __init__(self, parent): @@ -184,18 +184,20 @@ class MediaController(object): self.timer.stop() else: any_active = False - for display in self.currentMediaPlayer.keys(): - self.currentMediaPlayer[display].resize(display) - self.currentMediaPlayer[display].update_ui(display) - if self.currentMediaPlayer[display].state == \ + for source in self.currentMediaPlayer.keys(): + display = self._define_display(self.displayControllers[source]) + self.currentMediaPlayer[source].resize(display) + self.currentMediaPlayer[source].update_ui(display) + if self.currentMediaPlayer[source].state == \ MediaState.Playing: any_active = True # There are still any active players - no need to stop timer. if any_active: return # no players are active anymore - for display in self.currentMediaPlayer.keys(): - if self.currentMediaPlayer[display].state != MediaState.Paused: + for source in self.currentMediaPlayer.keys(): + if self.currentMediaPlayer[source].state != MediaState.Paused: + display = self._define_display(self.displayControllers[source]) display.controller.seekSlider.setSliderPosition(0) self.timer.stop() @@ -333,7 +335,7 @@ class MediaController(object): controller.mediabar.setVisible(value) if controller.isLive and controller.display: if self.currentMediaPlayer and value: - if self.currentMediaPlayer[controller.display] != \ + if self.currentMediaPlayer[controller.controllerType] != \ self.mediaPlayers[u'webkit']: controller.display.setTransparency(False) @@ -427,7 +429,7 @@ class MediaController(object): 'Unsupported File'))) return False self.set_controls_visible(controller, True) - log.debug(u'use %s controller' % self.currentMediaPlayer[display]) + log.debug(u'use %s controller' % self.currentMediaPlayer[controller.controllerType]) return True def media_length(self, serviceItem): @@ -461,7 +463,7 @@ class MediaController(object): return False serviceItem.set_media_length(controller.media_info.length) self.media_stop(controller) - log.debug(u'use %s controller' % self.currentMediaPlayer[display]) + log.debug(u'use %s controller' % self.currentMediaPlayer[controller.controllerType]) return True def _check_file_type(self, controller, display, serviceItem): @@ -488,12 +490,12 @@ class MediaController(object): player.canBackground: self.resize(display, player) if player.load(display): - self.currentMediaPlayer[display] = player + self.currentMediaPlayer[controller.controllerType] = player controller.media_info.media_type = MediaType.Video return True if suffix in player.audio_extensions_list: if player.load(display): - self.currentMediaPlayer[display] = player + self.currentMediaPlayer[controller.controllerType] = player controller.media_info.media_type = MediaType.Audio return True else: @@ -502,7 +504,7 @@ class MediaController(object): if player.canFolder: self.resize(display, player) if player.load(display): - self.currentMediaPlayer[display] = player + self.currentMediaPlayer[controller.controllerType] = player controller.media_info.media_type = MediaType.Video return True # no valid player found @@ -528,11 +530,11 @@ class MediaController(object): """ log.debug(u'media_play') display = self._define_display(controller) - if not self.currentMediaPlayer[display].play(display): + if not self.currentMediaPlayer[controller.controllerType].play(display): return False if status: display.frame.evaluateJavaScript(u'show_blank("desktop");') - self.currentMediaPlayer[display].set_visible(display, + self.currentMediaPlayer[controller.controllerType].set_visible(display, True) controller.mediabar.actions[u'playbackPlay'] \ .setVisible(False) @@ -567,7 +569,7 @@ class MediaController(object): """ log.debug(u'media_pause') display = self._define_display(controller) - self.currentMediaPlayer[display].pause(display) + self.currentMediaPlayer[controller.controllerType].pause(display) controller.mediabar.actions[u'playbackPlay'] \ .setVisible(True) controller.mediabar.actions[u'playbackStop'] \ @@ -596,8 +598,8 @@ class MediaController(object): display = self._define_display(controller) if display in self.currentMediaPlayer: display.frame.evaluateJavaScript(u'show_blank("black");') - self.currentMediaPlayer[display].stop(display) - self.currentMediaPlayer[display].set_visible(display, False) + self.currentMediaPlayer[controller.controllerType].stop(display) + self.currentMediaPlayer[controller.controllerType].set_visible(display, False) controller.seekSlider.setSliderPosition(0) controller.mediabar.actions[u'playbackPlay'] \ .setVisible(True) @@ -617,7 +619,7 @@ class MediaController(object): vol = msg[1][0] log.debug(u'media_volume %d' % vol) display = self._define_display(controller) - self.currentMediaPlayer[display].volume(display, vol) + self.currentMediaPlayer[controller.controllerType].volume(display, vol) def media_seek(self, msg): """ @@ -631,7 +633,7 @@ class MediaController(object): controller = msg[0] seekVal = msg[1][0] display = self._define_display(controller) - self.currentMediaPlayer[display].seek(display, seekVal) + self.currentMediaPlayer[controller.controllerType].seek(display, seekVal) def media_reset(self, controller): """ @@ -642,11 +644,11 @@ class MediaController(object): display = self._define_display(controller) if display in self.currentMediaPlayer: display.override = {} - self.currentMediaPlayer[display].reset(display) - self.currentMediaPlayer[display].set_visible(display, False) + self.currentMediaPlayer[controller.controllerType].reset(display) + self.currentMediaPlayer[controller.controllerType].set_visible(display, False) display.frame.evaluateJavaScript(u'show_video( \ "setBackBoard", null, null, null,"hidden");') - del self.currentMediaPlayer[display] + del self.currentMediaPlayer[controller.controllerType] def media_hide(self, msg): """ @@ -660,9 +662,9 @@ class MediaController(object): return controller = self.mainWindow.liveController display = self._define_display(controller) - if self.currentMediaPlayer[display].state == MediaState.Playing: - self.currentMediaPlayer[display].pause(display) - self.currentMediaPlayer[display].set_visible(display, False) + if self.currentMediaPlayer[controller.controllerType].state == MediaState.Playing: + self.currentMediaPlayer[controller.controllerType].pause(display) + self.currentMediaPlayer[controller.controllerType].set_visible(display, False) def media_blank(self, msg): """ @@ -679,9 +681,9 @@ class MediaController(object): Receiver.send_message(u'live_display_hide', hide_mode) controller = self.mainWindow.liveController display = self._define_display(controller) - if self.currentMediaPlayer[display].state == MediaState.Playing: - self.currentMediaPlayer[display].pause(display) - self.currentMediaPlayer[display].set_visible(display, False) + if self.currentMediaPlayer[controller.controllerType].state == MediaState.Playing: + self.currentMediaPlayer[controller.controllerType].pause(display) + self.currentMediaPlayer[controller.controllerType].set_visible(display, False) def media_unblank(self, msg): """ @@ -697,9 +699,9 @@ class MediaController(object): return controller = self.mainWindow.liveController display = self._define_display(controller) - if self.currentMediaPlayer[display].state != MediaState.Playing: - if self.currentMediaPlayer[display].play(display): - self.currentMediaPlayer[display].set_visible(display, True) + if self.currentMediaPlayer[controller.controllerType].state != MediaState.Playing: + if self.currentMediaPlayer[controller.controllerType].play(display): + self.currentMediaPlayer[controller.controllerType].set_visible(display, True) # Start Timer for ui updates if not self.timer.isActive(): self.timer.start() From 506fd80f894816a06f0e4cb8fbc316060e723ca5 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 17 Nov 2012 07:59:25 +0000 Subject: [PATCH 43/58] Style cleanups --- openlp/core/ui/media/mediacontroller.py | 77 ++++++++++++++----------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index ae320579f..b21ab478f 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -180,6 +180,7 @@ class MediaController(object): Check if there is a running media Player and do updating stuff (e.g. update the UI) """ + print "state" if not self.currentMediaPlayer.keys(): self.timer.stop() else: @@ -429,7 +430,8 @@ class MediaController(object): 'Unsupported File'))) return False self.set_controls_visible(controller, True) - log.debug(u'use %s controller' % self.currentMediaPlayer[controller.controllerType]) + log.debug(u'use %s controller' % + self.currentMediaPlayer[controller.controllerType]) return True def media_length(self, serviceItem): @@ -446,7 +448,7 @@ class MediaController(object): controller.media_info = MediaInfo() controller.media_info.volume = 0 controller.media_info.file_info = QtCore.QFileInfo(serviceItem - .get_filename()) + .get_frame_path()) display = controller.previewDisplay if not self._check_file_type(controller, display, serviceItem): # Media could not be loaded correctly @@ -463,7 +465,8 @@ class MediaController(object): return False serviceItem.set_media_length(controller.media_info.length) self.media_stop(controller) - log.debug(u'use %s controller' % self.currentMediaPlayer[controller.controllerType]) + log.debug(u'use %s controller' % + self.currentMediaPlayer[controller.controllerType]) return True def _check_file_type(self, controller, display, serviceItem): @@ -490,12 +493,14 @@ class MediaController(object): player.canBackground: self.resize(display, player) if player.load(display): - self.currentMediaPlayer[controller.controllerType] = player + self.currentMediaPlayer[controller.controllerType] \ + = player controller.media_info.media_type = MediaType.Video return True if suffix in player.audio_extensions_list: if player.load(display): - self.currentMediaPlayer[controller.controllerType] = player + self.currentMediaPlayer[controller.controllerType] \ + = player controller.media_info.media_type = MediaType.Audio return True else: @@ -504,7 +509,8 @@ class MediaController(object): if player.canFolder: self.resize(display, player) if player.load(display): - self.currentMediaPlayer[controller.controllerType] = player + self.currentMediaPlayer[controller.controllerType] \ + = player controller.media_info.media_type = MediaType.Video return True # no valid player found @@ -534,14 +540,11 @@ class MediaController(object): return False if status: display.frame.evaluateJavaScript(u'show_blank("desktop");') - self.currentMediaPlayer[controller.controllerType].set_visible(display, - True) - controller.mediabar.actions[u'playbackPlay'] \ - .setVisible(False) - controller.mediabar.actions[u'playbackStop'] \ - .setVisible(True) - controller.mediabar.actions[u'playbackPause'] \ - .setVisible(True) + self.currentMediaPlayer[controller.controllerType]\ + .set_visible(display, True) + controller.mediabar.actions[u'playbackPlay'].setVisible(False) + controller.mediabar.actions[u'playbackStop'].setVisible(True) + controller.mediabar.actions[u'playbackPause'].setVisible(True) if controller.isLive: if controller.hideMenu.defaultAction().isChecked(): controller.hideMenu.defaultAction().trigger() @@ -570,12 +573,9 @@ class MediaController(object): log.debug(u'media_pause') display = self._define_display(controller) self.currentMediaPlayer[controller.controllerType].pause(display) - controller.mediabar.actions[u'playbackPlay'] \ - .setVisible(True) - controller.mediabar.actions[u'playbackStop'] \ - .setVisible(True) - controller.mediabar.actions[u'playbackPause'] \ - .setVisible(False) + controller.mediabar.actions[u'playbackPlay'].setVisible(True) + controller.mediabar.actions[u'playbackStop'].setVisible(True) + controller.mediabar.actions[u'playbackPause'].setVisible(False) def media_stop_msg(self, msg): """ @@ -595,18 +595,17 @@ class MediaController(object): The controller that needs to be stopped """ log.debug(u'media_stop') + print "play" display = self._define_display(controller) if display in self.currentMediaPlayer: display.frame.evaluateJavaScript(u'show_blank("black");') self.currentMediaPlayer[controller.controllerType].stop(display) - self.currentMediaPlayer[controller.controllerType].set_visible(display, False) + self.currentMediaPlayer[controller.controllerType] \ + .set_visible(display, False) controller.seekSlider.setSliderPosition(0) - controller.mediabar.actions[u'playbackPlay'] \ - .setVisible(True) - controller.mediabar.actions[u'playbackStop'] \ - .setVisible(False) - controller.mediabar.actions[u'playbackPause'] \ - .setVisible(False) + controller.mediabar.actions[u'playbackPlay'].setVisible(True) + controller.mediabar.actions[u'playbackStop'].setVisible(False) + controller.mediabar.actions[u'playbackPause'].setVisible(False) def media_volume(self, msg): """ @@ -633,7 +632,8 @@ class MediaController(object): controller = msg[0] seekVal = msg[1][0] display = self._define_display(controller) - self.currentMediaPlayer[controller.controllerType].seek(display, seekVal) + self.currentMediaPlayer[controller.controllerType] \ + .seek(display, seekVal) def media_reset(self, controller): """ @@ -645,7 +645,8 @@ class MediaController(object): if display in self.currentMediaPlayer: display.override = {} self.currentMediaPlayer[controller.controllerType].reset(display) - self.currentMediaPlayer[controller.controllerType].set_visible(display, False) + self.currentMediaPlayer[controller.controllerType] \ + .set_visible(display, False) display.frame.evaluateJavaScript(u'show_video( \ "setBackBoard", null, null, null,"hidden");') del self.currentMediaPlayer[controller.controllerType] @@ -662,9 +663,11 @@ class MediaController(object): return controller = self.mainWindow.liveController display = self._define_display(controller) - if self.currentMediaPlayer[controller.controllerType].state == MediaState.Playing: + if self.currentMediaPlayer[controller.controllerType].state \ + == MediaState.Playing: self.currentMediaPlayer[controller.controllerType].pause(display) - self.currentMediaPlayer[controller.controllerType].set_visible(display, False) + self.currentMediaPlayer[controller.controllerType] \ + .set_visible(display, False) def media_blank(self, msg): """ @@ -681,9 +684,11 @@ class MediaController(object): Receiver.send_message(u'live_display_hide', hide_mode) controller = self.mainWindow.liveController display = self._define_display(controller) - if self.currentMediaPlayer[controller.controllerType].state == MediaState.Playing: + if self.currentMediaPlayer[controller.controllerType].state \ + == MediaState.Playing: self.currentMediaPlayer[controller.controllerType].pause(display) - self.currentMediaPlayer[controller.controllerType].set_visible(display, False) + self.currentMediaPlayer[controller.controllerType] \ + .set_visible(display, False) def media_unblank(self, msg): """ @@ -699,9 +704,11 @@ class MediaController(object): return controller = self.mainWindow.liveController display = self._define_display(controller) - if self.currentMediaPlayer[controller.controllerType].state != MediaState.Playing: + if self.currentMediaPlayer[controller.controllerType].state \ + != MediaState.Playing: if self.currentMediaPlayer[controller.controllerType].play(display): - self.currentMediaPlayer[controller.controllerType].set_visible(display, True) + self.currentMediaPlayer[controller.controllerType] \ + .set_visible(display, True) # Start Timer for ui updates if not self.timer.isActive(): self.timer.start() From acadf89a34b38882b5b58176aafc73f52936160c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 18 Nov 2012 07:56:12 +0000 Subject: [PATCH 44/58] Fix displayed preview --- openlp/core/ui/media/mediacontroller.py | 2 -- openlp/plugins/media/lib/mediaitem.py | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index b21ab478f..d99edf580 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -180,7 +180,6 @@ class MediaController(object): Check if there is a running media Player and do updating stuff (e.g. update the UI) """ - print "state" if not self.currentMediaPlayer.keys(): self.timer.stop() else: @@ -595,7 +594,6 @@ class MediaController(object): The controller that needs to be stopped """ log.debug(u'media_stop') - print "play" display = self._define_display(controller) if display in self.currentMediaPlayer: display.frame.evaluateJavaScript(u'show_blank("black");') diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 015c9b509..8e420243e 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -71,6 +71,7 @@ class MediaMediaItem(MediaManagerItem): False) self.displayController.previewDisplay = Display(self.displayController, False, self.displayController) + self.displayController.previewDisplay.hide() self.displayController.previewDisplay.setGeometry( QtCore.QRect(0, 0, 300, 300)) self.displayController.previewDisplay.screen = \ From 6fd865635f710baa4f4f75fdf8006ddeb7bc3aec Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 21 Nov 2012 21:49:18 +0000 Subject: [PATCH 45/58] Fix most of the review comments --- openlp/core/ui/media/playertab.py | 2 +- openlp/plugins/media/lib/mediaitem.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/core/ui/media/playertab.py b/openlp/core/ui/media/playertab.py index a326612d9..9a1275555 100644 --- a/openlp/core/ui/media/playertab.py +++ b/openlp/core/ui/media/playertab.py @@ -134,7 +134,7 @@ class PlayerTab(SettingsTab): self.backgroundColorLabel.setText( translate('ImagesPlugin.ImageTab', 'Default Color:')) self.informationLabel.setText( - translate('ImagesPlugin.ImageTab', 'Visible background for images ' + translate('OpenLP.PlayerTab', 'Visible background for videos ' 'with aspect ratio different to screen.')) self.retranslatePlayers() diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 8e420243e..b7c6e89ba 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -99,6 +99,7 @@ class MediaMediaItem(MediaManagerItem): 'Automatic') self.displayTypeLabel.setText( translate('MediaPlugin.MediaItem', 'Use Player:')) + self.rebuild_players() def requiredIcons(self): MediaManagerItem.requiredIcons(self) From 116c5b030f7a0d1e616d96150bb738e493233c46 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 22 Nov 2012 22:02:40 +0000 Subject: [PATCH 46/58] Fix media language Automatic --- openlp/core/lib/ui.py | 1 + openlp/core/ui/media/mediacontroller.py | 4 ++-- openlp/plugins/media/lib/mediaitem.py | 3 +-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index c96472fe3..beaaf15cc 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -61,6 +61,7 @@ class UiStrings(object): self.Add = translate('OpenLP.Ui', '&Add') self.Advanced = translate('OpenLP.Ui', 'Advanced') self.AllFiles = translate('OpenLP.Ui', 'All Files') + self.Automatic = translate('OpenLP.Ui', 'Automatic') self.Bottom = translate('OpenLP.Ui', 'Bottom') self.Browse = translate('OpenLP.Ui', 'Browse...') self.Cancel = translate('OpenLP.Ui', 'Cancel') diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index d99edf580..197d3dfc7 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -34,7 +34,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import OpenLPToolbar, Receiver, translate from openlp.core.lib.settings import Settings -from openlp.core.lib.ui import critical_error_message_box +from openlp.core.lib.ui import UiStrings, critical_error_message_box from openlp.core.ui.media import MediaState, MediaInfo, MediaType, \ get_media_players, set_media_players from openlp.core.ui.media.mediaplayer import MediaPlayer @@ -479,7 +479,7 @@ class MediaController(object): The ServiceItem containing the details to be played. """ usedPlayers = get_media_players()[0] - if serviceItem.title != u'Automatic': + if serviceItem.title != UiStrings().Automatic: usedPlayers = [serviceItem.title.lower()] if controller.media_info.file_info.isFile(): suffix = u'*.%s' % \ diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index b7c6e89ba..daddefc17 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -95,8 +95,7 @@ class MediaMediaItem(MediaManagerItem): self.replaceAction.setToolTip(UiStrings().ReplaceLiveBG) self.resetAction.setText(UiStrings().ResetBG) self.resetAction.setToolTip(UiStrings().ResetLiveBG) - self.automatic = translate('MediaPlugin.MediaItem', - 'Automatic') + self.automatic = UiStrings().Automatic self.displayTypeLabel.setText( translate('MediaPlugin.MediaItem', 'Use Player:')) self.rebuild_players() From 734c697fefc71193149addde79b4b94aec1dc896 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 24 Nov 2012 07:24:30 +0000 Subject: [PATCH 47/58] Documentation --- openlp/core/lib/serviceitem.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 6c9aa0d7f..e2ce85004 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -68,7 +68,7 @@ class ItemCapabilities(object): reordered. ``RequiresMedia`` - The capability to + Determines is the serviceItem needs a Media Player ``CanLoop`` The capability to allow the SlideController to allow the loop @@ -82,17 +82,18 @@ class ItemCapabilities(object): The capability to remove lines breaks in the renderer ``OnLoadUpdate`` - The capability to + The capability to update MediaManager when a service Item is + loaded. ``AddIfNewItem`` - The capability to + Not Used ``ProvidesOwnDisplay`` - The capability to tell the SlideCotroller the service Item has a + The capability to tell the SlideController the service Item has a different display. ``HasDetailedTitleDisplay`` - The capability to + ServiceItem provides a title ``HasVariableStartTime`` The capability to tell the ServiceManager that a change to start @@ -102,10 +103,11 @@ class ItemCapabilities(object): The capability to tell the renderer that Soft Break is allowed ``CanWordSplit`` - The capability to + The capability to tell the renderer that it can split words is + allowed ``HasBackgroundAudio`` - The capability to + That a audio file is present with the text. ``CanAutoStartForLive`` The capability to ignore the do not play if display blank flag. From d538a32f491a22a83cdc4a081133bf93222d7535 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 24 Nov 2012 08:01:10 +0000 Subject: [PATCH 48/58] String clean ups --- openlp/core/lib/ui.py | 2 ++ openlp/core/ui/media/playertab.py | 6 ++---- openlp/plugins/images/lib/imagetab.py | 7 +++---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index beaaf15cc..0880746d3 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -62,6 +62,7 @@ class UiStrings(object): self.Advanced = translate('OpenLP.Ui', 'Advanced') self.AllFiles = translate('OpenLP.Ui', 'All Files') self.Automatic = translate('OpenLP.Ui', 'Automatic') + self.BackgroundColor = translate('OpenLP.Ui', 'Background Color') self.Bottom = translate('OpenLP.Ui', 'Bottom') self.Browse = translate('OpenLP.Ui', 'Browse...') self.Cancel = translate('OpenLP.Ui', 'Cancel') @@ -70,6 +71,7 @@ class UiStrings(object): self.ConfirmDelete = translate('OpenLP.Ui', 'Confirm Delete') self.Continuous = translate('OpenLP.Ui', 'Continuous') self.Default = unicode(translate('OpenLP.Ui', 'Default')) + self.DefaultColor = translate('OpenLP.Ui', 'Default Color:') self.Delete = translate('OpenLP.Ui', '&Delete') self.DisplayStyle = translate('OpenLP.Ui', 'Display style:') self.Duplicate = translate('OpenLP.Ui', 'Duplicate Error') diff --git a/openlp/core/ui/media/playertab.py b/openlp/core/ui/media/playertab.py index 9a1275555..2bf2d4458 100644 --- a/openlp/core/ui/media/playertab.py +++ b/openlp/core/ui/media/playertab.py @@ -129,10 +129,8 @@ class PlayerTab(SettingsTab): translate('OpenLP.PlayerTab', 'Available Media Players')) self.playerOrderGroupBox.setTitle( translate('OpenLP.PlayerTab', 'Player Search Order')) - self.bgColorGroupBox.setTitle( - translate('ImagesPlugin.ImageTab', 'Background Color')) - self.backgroundColorLabel.setText( - translate('ImagesPlugin.ImageTab', 'Default Color:')) + self.bgColorGroupBox.setTitle(UiStrings().BackgroundColor) + self.backgroundColorLabel.setText(UiStrings().DefaultColor) self.informationLabel.setText( translate('OpenLP.PlayerTab', 'Visible background for videos ' 'with aspect ratio different to screen.')) diff --git a/openlp/plugins/images/lib/imagetab.py b/openlp/plugins/images/lib/imagetab.py index dfb294e1c..5bf957aa8 100644 --- a/openlp/plugins/images/lib/imagetab.py +++ b/openlp/plugins/images/lib/imagetab.py @@ -31,6 +31,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import SettingsTab, translate, Receiver from openlp.core.lib.settings import Settings +from openlp.core.lib.ui import UiStrings class ImageTab(SettingsTab): """ @@ -68,10 +69,8 @@ class ImageTab(SettingsTab): QtCore.SIGNAL(u'clicked()'), self.onbackgroundColorButtonClicked) def retranslateUi(self): - self.bgColorGroupBox.setTitle( - translate('ImagesPlugin.ImageTab', 'Background Color')) - self.backgroundColorLabel.setText( - translate('ImagesPlugin.ImageTab', 'Default Color:')) + self.bgColorGroupBox.setTitle(UiStrings().BackgroundColor) + self.backgroundColorLabel.setText(UiStrings().DefaultColor) self.informationLabel.setText( translate('ImagesPlugin.ImageTab', 'Visible background for images ' 'with aspect ratio different to screen.')) From cf0bb94b3fa9e0a2ff37459a4de1eb2aab2de628 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 26 Nov 2012 17:57:36 +0000 Subject: [PATCH 49/58] Clean ups --- openlp/core/lib/ui.py | 2 +- openlp/core/ui/media/mediacontroller.py | 2 +- openlp/core/ui/servicemanager.py | 2 +- openlp/core/ui/settingsform.py | 8 ++++---- openlp/plugins/media/lib/mediatab.py | 2 +- openlp/plugins/presentations/lib/mediaitem.py | 2 +- openlp/plugins/presentations/lib/presentationtab.py | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index 0880746d3..1e14079b5 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -109,7 +109,7 @@ class UiStrings(object): self.NISs = translate('OpenLP.Ui', 'No Item Selected', 'Singular') self.NISp = translate('OpenLP.Ui', 'No Items Selected', 'Plural') self.OLPV1 = translate('OpenLP.Ui', 'openlp.org 1.x') - self.OLPV2 = translate('OpenLP.Ui', 'OpenLP 2.0') + self.OLPV2 = translate('OpenLP.Ui', 'OpenLP 2.1') self.OpenLPStart = translate('OpenLP.Ui', 'OpenLP is already running. ' 'Do you wish to continue?') self.OpenService = translate('OpenLP.Ui', 'Open service.') diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 197d3dfc7..19f6ad0c5 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -92,7 +92,7 @@ class MediaController(object): QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'mediaitem_media_rebuild'), self._set_active_players) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'mediaitem_suffexes'), + QtCore.SIGNAL(u'mediaitem_suffixes'), self._generate_extensions_lists) def _set_active_players(self): diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 9db0deb78..4bed62456 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -386,7 +386,7 @@ class ServiceManager(QtGui.QWidget): def resetSupportedSuffixes(self): """ - Resets the Suffexes list. + Resets the Suffixes list. """ self.suffixes = [] diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py index b06c2b1ea..f3516408d 100644 --- a/openlp/core/ui/settingsform.py +++ b/openlp/core/ui/settingsform.py @@ -99,7 +99,7 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): """ Process the form saving the settings """ - self.resetSuffexes = True + self.resetSuffixes = True for tabIndex in range(self.stackedLayout.count()): self.stackedLayout.widget(tabIndex).save() # Must go after all settings are save @@ -135,10 +135,10 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): def resetSupportedSuffixes(self): """ - Control the resetting of the serviceManager suffex list as can be + Control the resetting of the serviceManager suffix list as can be called by a number of settings tab and only needs to be called once per save. """ - if self.resetSuffexes: + if self.resetSuffixes: self.mainWindow.serviceManagerContents.resetSupportedSuffixes() - self.resetSuffexes = False \ No newline at end of file + self.resetSuffixes = False \ No newline at end of file diff --git a/openlp/plugins/media/lib/mediatab.py b/openlp/plugins/media/lib/mediatab.py index 941ee766e..eb7542535 100644 --- a/openlp/plugins/media/lib/mediatab.py +++ b/openlp/plugins/media/lib/mediatab.py @@ -100,4 +100,4 @@ class MediaTab(SettingsTab): if override_changed: self.parent.resetSupportedSuffixes() Receiver.send_message(u'mediaitem_media_rebuild') - Receiver.send_message(u'mediaitem_suffexes') \ No newline at end of file + Receiver.send_message(u'mediaitem_suffixes') \ No newline at end of file diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index bb038f87f..d62fcdad1 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -67,7 +67,7 @@ class PresentationMediaItem(MediaManagerItem): QtCore.SIGNAL(u'mediaitem_presentation_rebuild'), self.populateDisplayTypes) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'mediaitem_suffexes'), self.buildFileMaskString) + QtCore.SIGNAL(u'mediaitem_suffixes'), self.buildFileMaskString) # Allow DnD from the desktop self.listView.activateDnD() diff --git a/openlp/plugins/presentations/lib/presentationtab.py b/openlp/plugins/presentations/lib/presentationtab.py index 7a9f29b74..ae2c8c8e6 100644 --- a/openlp/plugins/presentations/lib/presentationtab.py +++ b/openlp/plugins/presentations/lib/presentationtab.py @@ -145,7 +145,7 @@ class PresentationTab(SettingsTab): if changed: self.parent.resetSupportedSuffixes() Receiver.send_message(u'mediaitem_presentation_rebuild') - Receiver.send_message(u'mediaitem_suffexes') + Receiver.send_message(u'mediaitem_suffixes') def tabVisible(self): """ From 846d909dc3b70dc9d8e3ffc670a26de16edc68d7 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 28 Nov 2012 21:14:08 +0000 Subject: [PATCH 50/58] Fix osz bug --- openlp/core/ui/media/mediacontroller.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 19f6ad0c5..6cbe7af67 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -314,6 +314,8 @@ class MediaController(object): # update player status self._set_active_players() display.hasAudio = True + if display.isLive and preview: + return if preview: display.hasAudio = False for player in self.mediaPlayers.values(): From 2299290f5c099f116f8361cf36fdc4aca14ad32f Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 29 Nov 2012 20:46:16 +0000 Subject: [PATCH 51/58] fix stop --- openlp/core/ui/media/mediacontroller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 6cbe7af67..c124d7ce5 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -597,7 +597,7 @@ class MediaController(object): """ log.debug(u'media_stop') display = self._define_display(controller) - if display in self.currentMediaPlayer: + if controller.controllerType in self.currentMediaPlayer: display.frame.evaluateJavaScript(u'show_blank("black");') self.currentMediaPlayer[controller.controllerType].stop(display) self.currentMediaPlayer[controller.controllerType] \ From 580de0015f9fc1cf7dde4d8f320866e5dc3ee0dc Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 2 Dec 2012 08:06:08 +0000 Subject: [PATCH 52/58] Fix background video --- openlp/core/ui/media/mediacontroller.py | 2 +- openlp/plugins/media/lib/mediaitem.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index c124d7ce5..706a30d4c 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -642,7 +642,7 @@ class MediaController(object): log.debug(u'media_reset') self.set_controls_visible(controller, False) display = self._define_display(controller) - if display in self.currentMediaPlayer: + if controller.controllerType in self.currentMediaPlayer: display.override = {} self.currentMediaPlayer[controller.controllerType].reset(display) self.currentMediaPlayer[controller.controllerType] \ diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index daddefc17..2dadfac05 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -167,8 +167,7 @@ class MediaMediaItem(MediaManagerItem): filename = unicode(item.data(QtCore.Qt.UserRole).toString()) if os.path.exists(filename): service_item = ServiceItem() - service_item.title = \ - unicode(self.displayTypeComboBox.currentText()) + service_item.title = u'webkit' service_item.shortname = service_item.title (path, name) = os.path.split(filename) service_item.add_from_command(path, name,CLAPPERBOARD) From b1c2cee0032943b8a7d216675af2ece92deffffb Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 3 Dec 2012 19:18:28 +0000 Subject: [PATCH 53/58] Fix swf files --- openlp/core/ui/media/mediacontroller.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 706a30d4c..13dd8c4bd 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -543,9 +543,14 @@ class MediaController(object): display.frame.evaluateJavaScript(u'show_blank("desktop");') self.currentMediaPlayer[controller.controllerType]\ .set_visible(display, True) - controller.mediabar.actions[u'playbackPlay'].setVisible(False) + # Flash needs to be played and will not AutoPlay + if controller.media_info.is_flash: + controller.mediabar.actions[u'playbackPlay'].setVisible(True) + controller.mediabar.actions[u'playbackPause'].setVisible(False) + else: + controller.mediabar.actions[u'playbackPlay'].setVisible(False) + controller.mediabar.actions[u'playbackPause'].setVisible(True) controller.mediabar.actions[u'playbackStop'].setVisible(True) - controller.mediabar.actions[u'playbackPause'].setVisible(True) if controller.isLive: if controller.hideMenu.defaultAction().isChecked(): controller.hideMenu.defaultAction().trigger() From a1d3d002ef5e396bbc7d90a29cff3261680205b7 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 4 Dec 2012 06:09:55 +0000 Subject: [PATCH 54/58] String fixes --- openlp/core/lib/ui.py | 3 ++- openlp/core/ui/mainwindow.py | 2 +- openlp/plugins/alerts/lib/alertstab.py | 2 +- openlp/plugins/bibles/lib/mediaitem.py | 2 +- openlp/plugins/images/lib/mediaitem.py | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index b078dd361..52bb75fa1 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -109,7 +109,8 @@ class UiStrings(object): self.NISs = translate('OpenLP.Ui', 'No Item Selected', 'Singular') self.NISp = translate('OpenLP.Ui', 'No Items Selected', 'Plural') self.OLPV1 = translate('OpenLP.Ui', 'openlp.org 1.x') - self.OLPV2 = translate('OpenLP.Ui', 'OpenLP 2.1') + self.OLPV2 = translate('OpenLP.Ui', 'OpenLP 2') + self.OLPV2x = translate('OpenLP.Ui', 'OpenLP 2.1') self.OpenLPStart = translate('OpenLP.Ui', 'OpenLP is already running. ' 'Do you wish to continue?') self.OpenService = translate('OpenLP.Ui', 'Open service.') diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 67414f691..23e467f1a 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -395,7 +395,7 @@ class Ui_MainWindow(object): """ Set up the translation system """ - mainWindow.mainTitle = UiStrings().OLPV2 + mainWindow.mainTitle = UiStrings().OLPV2x mainWindow.setWindowTitle(mainWindow.mainTitle) self.fileMenu.setTitle(translate('OpenLP.MainWindow', '&File')) self.fileImportMenu.setTitle(translate('OpenLP.MainWindow', '&Import')) diff --git a/openlp/plugins/alerts/lib/alertstab.py b/openlp/plugins/alerts/lib/alertstab.py index 53662d3ad..e97fbce3f 100644 --- a/openlp/plugins/alerts/lib/alertstab.py +++ b/openlp/plugins/alerts/lib/alertstab.py @@ -123,7 +123,7 @@ class AlertsTab(SettingsTab): translate('AlertsPlugin.AlertsTab', 'Alert timeout:')) self.timeoutSpinBox.setSuffix(UiStrings().Seconds) self.previewGroupBox.setTitle(UiStrings().Preview) - self.fontPreview.setText(UiStrings().OLPV2) + self.fontPreview.setText(UiStrings().OLPV2x) def onBackgroundColorButtonClicked(self): new_color = QtGui.QColorDialog.getColor( diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index b26b2e46d..77ac67aac 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -894,7 +894,7 @@ class BibleMediaItem(MediaManagerItem): return items def generateSlideData(self, service_item, item=None, xmlVersion=False, - remote=False,context=ServiceItemContext.Service): + remote=False, context=ServiceItemContext.Service): """ Generates and formats the slides for the service item as well as the service item's title. diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 52fcea057..43ad97248 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -153,7 +153,7 @@ class ImageMediaItem(MediaManagerItem): Receiver.send_message(u'cursor_normal') def generateSlideData(self, service_item, item=None, xmlVersion=False, - remote=False,context=ServiceItemContext.Service): + remote=False, context=ServiceItemContext.Service): background = QtGui.QColor(Settings().value(self.settingsSection + u'/background color', QtCore.QVariant(u'#000000'))) if item: From 34275d0a5fe4a3f6bdd511ea5d668fc6cc3567bc Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 5 Dec 2012 22:42:48 +0000 Subject: [PATCH 55/58] Fix service save --- openlp/core/ui/servicemanager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 013021045..76fa3b5cb 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -537,7 +537,7 @@ class ServiceManager(QtGui.QWidget): if not item[u'service_item'].validate(): self.serviceItems.remove(item) else: - service_item = item[u'service_item'].get_service_repr() + service_item = item[u'service_item'].get_service_repr(self._saveLite) if service_item[u'header'][u'background_audio']: for i, filename in enumerate( service_item[u'header'][u'background_audio']): From 901f835e903e6047377401d2401f3fcc97c94c5a Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 6 Dec 2012 21:56:04 +0000 Subject: [PATCH 56/58] Fix song edit media --- openlp/plugins/songs/forms/editsongform.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 3f92feed2..378a1c14c 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -58,6 +58,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): Constructor """ QtGui.QDialog.__init__(self, parent) + self.parent = parent self.mediaitem = mediaitem self.song = None # can this be automated? @@ -179,13 +180,8 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): set_case_insensitive_completer(self.themes, self.themeComboBox) def loadMediaFiles(self): - self.audioAddFromMediaButton.setVisible(False) - for plugin in self.parent().pluginManager.plugins: - if plugin.name == u'media' and plugin.status == PluginStatus.Active: - self.audioAddFromMediaButton.setVisible(True) - self.mediaForm.populateFiles( - plugin.mediaItem.getList(MediaType.Audio)) - break + self.audioAddFromMediaButton.setVisible(True) + self.mediaForm.populateFiles(self.parent.mediaController.audio_extensions_list) def newSong(self): log.debug(u'New Song') From cdc810de67716ee06fed8df2b3c980df329f72c0 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 7 Dec 2012 06:04:15 +0000 Subject: [PATCH 57/58] Correct fix this time --- openlp/plugins/media/lib/mediaitem.py | 4 ++-- openlp/plugins/songs/forms/editsongform.py | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 2965eb53a..1ab36ff45 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -316,9 +316,9 @@ class MediaMediaItem(MediaManagerItem): key=lambda filename: os.path.split(unicode(filename))[1]) ext = [] if type == MediaType.Audio: - ext = self.plugin.audio_extensions_list + ext = self.plugin.mediaController.audio_extensions_list else: - ext = self.plugin.video_extensions_list + ext = self.plugin.mediaController.video_extensions_list ext = map(lambda x: x[1:], ext) media = filter(lambda x: os.path.splitext(x)[1] in ext, media) return media diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 378a1c14c..a1242552a 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -58,7 +58,6 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): Constructor """ QtGui.QDialog.__init__(self, parent) - self.parent = parent self.mediaitem = mediaitem self.song = None # can this be automated? @@ -180,8 +179,12 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): set_case_insensitive_completer(self.themes, self.themeComboBox) def loadMediaFiles(self): - self.audioAddFromMediaButton.setVisible(True) - self.mediaForm.populateFiles(self.parent.mediaController.audio_extensions_list) + self.audioAddFromMediaButton.setVisible(False) + for plugin in self.parent().pluginManager.plugins: + if plugin.name == u'media' and plugin.status == PluginStatus.Active: + self.audioAddFromMediaButton.setVisible(True) + self.mediaForm.populateFiles(plugin.mediaItem.getList(MediaType.Audio)) + break def newSong(self): log.debug(u'New Song') From d6513f7c6006065c2513f60a26ab77a98c7a41d1 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 7 Dec 2012 17:47:32 +0000 Subject: [PATCH 58/58] Fix blank / unblank bug --- openlp/core/ui/media/mediacontroller.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 428921617..fc2b8635a 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -709,11 +709,10 @@ class MediaController(object): return controller = self.mainWindow.liveController display = self._define_display(controller) - if self.currentMediaPlayer[controller.controllerType].state \ - != MediaState.Playing: + if controller.controllerType in self.currentMediaPlayer and \ + self.currentMediaPlayer[controller.controllerType].state != MediaState.Playing: if self.currentMediaPlayer[controller.controllerType].play(display): - self.currentMediaPlayer[controller.controllerType] \ - .set_visible(display, True) + self.currentMediaPlayer[controller.controllerType].set_visible(display, True) # Start Timer for ui updates if not self.timer.isActive(): self.timer.start()