From d14a316309a9c9a809dcb6568c35eee342f1a5b5 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Thu, 16 Feb 2012 23:08:30 +0200 Subject: [PATCH 01/15] Added repeating of the background audio track list. Migrated the songs plugin configuration tab to use the proper camelCase names. --- openlp/core/ui/generaltab.py | 11 +++- openlp/core/ui/maindisplay.py | 12 +++- openlp/core/ui/slidecontroller.py | 30 ++++++++-- openlp/plugins/songs/lib/songstab.py | 90 ++++++++++++++-------------- 4 files changed, 91 insertions(+), 52 deletions(-) diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index d515fc501..b1d44b3dd 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -175,6 +175,9 @@ class GeneralTab(SettingsTab): self.startPausedCheckBox = QtGui.QCheckBox(self.audioGroupBox) self.startPausedCheckBox.setObjectName(u'startPausedCheckBox') self.audioLayout.addWidget(self.startPausedCheckBox) + self.repeatListCheckBox = QtGui.QCheckBox(self.audioGroupBox) + self.repeatListCheckBox.setObjectName(u'repeatListCheckBox') + self.audioLayout.addWidget(self.repeatListCheckBox) self.rightLayout.addWidget(self.audioGroupBox) self.rightLayout.addStretch() # Signals and slots @@ -251,6 +254,8 @@ class GeneralTab(SettingsTab): translate('OpenLP.GeneralTab', 'Background Audio')) self.startPausedCheckBox.setText( translate('OpenLP.GeneralTab', 'Start background audio paused')) + self.repeatListCheckBox.setText( + translate('OpenLP.GeneralTab', 'Repeat track list')) def load(self): """ @@ -298,6 +303,8 @@ class GeneralTab(SettingsTab): QtCore.QVariant(self.screens.current[u'size'].width())).toInt()[0]) self.startPausedCheckBox.setChecked(settings.value( u'audio start paused', QtCore.QVariant(True)).toBool()) + self.repeatListCheckBox.setChecked(settings.value( + u'audio repeat list', QtCore.QVariant(False)).toBool()) settings.endGroup() self.customXValueEdit.setEnabled(self.overrideCheckBox.isChecked()) self.customYValueEdit.setEnabled(self.overrideCheckBox.isChecked()) @@ -350,7 +357,9 @@ class GeneralTab(SettingsTab): QtCore.QVariant(self.overrideCheckBox.isChecked())) settings.setValue(u'audio start paused', QtCore.QVariant(self.startPausedCheckBox.isChecked())) - settings.endGroup() + settings.setValue(u'audio repeat list', + QtCore.QVariant(self.repeatListCheckBox.isChecked())) + settings.endGroup() # On save update the screens as well self.postSetUp(True) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 971a9903f..f1a94138c 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -493,11 +493,14 @@ class AudioPlayer(QtCore.QObject): QtCore.QObject.__init__(self, parent) self.currentIndex = -1 self.playlist = [] + self.repeat = False self.mediaObject = Phonon.MediaObject() self.audioObject = Phonon.AudioOutput(Phonon.VideoCategory) Phonon.createPath(self.mediaObject, self.audioObject) QtCore.QObject.connect(self.mediaObject, QtCore.SIGNAL(u'aboutToFinish()'), self.onAboutToFinish) + QtCore.QObject.connect(self.mediaObject, + QtCore.SIGNAL(u'finished()'), self.onFinished) def __del__(self): """ @@ -516,6 +519,14 @@ class AudioPlayer(QtCore.QObject): if len(self.playlist) > self.currentIndex: self.mediaObject.enqueue(self.playlist[self.currentIndex]) + def onFinished(self): + if self.repeat: + log.debug(u'Repeat is enabled... here we go again!') + self.mediaObject.clearQueue() + self.mediaObject.clear() + self.currentIndex = -1 + self.play() + def connectVolumeSlider(self, slider): slider.setAudioOutput(self.audioObject) @@ -562,4 +573,3 @@ class AudioPlayer(QtCore.QObject): filenames = [filenames] for filename in filenames: self.playlist.append(Phonon.MediaSource(filename)) - diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index f0fc363b7..75ce23996 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -279,11 +279,26 @@ class SlideController(Controller): translate('OpenLP.SlideController', 'Go To'), self.toolbar)) self.toolbar.makeWidgetsInvisible([u'Song Menu']) # Stuff for items with background audio. - self.audioPauseItem = self.toolbar.addToolbarButton( - u'Pause Audio', u':/slides/media_playback_pause.png', - translate('OpenLP.SlideController', 'Pause audio.'), - self.onAudioPauseClicked, True) + self.audioPauseItem = QtGui.QToolButton(self.toolbar) + self.audioPauseItem.setIcon(QtGui.QIcon(u':/slides/media_playback_pause.png')) + #u'Pause Audio', , + self.audioPauseItem.setText(translate('OpenLP.SlideController', + 'Pause audio.')) + self.audioPauseItem.setCheckable(True) + self.toolbar.addToolbarWidget(u'Pause Audio', self.audioPauseItem) + QtCore.QObject.connect(self.audioPauseItem, + QtCore.SIGNAL(u'clicked(bool)'), self.onAudioPauseClicked) self.audioPauseItem.setVisible(False) + audioMenu = QtGui.QMenu( + translate('OpenLP.SlideController', 'Background Audio'), + self.toolbar) + trackMenu = audioMenu.addMenu( + translate('OpenLP.SlideController', 'Tracks')) + trackMenu.addAction('first song') + trackMenu.addAction('second song') + trackMenu.addAction('third song') + self.audioPauseItem.setPopupMode(QtGui.QToolButton.MenuButtonPopup) + self.audioPauseItem.setMenu(audioMenu) # Screen preview area self.previewFrame = QtGui.QFrame(self.splitter) self.previewFrame.setGeometry(QtCore.QRect(0, 0, 300, 300 * self.ratio)) @@ -715,7 +730,7 @@ class SlideController(Controller): Adjusts the value of the ``delaySpinBox`` to the given one. """ self.delaySpinBox.setValue(int(value)) - + def updateSlideLimits(self): """ Updates the Slide Limits variable from the settings. @@ -860,10 +875,15 @@ class SlideController(Controller): self.display.audioPlayer.reset() self.setAudioItemsVisibility(False) self.audioPauseItem.setChecked(False) + # If the current item has background audio if self.serviceItem.is_capable(ItemCapabilities.HasBackgroundAudio): log.debug(u'Starting to play...') self.display.audioPlayer.addToPlaylist( self.serviceItem.background_audio) + self.display.audioPlayer.repeat = QtCore.QSettings().value( + self.parent().generalSettingsSection + \ + u'/audio repeat list', + QtCore.QVariant(False)).toBool() if QtCore.QSettings().value( self.parent().generalSettingsSection + \ u'/audio start paused', diff --git a/openlp/plugins/songs/lib/songstab.py b/openlp/plugins/songs/lib/songstab.py index e662cee78..5da2a2a3c 100644 --- a/openlp/plugins/songs/lib/songstab.py +++ b/openlp/plugins/songs/lib/songstab.py @@ -33,56 +33,56 @@ class SongsTab(SettingsTab): """ SongsTab is the Songs settings tab in the settings dialog. """ - def __init__(self, parent, title, visible_title, icon_path): - SettingsTab.__init__(self, parent, title, visible_title, icon_path) - def setupUi(self): + """ + Set up the configuration tab UI. + """ self.setObjectName(u'SongsTab') SettingsTab.setupUi(self) - self.SongsModeGroupBox = QtGui.QGroupBox(self.leftColumn) - self.SongsModeGroupBox.setObjectName(u'SongsModeGroupBox') - self.SongsModeLayout = QtGui.QVBoxLayout(self.SongsModeGroupBox) - self.SongsModeLayout.setObjectName(u'SongsModeLayout') - self.SearchAsTypeCheckBox = QtGui.QCheckBox(self.SongsModeGroupBox) - self.SearchAsTypeCheckBox.setObjectName(u'SearchAsTypeCheckBox') - self.SongsModeLayout.addWidget(self.SearchAsTypeCheckBox) - self.SongBarActiveCheckBox = QtGui.QCheckBox(self.SongsModeGroupBox) - self.SongBarActiveCheckBox.setObjectName(u'SongBarActiveCheckBox') - self.SongsModeLayout.addWidget(self.SongBarActiveCheckBox) - self.SongUpdateOnEditCheckBox = QtGui.QCheckBox(self.SongsModeGroupBox) - self.SongUpdateOnEditCheckBox.setObjectName(u'SongUpdateOnEditCheckBox') - self.SongsModeLayout.addWidget(self.SongUpdateOnEditCheckBox) - self.SongAddFromServiceCheckBox = QtGui.QCheckBox( - self.SongsModeGroupBox) - self.SongAddFromServiceCheckBox.setObjectName( - u'SongAddFromServiceCheckBox') - self.SongsModeLayout.addWidget(self.SongAddFromServiceCheckBox) - self.leftLayout.addWidget(self.SongsModeGroupBox) + self.modeGroupBox = QtGui.QGroupBox(self.leftColumn) + self.modeGroupBox.setObjectName(u'modeGroupBox') + self.modeLayout = QtGui.QVBoxLayout(self.modeGroupBox) + self.modeLayout.setObjectName(u'modeLayout') + self.searchAsTypeCheckBox = QtGui.QCheckBox(self.modeGroupBox) + self.searchAsTypeCheckBox.setObjectName(u'SearchAsTypeCheckBox') + self.modeLayout.addWidget(self.searchAsTypeCheckBox) + self.toolBarActiveCheckBox = QtGui.QCheckBox(self.modeGroupBox) + self.toolBarActiveCheckBox.setObjectName(u'toolBarActiveCheckBox') + self.modeLayout.addWidget(self.toolBarActiveCheckBox) + self.updateOnEditCheckBox = QtGui.QCheckBox(self.modeGroupBox) + self.updateOnEditCheckBox.setObjectName(u'updateOnEditCheckBox') + self.modeLayout.addWidget(self.updateOnEditCheckBox) + self.addFromServiceCheckBox = QtGui.QCheckBox( + self.modeGroupBox) + self.addFromServiceCheckBox.setObjectName( + u'addFromServiceCheckBox') + self.modeLayout.addWidget(self.addFromServiceCheckBox) + self.leftLayout.addWidget(self.modeGroupBox) self.leftLayout.addStretch() self.rightLayout.addStretch() - QtCore.QObject.connect(self.SearchAsTypeCheckBox, + QtCore.QObject.connect(self.searchAsTypeCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onSearchAsTypeCheckBoxChanged) - QtCore.QObject.connect(self.SongBarActiveCheckBox, + QtCore.QObject.connect(self.toolBarActiveCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), - self.onSongBarActiveCheckBoxChanged) - QtCore.QObject.connect(self.SongUpdateOnEditCheckBox, + self.onToolBarActiveCheckBoxChanged) + QtCore.QObject.connect(self.updateOnEditCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), - self.onSongUpdateOnEditCheckBoxChanged) - QtCore.QObject.connect(self.SongAddFromServiceCheckBox, + self.onUpdateOnEditCheckBoxChanged) + QtCore.QObject.connect(self.addFromServiceCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), - self.onSongAddFromServiceCheckBoxChanged) + self.onAddFromServiceCheckBoxChanged) def retranslateUi(self): - self.SongsModeGroupBox.setTitle( + self.modeGroupBox.setTitle( translate('SongsPlugin.SongsTab', 'Songs Mode')) - self.SearchAsTypeCheckBox.setText( + self.searchAsTypeCheckBox.setText( translate('SongsPlugin.SongsTab', 'Enable search as you type')) - self.SongBarActiveCheckBox.setText(translate('SongsPlugin.SongsTab', + self.toolBarActiveCheckBox.setText(translate('SongsPlugin.SongsTab', 'Display verses on live tool bar')) - self.SongUpdateOnEditCheckBox.setText( + self.updateOnEditCheckBox.setText( translate('SongsPlugin.SongsTab', 'Update service from song edit')) - self.SongAddFromServiceCheckBox.setText( + self.addFromServiceCheckBox.setText( translate('SongsPlugin.SongsTab', 'Add missing songs when opening service')) @@ -92,19 +92,19 @@ class SongsTab(SettingsTab): if check_state == QtCore.Qt.Checked: self.song_search = True - def onSongBarActiveCheckBoxChanged(self, check_state): - self.song_bar = False + def onToolBarActiveCheckBoxChanged(self, check_state): + self.tool_bar = False # we have a set value convert to True/False if check_state == QtCore.Qt.Checked: - self.song_bar = True + self.tool_bar = True - def onSongUpdateOnEditCheckBoxChanged(self, check_state): + def onUpdateOnEditCheckBoxChanged(self, check_state): self.update_edit = False # we have a set value convert to True/False if check_state == QtCore.Qt.Checked: self.update_edit = True - def onSongAddFromServiceCheckBoxChanged(self, check_state): + def onAddFromServiceCheckBoxChanged(self, check_state): self.update_load = False # we have a set value convert to True/False if check_state == QtCore.Qt.Checked: @@ -115,23 +115,23 @@ class SongsTab(SettingsTab): settings.beginGroup(self.settingsSection) self.song_search = settings.value( u'search as type', QtCore.QVariant(False)).toBool() - self.song_bar = settings.value( + self.tool_bar = settings.value( u'display songbar', QtCore.QVariant(True)).toBool() self.update_edit = settings.value( u'update service on edit', QtCore.QVariant(False)).toBool() self.update_load = settings.value( u'add song from service', QtCore.QVariant(True)).toBool() - self.SearchAsTypeCheckBox.setChecked(self.song_search) - self.SongBarActiveCheckBox.setChecked(self.song_bar) - self.SongUpdateOnEditCheckBox.setChecked(self.update_edit) - self.SongAddFromServiceCheckBox.setChecked(self.update_load) + self.searchAsTypeCheckBox.setChecked(self.song_search) + self.toolBarActiveCheckBox.setChecked(self.tool_bar) + self.updateOnEditCheckBox.setChecked(self.update_edit) + self.addFromServiceCheckBox.setChecked(self.update_load) settings.endGroup() def save(self): settings = QtCore.QSettings() settings.beginGroup(self.settingsSection) settings.setValue(u'search as type', QtCore.QVariant(self.song_search)) - settings.setValue(u'display songbar', QtCore.QVariant(self.song_bar)) + settings.setValue(u'display songbar', QtCore.QVariant(self.tool_bar)) settings.setValue(u'update service on edit', QtCore.QVariant(self.update_edit)) settings.setValue(u'add song from service', From 8fa7dcf0807ae974d7938ba02d8c35e43fda7c55 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sat, 25 Feb 2012 01:26:10 +0200 Subject: [PATCH 02/15] Add the last two remaining outstanding items, the "next track" and the time remaining. Fixes: https://launchpad.net/bugs/845692 --- openlp/core/lib/ui.py | 1 + openlp/core/ui/maindisplay.py | 22 +++++++++++++--- openlp/core/ui/slidecontroller.py | 44 ++++++++++++++++++++++++------- 3 files changed, 54 insertions(+), 13 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index 72bdd8b0c..2922200e3 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -93,6 +93,7 @@ class UiStrings(object): self.New = translate('OpenLP.Ui', 'New') self.NewService = translate('OpenLP.Ui', 'New Service') self.NewTheme = translate('OpenLP.Ui', 'New Theme') + self.NextTrack = translate('OpenLP.Ui', 'Next Track') self.NFSs = translate('OpenLP.Ui', 'No File Selected', 'Singular') self.NFSp = translate('OpenLP.Ui', 'No Files Selected', 'Plural') self.NISs = translate('OpenLP.Ui', 'No Item Selected', 'Singular') diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index f1a94138c..684382e21 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -30,7 +30,6 @@ and play multimedia within OpenLP. """ import cgi import logging -import os import sys from PyQt4 import QtCore, QtGui, QtWebKit, QtOpenGL @@ -136,12 +135,12 @@ class MainDisplay(Display): QtCore.Qt.WindowStaysOnTopHint if QtCore.QSettings().value(u'advanced/x11 bypass wm', QtCore.QVariant(True)).toBool(): - windowFlags = windowFlags | QtCore.Qt.X11BypassWindowManagerHint + windowFlags |= QtCore.Qt.X11BypassWindowManagerHint # FIXME: QtCore.Qt.SplashScreen is workaround to make display screen # stay always on top on Mac OS X. For details see bug 906926. # It needs more investigation to fix it properly. if sys.platform == 'darwin': - windowFlags = windowFlags | QtCore.Qt.SplashScreen + windowFlags |= QtCore.Qt.SplashScreen self.setWindowFlags(windowFlags) self.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.setTransparency(True) @@ -495,6 +494,7 @@ class AudioPlayer(QtCore.QObject): self.playlist = [] self.repeat = False self.mediaObject = Phonon.MediaObject() + self.mediaObject.setTickInterval(100) self.audioObject = Phonon.AudioOutput(Phonon.VideoCategory) Phonon.createPath(self.mediaObject, self.audioObject) QtCore.QObject.connect(self.mediaObject, @@ -573,3 +573,19 @@ class AudioPlayer(QtCore.QObject): filenames = [filenames] for filename in filenames: self.playlist.append(Phonon.MediaSource(filename)) + + def next(self): + self.mediaObject.clearQueue() + self.mediaObject.clear() + self.currentIndex += 1 + if len(self.playlist) <= self.currentIndex: + if self.repeat: + self.currentIndex = 0 + else: + self.currentIndex = -1 + if self.currentIndex >= 0: + self.mediaObject.enqueue(self.playlist[self.currentIndex]) + self.mediaObject.play() + + def connectSlot(self, signal, slot): + QtCore.QObject.connect(self.mediaObject, signal, slot) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 75ce23996..d8f6bd1a9 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -33,7 +33,7 @@ from collections import deque from PyQt4 import QtCore, QtGui from openlp.core.lib import OpenLPToolbar, Receiver, ItemCapabilities, \ - translate, build_icon, ServiceItem, build_html, PluginManager, ServiceItem + translate, build_icon, build_html, PluginManager, ServiceItem from openlp.core.lib.ui import UiStrings, shortcut_action from openlp.core.lib import SlideLimits, ServiceItemAction from openlp.core.ui import HideMode, MainDisplay, Display, ScreenList @@ -277,10 +277,10 @@ class SlideController(Controller): self.toolbar.addToolbarWidget(u'Song Menu', self.songMenu) self.songMenu.setMenu(QtGui.QMenu( translate('OpenLP.SlideController', 'Go To'), self.toolbar)) - self.toolbar.makeWidgetsInvisible([u'Song Menu']) # Stuff for items with background audio. self.audioPauseItem = QtGui.QToolButton(self.toolbar) - self.audioPauseItem.setIcon(QtGui.QIcon(u':/slides/media_playback_pause.png')) + self.audioPauseItem.setIcon( + QtGui.QIcon(u':/slides/media_playback_pause.png')) #u'Pause Audio', , self.audioPauseItem.setText(translate('OpenLP.SlideController', 'Pause audio.')) @@ -289,16 +289,27 @@ class SlideController(Controller): QtCore.QObject.connect(self.audioPauseItem, QtCore.SIGNAL(u'clicked(bool)'), self.onAudioPauseClicked) self.audioPauseItem.setVisible(False) - audioMenu = QtGui.QMenu( + self.audioMenu = QtGui.QMenu( translate('OpenLP.SlideController', 'Background Audio'), self.toolbar) - trackMenu = audioMenu.addMenu( + self.nextTrackItem = shortcut_action(self.audioMenu, + 'nextTrackItem', [], self.onNextTrackClicked, None, None, + unicode(UiStrings().LiveToolbar)) + self.nextTrackItem.setText(translate('OpenLP.SlideController', 'Next Track')) + self.audioMenu.addAction(self.nextTrackItem) + self.trackMenu = self.audioMenu.addMenu( translate('OpenLP.SlideController', 'Tracks')) - trackMenu.addAction('first song') - trackMenu.addAction('second song') - trackMenu.addAction('third song') + self.trackMenu.addAction('first song') + self.trackMenu.addAction('second song') + self.trackMenu.addAction('third song') self.audioPauseItem.setPopupMode(QtGui.QToolButton.MenuButtonPopup) - self.audioPauseItem.setMenu(audioMenu) + self.audioPauseItem.setMenu(self.audioMenu) + self.audioTimeLabel = QtGui.QLabel(u' 00:00 ', self.toolbar) + self.audioTimeLabel.setAlignment(QtCore.Qt.AlignCenter|QtCore.Qt.AlignHCenter) + self.audioTimeLabel.setStyleSheet(u'background-color: palette(background); border-top-color: palette(shadow); border-left-color: palette(shadow); border-bottom-color: palette(light); border-right-color: palette(light); border-radius: 3px; border-style: inset; border-width: 1; font-family: monospace; margin: 2px;') + self.audioTimeLabel.setObjectName(u'audioTimeLabel') + self.toolbar.addToolbarWidget(u'Time Remaining', self.audioTimeLabel) + self.toolbar.makeWidgetsInvisible([u'Song Menu', u'Pause Audio', u'Time Remaining']) # Screen preview area self.previewFrame = QtGui.QFrame(self.splitter) self.previewFrame.setGeometry(QtCore.QRect(0, 0, 300, 300 * self.ratio)) @@ -657,6 +668,7 @@ class SlideController(Controller): self.display.setup() if self.isLive: self.__addActionsToWidget(self.display) + self.display.audioPlayer.connectSlot(QtCore.SIGNAL(u'tick(qint64)'), self.onAudioTimeRemaining) # The SlidePreview's ratio. try: self.ratio = float(self.screens.current[u'size'].width()) / \ @@ -1333,7 +1345,10 @@ class SlideController(Controller): self.onToggleLoop() def setAudioItemsVisibility(self, visible): - self.audioPauseItem.setVisible(visible) + if visible: + self.toolbar.makeWidgetsVisible([u'Song Menu', u'Pause Audio', u'Time Remaining']) + else: + self.toolbar.makeWidgetsInvisible([u'Song Menu', u'Pause Audio', u'Time Remaining']) def onAudioPauseClicked(self, checked): if not self.audioPauseItem.isVisible(): @@ -1444,3 +1459,12 @@ class SlideController(Controller): return HideMode.Screen else: return None + + def onNextTrackClicked(self): + self.display.audioPlayer.next() + + def onAudioTimeRemaining(self, time): + seconds = self.display.audioPlayer.mediaObject.remainingTime() // 1000 + minutes = seconds // 60 + seconds = seconds % 60 + self.audioTimeLabel.setText(u' %02d:%02d ' % (minutes, seconds)) From d681afb2b4b2838d56619e689163b04b1255a0ed Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sat, 25 Feb 2012 02:01:24 +0200 Subject: [PATCH 03/15] Added an icon in for the Next button, and added in direct-to-track skipping too. Fixes: https://launchpad.net/bugs/845692 --- openlp/core/ui/maindisplay.py | 19 +++++++- openlp/core/ui/slidecontroller.py | 58 ++++++++++++++++------- resources/images/media_playback_next.png | Bin 0 -> 506 bytes resources/images/openlp-2.qrc | 1 + 4 files changed, 60 insertions(+), 18 deletions(-) create mode 100644 resources/images/media_playback_next.png diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 684382e21..fb45ecff0 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -575,6 +575,7 @@ class AudioPlayer(QtCore.QObject): self.playlist.append(Phonon.MediaSource(filename)) def next(self): + isPlaying = self.mediaObject.state() == Phonon.PlayingState self.mediaObject.clearQueue() self.mediaObject.clear() self.currentIndex += 1 @@ -585,7 +586,23 @@ class AudioPlayer(QtCore.QObject): self.currentIndex = -1 if self.currentIndex >= 0: self.mediaObject.enqueue(self.playlist[self.currentIndex]) - self.mediaObject.play() + if isPlaying: + self.mediaObject.play() + + def goTo(self, index): + isPlaying = self.mediaObject.state() == Phonon.PlayingState + self.mediaObject.clearQueue() + self.mediaObject.clear() + self.currentIndex = index + if len(self.playlist) <= self.currentIndex: + if self.repeat: + self.currentIndex = 0 + else: + self.currentIndex = -1 + if self.currentIndex >= 0: + self.mediaObject.enqueue(self.playlist[self.currentIndex]) + if isPlaying: + self.mediaObject.play() def connectSlot(self, signal, slot): QtCore.QObject.connect(self.mediaObject, signal, slot) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index d8f6bd1a9..ade6b4bc4 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -46,9 +46,10 @@ class SlideList(QtGui.QTableWidget): Customised version of QTableWidget which can respond to keyboard events. """ - def __init__(self, parent=None, name=None): + def __init__(self, parent=None): QtGui.QTableWidget.__init__(self, parent.controller) + class Controller(QtGui.QWidget): """ Controller is a general controller widget. @@ -293,23 +294,33 @@ class SlideController(Controller): translate('OpenLP.SlideController', 'Background Audio'), self.toolbar) self.nextTrackItem = shortcut_action(self.audioMenu, - 'nextTrackItem', [], self.onNextTrackClicked, None, None, - unicode(UiStrings().LiveToolbar)) - self.nextTrackItem.setText(translate('OpenLP.SlideController', 'Next Track')) + u'nextTrackItem', [], self.onNextTrackClicked, + u':/slides/media_playback_next.png', + category=unicode(UiStrings().LiveToolbar)) + self.nextTrackItem.setText( + translate('OpenLP.SlideController', 'Next Track')) self.audioMenu.addAction(self.nextTrackItem) self.trackMenu = self.audioMenu.addMenu( translate('OpenLP.SlideController', 'Tracks')) - self.trackMenu.addAction('first song') - self.trackMenu.addAction('second song') - self.trackMenu.addAction('third song') self.audioPauseItem.setPopupMode(QtGui.QToolButton.MenuButtonPopup) self.audioPauseItem.setMenu(self.audioMenu) self.audioTimeLabel = QtGui.QLabel(u' 00:00 ', self.toolbar) - self.audioTimeLabel.setAlignment(QtCore.Qt.AlignCenter|QtCore.Qt.AlignHCenter) - self.audioTimeLabel.setStyleSheet(u'background-color: palette(background); border-top-color: palette(shadow); border-left-color: palette(shadow); border-bottom-color: palette(light); border-right-color: palette(light); border-radius: 3px; border-style: inset; border-width: 1; font-family: monospace; margin: 2px;') + self.audioTimeLabel.setAlignment( + QtCore.Qt.AlignCenter|QtCore.Qt.AlignHCenter) + self.audioTimeLabel.setStyleSheet( + u'background-color: palette(background); ' + u'border-top-color: palette(shadow); ' + u'border-left-color: palette(shadow); ' + u'border-bottom-color: palette(light); ' + u'border-right-color: palette(light); ' + u'border-radius: 3px; border-style: inset; ' + u'border-width: 1; font-family: monospace; margin: 2px;' + ) self.audioTimeLabel.setObjectName(u'audioTimeLabel') - self.toolbar.addToolbarWidget(u'Time Remaining', self.audioTimeLabel) - self.toolbar.makeWidgetsInvisible([u'Song Menu', u'Pause Audio', u'Time Remaining']) + self.toolbar.addToolbarWidget( + u'Time Remaining', self.audioTimeLabel) + self.toolbar.makeWidgetsInvisible([u'Song Menu', u'Pause Audio', + u'Time Remaining']) # Screen preview area self.previewFrame = QtGui.QFrame(self.splitter) self.previewFrame.setGeometry(QtCore.QRect(0, 0, 300, 300 * self.ratio)) @@ -570,7 +581,7 @@ class SlideController(Controller): # Reset the shortcut. self.current_shortcut = u'' - def setPreviewHotkeys(self, parent=None): + def setPreviewHotkeys(self): self.previousItem.setObjectName(u'previousItemPreview') self.nextItem.setObjectName(u'nextItemPreview') action_list = ActionList.get_instance() @@ -647,7 +658,7 @@ class SlideController(Controller): self.keypress_loop = True keypressCommand = self.keypress_queue.popleft() if keypressCommand == ServiceItemAction.Previous: - Receiver.send_message('servicemanager_previous_item', None) + Receiver.send_message('servicemanager_previous_item') elif keypressCommand == ServiceItemAction.PreviousLastSlide: # Go to the last slide of the previous item Receiver.send_message('servicemanager_previous_item', u'last slide') @@ -680,7 +691,7 @@ class SlideController(Controller): self.previewDisplay.setup() serviceItem = ServiceItem() self.previewDisplay.webView.setHtml(build_html(serviceItem, - self.previewDisplay.screen, None, self.isLive, None, + self.previewDisplay.screen, None, self.isLive, plugins=PluginManager.get_instance().plugins)) self.mediaController.setup_display(self.previewDisplay) if self.serviceItem: @@ -892,6 +903,14 @@ class SlideController(Controller): log.debug(u'Starting to play...') self.display.audioPlayer.addToPlaylist( self.serviceItem.background_audio) + self.trackMenu.clear() + for counter in range(len(self.serviceItem.background_audio)): + action = self.trackMenu.addAction(os.path.basename( + self.serviceItem.background_audio[counter])) + action.setData(counter) + QtCore.QObject.connect(action, + QtCore.SIGNAL(u'triggered(bool)'), + self.onTrackTriggered) self.display.audioPlayer.repeat = QtCore.QSettings().value( self.parent().generalSettingsSection + \ u'/audio repeat list', @@ -947,7 +966,7 @@ class SlideController(Controller): self.slideList[unicode(row)] = row - 1 text.append(unicode(row)) self.previewListWidget.setItem(framenumber, 0, item) - if slideHeight != 0: + if not slideHeight: self.previewListWidget.setRowHeight(framenumber, slideHeight) self.previewListWidget.setVerticalHeaderLabels(text) if self.serviceItem.is_text(): @@ -1149,7 +1168,7 @@ class SlideController(Controller): else: Receiver.send_message(u'live_display_show') - def onSlideSelected(self, start=False): + def onSlideSelected(self): """ Slide selected in controller """ @@ -1466,5 +1485,10 @@ class SlideController(Controller): def onAudioTimeRemaining(self, time): seconds = self.display.audioPlayer.mediaObject.remainingTime() // 1000 minutes = seconds // 60 - seconds = seconds % 60 + seconds %= 60 self.audioTimeLabel.setText(u' %02d:%02d ' % (minutes, seconds)) + + def onTrackTriggered(self): + action = self.sender() + index = action.data().toInt()[0] + self.display.audioPlayer.goTo(index) diff --git a/resources/images/media_playback_next.png b/resources/images/media_playback_next.png new file mode 100644 index 0000000000000000000000000000000000000000..0d22924eef18d1f675d39e9c1468682f47365f5a GIT binary patch literal 506 zcmVMzCV_|S* zE^l&Yo9;Xs0004bNklPHu8N*UY6P4s` zVoj6z5W7`$3L^Rz8)eWJ2x3qkLcDl+8P$3TJFJagzh4L;#9`?m%etMslV{z7?64$+ z5Ftb-*-P8QrY#*ETbkO#y|j}E5n?B4_clFpr0<&(Ume-DsomR2M2J?p?zu0%8~E!& z;fGVttZStr($dDT<=A__{4+5zHc~jVWn-9@Vl7+p(NAx^atzp1SLj=^wjayg6`vJe z+V#*I7g#ZEabo4 zQA=k%b*3;fHZe9*cx_fK6(Q!6T5raxzHqLoy+I)a<`IIOF{_oABo&%w-$tV_5c6?07*qoM6N<$g1p4kZvX%Q literal 0 HcmV?d00001 diff --git a/resources/images/openlp-2.qrc b/resources/images/openlp-2.qrc index dc444d445..1b833a4db 100644 --- a/resources/images/openlp-2.qrc +++ b/resources/images/openlp-2.qrc @@ -68,6 +68,7 @@ media_playback_start.png media_playback_stop.png media_playback_pause.png + media_playback_next.png openlp-logo-16x16.png From 476ba8eb1b6298791e74e2be1cc85068e3916e6e Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sat, 25 Feb 2012 13:11:59 +0200 Subject: [PATCH 04/15] Fixed the copyright in the patch file which someone else missed. Regenerated the resource file. Fixed the copyright in the translation_utils.py script which someone else missed. Removed an unnecessary comment. --- openlp/core/ui/slidecontroller.py | 1 - scripts/resources.patch | 12 ++++++------ scripts/translation_utils.py | 12 ++++++------ 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 23f9ffc3c..04cb2b4a3 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -282,7 +282,6 @@ class SlideController(Controller): self.audioPauseItem = QtGui.QToolButton(self.toolbar) self.audioPauseItem.setIcon( QtGui.QIcon(u':/slides/media_playback_pause.png')) - #u'Pause Audio', , self.audioPauseItem.setText(translate('OpenLP.SlideController', 'Pause audio.')) self.audioPauseItem.setCheckable(True) diff --git a/scripts/resources.patch b/scripts/resources.patch index 3697a705a..8fa2edbe1 100644 --- a/scripts/resources.patch +++ b/scripts/resources.patch @@ -12,12 +12,12 @@ +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # -+# Copyright (c) 2008-2011 Raoul Snyman # -+# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # -+# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # -+# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -+# Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode # -+# Woldsund # ++# Copyright (c) 2008-2012 Raoul Snyman # ++# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # ++# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # ++# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # ++# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # ++# Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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 # diff --git a/scripts/translation_utils.py b/scripts/translation_utils.py index 812258fe2..b60d7d425 100755 --- a/scripts/translation_utils.py +++ b/scripts/translation_utils.py @@ -5,12 +5,12 @@ ############################################################################### # OpenLP - Open Source Lyrics Projection # # --------------------------------------------------------------------------- # -# Copyright (c) 2008-2011 Raoul Snyman # -# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # -# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode # -# Woldsund # +# Copyright (c) 2008-2012 Raoul Snyman # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # +# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # +# Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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 # From ef4b69c50f29e869fee3a7ac9a6994df504c2883 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sat, 25 Feb 2012 15:39:12 +0200 Subject: [PATCH 05/15] Fixed some long lines. --- openlp/core/ui/slidecontroller.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 04cb2b4a3..f7be9a191 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -678,7 +678,8 @@ class SlideController(Controller): self.display.setup() if self.isLive: self.__addActionsToWidget(self.display) - self.display.audioPlayer.connectSlot(QtCore.SIGNAL(u'tick(qint64)'), self.onAudioTimeRemaining) + self.display.audioPlayer.connectSlot( + QtCore.SIGNAL(u'tick(qint64)'), self.onAudioTimeRemaining) # The SlidePreview's ratio. try: self.ratio = float(self.screens.current[u'size'].width()) / \ @@ -1364,9 +1365,11 @@ class SlideController(Controller): def setAudioItemsVisibility(self, visible): if visible: - self.toolbar.makeWidgetsVisible([u'Song Menu', u'Pause Audio', u'Time Remaining']) + self.toolbar.makeWidgetsVisible( + [u'Song Menu', u'Pause Audio', u'Time Remaining']) else: - self.toolbar.makeWidgetsInvisible([u'Song Menu', u'Pause Audio', u'Time Remaining']) + self.toolbar.makeWidgetsInvisible( + [u'Song Menu', u'Pause Audio', u'Time Remaining']) def onAudioPauseClicked(self, checked): if not self.audioPauseItem.isVisible(): From 2592d6f698cbddffcfe84b7b73f358b8041123cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Sun, 26 Feb 2012 22:27:05 +0100 Subject: [PATCH 06/15] add possibility to search for songbook and songnumber --- openlp/plugins/songs/lib/mediaitem.py | 39 +++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index ab95d794f..62a48521c 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -43,7 +43,7 @@ from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm, \ SongImportForm, SongExportForm from openlp.plugins.songs.lib import OpenLyrics, SongXML, VerseType, \ clean_string -from openlp.plugins.songs.lib.db import Author, Song, MediaFile +from openlp.plugins.songs.lib.db import Author, Song, Book, MediaFile from openlp.plugins.songs.lib.ui import SongStrings log = logging.getLogger(__name__) @@ -56,7 +56,8 @@ class SongSearch(object): Titles = 2 Lyrics = 3 Authors = 4 - Themes = 5 + Books = 5 + Themes = 6 class SongMediaItem(MediaManagerItem): @@ -158,6 +159,8 @@ class SongMediaItem(MediaManagerItem): translate('SongsPlugin.MediaItem', 'Lyrics')), (SongSearch.Authors, u':/songs/song_search_author.png', SongStrings.Authors), + (SongSearch.Books, u':/songs/song_book_edit.png', + SongStrings.SongBooks), (SongSearch.Themes, u':/slides/slide_theme.png', UiStrings().Themes) ]) self.searchTextEdit.setCurrentSearchType(QtCore.QSettings().value( @@ -196,6 +199,19 @@ class SongMediaItem(MediaManagerItem): Author.display_name.like(u'%' + search_keywords + u'%'), Author.display_name.asc()) self.displayResultsAuthor(search_results) + elif search_type == SongSearch.Books: + log.debug(u'Books Search') + search_results = self.plugin.manager.get_all_objects(Book, + Book.name.like(u'%' + search_keywords + u'%'), + Book.name.asc()) + song_number = False + if not search_results: + search_keywords = search_keywords.rpartition(' ') + search_results = self.plugin.manager.get_all_objects(Book, + Book.name.like(u'%' + search_keywords[0] + u'%'), + Book.name.asc()) + song_number = re.sub(r'[^0-9]', u'', search_keywords[2]) + self.displayResultsBook(search_results, song_number) elif search_type == SongSearch.Themes: log.debug(u'Theme Search') search_results = self.plugin.manager.get_all_objects(Song, @@ -270,6 +286,25 @@ class SongMediaItem(MediaManagerItem): song_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(song.id)) self.listView.addItem(song_name) + def displayResultsBook(self, searchresults, song_number=False): + log.debug(u'display results Book') + self.listView.clear() + for book in searchresults: + songs = sorted(book.songs, key=lambda song: int( + re.sub(r'[^0-9]', u' ', song.song_number).partition(' ')[0]) + if len(re.sub(r'[^\w]', ' ', song.song_number)) else 0) + for song in songs: + # Do not display temporary songs + if song.temporary: + continue + if song_number and not song_number in song.song_number: + continue + song_detail = u'%s - %s (%s)' % (book.name, song.song_number, + song.title) + song_name = QtGui.QListWidgetItem(song_detail) + song_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(song.id)) + self.listView.addItem(song_name) + def onClearTextButtonClick(self): """ Clear the search text. From b56d8d2a061aa52511cab2763c64230b42fc65e6 Mon Sep 17 00:00:00 2001 From: Rastislav Pecik Date: Mon, 27 Feb 2012 01:42:35 +0100 Subject: [PATCH 07/15] Fixed connection to mysql to use UTF8 encoding. Fixes: https://launchpad.net/bugs/941692 --- openlp/core/lib/db.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index d7ca10f0f..30b41a6b5 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -193,6 +193,12 @@ class Manager(object): else: self.db_url = u'sqlite:///%s/%s.sqlite' % ( AppLocation.get_section_data_path(plugin_name), plugin_name) + elif db_type == u'mysql' : + self.db_url = u'%s://%s:%s@%s/%s?charset=utf8' % (db_type, + urlquote(unicode(settings.value(u'db username').toString())), + urlquote(unicode(settings.value(u'db password').toString())), + urlquote(unicode(settings.value(u'db hostname').toString())), + urlquote(unicode(settings.value(u'db database').toString()))) else: self.db_url = u'%s://%s:%s@%s/%s' % (db_type, urlquote(unicode(settings.value(u'db username').toString())), From c024e9e47d989855418f3e20aa564fa1a6b1b889 Mon Sep 17 00:00:00 2001 From: Rastislav Pecik Date: Mon, 27 Feb 2012 19:18:52 +0100 Subject: [PATCH 08/15] Exported mysql charset settings to configuration files and cleaned up the code --- openlp/core/lib/db.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index 30b41a6b5..36823b118 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -193,18 +193,18 @@ class Manager(object): else: self.db_url = u'sqlite:///%s/%s.sqlite' % ( AppLocation.get_section_data_path(plugin_name), plugin_name) - elif db_type == u'mysql' : - self.db_url = u'%s://%s:%s@%s/%s?charset=utf8' % (db_type, - urlquote(unicode(settings.value(u'db username').toString())), - urlquote(unicode(settings.value(u'db password').toString())), - urlquote(unicode(settings.value(u'db hostname').toString())), - urlquote(unicode(settings.value(u'db database').toString()))) else: self.db_url = u'%s://%s:%s@%s/%s' % (db_type, urlquote(unicode(settings.value(u'db username').toString())), urlquote(unicode(settings.value(u'db password').toString())), urlquote(unicode(settings.value(u'db hostname').toString())), urlquote(unicode(settings.value(u'db database').toString()))) + if db_type == u'mysql': + db_encoding = unicode( + settings.value(u'db encoding').toString()) + if db_encoding == "": + db_encoding = u'utf8' + self.db_url += u'?charset=%s' % (urlquote(db_encoding)) settings.endGroup() if upgrade_mod: db_ver, up_ver = upgrade_db(self.db_url, upgrade_mod) From 6ec167ed83b13f84f3307194509f7634d03a008f Mon Sep 17 00:00:00 2001 From: Rastislav Pecik Date: Tue, 28 Feb 2012 12:12:52 +0100 Subject: [PATCH 09/15] QSettings.value() now uses second argument for default value, which is utf8 --- openlp/core/lib/db.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index 36823b118..a4a047497 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -201,9 +201,7 @@ class Manager(object): urlquote(unicode(settings.value(u'db database').toString()))) if db_type == u'mysql': db_encoding = unicode( - settings.value(u'db encoding').toString()) - if db_encoding == "": - db_encoding = u'utf8' + settings.value(u'db encoding', u'utf8').toString()) self.db_url += u'?charset=%s' % (urlquote(db_encoding)) settings.endGroup() if upgrade_mod: From 271c4ef1a41a18b18707d6d4509ee5069eee93b9 Mon Sep 17 00:00:00 2001 From: Rastislav Pecik Date: Tue, 28 Feb 2012 12:30:30 +0100 Subject: [PATCH 10/15] using QtCore.QVariant object as a second argument in settings.value method --- openlp/core/lib/db.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index a4a047497..6eff984c3 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -201,7 +201,7 @@ class Manager(object): urlquote(unicode(settings.value(u'db database').toString()))) if db_type == u'mysql': db_encoding = unicode( - settings.value(u'db encoding', u'utf8').toString()) + settings.value(u'db encoding', QtCore.QVariant(u'utf8')).toString()) self.db_url += u'?charset=%s' % (urlquote(db_encoding)) settings.endGroup() if upgrade_mod: From 8818256b2a99d0b8a3805495ff47232a6ad054f0 Mon Sep 17 00:00:00 2001 From: Rastislav Pecik Date: Tue, 28 Feb 2012 15:06:14 +0100 Subject: [PATCH 11/15] Fixed code according to mrege proposal comments --- openlp/core/lib/db.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index 6eff984c3..436ea82de 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -201,8 +201,8 @@ class Manager(object): urlquote(unicode(settings.value(u'db database').toString()))) if db_type == u'mysql': db_encoding = unicode( - settings.value(u'db encoding', QtCore.QVariant(u'utf8')).toString()) - self.db_url += u'?charset=%s' % (urlquote(db_encoding)) + settings.value(u'db encoding', u'utf8').toString()) + self.db_url += u'?charset=%s' % urlquote(db_encoding) settings.endGroup() if upgrade_mod: db_ver, up_ver = upgrade_db(self.db_url, upgrade_mod) From 87e70fa2dcb953ad6db2fa91f83841cee15d5cbf Mon Sep 17 00:00:00 2001 From: rimach Date: Sat, 3 Mar 2012 00:08:24 +0100 Subject: [PATCH 12/15] fix --- openlp/core/ui/media/mediacontroller.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index 9c44f1693..6ef7185bc 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -100,8 +100,7 @@ class MediaController(object): Register each media Player controller (Webkit, Phonon, etc) and store for later use """ - if controller.check_available(): - self.mediaPlayers[controller.name] = controller + self.mediaPlayers[controller.name] = controller def check_available_media_players(self): """ @@ -134,7 +133,8 @@ class MediaController(object): QtCore.QVariant(u'webkit')).toString()) savedPlayers = playerSettings.split(u',') invalidMediaPlayers = [mediaPlayer for mediaPlayer in savedPlayers \ - if not mediaPlayer in self.mediaPlayers] + if not mediaPlayer in self.mediaPlayers or \ + self.mediaPlayers[mediaPlayer].check_available() == False] if len(invalidMediaPlayers) > 0: for invalidPlayer in invalidMediaPlayers: savedPlayers.remove(invalidPlayer) From 0b15238245d19fb5dbebd11c786e1e3a556d00ac Mon Sep 17 00:00:00 2001 From: Samuel Findlay Date: Sat, 3 Mar 2012 16:13:48 +1100 Subject: [PATCH 13/15] fixed bug #944510 'web remote doesn't scale to screen' Fixes: https://launchpad.net/bugs/944510 --- openlp/plugins/remotes/html/index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/openlp/plugins/remotes/html/index.html b/openlp/plugins/remotes/html/index.html index fb88ee0dc..7a2da3bea 100644 --- a/openlp/plugins/remotes/html/index.html +++ b/openlp/plugins/remotes/html/index.html @@ -27,6 +27,7 @@ --> + ${app_title} From 5d6db957e166c3aa4d5f1e3b27b302efb1c0853e Mon Sep 17 00:00:00 2001 From: rimach Date: Sat, 3 Mar 2012 23:36:46 +0100 Subject: [PATCH 14/15] fix --- 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 6ef7185bc..3beffbf36 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -134,7 +134,7 @@ class MediaController(object): savedPlayers = playerSettings.split(u',') invalidMediaPlayers = [mediaPlayer for mediaPlayer in savedPlayers \ if not mediaPlayer in self.mediaPlayers or \ - self.mediaPlayers[mediaPlayer].check_available() == False] + not self.mediaPlayers[mediaPlayer].check_available()] if len(invalidMediaPlayers) > 0: for invalidPlayer in invalidMediaPlayers: savedPlayers.remove(invalidPlayer) From e59e71748094b682ebc0bc92b8ca756c36af6821 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sun, 4 Mar 2012 20:05:15 +0200 Subject: [PATCH 15/15] Hopefully fix the next button when things are on repeat. --- openlp/core/ui/maindisplay.py | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index fb45ecff0..b0a18537b 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -575,34 +575,26 @@ class AudioPlayer(QtCore.QObject): self.playlist.append(Phonon.MediaSource(filename)) def next(self): + if not self.repeat and self.currentIndex + 1 == len(self.playlist): + return isPlaying = self.mediaObject.state() == Phonon.PlayingState + self.currentIndex += 1 + if self.repeat and self.currentIndex == len(self.playlist): + self.currentIndex = 0 self.mediaObject.clearQueue() self.mediaObject.clear() - self.currentIndex += 1 - if len(self.playlist) <= self.currentIndex: - if self.repeat: - self.currentIndex = 0 - else: - self.currentIndex = -1 - if self.currentIndex >= 0: - self.mediaObject.enqueue(self.playlist[self.currentIndex]) - if isPlaying: - self.mediaObject.play() + self.mediaObject.enqueue(self.playlist[self.currentIndex]) + if isPlaying: + self.mediaObject.play() def goTo(self, index): isPlaying = self.mediaObject.state() == Phonon.PlayingState self.mediaObject.clearQueue() self.mediaObject.clear() self.currentIndex = index - if len(self.playlist) <= self.currentIndex: - if self.repeat: - self.currentIndex = 0 - else: - self.currentIndex = -1 - if self.currentIndex >= 0: - self.mediaObject.enqueue(self.playlist[self.currentIndex]) - if isPlaying: - self.mediaObject.play() + self.mediaObject.enqueue(self.playlist[self.currentIndex]) + if isPlaying: + self.mediaObject.play() def connectSlot(self, signal, slot): QtCore.QObject.connect(self.mediaObject, signal, slot)