forked from openlp/openlp
r2082 + conflicts + fix
This commit is contained in:
commit
cff3f252fd
@ -135,6 +135,9 @@ class Settings(QtCore.QSettings):
|
||||
return []
|
||||
# Convert the setting to the correct type.
|
||||
if isinstance(defaultValue, bool):
|
||||
if isinstance(setting, bool):
|
||||
return setting
|
||||
# Sometimes setting is string instead of a boolean.
|
||||
return setting == u'true'
|
||||
if isinstance(defaultValue, int):
|
||||
return int(setting)
|
||||
|
@ -29,14 +29,15 @@
|
||||
The :mod:`advancedtab` provides an advanced settings facility.
|
||||
"""
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
|
||||
from openlp.core.lib import SettingsTab, translate, build_icon, Receiver, \
|
||||
Settings
|
||||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib.ui import UiStrings
|
||||
from openlp.core.utils import get_images_filter, AppLocation, format_time
|
||||
from openlp.core.lib import SlideLimits
|
||||
@ -432,8 +433,7 @@ class AdvancedTab(SettingsTab):
|
||||
translate('OpenLP.AdvancedTab',
|
||||
'<strong>WARNING:</strong> New data directory location contains '
|
||||
'OpenLP data files. These files WILL be replaced during a copy.'))
|
||||
self.x11GroupBox.setTitle(translate('OpenLP.AdvancedTab',
|
||||
'X11'))
|
||||
self.x11GroupBox.setTitle(translate('OpenLP.AdvancedTab', 'X11'))
|
||||
self.x11BypassCheckBox.setText(translate('OpenLP.AdvancedTab',
|
||||
'Bypass X11 Window Manager'))
|
||||
# Slide Limits
|
||||
@ -483,8 +483,14 @@ class AdvancedTab(SettingsTab):
|
||||
u'default service enabled', True)
|
||||
self.serviceNameCheckBox.setChecked(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(
|
||||
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.defaultFileEdit.setText(settings.value(u'default image',
|
||||
u':/graphics/openlp-splash-screen.png'))
|
||||
|
@ -31,6 +31,7 @@ and play multimedia within OpenLP.
|
||||
"""
|
||||
import cgi
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
|
||||
from PyQt4 import QtCore, QtGui, QtWebKit, QtOpenGL
|
||||
@ -134,7 +135,13 @@ class MainDisplay(Display):
|
||||
self.setStyleSheet(u'border: 0px; margin: 0px; padding: 0px;')
|
||||
windowFlags = QtCore.Qt.FramelessWindowHint | QtCore.Qt.Tool | \
|
||||
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
|
||||
# TODO: The following combination of windowFlags works correctly
|
||||
# on Mac OS X. For next OpenLP version we should test it on other
|
||||
|
@ -48,7 +48,7 @@ import sys
|
||||
from inspect import getargspec
|
||||
|
||||
__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:
|
||||
str = str
|
||||
@ -680,6 +680,19 @@ class LogCb(ctypes.c_void_p):
|
||||
\note Log message handlers <b>must</b> be thread-safe.
|
||||
"""
|
||||
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):
|
||||
"""Callback prototype to unlock a picture buffer.
|
||||
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.
|
||||
\warning A picture buffer is unlocked after the picture is decoded,
|
||||
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
|
||||
callback [IN]
|
||||
\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.
|
||||
When the video frame needs to be shown, as determined by the media playback
|
||||
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
|
||||
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
|
||||
(rescaling and chroma conversion) but these operations can be CPU intensive.
|
||||
\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 width pointer to the pixel width [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
|
||||
class VideoCleanupCb(ctypes.c_void_p):
|
||||
"""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]
|
||||
"""
|
||||
pass
|
||||
@ -806,6 +819,18 @@ class CallbackDecorators(object):
|
||||
\param args variable argument list for the format
|
||||
\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.__doc__ = '''Callback prototype to unlock a picture buffer.
|
||||
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.
|
||||
\warning A picture buffer is unlocked after the picture is decoded,
|
||||
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
|
||||
callback [IN]
|
||||
\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.
|
||||
When the video frame needs to be shown, as determined by the media playback
|
||||
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
|
||||
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
|
||||
(rescaling and chroma conversion) but these operations can be CPU intensive.
|
||||
\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 width pointer to the pixel width [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.__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]
|
||||
'''
|
||||
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)
|
||||
|
||||
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):
|
||||
'''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}().
|
||||
@param chroma: a four-characters string identifying the chroma (e.g. "RV32" or "YUYV").
|
||||
@param width: pixel width.
|
||||
@ -2498,7 +2536,7 @@ class MediaPlayer(_Ctype):
|
||||
|
||||
def video_set_format_callbacks(self, setup, cleanup):
|
||||
'''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 cleanup: callback to release any allocated resources (or NULL).
|
||||
@version: LibVLC 2.0.0 or later.
|
||||
@ -4382,9 +4420,26 @@ def libvlc_media_player_stop(p_mi):
|
||||
None, MediaPlayer)
|
||||
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):
|
||||
'''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}().
|
||||
@param mp: the media player.
|
||||
@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):
|
||||
'''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 setup: callback to select the video format (cannot be 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)
|
||||
|
||||
|
||||
# 3 function(s) blacklisted:
|
||||
# 2 function(s) blacklisted:
|
||||
# libvlc_printerr
|
||||
# libvlc_set_exit_handler
|
||||
# libvlc_video_set_callbacks
|
||||
|
||||
# 17 function(s) not wrapped as methods:
|
||||
# libvlc_audio_output_list_release
|
||||
|
@ -853,7 +853,11 @@ class SlideController(Controller):
|
||||
else:
|
||||
label = QtGui.QLabel()
|
||||
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():
|
||||
label.setPixmap(QtGui.QPixmap(frame[u'image']))
|
||||
else:
|
||||
|
@ -35,7 +35,7 @@ class Ui_AlertDialog(object):
|
||||
def setupUi(self, alertDialog):
|
||||
alertDialog.setObjectName(u'alertDialog')
|
||||
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.setObjectName(u'alertDialogLayout')
|
||||
self.alertTextLayout = QtGui.QFormLayout()
|
||||
|
@ -36,7 +36,7 @@ class Ui_CustomEditDialog(object):
|
||||
customEditDialog.setObjectName(u'customEditDialog')
|
||||
customEditDialog.resize(450, 350)
|
||||
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.setObjectName(u'dialogLayout')
|
||||
self.titleLayout = QtGui.QHBoxLayout()
|
||||
|
@ -42,8 +42,9 @@ from openlp.core.ui.media import get_media_players, set_media_players
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
CLAPPERBOARD = QtGui.QImage(u':/media/media_video.png')
|
||||
#TODO: Add an appropriate Icon for DVDs, CDs, ...
|
||||
CLAPPERBOARD = u':/media/slidecontroller_multimedia.png'
|
||||
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')
|
||||
|
||||
class MediaMediaItem(MediaManagerItem):
|
||||
@ -217,7 +218,7 @@ class MediaMediaItem(MediaManagerItem):
|
||||
service_item.add_capability(ItemCapabilities.RequiresMedia)
|
||||
# force a non-existent theme
|
||||
service_item.theme = -1
|
||||
frame = u':/media/image_clapperboard.png'
|
||||
frame = CLAPPERBOARD
|
||||
(path, name) = os.path.split(filename)
|
||||
service_item.add_from_command(path, name, frame)
|
||||
return True
|
||||
@ -289,10 +290,10 @@ class MediaMediaItem(MediaManagerItem):
|
||||
key=lambda filename: os.path.split(unicode(filename))[1].lower())
|
||||
for track in media:
|
||||
track_info = QtCore.QFileInfo(track)
|
||||
if not track_info.isFile():
|
||||
if track_info.isFile():
|
||||
filename = os.path.split(unicode(track))[1]
|
||||
item_name = QtGui.QListWidgetItem(filename)
|
||||
item_name.setIcon(build_icon(CLAPPERBOARD))
|
||||
item_name.setIcon(build_icon(VIDEO))
|
||||
item_name.setData(QtCore.Qt.UserRole, track)
|
||||
else:
|
||||
filename = os.path.split(unicode(track))[1]
|
||||
|
@ -55,7 +55,9 @@ window.OpenLP = {
|
||||
);
|
||||
},
|
||||
loadService: function (event) {
|
||||
event.preventDefault();
|
||||
if (event) {
|
||||
event.preventDefault();
|
||||
}
|
||||
$.getJSON(
|
||||
"/api/service/list",
|
||||
function (data, status) {
|
||||
@ -150,6 +152,10 @@ window.OpenLP = {
|
||||
OpenLP.currentSlide = data.results.slide;
|
||||
OpenLP.currentItem = data.results.item;
|
||||
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 a").each(function () {
|
||||
var item = $(this);
|
||||
@ -307,7 +313,7 @@ window.OpenLP = {
|
||||
}
|
||||
);
|
||||
},
|
||||
escapeString: function (string) {
|
||||
escapeString: function (string) {
|
||||
return string.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")
|
||||
}
|
||||
}
|
||||
|
@ -139,8 +139,10 @@ window.OpenLP = {
|
||||
"/api/poll",
|
||||
function (data, status) {
|
||||
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.currentService = data.results.service;
|
||||
OpenLP.loadSlides();
|
||||
}
|
||||
else if (OpenLP.currentSlide != data.results.slide) {
|
||||
|
@ -154,18 +154,20 @@ class SundayPlusImport(SongImport):
|
||||
# If any line inside any verse contains CCLI or
|
||||
# only Public Domain, we treat this as special data:
|
||||
# we remove that line and add data to specific field.
|
||||
processed_lines = []
|
||||
for i in xrange(len(lines)):
|
||||
lines[i] = lines[i].strip()
|
||||
line = lines[i]
|
||||
if line[:4].lower() == u'ccli':
|
||||
line = lines[i].strip()
|
||||
if line[:3].lower() == u'ccl':
|
||||
m = re.search(r'[0-9]+', line)
|
||||
if m:
|
||||
self.ccliNumber = int(m.group(0))
|
||||
lines.pop(i)
|
||||
continue
|
||||
elif line.lower() == u'public domain':
|
||||
self.copyright = u'Public Domain'
|
||||
lines.pop(i)
|
||||
self.addVerse('\n'.join(lines).strip(), verse_type)
|
||||
continue
|
||||
processed_lines.append(line)
|
||||
self.addVerse('\n'.join(processed_lines).strip(),
|
||||
verse_type)
|
||||
if end == -1:
|
||||
break
|
||||
i = end + 1
|
||||
|
@ -260,7 +260,7 @@ class OpenLyrics(object):
|
||||
IMPLEMENTED_VERSION = u'0.8'
|
||||
START_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):
|
||||
self.manager = manager
|
||||
@ -325,10 +325,22 @@ class OpenLyrics(object):
|
||||
# Process the song's lyrics.
|
||||
lyrics = etree.SubElement(song_xml, u'lyrics')
|
||||
verse_list = sxml.get_verses(song.lyrics)
|
||||
# Add a suffix letter to each verse
|
||||
verse_tags = []
|
||||
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
|
||||
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 = \
|
||||
self._add_text_to_element(u'verse', lyrics, None, verse_def)
|
||||
if u'lang' in verse[0]:
|
||||
@ -742,11 +754,10 @@ class OpenLyrics(object):
|
||||
if lines.get(u'break') is not None:
|
||||
text += u'\n[---]'
|
||||
verse_def = verse.get(u'name', u' ').lower()
|
||||
if verse_def[0] in VerseType.Tags:
|
||||
verse_tag = verse_def[0]
|
||||
else:
|
||||
verse_tag, verse_number, verse_part = \
|
||||
OpenLyrics.VERSE_TAG_SPLITTER.search(verse_def).groups()
|
||||
if verse_tag not in VerseType.Tags:
|
||||
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
|
||||
# not correct the verse order.
|
||||
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 \
|
||||
song_xml.get(u'version') == u'0.7' and \
|
||||
(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.
|
||||
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
|
||||
else:
|
||||
verses[(verse_tag, verse_number, lang)] = text
|
||||
verse_def_list.append((verse_tag, verse_number, lang))
|
||||
verses[(verse_tag, verse_number, lang, verse_part)] = text
|
||||
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.
|
||||
for verse in verse_def_list:
|
||||
sxml.add_verse_to_lyrics(
|
||||
|
BIN
resources/images/media_audio.png
Normal file
BIN
resources/images/media_audio.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.7 KiB |
BIN
resources/images/media_video.png
Normal file
BIN
resources/images/media_video.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
@ -130,7 +130,9 @@
|
||||
<qresource prefix="media">
|
||||
<file>media_time.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 prefix="messagebox">
|
||||
<file>messagebox_critical.png</file>
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 11 KiB |
BIN
resources/images/slidecontroller_multimedia.png
Normal file
BIN
resources/images/slidecontroller_multimedia.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
Loading…
Reference in New Issue
Block a user