r2082 + conflicts + fix

This commit is contained in:
Andreas Preikschat 2012-10-11 12:40:22 +02:00
commit cff3f252fd
17 changed files with 147 additions and 49 deletions

View File

@ -135,6 +135,9 @@ class Settings(QtCore.QSettings):
return [] return []
# Convert the setting to the correct type. # Convert the setting to the correct type.
if isinstance(defaultValue, bool): if isinstance(defaultValue, bool):
if isinstance(setting, bool):
return setting
# Sometimes setting is string instead of a boolean.
return setting == u'true' return setting == u'true'
if isinstance(defaultValue, int): if isinstance(defaultValue, int):
return int(setting) return int(setting)

View File

@ -29,14 +29,15 @@
The :mod:`advancedtab` provides an advanced settings facility. The :mod:`advancedtab` provides an advanced settings facility.
""" """
from datetime import datetime, timedelta from datetime import datetime, timedelta
from PyQt4 import QtCore, QtGui
import logging import logging
import os import os
import sys import sys
from openlp.core.lib import SettingsTab, translate, build_icon, Receiver, \ from openlp.core.lib import SettingsTab, translate, build_icon, Receiver, \
Settings Settings
from PyQt4 import QtCore, QtGui
from openlp.core.lib.ui import UiStrings from openlp.core.lib.ui import UiStrings
from openlp.core.utils import get_images_filter, AppLocation, format_time from openlp.core.utils import get_images_filter, AppLocation, format_time
from openlp.core.lib import SlideLimits from openlp.core.lib import SlideLimits
@ -432,8 +433,7 @@ class AdvancedTab(SettingsTab):
translate('OpenLP.AdvancedTab', translate('OpenLP.AdvancedTab',
'<strong>WARNING:</strong> New data directory location contains ' '<strong>WARNING:</strong> New data directory location contains '
'OpenLP data files. These files WILL be replaced during a copy.')) 'OpenLP data files. These files WILL be replaced during a copy.'))
self.x11GroupBox.setTitle(translate('OpenLP.AdvancedTab', self.x11GroupBox.setTitle(translate('OpenLP.AdvancedTab', 'X11'))
'X11'))
self.x11BypassCheckBox.setText(translate('OpenLP.AdvancedTab', self.x11BypassCheckBox.setText(translate('OpenLP.AdvancedTab',
'Bypass X11 Window Manager')) 'Bypass X11 Window Manager'))
# Slide Limits # Slide Limits
@ -483,8 +483,14 @@ class AdvancedTab(SettingsTab):
u'default service enabled', True) u'default service enabled', True)
self.serviceNameCheckBox.setChecked(default_service_enabled) self.serviceNameCheckBox.setChecked(default_service_enabled)
self.serviceNameCheckBoxToggled(default_service_enabled) self.serviceNameCheckBoxToggled(default_service_enabled)
# Fix for bug #1014422.
x11_bypass_default = True
if sys.platform.startswith(u'linux'):
# Default to False on Gnome.
x11_bypass_default = bool(not
os.environ.get(u'GNOME_DESKTOP_SESSION_ID'))
self.x11BypassCheckBox.setChecked( self.x11BypassCheckBox.setChecked(
settings.value(u'x11 bypass wm', True)) settings.value(u'x11 bypass wm', x11_bypass_default))
self.defaultColor = settings.value(u'default color', u'#ffffff') self.defaultColor = settings.value(u'default color', u'#ffffff')
self.defaultFileEdit.setText(settings.value(u'default image', self.defaultFileEdit.setText(settings.value(u'default image',
u':/graphics/openlp-splash-screen.png')) u':/graphics/openlp-splash-screen.png'))

View File

@ -31,6 +31,7 @@ and play multimedia within OpenLP.
""" """
import cgi import cgi
import logging import logging
import os
import sys import sys
from PyQt4 import QtCore, QtGui, QtWebKit, QtOpenGL from PyQt4 import QtCore, QtGui, QtWebKit, QtOpenGL
@ -134,7 +135,13 @@ class MainDisplay(Display):
self.setStyleSheet(u'border: 0px; margin: 0px; padding: 0px;') self.setStyleSheet(u'border: 0px; margin: 0px; padding: 0px;')
windowFlags = QtCore.Qt.FramelessWindowHint | QtCore.Qt.Tool | \ windowFlags = QtCore.Qt.FramelessWindowHint | QtCore.Qt.Tool | \
QtCore.Qt.WindowStaysOnTopHint QtCore.Qt.WindowStaysOnTopHint
if Settings().value(u'advanced/x11 bypass wm', True): # Fix for bug #1014422.
x11_bypass_default = True
if sys.platform.startswith(u'linux'):
# Default to False on Gnome.
x11_bypass_default = bool(not
os.environ.get(u'GNOME_DESKTOP_SESSION_ID'))
if Settings().value(u'advanced/x11 bypass wm', x11_bypass_default):
windowFlags |= QtCore.Qt.X11BypassWindowManagerHint windowFlags |= QtCore.Qt.X11BypassWindowManagerHint
# TODO: The following combination of windowFlags works correctly # TODO: The following combination of windowFlags works correctly
# on Mac OS X. For next OpenLP version we should test it on other # on Mac OS X. For next OpenLP version we should test it on other

View File

@ -48,7 +48,7 @@ import sys
from inspect import getargspec from inspect import getargspec
__version__ = "N/A" __version__ = "N/A"
build_date = "Fri Sep 28 22:48:50 2012" build_date = "Fri Oct 5 21:35:59 2012"
if sys.version_info[0] > 2: if sys.version_info[0] > 2:
str = str str = str
@ -680,6 +680,19 @@ class LogCb(ctypes.c_void_p):
\note Log message handlers <b>must</b> be thread-safe. \note Log message handlers <b>must</b> be thread-safe.
""" """
pass pass
class VideoLockCb(ctypes.c_void_p):
"""Callback prototype to allocate and lock a picture buffer.
Whenever a new video frame needs to be decoded, the lock callback is
invoked. Depending on the video chroma, one or three pixel planes of
adequate dimensions must be returned via the second parameter. Those
planes must be aligned on 32-bytes boundaries.
\param opaque private pointer as passed to L{libvlc_video_set_callbacks}() [IN]
\param planes start address of the pixel planes (LibVLC allocates the array
of void pointers, this callback must initialize the array) [OUT]
\return a private pointer for the display and unlock callbacks to identify
the picture buffers
"""
pass
class VideoUnlockCb(ctypes.c_void_p): class VideoUnlockCb(ctypes.c_void_p):
"""Callback prototype to unlock a picture buffer. """Callback prototype to unlock a picture buffer.
When the video frame decoding is complete, the unlock callback is invoked. When the video frame decoding is complete, the unlock callback is invoked.
@ -687,7 +700,7 @@ This callback might not be needed at all. It is only an indication that the
application can now read the pixel values if it needs to. application can now read the pixel values if it needs to.
\warning A picture buffer is unlocked after the picture is decoded, \warning A picture buffer is unlocked after the picture is decoded,
but before the picture is displayed. but before the picture is displayed.
\param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] \param opaque private pointer as passed to L{libvlc_video_set_callbacks}() [IN]
\param picture private pointer returned from the @ref libvlc_video_lock_cb \param picture private pointer returned from the @ref libvlc_video_lock_cb
callback [IN] callback [IN]
\param planes pixel planes as defined by the @ref libvlc_video_lock_cb \param planes pixel planes as defined by the @ref libvlc_video_lock_cb
@ -698,7 +711,7 @@ class VideoDisplayCb(ctypes.c_void_p):
"""Callback prototype to display a picture. """Callback prototype to display a picture.
When the video frame needs to be shown, as determined by the media playback When the video frame needs to be shown, as determined by the media playback
clock, the display callback is invoked. clock, the display callback is invoked.
\param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] \param opaque private pointer as passed to L{libvlc_video_set_callbacks}() [IN]
\param picture private pointer returned from the @ref libvlc_video_lock_cb \param picture private pointer returned from the @ref libvlc_video_lock_cb
callback [IN] callback [IN]
""" """
@ -710,7 +723,7 @@ and the chain of video filters (if any). It can opt to change any parameter
as it needs. In that case, LibVLC will attempt to convert the video format as it needs. In that case, LibVLC will attempt to convert the video format
(rescaling and chroma conversion) but these operations can be CPU intensive. (rescaling and chroma conversion) but these operations can be CPU intensive.
\param opaque pointer to the private pointer passed to \param opaque pointer to the private pointer passed to
libvlc_video_set_callbacks() [IN/OUT] L{libvlc_video_set_callbacks}() [IN/OUT]
\param chroma pointer to the 4 bytes video format identifier [IN/OUT] \param chroma pointer to the 4 bytes video format identifier [IN/OUT]
\param width pointer to the pixel width [IN/OUT] \param width pointer to the pixel width [IN/OUT]
\param height pointer to the pixel height [IN/OUT] \param height pointer to the pixel height [IN/OUT]
@ -730,7 +743,7 @@ in the video decoders, video filters and/or video converters.
pass pass
class VideoCleanupCb(ctypes.c_void_p): class VideoCleanupCb(ctypes.c_void_p):
"""Callback prototype to configure picture buffers format. """Callback prototype to configure picture buffers format.
\param opaque private pointer as passed to libvlc_video_set_callbacks() \param opaque private pointer as passed to L{libvlc_video_set_callbacks}()
(and possibly modified by @ref libvlc_video_format_cb) [IN] (and possibly modified by @ref libvlc_video_format_cb) [IN]
""" """
pass pass
@ -806,6 +819,18 @@ class CallbackDecorators(object):
\param args variable argument list for the format \param args variable argument list for the format
\note Log message handlers <b>must</b> be thread-safe. \note Log message handlers <b>must</b> be thread-safe.
''' '''
VideoLockCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p, ListPOINTER(ctypes.c_void_p))
VideoLockCb.__doc__ = '''Callback prototype to allocate and lock a picture buffer.
Whenever a new video frame needs to be decoded, the lock callback is
invoked. Depending on the video chroma, one or three pixel planes of
adequate dimensions must be returned via the second parameter. Those
planes must be aligned on 32-bytes boundaries.
\param opaque private pointer as passed to L{libvlc_video_set_callbacks}() [IN]
\param planes start address of the pixel planes (LibVLC allocates the array
of void pointers, this callback must initialize the array) [OUT]
\return a private pointer for the display and unlock callbacks to identify
the picture buffers
'''
VideoUnlockCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ListPOINTER(ctypes.c_void_p)) VideoUnlockCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ListPOINTER(ctypes.c_void_p))
VideoUnlockCb.__doc__ = '''Callback prototype to unlock a picture buffer. VideoUnlockCb.__doc__ = '''Callback prototype to unlock a picture buffer.
When the video frame decoding is complete, the unlock callback is invoked. When the video frame decoding is complete, the unlock callback is invoked.
@ -813,7 +838,7 @@ This callback might not be needed at all. It is only an indication that the
application can now read the pixel values if it needs to. application can now read the pixel values if it needs to.
\warning A picture buffer is unlocked after the picture is decoded, \warning A picture buffer is unlocked after the picture is decoded,
but before the picture is displayed. but before the picture is displayed.
\param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] \param opaque private pointer as passed to L{libvlc_video_set_callbacks}() [IN]
\param picture private pointer returned from the @ref libvlc_video_lock_cb \param picture private pointer returned from the @ref libvlc_video_lock_cb
callback [IN] callback [IN]
\param planes pixel planes as defined by the @ref libvlc_video_lock_cb \param planes pixel planes as defined by the @ref libvlc_video_lock_cb
@ -823,7 +848,7 @@ but before the picture is displayed.
VideoDisplayCb.__doc__ = '''Callback prototype to display a picture. VideoDisplayCb.__doc__ = '''Callback prototype to display a picture.
When the video frame needs to be shown, as determined by the media playback When the video frame needs to be shown, as determined by the media playback
clock, the display callback is invoked. clock, the display callback is invoked.
\param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] \param opaque private pointer as passed to L{libvlc_video_set_callbacks}() [IN]
\param picture private pointer returned from the @ref libvlc_video_lock_cb \param picture private pointer returned from the @ref libvlc_video_lock_cb
callback [IN] callback [IN]
''' '''
@ -834,7 +859,7 @@ and the chain of video filters (if any). It can opt to change any parameter
as it needs. In that case, LibVLC will attempt to convert the video format as it needs. In that case, LibVLC will attempt to convert the video format
(rescaling and chroma conversion) but these operations can be CPU intensive. (rescaling and chroma conversion) but these operations can be CPU intensive.
\param opaque pointer to the private pointer passed to \param opaque pointer to the private pointer passed to
libvlc_video_set_callbacks() [IN/OUT] L{libvlc_video_set_callbacks}() [IN/OUT]
\param chroma pointer to the 4 bytes video format identifier [IN/OUT] \param chroma pointer to the 4 bytes video format identifier [IN/OUT]
\param width pointer to the pixel width [IN/OUT] \param width pointer to the pixel width [IN/OUT]
\param height pointer to the pixel height [IN/OUT] \param height pointer to the pixel height [IN/OUT]
@ -853,7 +878,7 @@ in the video decoders, video filters and/or video converters.
''' '''
VideoCleanupCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p) VideoCleanupCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p)
VideoCleanupCb.__doc__ = '''Callback prototype to configure picture buffers format. VideoCleanupCb.__doc__ = '''Callback prototype to configure picture buffers format.
\param opaque private pointer as passed to libvlc_video_set_callbacks() \param opaque private pointer as passed to L{libvlc_video_set_callbacks}()
(and possibly modified by @ref libvlc_video_format_cb) [IN] (and possibly modified by @ref libvlc_video_format_cb) [IN]
''' '''
AudioPlayCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint, ctypes.c_int64) AudioPlayCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint, ctypes.c_int64)
@ -2483,9 +2508,22 @@ class MediaPlayer(_Ctype):
''' '''
return libvlc_media_player_stop(self) return libvlc_media_player_stop(self)
def video_set_callbacks(self, lock, unlock, display, opaque):
'''Set callbacks and private data to render decoded video to a custom area
in memory.
Use L{video_set_format}() or L{video_set_format_callbacks}()
to configure the decoded format.
@param lock: callback to lock video memory (must not be NULL).
@param unlock: callback to unlock video memory (or NULL if not needed).
@param display: callback to display video (or NULL if not needed).
@param opaque: private pointer for the three callbacks (as first parameter).
@version: LibVLC 1.1.1 or later.
'''
return libvlc_video_set_callbacks(self, lock, unlock, display, opaque)
def video_set_format(self, chroma, width, height, pitch): def video_set_format(self, chroma, width, height, pitch):
'''Set decoded video chroma and dimensions. '''Set decoded video chroma and dimensions.
This only works in combination with libvlc_video_set_callbacks(), This only works in combination with L{video_set_callbacks}(),
and is mutually exclusive with L{video_set_format_callbacks}(). and is mutually exclusive with L{video_set_format_callbacks}().
@param chroma: a four-characters string identifying the chroma (e.g. "RV32" or "YUYV"). @param chroma: a four-characters string identifying the chroma (e.g. "RV32" or "YUYV").
@param width: pixel width. @param width: pixel width.
@ -2498,7 +2536,7 @@ class MediaPlayer(_Ctype):
def video_set_format_callbacks(self, setup, cleanup): def video_set_format_callbacks(self, setup, cleanup):
'''Set decoded video chroma and dimensions. This only works in combination with '''Set decoded video chroma and dimensions. This only works in combination with
libvlc_video_set_callbacks(). L{video_set_callbacks}().
@param setup: callback to select the video format (cannot be NULL). @param setup: callback to select the video format (cannot be NULL).
@param cleanup: callback to release any allocated resources (or NULL). @param cleanup: callback to release any allocated resources (or NULL).
@version: LibVLC 2.0.0 or later. @version: LibVLC 2.0.0 or later.
@ -4382,9 +4420,26 @@ def libvlc_media_player_stop(p_mi):
None, MediaPlayer) None, MediaPlayer)
return f(p_mi) return f(p_mi)
def libvlc_video_set_callbacks(mp, lock, unlock, display, opaque):
'''Set callbacks and private data to render decoded video to a custom area
in memory.
Use L{libvlc_video_set_format}() or L{libvlc_video_set_format_callbacks}()
to configure the decoded format.
@param mp: the media player.
@param lock: callback to lock video memory (must not be NULL).
@param unlock: callback to unlock video memory (or NULL if not needed).
@param display: callback to display video (or NULL if not needed).
@param opaque: private pointer for the three callbacks (as first parameter).
@version: LibVLC 1.1.1 or later.
'''
f = _Cfunctions.get('libvlc_video_set_callbacks', None) or \
_Cfunction('libvlc_video_set_callbacks', ((1,), (1,), (1,), (1,), (1,),), None,
None, MediaPlayer, VideoLockCb, VideoUnlockCb, VideoDisplayCb, ctypes.c_void_p)
return f(mp, lock, unlock, display, opaque)
def libvlc_video_set_format(mp, chroma, width, height, pitch): def libvlc_video_set_format(mp, chroma, width, height, pitch):
'''Set decoded video chroma and dimensions. '''Set decoded video chroma and dimensions.
This only works in combination with libvlc_video_set_callbacks(), This only works in combination with L{libvlc_video_set_callbacks}(),
and is mutually exclusive with L{libvlc_video_set_format_callbacks}(). and is mutually exclusive with L{libvlc_video_set_format_callbacks}().
@param mp: the media player. @param mp: the media player.
@param chroma: a four-characters string identifying the chroma (e.g. "RV32" or "YUYV"). @param chroma: a four-characters string identifying the chroma (e.g. "RV32" or "YUYV").
@ -4401,7 +4456,7 @@ def libvlc_video_set_format(mp, chroma, width, height, pitch):
def libvlc_video_set_format_callbacks(mp, setup, cleanup): def libvlc_video_set_format_callbacks(mp, setup, cleanup):
'''Set decoded video chroma and dimensions. This only works in combination with '''Set decoded video chroma and dimensions. This only works in combination with
libvlc_video_set_callbacks(). L{libvlc_video_set_callbacks}().
@param mp: the media player. @param mp: the media player.
@param setup: callback to select the video format (cannot be NULL). @param setup: callback to select the video format (cannot be NULL).
@param cleanup: callback to release any allocated resources (or NULL). @param cleanup: callback to release any allocated resources (or NULL).
@ -5878,10 +5933,9 @@ def libvlc_vlm_get_event_manager(p_instance):
return f(p_instance) return f(p_instance)
# 3 function(s) blacklisted: # 2 function(s) blacklisted:
# libvlc_printerr # libvlc_printerr
# libvlc_set_exit_handler # libvlc_set_exit_handler
# libvlc_video_set_callbacks
# 17 function(s) not wrapped as methods: # 17 function(s) not wrapped as methods:
# libvlc_audio_output_list_release # libvlc_audio_output_list_release

View File

@ -853,7 +853,11 @@ class SlideController(Controller):
else: else:
label = QtGui.QLabel() label = QtGui.QLabel()
label.setMargin(4) label.setMargin(4)
label.setScaledContents(True) if serviceItem.is_media():
label.setAlignment(QtCore.Qt.AlignHCenter |
QtCore.Qt.AlignVCenter)
else:
label.setScaledContents(True)
if self.serviceItem.is_command(): if self.serviceItem.is_command():
label.setPixmap(QtGui.QPixmap(frame[u'image'])) label.setPixmap(QtGui.QPixmap(frame[u'image']))
else: else:

View File

@ -35,7 +35,7 @@ class Ui_AlertDialog(object):
def setupUi(self, alertDialog): def setupUi(self, alertDialog):
alertDialog.setObjectName(u'alertDialog') alertDialog.setObjectName(u'alertDialog')
alertDialog.resize(400, 300) alertDialog.resize(400, 300)
alertDialog.setWindowIcon(build_icon(u':/icon/openlp.org-icon-32.bmp')) alertDialog.setWindowIcon(build_icon(u':/icon/openlp-logo-16x16.png'))
self.alertDialogLayout = QtGui.QGridLayout(alertDialog) self.alertDialogLayout = QtGui.QGridLayout(alertDialog)
self.alertDialogLayout.setObjectName(u'alertDialogLayout') self.alertDialogLayout.setObjectName(u'alertDialogLayout')
self.alertTextLayout = QtGui.QFormLayout() self.alertTextLayout = QtGui.QFormLayout()

View File

@ -36,7 +36,7 @@ class Ui_CustomEditDialog(object):
customEditDialog.setObjectName(u'customEditDialog') customEditDialog.setObjectName(u'customEditDialog')
customEditDialog.resize(450, 350) customEditDialog.resize(450, 350)
customEditDialog.setWindowIcon( customEditDialog.setWindowIcon(
build_icon(u':/icon/openlp.org-icon-32.bmp')) build_icon(u':/icon/openlp-logo-16x16.png'))
self.dialogLayout = QtGui.QVBoxLayout(customEditDialog) self.dialogLayout = QtGui.QVBoxLayout(customEditDialog)
self.dialogLayout.setObjectName(u'dialogLayout') self.dialogLayout.setObjectName(u'dialogLayout')
self.titleLayout = QtGui.QHBoxLayout() self.titleLayout = QtGui.QHBoxLayout()

View File

@ -42,8 +42,9 @@ from openlp.core.ui.media import get_media_players, set_media_players
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
CLAPPERBOARD = QtGui.QImage(u':/media/media_video.png') CLAPPERBOARD = u':/media/slidecontroller_multimedia.png'
#TODO: Add an appropriate Icon for DVDs, CDs, ... VIDEO = QtGui.QImage(u':/media/media_video.png')
AUDIO = QtGui.QImage(u':/media/media_audio.png')
DVD_ICON = QtGui.QImage(u':/media/media_video.png') DVD_ICON = QtGui.QImage(u':/media/media_video.png')
class MediaMediaItem(MediaManagerItem): class MediaMediaItem(MediaManagerItem):
@ -217,7 +218,7 @@ class MediaMediaItem(MediaManagerItem):
service_item.add_capability(ItemCapabilities.RequiresMedia) service_item.add_capability(ItemCapabilities.RequiresMedia)
# force a non-existent theme # force a non-existent theme
service_item.theme = -1 service_item.theme = -1
frame = u':/media/image_clapperboard.png' frame = CLAPPERBOARD
(path, name) = os.path.split(filename) (path, name) = os.path.split(filename)
service_item.add_from_command(path, name, frame) service_item.add_from_command(path, name, frame)
return True return True
@ -289,10 +290,10 @@ class MediaMediaItem(MediaManagerItem):
key=lambda filename: os.path.split(unicode(filename))[1].lower()) key=lambda filename: os.path.split(unicode(filename))[1].lower())
for track in media: for track in media:
track_info = QtCore.QFileInfo(track) track_info = QtCore.QFileInfo(track)
if not track_info.isFile(): if track_info.isFile():
filename = os.path.split(unicode(track))[1] filename = os.path.split(unicode(track))[1]
item_name = QtGui.QListWidgetItem(filename) item_name = QtGui.QListWidgetItem(filename)
item_name.setIcon(build_icon(CLAPPERBOARD)) item_name.setIcon(build_icon(VIDEO))
item_name.setData(QtCore.Qt.UserRole, track) item_name.setData(QtCore.Qt.UserRole, track)
else: else:
filename = os.path.split(unicode(track))[1] filename = os.path.split(unicode(track))[1]

View File

@ -55,7 +55,9 @@ window.OpenLP = {
); );
}, },
loadService: function (event) { loadService: function (event) {
event.preventDefault(); if (event) {
event.preventDefault();
}
$.getJSON( $.getJSON(
"/api/service/list", "/api/service/list",
function (data, status) { function (data, status) {
@ -150,6 +152,10 @@ window.OpenLP = {
OpenLP.currentSlide = data.results.slide; OpenLP.currentSlide = data.results.slide;
OpenLP.currentItem = data.results.item; OpenLP.currentItem = data.results.item;
if ($("#service-manager").is(":visible")) { if ($("#service-manager").is(":visible")) {
if (OpenLP.currentService != data.results.service) {
OpenLP.currentService = data.results.service;
OpenLP.loadService();
}
$("#service-manager div[data-role=content] ul[data-role=listview] li").attr("data-theme", "c").removeClass("ui-btn-up-e").addClass("ui-btn-up-c"); $("#service-manager div[data-role=content] ul[data-role=listview] li").attr("data-theme", "c").removeClass("ui-btn-up-e").addClass("ui-btn-up-c");
$("#service-manager div[data-role=content] ul[data-role=listview] li a").each(function () { $("#service-manager div[data-role=content] ul[data-role=listview] li a").each(function () {
var item = $(this); var item = $(this);
@ -307,7 +313,7 @@ window.OpenLP = {
} }
); );
}, },
escapeString: function (string) { escapeString: function (string) {
return string.replace(/\\/g, "\\\\").replace(/"/g, "\\\"") return string.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")
} }
} }

View File

@ -139,8 +139,10 @@ window.OpenLP = {
"/api/poll", "/api/poll",
function (data, status) { function (data, status) {
OpenLP.updateClock(data); OpenLP.updateClock(data);
if (OpenLP.currentItem != data.results.item) { if (OpenLP.currentItem != data.results.item ||
OpenLP.currentService != data.results.service) {
OpenLP.currentItem = data.results.item; OpenLP.currentItem = data.results.item;
OpenLP.currentService = data.results.service;
OpenLP.loadSlides(); OpenLP.loadSlides();
} }
else if (OpenLP.currentSlide != data.results.slide) { else if (OpenLP.currentSlide != data.results.slide) {

View File

@ -154,18 +154,20 @@ class SundayPlusImport(SongImport):
# If any line inside any verse contains CCLI or # If any line inside any verse contains CCLI or
# only Public Domain, we treat this as special data: # only Public Domain, we treat this as special data:
# we remove that line and add data to specific field. # we remove that line and add data to specific field.
processed_lines = []
for i in xrange(len(lines)): for i in xrange(len(lines)):
lines[i] = lines[i].strip() line = lines[i].strip()
line = lines[i] if line[:3].lower() == u'ccl':
if line[:4].lower() == u'ccli':
m = re.search(r'[0-9]+', line) m = re.search(r'[0-9]+', line)
if m: if m:
self.ccliNumber = int(m.group(0)) self.ccliNumber = int(m.group(0))
lines.pop(i) continue
elif line.lower() == u'public domain': elif line.lower() == u'public domain':
self.copyright = u'Public Domain' self.copyright = u'Public Domain'
lines.pop(i) continue
self.addVerse('\n'.join(lines).strip(), verse_type) processed_lines.append(line)
self.addVerse('\n'.join(processed_lines).strip(),
verse_type)
if end == -1: if end == -1:
break break
i = end + 1 i = end + 1

View File

@ -260,7 +260,7 @@ class OpenLyrics(object):
IMPLEMENTED_VERSION = u'0.8' IMPLEMENTED_VERSION = u'0.8'
START_TAGS_REGEX = re.compile(r'\{(\w+)\}') START_TAGS_REGEX = re.compile(r'\{(\w+)\}')
END_TAGS_REGEX = re.compile(r'\{\/(\w+)\}') END_TAGS_REGEX = re.compile(r'\{\/(\w+)\}')
VERSE_NUMBER_REGEX = re.compile(u'[a-zA-Z]*') VERSE_TAG_SPLITTER = re.compile(u'([a-zA-Z]+)([0-9]*)([a-zA-Z]?)')
def __init__(self, manager): def __init__(self, manager):
self.manager = manager self.manager = manager
@ -325,10 +325,22 @@ class OpenLyrics(object):
# Process the song's lyrics. # Process the song's lyrics.
lyrics = etree.SubElement(song_xml, u'lyrics') lyrics = etree.SubElement(song_xml, u'lyrics')
verse_list = sxml.get_verses(song.lyrics) verse_list = sxml.get_verses(song.lyrics)
# Add a suffix letter to each verse
verse_tags = []
for verse in verse_list: for verse in verse_list:
verse_tag = verse[0][u'type'][0].lower() verse_tag = verse[0][u'type'][0].lower()
verse_number = verse[0][u'label'] verse_number = verse[0][u'label']
verse_def = verse_tag + verse_number verse_def = verse_tag + verse_number
verse_tags.append(verse_def)
# Create the letter from the number of duplicates
verse[0][u'suffix'] = chr(96 + verse_tags.count(verse_def))
# If the verse tag is a duplicate use the suffix letter
for verse in verse_list:
verse_tag = verse[0][u'type'][0].lower()
verse_number = verse[0][u'label']
verse_def = verse_tag + verse_number
if verse_tags.count(verse_def) > 1:
verse_def += verse[0][u'suffix']
verse_element = \ verse_element = \
self._add_text_to_element(u'verse', lyrics, None, verse_def) self._add_text_to_element(u'verse', lyrics, None, verse_def)
if u'lang' in verse[0]: if u'lang' in verse[0]:
@ -742,11 +754,10 @@ class OpenLyrics(object):
if lines.get(u'break') is not None: if lines.get(u'break') is not None:
text += u'\n[---]' text += u'\n[---]'
verse_def = verse.get(u'name', u' ').lower() verse_def = verse.get(u'name', u' ').lower()
if verse_def[0] in VerseType.Tags: verse_tag, verse_number, verse_part = \
verse_tag = verse_def[0] OpenLyrics.VERSE_TAG_SPLITTER.search(verse_def).groups()
else: if verse_tag not in VerseType.Tags:
verse_tag = VerseType.Tags[VerseType.Other] verse_tag = VerseType.Tags[VerseType.Other]
verse_number = OpenLyrics.VERSE_NUMBER_REGEX.sub(u'', verse_def)
# OpenLyrics allows e. g. "c", but we need "c1". However, this does # OpenLyrics allows e. g. "c", but we need "c1". However, this does
# not correct the verse order. # not correct the verse order.
if not verse_number: if not verse_number:
@ -757,13 +768,13 @@ class OpenLyrics(object):
if song_xml.get(u'modifiedIn') in (u'1.9.6', u'OpenLP 1.9.6') and \ if song_xml.get(u'modifiedIn') in (u'1.9.6', u'OpenLP 1.9.6') and \
song_xml.get(u'version') == u'0.7' and \ song_xml.get(u'version') == u'0.7' and \
(verse_tag, verse_number, lang) in verses: (verse_tag, verse_number, lang) in verses:
verses[(verse_tag, verse_number, lang)] += u'\n[---]\n' + text verses[(verse_tag, verse_number, lang, None)] += u'\n[---]\n' + text
# Merge v1a, v1b, .... to v1. # Merge v1a, v1b, .... to v1.
elif (verse_tag, verse_number, lang) in verses: elif (verse_tag, verse_number, lang, verse_part) in verses:
verses[(verse_tag, verse_number, lang)] += u'\n' + text verses[(verse_tag, verse_number, lang)] += u'\n' + text
else: else:
verses[(verse_tag, verse_number, lang)] = text verses[(verse_tag, verse_number, lang, verse_part)] = text
verse_def_list.append((verse_tag, verse_number, lang)) verse_def_list.append((verse_tag, verse_number, lang, verse_part))
# We have to use a list to keep the order, as dicts are not sorted. # We have to use a list to keep the order, as dicts are not sorted.
for verse in verse_def_list: for verse in verse_def_list:
sxml.add_verse_to_lyrics( sxml.add_verse_to_lyrics(

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -130,7 +130,9 @@
<qresource prefix="media"> <qresource prefix="media">
<file>media_time.png</file> <file>media_time.png</file>
<file>media_stop.png</file> <file>media_stop.png</file>
<file>image_clapperboard.png</file> <file>media_audio.png</file>
<file>media_video.png</file>
<file>slidecontroller_multimedia.png</file>
</qresource> </qresource>
<qresource prefix="messagebox"> <qresource prefix="messagebox">
<file>messagebox_critical.png</file> <file>messagebox_critical.png</file>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB