mirror of https://gitlab.com/openlp/openlp.git
Merge trunk.
This commit is contained in:
commit
d09cfa4a57
|
@ -43,6 +43,26 @@ class MediaType(object):
|
|||
Audio = 1
|
||||
Video = 2
|
||||
|
||||
|
||||
class SlideLimits(object):
|
||||
"""
|
||||
Provides an enumeration for behaviour of OpenLP at the end limits of each
|
||||
service item when pressing the up/down arrow keys
|
||||
"""
|
||||
End = 1
|
||||
Wrap = 2
|
||||
Next = 3
|
||||
|
||||
|
||||
class ServiceItemAction(object):
|
||||
"""
|
||||
Provides an enumeration for the required action moving between service
|
||||
items by left/right arrow keys
|
||||
"""
|
||||
Previous = 1
|
||||
PreviousLastSlide = 2
|
||||
Next = 3
|
||||
|
||||
def translate(context, text, comment=None,
|
||||
encoding=QtCore.QCoreApplication.CodecForTr, n=-1,
|
||||
translate=QtCore.QCoreApplication.translate):
|
||||
|
|
|
@ -112,6 +112,9 @@ class EventReceiver(QtCore.QObject):
|
|||
``slidecontroller_live_spin_delay``
|
||||
Pushes out the loop delay.
|
||||
|
||||
``slidecontroller_update_slide_limits``
|
||||
Updates the slide_limits variable from the saved settings.
|
||||
|
||||
``slidecontroller_live_stop_loop``
|
||||
Stop the loop on the main display.
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@ from PyQt4 import QtCore, QtGui
|
|||
|
||||
from openlp.core.lib import SettingsTab, translate, build_icon, Receiver
|
||||
from openlp.core.lib.ui import UiStrings
|
||||
from openlp.core.lib import SlideLimits
|
||||
from openlp.core.utils import get_images_filter
|
||||
|
||||
class AdvancedTab(SettingsTab):
|
||||
|
@ -182,7 +183,7 @@ class AdvancedTab(SettingsTab):
|
|||
self.defaultFileLayout.addWidget(self.defaultRevertButton)
|
||||
self.defaultImageLayout.addRow(self.defaultFileLabel,
|
||||
self.defaultFileLayout)
|
||||
self.rightLayout.addWidget(self.defaultImageGroupBox)
|
||||
self.leftLayout.addWidget(self.defaultImageGroupBox)
|
||||
self.hideMouseGroupBox = QtGui.QGroupBox(self.leftColumn)
|
||||
self.hideMouseGroupBox.setObjectName(u'hideMouseGroupBox')
|
||||
self.hideMouseLayout = QtGui.QVBoxLayout(self.hideMouseGroupBox)
|
||||
|
@ -190,7 +191,39 @@ class AdvancedTab(SettingsTab):
|
|||
self.hideMouseCheckBox = QtGui.QCheckBox(self.hideMouseGroupBox)
|
||||
self.hideMouseCheckBox.setObjectName(u'hideMouseCheckBox')
|
||||
self.hideMouseLayout.addWidget(self.hideMouseCheckBox)
|
||||
self.rightLayout.addWidget(self.hideMouseGroupBox)
|
||||
self.leftLayout.addWidget(self.hideMouseGroupBox)
|
||||
self.leftLayout.addStretch()
|
||||
# Service Item Slide Limits
|
||||
self.slideGroupBox = QtGui.QGroupBox(self.rightColumn)
|
||||
self.slideGroupBox.setObjectName(u'slideGroupBox')
|
||||
self.slideLayout = QtGui.QFormLayout(self.slideGroupBox)
|
||||
self.slideLayout.setLabelAlignment(
|
||||
QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
|
||||
self.slideLayout.setFormAlignment(
|
||||
QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
|
||||
self.slideLayout.setObjectName(u'slideLayout')
|
||||
self.endSlideRadioButton = QtGui.QRadioButton(self.slideGroupBox)
|
||||
self.endSlideRadioButton.setObjectName(u'endSlideRadioButton')
|
||||
self.endSlideLabel = QtGui.QLabel(self.slideGroupBox)
|
||||
self.endSlideLabel.setWordWrap(True)
|
||||
self.endSlideLabel.setObjectName(u'endSlideLabel')
|
||||
self.slideLayout.addRow(self.endSlideRadioButton, self.endSlideLabel)
|
||||
self.wrapSlideRadioButton = QtGui.QRadioButton(self.slideGroupBox)
|
||||
self.wrapSlideRadioButton.setObjectName(u'wrapSlideRadioButton')
|
||||
self.wrapSlideLabel = QtGui.QLabel(self.slideGroupBox)
|
||||
self.wrapSlideLabel.setWordWrap(True)
|
||||
self.wrapSlideLabel.setObjectName(u'wrapSlideLabel')
|
||||
self.slideLayout.addRow(self.wrapSlideRadioButton,
|
||||
self.wrapSlideLabel)
|
||||
self.nextItemRadioButton = QtGui.QRadioButton(self.slideGroupBox)
|
||||
self.nextItemRadioButton.setChecked(True)
|
||||
self.nextItemRadioButton.setObjectName(u'nextItemRadioButton')
|
||||
self.nextItemLabel = QtGui.QLabel(self.slideGroupBox)
|
||||
self.nextItemLabel.setWordWrap(True)
|
||||
self.nextItemLabel.setObjectName(u'nextItemLabel')
|
||||
self.slideLayout.addRow(self.nextItemRadioButton,
|
||||
self.nextItemLabel)
|
||||
self.rightLayout.addWidget(self.slideGroupBox)
|
||||
self.x11GroupBox = QtGui.QGroupBox(self.leftColumn)
|
||||
self.x11GroupBox.setObjectName(u'x11GroupBox')
|
||||
self.x11Layout = QtGui.QVBoxLayout(self.x11GroupBox)
|
||||
|
@ -224,6 +257,12 @@ class AdvancedTab(SettingsTab):
|
|||
QtCore.SIGNAL(u'pressed()'), self.onDefaultRevertButtonPressed)
|
||||
QtCore.QObject.connect(self.x11BypassCheckBox,
|
||||
QtCore.SIGNAL(u'toggled(bool)'), self.onX11BypassCheckBoxToggled)
|
||||
QtCore.QObject.connect(self.endSlideRadioButton,
|
||||
QtCore.SIGNAL(u'pressed()'), self.onEndSlideButtonPressed)
|
||||
QtCore.QObject.connect(self.wrapSlideRadioButton,
|
||||
QtCore.SIGNAL(u'pressed()'), self.onWrapSlideButtonPressed)
|
||||
QtCore.QObject.connect(self.nextItemRadioButton,
|
||||
QtCore.SIGNAL(u'pressed()'), self.onnextItemButtonPressed)
|
||||
|
||||
def retranslateUi(self):
|
||||
"""
|
||||
|
@ -299,6 +338,25 @@ class AdvancedTab(SettingsTab):
|
|||
'X11'))
|
||||
self.x11BypassCheckBox.setText(translate('OpenLP.AdvancedTab',
|
||||
'Bypass X11 Window Manager'))
|
||||
# Slide Limits
|
||||
self.slideGroupBox.setTitle(
|
||||
translate('OpenLP.GeneralTab', 'Service Item Slide Limits'))
|
||||
self.endSlideRadioButton.setText(
|
||||
translate('OpenLP.GeneralTab', '&End Slide'))
|
||||
self.endSlideLabel.setText(
|
||||
translate('OpenLP.GeneralTab', 'Up and down arrow keys '
|
||||
'stop at the top and bottom slides of each Service Item.'))
|
||||
self.wrapSlideRadioButton.setText(
|
||||
translate('OpenLP.GeneralTab', '&Wrap Slide'))
|
||||
self.wrapSlideLabel.setText(
|
||||
translate('OpenLP.GeneralTab', 'Up and down arrow keys '
|
||||
'wrap around at the top and bottom slides of each Service Item.'))
|
||||
self.nextItemRadioButton.setText(
|
||||
translate('OpenLP.GeneralTab', '&Next Item'))
|
||||
self.nextItemLabel.setText(
|
||||
translate('OpenLP.GeneralTab', 'Up and down arrow keys '
|
||||
'advance to the the next or previous Service Item from the '
|
||||
'top and bottom slides of each Service Item.'))
|
||||
|
||||
def load(self):
|
||||
"""
|
||||
|
@ -352,6 +410,14 @@ class AdvancedTab(SettingsTab):
|
|||
self.defaultFileEdit.setText(settings.value(u'default image',
|
||||
QtCore.QVariant(u':/graphics/openlp-splash-screen.png'))\
|
||||
.toString())
|
||||
self.slide_limits = settings.value(
|
||||
u'slide limits', QtCore.QVariant(SlideLimits.End)).toInt()[0]
|
||||
if self.slide_limits == SlideLimits.End:
|
||||
self.endSlideRadioButton.setChecked(True)
|
||||
elif self.slide_limits == SlideLimits.Wrap:
|
||||
self.wrapSlideRadioButton.setChecked(True)
|
||||
else:
|
||||
self.nextItemRadioButton.setChecked(True)
|
||||
settings.endGroup()
|
||||
self.defaultColorButton.setStyleSheet(
|
||||
u'background-color: %s' % self.defaultColor)
|
||||
|
@ -395,10 +461,12 @@ class AdvancedTab(SettingsTab):
|
|||
QtCore.QVariant(self.x11BypassCheckBox.isChecked()))
|
||||
settings.setValue(u'default color', self.defaultColor)
|
||||
settings.setValue(u'default image', self.defaultFileEdit.text())
|
||||
settings.setValue(u'slide limits', QtCore.QVariant(self.slide_limits))
|
||||
settings.endGroup()
|
||||
if self.displayChanged:
|
||||
Receiver.send_message(u'config_screen_changed')
|
||||
self.displayChanged = False
|
||||
Receiver.send_message(u'slidecontroller_update_slide_limits')
|
||||
|
||||
def serviceNameCheckBoxToggled(self, default_service_enabled):
|
||||
self.serviceNameDay.setEnabled(default_service_enabled)
|
||||
|
@ -473,3 +541,12 @@ class AdvancedTab(SettingsTab):
|
|||
The state of the check box (boolean).
|
||||
"""
|
||||
self.displayChanged = True
|
||||
|
||||
def onEndSlideButtonPressed(self):
|
||||
self.slide_limits = SlideLimits.End
|
||||
|
||||
def onWrapSlideButtonPressed(self):
|
||||
self.slide_limits = SlideLimits.Wrap
|
||||
|
||||
def onnextItemButtonPressed(self):
|
||||
self.slide_limits = SlideLimits.Next
|
||||
|
|
|
@ -97,9 +97,6 @@ class GeneralTab(SettingsTab):
|
|||
self.autoPreviewCheckBox = QtGui.QCheckBox(self.settingsGroupBox)
|
||||
self.autoPreviewCheckBox.setObjectName(u'autoPreviewCheckBox')
|
||||
self.settingsLayout.addRow(self.autoPreviewCheckBox)
|
||||
self.enableLoopCheckBox = QtGui.QCheckBox(self.settingsGroupBox)
|
||||
self.enableLoopCheckBox.setObjectName(u'enableLoopCheckBox')
|
||||
self.settingsLayout.addRow(self.enableLoopCheckBox)
|
||||
# Moved here from image tab
|
||||
self.timeoutLabel = QtGui.QLabel(self.settingsGroupBox)
|
||||
self.timeoutLabel.setObjectName(u'timeoutLabel')
|
||||
|
@ -231,8 +228,6 @@ class GeneralTab(SettingsTab):
|
|||
'Unblank display when adding new live item'))
|
||||
self.autoPreviewCheckBox.setText(translate('OpenLP.GeneralTab',
|
||||
'Automatically preview next item in service'))
|
||||
self.enableLoopCheckBox.setText(translate('OpenLP.GeneralTab',
|
||||
'Enable slide wrap-around'))
|
||||
self.timeoutLabel.setText(translate('OpenLP.GeneralTab',
|
||||
'Timed slide interval:'))
|
||||
self.timeoutSpinBox.setSuffix(translate('OpenLP.GeneralTab', ' sec'))
|
||||
|
@ -289,8 +284,6 @@ class GeneralTab(SettingsTab):
|
|||
QtCore.QVariant(True)).toBool())
|
||||
self.autoPreviewCheckBox.setChecked(settings.value(u'auto preview',
|
||||
QtCore.QVariant(False)).toBool())
|
||||
self.enableLoopCheckBox.setChecked(settings.value(u'enable slide loop',
|
||||
QtCore.QVariant(True)).toBool())
|
||||
self.timeoutSpinBox.setValue(settings.value(u'loop delay',
|
||||
QtCore.QVariant(5)).toInt()[0])
|
||||
self.overrideCheckBox.setChecked(settings.value(u'override position',
|
||||
|
@ -311,6 +304,7 @@ class GeneralTab(SettingsTab):
|
|||
self.customHeightValueEdit.setEnabled(self.overrideCheckBox.isChecked())
|
||||
self.customWidthValueEdit.setEnabled(self.overrideCheckBox.isChecked())
|
||||
self.display_changed = False
|
||||
settings.beginGroup(self.settingsSection)
|
||||
|
||||
def save(self):
|
||||
"""
|
||||
|
@ -336,8 +330,6 @@ class GeneralTab(SettingsTab):
|
|||
QtCore.QVariant(self.autoUnblankCheckBox.isChecked()))
|
||||
settings.setValue(u'auto preview',
|
||||
QtCore.QVariant(self.autoPreviewCheckBox.isChecked()))
|
||||
settings.setValue(u'enable slide loop',
|
||||
QtCore.QVariant(self.enableLoopCheckBox.isChecked()))
|
||||
settings.setValue(u'loop delay',
|
||||
QtCore.QVariant(self.timeoutSpinBox.value()))
|
||||
settings.setValue(u'ccli number',
|
||||
|
|
|
@ -144,7 +144,7 @@ class MainDisplay(Display):
|
|||
windowFlags = windowFlags | QtCore.Qt.SplashScreen
|
||||
self.setWindowFlags(windowFlags)
|
||||
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
|
||||
self.setAttribute(QtCore.Qt.WA_TranslucentBackground, True)
|
||||
self.setTransparency(True)
|
||||
if self.isLive:
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'live_display_hide'), self.hideDisplay)
|
||||
|
@ -155,6 +155,14 @@ class MainDisplay(Display):
|
|||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'config_updated'), self.configChanged)
|
||||
|
||||
def setTransparency(self, enabled):
|
||||
if enabled:
|
||||
self.setAutoFillBackground(False)
|
||||
else:
|
||||
self.setAttribute(QtCore.Qt.WA_NoSystemBackground, False)
|
||||
self.setAttribute(QtCore.Qt.WA_TranslucentBackground, enabled)
|
||||
self.repaint()
|
||||
|
||||
def cssChanged(self):
|
||||
"""
|
||||
We may need to rebuild the CSS on the live display.
|
||||
|
|
|
@ -38,6 +38,7 @@ from openlp.core.lib import Renderer, build_icon, OpenLPDockWidget, \
|
|||
PluginManager, Receiver, translate, ImageManager, PluginStatus
|
||||
from openlp.core.lib.ui import UiStrings, base_action, checkable_action, \
|
||||
icon_action, shortcut_action
|
||||
from openlp.core.lib import SlideLimits
|
||||
from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, \
|
||||
ThemeManager, SlideController, PluginForm, MediaDockManager, \
|
||||
ShortcutListForm, FormattingTagForm
|
||||
|
@ -1059,7 +1060,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||
export_settings.endGroup()
|
||||
# Write all the sections and keys.
|
||||
for section_key in keys:
|
||||
section, key = section_key.split(u'/')
|
||||
key_value = settings.value(section_key)
|
||||
export_settings.setValue(section_key, key_value)
|
||||
export_settings.sync()
|
||||
|
@ -1307,6 +1307,19 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||
Load the main window settings.
|
||||
"""
|
||||
log.debug(u'Loading QSettings')
|
||||
# Migrate Wrap Settings to Slide Limits Settings
|
||||
if QtCore.QSettings().contains(self.generalSettingsSection +
|
||||
u'/enable slide loop'):
|
||||
if QtCore.QSettings().value(self.generalSettingsSection +
|
||||
u'/enable slide loop', QtCore.QVariant(True)).toBool():
|
||||
QtCore.QSettings().setValue(self.advancedlSettingsSection +
|
||||
u'/slide limits', QtCore.QVariant(SlideLimits.Wrap))
|
||||
else:
|
||||
QtCore.QSettings().setValue(self.advancedlSettingsSection +
|
||||
u'/slide limits', QtCore.QVariant(SlideLimits.End))
|
||||
QtCore.QSettings().remove(self.generalSettingsSection +
|
||||
u'/enable slide loop')
|
||||
Receiver.send_message(u'slidecontroller_update_slide_limits')
|
||||
settings = QtCore.QSettings()
|
||||
# Remove obsolete entries.
|
||||
settings.remove(u'custom slide')
|
||||
|
|
|
@ -278,6 +278,12 @@ class MediaController(object):
|
|||
def set_controls_visible(self, controller, value):
|
||||
# Generic controls
|
||||
controller.mediabar.setVisible(value)
|
||||
if controller.isLive and controller.display:
|
||||
if self.curDisplayMediaPlayer and value:
|
||||
if self.curDisplayMediaPlayer[controller.display] != self.mediaPlayers[u'webkit']:
|
||||
controller.display.setTransparency(False)
|
||||
else:
|
||||
controller.display.setTransparency(True)
|
||||
# Special controls: Here media type specific Controls will be enabled
|
||||
# (e.g. for DVD control, ...)
|
||||
# TODO
|
||||
|
@ -481,6 +487,7 @@ class MediaController(object):
|
|||
Responds to the request to reset a loaded video
|
||||
"""
|
||||
log.debug(u'video_reset')
|
||||
self.set_controls_visible(controller, False)
|
||||
for display in self.curDisplayMediaPlayer.keys():
|
||||
if display.controller == controller:
|
||||
display.override = {}
|
||||
|
@ -489,7 +496,6 @@ class MediaController(object):
|
|||
display.frame.evaluateJavaScript(u'show_video( \
|
||||
"setBackBoard", null, null, null,"hidden");')
|
||||
del self.curDisplayMediaPlayer[display]
|
||||
self.set_controls_visible(controller, False)
|
||||
|
||||
def video_hide(self, msg):
|
||||
"""
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,220 @@
|
|||
# -*- 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, 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 #
|
||||
# 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 #
|
||||
###############################################################################
|
||||
|
||||
import logging
|
||||
import sys, os
|
||||
from datetime import datetime
|
||||
try:
|
||||
import vlc
|
||||
vlc_available = bool(vlc.get_default_instance())
|
||||
except (ImportError, NameError):
|
||||
vlc_available = False
|
||||
except OSError, e:
|
||||
if sys.platform.startswith('win'):
|
||||
if isinstance(e, WindowsError) and e.winerror == 126:
|
||||
vlc_available = False
|
||||
else:
|
||||
raise
|
||||
else:
|
||||
raise
|
||||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
from openlp.core.lib import Receiver
|
||||
from openlp.core.lib.mediaplayer import MediaPlayer
|
||||
from openlp.core.ui.media import MediaState
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
AUDIO_EXT = [
|
||||
u'*.mp3'
|
||||
, u'*.wav'
|
||||
, u'*.ogg'
|
||||
]
|
||||
|
||||
VIDEO_EXT = [
|
||||
u'*.3gp'
|
||||
, u'*.asf', u'*.wmv'
|
||||
, u'*.au'
|
||||
, u'*.avi'
|
||||
, u'*.flv'
|
||||
, u'*.mov'
|
||||
, u'*.mp4'
|
||||
, u'*.ogm'
|
||||
, u'*.mkv', u'*.mka'
|
||||
, u'*.ts', u'*.mpg'
|
||||
, u'*.mpg', u'*.mp2'
|
||||
, u'*.nsc'
|
||||
, u'*.nsv'
|
||||
, u'*.nut'
|
||||
, u'*.ra', u'*.ram', u'*.rm', u'*.rv' ,u'*.rmbv'
|
||||
, u'*.a52', u'*.dts', u'*.aac', u'*.flac' ,u'*.dv', u'*.vid'
|
||||
, u'*.tta', u'*.tac'
|
||||
, u'*.ty'
|
||||
, u'*.dts'
|
||||
, u'*.xa'
|
||||
, u'*.iso'
|
||||
, u'*.vob'
|
||||
]
|
||||
|
||||
|
||||
class VlcPlayer(MediaPlayer):
|
||||
"""
|
||||
A specialised version of the MediaPlayer class, which provides a QtWebKit
|
||||
display.
|
||||
"""
|
||||
|
||||
def __init__(self, parent):
|
||||
MediaPlayer.__init__(self, parent, u'vlc')
|
||||
self.parent = parent
|
||||
self.canFolder = True
|
||||
self.audio_extensions_list = AUDIO_EXT
|
||||
self.video_extensions_list = VIDEO_EXT
|
||||
|
||||
def setup(self, display):
|
||||
display.vlcWidget = QtGui.QFrame(display)
|
||||
# creating a basic vlc instance
|
||||
command_line_options = u'--no-video-title-show'
|
||||
if not display.hasAudio:
|
||||
command_line_options += u' --no-audio --no-video-title-show'
|
||||
if QtCore.QSettings().value(u'advanced/hide mouse',
|
||||
QtCore.QVariant(False)).toBool() and \
|
||||
display.controller.isLive:
|
||||
command_line_options += u' --mouse-hide-timeout=0'
|
||||
display.vlcInstance = vlc.Instance(command_line_options)
|
||||
display.vlcInstance.set_log_verbosity(2)
|
||||
# creating an empty vlc media player
|
||||
display.vlcMediaPlayer = display.vlcInstance.media_player_new()
|
||||
display.vlcWidget.resize(display.size())
|
||||
display.vlcWidget.raise_()
|
||||
display.vlcWidget.hide()
|
||||
# the media player has to be 'connected' to the QFrame
|
||||
# (otherwise a video would be displayed in it's own window)
|
||||
# this is platform specific!
|
||||
# you have to give the id of the QFrame (or similar object) to
|
||||
# vlc, different platforms have different functions for this
|
||||
if sys.platform == "win32": # for Windows
|
||||
display.vlcMediaPlayer.set_hwnd(int(display.vlcWidget.winId()))
|
||||
elif sys.platform == "darwin": # for MacOS
|
||||
display.vlcMediaPlayer.set_agl(int(display.vlcWidget.winId()))
|
||||
else:
|
||||
# for Linux using the X Server
|
||||
display.vlcMediaPlayer.set_xwindow(int(display.vlcWidget.winId()))
|
||||
self.hasOwnWidget = True
|
||||
|
||||
def check_available(self):
|
||||
return vlc_available
|
||||
|
||||
def load(self, display):
|
||||
log.debug(u'load vid in Vlc Controller')
|
||||
controller = display.controller
|
||||
volume = controller.media_info.volume
|
||||
file_path = str(
|
||||
controller.media_info.file_info.absoluteFilePath().toUtf8())
|
||||
path = os.path.normcase(file_path)
|
||||
# create the media
|
||||
display.vlcMedia = display.vlcInstance.media_new_path(path)
|
||||
# put the media in the media player
|
||||
display.vlcMediaPlayer.set_media(display.vlcMedia)
|
||||
# parse the metadata of the file
|
||||
display.vlcMedia.parse()
|
||||
self.volume(display, volume)
|
||||
return True
|
||||
|
||||
def media_state_wait(self, display, mediaState):
|
||||
"""
|
||||
Wait for the video to change its state
|
||||
Wait no longer than 60 seconds. (loading an iso file needs a long time)
|
||||
"""
|
||||
start = datetime.now()
|
||||
while not mediaState == display.vlcMedia.get_state():
|
||||
if display.vlcMedia.get_state() == vlc.State.Error:
|
||||
return False
|
||||
Receiver.send_message(u'openlp_process_events')
|
||||
if (datetime.now() - start).seconds > 60:
|
||||
return False
|
||||
return True
|
||||
|
||||
def resize(self, display):
|
||||
display.vlcWidget.resize(display.size())
|
||||
|
||||
def play(self, display):
|
||||
controller = display.controller
|
||||
start_time = 0
|
||||
if controller.media_info.start_time > 0:
|
||||
start_time = controller.media_info.start_time
|
||||
display.vlcMediaPlayer.play()
|
||||
if self.media_state_wait(display, vlc.State.Playing):
|
||||
if start_time > 0:
|
||||
self.seek(display, controller.media_info.start_time * 1000)
|
||||
controller.media_info.length = \
|
||||
int(display.vlcMediaPlayer.get_media().get_duration() / 1000)
|
||||
controller.seekSlider.setMaximum(controller.media_info.length * 1000)
|
||||
self.state = MediaState.Playing
|
||||
display.vlcWidget.raise_()
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def pause(self, display):
|
||||
if display.vlcMedia.get_state() != vlc.State.Playing:
|
||||
return
|
||||
display.vlcMediaPlayer.pause()
|
||||
if self.media_state_wait(display, vlc.State.Paused):
|
||||
self.state = MediaState.Paused
|
||||
|
||||
def stop(self, display):
|
||||
display.vlcMediaPlayer.stop()
|
||||
self.state = MediaState.Stopped
|
||||
|
||||
def volume(self, display, vol):
|
||||
if display.hasAudio:
|
||||
display.vlcMediaPlayer.audio_set_volume(vol)
|
||||
|
||||
def seek(self, display, seekVal):
|
||||
if display.vlcMediaPlayer.is_seekable():
|
||||
display.vlcMediaPlayer.set_time(seekVal)
|
||||
|
||||
def reset(self, display):
|
||||
display.vlcMediaPlayer.stop()
|
||||
display.vlcWidget.setVisible(False)
|
||||
self.state = MediaState.Off
|
||||
|
||||
def set_visible(self, display, status):
|
||||
if self.hasOwnWidget:
|
||||
display.vlcWidget.setVisible(status)
|
||||
|
||||
def update_ui(self, display):
|
||||
controller = display.controller
|
||||
if controller.media_info.end_time > 0:
|
||||
if display.vlcMediaPlayer.get_time() > \
|
||||
controller.media_info.end_time * 1000:
|
||||
self.stop(display)
|
||||
self.set_visible(display, False)
|
||||
if not controller.seekSlider.isSliderDown():
|
||||
controller.seekSlider.setSliderPosition( \
|
||||
display.vlcMediaPlayer.get_time())
|
||||
|
|
@ -294,7 +294,7 @@ class WebkitPlayer(MediaPlayer):
|
|||
def load(self, display):
|
||||
log.debug(u'load vid in Webkit Controller')
|
||||
controller = display.controller
|
||||
if display.hasAudio:
|
||||
if display.hasAudio and not controller.media_info.is_background:
|
||||
volume = controller.media_info.volume
|
||||
vol = float(volume) / float(100)
|
||||
else:
|
||||
|
|
|
@ -861,7 +861,7 @@ class ServiceManager(QtGui.QWidget):
|
|||
lookFor = 1
|
||||
serviceIterator += 1
|
||||
|
||||
def previousItem(self):
|
||||
def previousItem(self, message):
|
||||
"""
|
||||
Called by the SlideController to select the previous service item.
|
||||
"""
|
||||
|
@ -869,15 +869,26 @@ class ServiceManager(QtGui.QWidget):
|
|||
return
|
||||
selected = self.serviceManagerList.selectedItems()[0]
|
||||
prevItem = None
|
||||
prevItemLastSlide = None
|
||||
serviceIterator = QtGui.QTreeWidgetItemIterator(self.serviceManagerList)
|
||||
while serviceIterator.value():
|
||||
if serviceIterator.value() == selected:
|
||||
if prevItem:
|
||||
if message == u'last slide' and prevItemLastSlide:
|
||||
pos = prevItem.data(0, QtCore.Qt.UserRole).toInt()[0]
|
||||
check_expanded = self.serviceItems[pos - 1][u'expanded']
|
||||
self.serviceManagerList.setCurrentItem(prevItemLastSlide)
|
||||
if not check_expanded:
|
||||
self.serviceManagerList.collapseItem(prevItem)
|
||||
self.makeLive()
|
||||
self.serviceManagerList.setCurrentItem(prevItem)
|
||||
elif prevItem:
|
||||
self.serviceManagerList.setCurrentItem(prevItem)
|
||||
self.makeLive()
|
||||
return
|
||||
if serviceIterator.value().parent() is None:
|
||||
prevItem = serviceIterator.value()
|
||||
if serviceIterator.value().parent() is prevItem:
|
||||
prevItemLastSlide = serviceIterator.value()
|
||||
serviceIterator += 1
|
||||
|
||||
def onSetItem(self, message):
|
||||
|
|
|
@ -35,6 +35,7 @@ from PyQt4 import QtCore, QtGui
|
|||
from openlp.core.lib import OpenLPToolbar, Receiver, ItemCapabilities, \
|
||||
translate, build_icon, ServiceItem, 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
|
||||
from openlp.core.utils.actions import ActionList, CategoryOrder
|
||||
|
||||
|
@ -82,8 +83,11 @@ class SlideController(Controller):
|
|||
"""
|
||||
Controller.__init__(self, parent, isLive)
|
||||
self.screens = ScreenList.get_instance()
|
||||
try:
|
||||
self.ratio = float(self.screens.current[u'size'].width()) / \
|
||||
float(self.screens.current[u'size'].height())
|
||||
except ZeroDivisionError:
|
||||
self.ratio = 1
|
||||
self.imageManager = self.parent().imageManager
|
||||
self.mediaController = self.parent().mediaController
|
||||
self.loopList = [
|
||||
|
@ -102,6 +106,8 @@ class SlideController(Controller):
|
|||
self.songEdit = False
|
||||
self.selectedRow = 0
|
||||
self.serviceItem = None
|
||||
self.slide_limits = None
|
||||
self.updateSlideLimits()
|
||||
self.panel = QtGui.QWidget(parent.controlSplitter)
|
||||
self.slideList = {}
|
||||
# Layout for holding panel
|
||||
|
@ -450,6 +456,9 @@ class SlideController(Controller):
|
|||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'slidecontroller_%s_unblank' % self.typePrefix),
|
||||
self.onSlideUnblank)
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'slidecontroller_update_slide_limits'),
|
||||
self.updateSlideLimits)
|
||||
|
||||
def slideShortcutActivated(self):
|
||||
"""
|
||||
|
@ -592,14 +601,14 @@ class SlideController(Controller):
|
|||
"""
|
||||
Live event to select the previous service item from the service manager.
|
||||
"""
|
||||
self.keypress_queue.append(u'previous')
|
||||
self.keypress_queue.append(ServiceItemAction.Previous)
|
||||
self._process_queue()
|
||||
|
||||
def serviceNext(self):
|
||||
"""
|
||||
Live event to select the next service item from the service manager.
|
||||
"""
|
||||
self.keypress_queue.append(u'next')
|
||||
self.keypress_queue.append(ServiceItemAction.Next)
|
||||
self._process_queue()
|
||||
|
||||
def _process_queue(self):
|
||||
|
@ -610,8 +619,12 @@ class SlideController(Controller):
|
|||
if len(self.keypress_queue):
|
||||
while len(self.keypress_queue) and not self.keypress_loop:
|
||||
self.keypress_loop = True
|
||||
if self.keypress_queue.popleft() == u'previous':
|
||||
Receiver.send_message('servicemanager_previous_item')
|
||||
keypressCommand = self.keypress_queue.popleft()
|
||||
if keypressCommand == ServiceItemAction.Previous:
|
||||
Receiver.send_message('servicemanager_previous_item', None)
|
||||
elif keypressCommand == ServiceItemAction.PreviousLastSlide:
|
||||
# Go to the last slide of the previous item
|
||||
Receiver.send_message('servicemanager_previous_item', u'last slide')
|
||||
else:
|
||||
Receiver.send_message('servicemanager_next_item')
|
||||
self.keypress_loop = False
|
||||
|
@ -630,8 +643,11 @@ class SlideController(Controller):
|
|||
if self.isLive:
|
||||
self.__addActionsToWidget(self.display)
|
||||
# The SlidePreview's ratio.
|
||||
try:
|
||||
self.ratio = float(self.screens.current[u'size'].width()) / \
|
||||
float(self.screens.current[u'size'].height())
|
||||
except ZeroDivisionError:
|
||||
self.ratio = 1
|
||||
self.mediaController.setup_display(self.display)
|
||||
self.previewSizeChanged()
|
||||
self.previewDisplay.setup()
|
||||
|
@ -700,6 +716,14 @@ class SlideController(Controller):
|
|||
"""
|
||||
self.delaySpinBox.setValue(int(value))
|
||||
|
||||
def updateSlideLimits(self):
|
||||
"""
|
||||
Updates the Slide Limits variable from the settings.
|
||||
"""
|
||||
self.slide_limits = QtCore.QSettings().value(
|
||||
self.parent().advancedlSettingsSection + u'/slide limits',
|
||||
QtCore.QVariant(SlideLimits.End)).toInt()[0]
|
||||
|
||||
def enableToolBar(self, item):
|
||||
"""
|
||||
Allows the toolbars to be reconfigured based on Controller Type
|
||||
|
@ -1177,10 +1201,14 @@ class SlideController(Controller):
|
|||
row = self.previewListWidget.currentRow() + 1
|
||||
if row == self.previewListWidget.rowCount():
|
||||
if wrap is None:
|
||||
wrap = QtCore.QSettings().value(
|
||||
self.parent().generalSettingsSection +
|
||||
u'/enable slide loop', QtCore.QVariant(True)).toBool()
|
||||
if wrap:
|
||||
if self.slide_limits == SlideLimits.Wrap:
|
||||
row = 0
|
||||
elif self.slide_limits == SlideLimits.Next:
|
||||
self.serviceNext()
|
||||
return
|
||||
else:
|
||||
row = self.previewListWidget.rowCount() - 1
|
||||
elif wrap:
|
||||
row = 0
|
||||
else:
|
||||
row = self.previewListWidget.rowCount() - 1
|
||||
|
@ -1200,9 +1228,12 @@ class SlideController(Controller):
|
|||
else:
|
||||
row = self.previewListWidget.currentRow() - 1
|
||||
if row == -1:
|
||||
if QtCore.QSettings().value(self.parent().generalSettingsSection
|
||||
+ u'/enable slide loop', QtCore.QVariant(True)).toBool():
|
||||
if self.slide_limits == SlideLimits.Wrap:
|
||||
row = self.previewListWidget.rowCount() - 1
|
||||
elif self.slide_limits == SlideLimits.Next:
|
||||
self.keypress_queue.append(ServiceItemAction.PreviousLastSlide)
|
||||
self._process_queue()
|
||||
return
|
||||
else:
|
||||
row = 0
|
||||
self.__checkUpdateSelectedSlide(row)
|
||||
|
|
Loading…
Reference in New Issue