From 6ef5fa88d28e64f02d87508c79a526c553fd0520 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 9 Sep 2012 07:27:53 +0100 Subject: [PATCH] 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)