forked from openlp/openlp
Head
This commit is contained in:
commit
220e40c306
@ -554,4 +554,4 @@ class MediaManagerItem(QtGui.QWidget):
|
|||||||
item_id = remoteItem
|
item_id = remoteItem
|
||||||
else:
|
else:
|
||||||
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
|
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
|
||||||
return item_id
|
return item_id
|
||||||
|
@ -222,13 +222,13 @@ class Renderer(object):
|
|||||||
# Songs and Custom
|
# Songs and Custom
|
||||||
if item.is_capable(ItemCapabilities.AllowsVirtualSplit):
|
if item.is_capable(ItemCapabilities.AllowsVirtualSplit):
|
||||||
# Do not forget the line breaks !
|
# Do not forget the line breaks !
|
||||||
slides = text.split(u'\n[---]\n')
|
slides = text.split(u'[---]')
|
||||||
pages = []
|
pages = []
|
||||||
for slide in slides:
|
for slide in slides:
|
||||||
lines = self._lines(slide)
|
lines = slide.strip(u'\n').split(u'\n')
|
||||||
new_pages = self._paginate_slide(lines, line_break,
|
new_pages = self._paginate_slide(lines, line_break,
|
||||||
self.force_page)
|
self.force_page)
|
||||||
pages.extend([page for page in new_pages])
|
pages.extend(new_pages)
|
||||||
# Bibles
|
# Bibles
|
||||||
elif item.is_capable(ItemCapabilities.AllowsWordSplit):
|
elif item.is_capable(ItemCapabilities.AllowsWordSplit):
|
||||||
pages = self._paginate_slide_words(text, line_break)
|
pages = self._paginate_slide_words(text, line_break)
|
||||||
@ -341,12 +341,14 @@ class Renderer(object):
|
|||||||
if force_page and line_count > 0:
|
if force_page and line_count > 0:
|
||||||
Receiver.send_message(u'theme_line_count', line_count)
|
Receiver.send_message(u'theme_line_count', line_count)
|
||||||
line_count = -1
|
line_count = -1
|
||||||
html_text = html_text.rstrip(u'<br>')
|
while html_text.endswith(u'<br>'):
|
||||||
|
html_text = html_text[:-4]
|
||||||
formatted.append(html_text)
|
formatted.append(html_text)
|
||||||
html_text = u''
|
html_text = u''
|
||||||
styled_text = styled_line
|
styled_text = styled_line
|
||||||
html_text += line + line_end
|
html_text += line + line_end
|
||||||
html_text = html_text.rstrip(u'<br>')
|
while html_text.endswith(u'<br>'):
|
||||||
|
html_text = html_text[:-4]
|
||||||
formatted.append(html_text)
|
formatted.append(html_text)
|
||||||
log.debug(u'_paginate_slide - End')
|
log.debug(u'_paginate_slide - End')
|
||||||
return formatted
|
return formatted
|
||||||
@ -371,7 +373,7 @@ class Renderer(object):
|
|||||||
formatted = []
|
formatted = []
|
||||||
previous_html = u''
|
previous_html = u''
|
||||||
previous_raw = u''
|
previous_raw = u''
|
||||||
lines = self._lines(text)
|
lines = text.split(u'\n')
|
||||||
for line in lines:
|
for line in lines:
|
||||||
styled_line = expand_tags(line)
|
styled_line = expand_tags(line)
|
||||||
html = self.page_shell + previous_html + styled_line + HTML_END
|
html = self.page_shell + previous_html + styled_line + HTML_END
|
||||||
@ -385,7 +387,8 @@ class Renderer(object):
|
|||||||
self.web.setHtml(html)
|
self.web.setHtml(html)
|
||||||
if self.web_frame.contentsSize().height() <= \
|
if self.web_frame.contentsSize().height() <= \
|
||||||
self.page_height:
|
self.page_height:
|
||||||
previous_raw = previous_raw.rstrip(u'<br>')
|
while previous_raw.endswith(u'<br>'):
|
||||||
|
previous_raw = previous_raw[:-4]
|
||||||
formatted.append(previous_raw)
|
formatted.append(previous_raw)
|
||||||
previous_html = u''
|
previous_html = u''
|
||||||
previous_raw = u''
|
previous_raw = u''
|
||||||
@ -408,7 +411,8 @@ class Renderer(object):
|
|||||||
# Text too long so go to next page
|
# Text too long so go to next page
|
||||||
if self.web_frame.contentsSize().height() > \
|
if self.web_frame.contentsSize().height() > \
|
||||||
self.page_height:
|
self.page_height:
|
||||||
previous_raw = previous_raw.rstrip(u'<br>')
|
while previous_raw.endswith(u'<br>'):
|
||||||
|
previous_raw = previous_raw[:-4]
|
||||||
formatted.append(previous_raw)
|
formatted.append(previous_raw)
|
||||||
previous_html = u''
|
previous_html = u''
|
||||||
previous_raw = u''
|
previous_raw = u''
|
||||||
@ -419,36 +423,20 @@ class Renderer(object):
|
|||||||
else:
|
else:
|
||||||
previous_html += styled_line + line_end
|
previous_html += styled_line + line_end
|
||||||
previous_raw += line + line_end
|
previous_raw += line + line_end
|
||||||
previous_raw = previous_raw.rstrip(u'<br>')
|
while previous_raw.endswith(u'<br>'):
|
||||||
|
previous_raw = previous_raw[:-4]
|
||||||
formatted.append(previous_raw)
|
formatted.append(previous_raw)
|
||||||
log.debug(u'_paginate_slide_words - End')
|
log.debug(u'_paginate_slide_words - End')
|
||||||
return formatted
|
return formatted
|
||||||
|
|
||||||
def _lines(self, text):
|
|
||||||
"""
|
|
||||||
Split the slide up by physical line
|
|
||||||
"""
|
|
||||||
# this parse we do not want to use this so remove it
|
|
||||||
verses_text = text.split(u'\n')
|
|
||||||
text = []
|
|
||||||
for verse in verses_text:
|
|
||||||
lines = verse.split(u'\n')
|
|
||||||
text.extend([line for line in lines])
|
|
||||||
|
|
||||||
return text
|
|
||||||
|
|
||||||
def _words_split(self, line):
|
def _words_split(self, line):
|
||||||
"""
|
"""
|
||||||
Split the slide up by word so can wrap better
|
Split the slide up by word so can wrap better
|
||||||
"""
|
"""
|
||||||
# this parse we are to be wordy
|
# this parse we are to be wordy
|
||||||
line = line.replace(u'\n', u' ')
|
line = line.replace(u'\n', u' ')
|
||||||
verses_text = line.split(u' ')
|
words = line.split(u' ')
|
||||||
text = []
|
return [word + u' ' for word in words]
|
||||||
for verse in verses_text:
|
|
||||||
lines = verse.split(u' ')
|
|
||||||
text.extend([line + u' ' for line in lines])
|
|
||||||
return text
|
|
||||||
|
|
||||||
def _lines_split(self, text):
|
def _lines_split(self, text):
|
||||||
"""
|
"""
|
||||||
@ -457,9 +445,4 @@ class Renderer(object):
|
|||||||
# this parse we do not want to use this so remove it
|
# this parse we do not want to use this so remove it
|
||||||
text = text.replace(u'\n[---]', u'')
|
text = text.replace(u'\n[---]', u'')
|
||||||
lines = text.split(u'\n')
|
lines = text.split(u'\n')
|
||||||
real_lines = []
|
return [line.replace(u'[---]', u'') for line in lines]
|
||||||
for line in lines:
|
|
||||||
line = line.replace(u'[---]', u'')
|
|
||||||
sub_lines = line.split(u'\n')
|
|
||||||
real_lines.extend([sub_line for sub_line in sub_lines])
|
|
||||||
return real_lines
|
|
||||||
|
@ -122,12 +122,17 @@ class Ui_MainWindow(object):
|
|||||||
self.HelpMenu = QtGui.QMenu(self.MenuBar)
|
self.HelpMenu = QtGui.QMenu(self.MenuBar)
|
||||||
self.HelpMenu.setObjectName(u'HelpMenu')
|
self.HelpMenu.setObjectName(u'HelpMenu')
|
||||||
mainWindow.setMenuBar(self.MenuBar)
|
mainWindow.setMenuBar(self.MenuBar)
|
||||||
self.StatusBar = QtGui.QStatusBar(mainWindow)
|
self.statusBar = QtGui.QStatusBar(mainWindow)
|
||||||
self.StatusBar.setObjectName(u'StatusBar')
|
self.statusBar.setObjectName(u'statusBar')
|
||||||
mainWindow.setStatusBar(self.StatusBar)
|
mainWindow.setStatusBar(self.statusBar)
|
||||||
self.DefaultThemeLabel = QtGui.QLabel(self.StatusBar)
|
self.loadProgressBar = QtGui.QProgressBar(self.statusBar)
|
||||||
self.DefaultThemeLabel.setObjectName(u'DefaultThemeLabel')
|
self.loadProgressBar.setObjectName(u'loadProgressBar')
|
||||||
self.StatusBar.addPermanentWidget(self.DefaultThemeLabel)
|
self.statusBar.addPermanentWidget(self.loadProgressBar)
|
||||||
|
self.loadProgressBar.hide()
|
||||||
|
self.loadProgressBar.setValue(0)
|
||||||
|
self.defaultThemeLabel = QtGui.QLabel(self.statusBar)
|
||||||
|
self.defaultThemeLabel.setObjectName(u'defaultThemeLabel')
|
||||||
|
self.statusBar.addPermanentWidget(self.defaultThemeLabel)
|
||||||
# Create the MediaManager
|
# Create the MediaManager
|
||||||
self.mediaManagerDock = OpenLPDockWidget(mainWindow,
|
self.mediaManagerDock = OpenLPDockWidget(mainWindow,
|
||||||
u'mediaManagerDock', u':/system/system_mediamanager.png')
|
u'mediaManagerDock', u':/system/system_mediamanager.png')
|
||||||
@ -880,10 +885,10 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||||||
self.setWindowTitle(title)
|
self.setWindowTitle(title)
|
||||||
|
|
||||||
def showStatusMessage(self, message):
|
def showStatusMessage(self, message):
|
||||||
self.StatusBar.showMessage(message)
|
self.statusBar.showMessage(message)
|
||||||
|
|
||||||
def defaultThemeChanged(self, theme):
|
def defaultThemeChanged(self, theme):
|
||||||
self.DefaultThemeLabel.setText(
|
self.defaultThemeLabel.setText(
|
||||||
unicode(translate('OpenLP.MainWindow', 'Default Theme: %s')) %
|
unicode(translate('OpenLP.MainWindow', 'Default Theme: %s')) %
|
||||||
theme)
|
theme)
|
||||||
|
|
||||||
@ -979,7 +984,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||||||
for fileId, filename in enumerate(recentFilesToDisplay):
|
for fileId, filename in enumerate(recentFilesToDisplay):
|
||||||
log.debug('Recent file name: %s', filename)
|
log.debug('Recent file name: %s', filename)
|
||||||
action = base_action(self, u'')
|
action = base_action(self, u'')
|
||||||
action.setText(u'&%d %s' %
|
action.setText(u'&%d %s' %
|
||||||
(fileId + 1, QtCore.QFileInfo(filename).fileName()))
|
(fileId + 1, QtCore.QFileInfo(filename).fileName()))
|
||||||
action.setData(QtCore.QVariant(filename))
|
action.setData(QtCore.QVariant(filename))
|
||||||
self.connect(action, QtCore.SIGNAL(u'triggered()'),
|
self.connect(action, QtCore.SIGNAL(u'triggered()'),
|
||||||
@ -1008,3 +1013,34 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||||||
while self.recentFiles.count() > maxRecentFiles:
|
while self.recentFiles.count() > maxRecentFiles:
|
||||||
# Don't care what API says takeLast works, removeLast doesn't!
|
# Don't care what API says takeLast works, removeLast doesn't!
|
||||||
self.recentFiles.takeLast()
|
self.recentFiles.takeLast()
|
||||||
|
|
||||||
|
def displayProgressBar(self, size):
|
||||||
|
"""
|
||||||
|
Make Progress bar visible and set size
|
||||||
|
"""
|
||||||
|
self.loadProgressBar.show()
|
||||||
|
self.loadProgressBar.setMaximum(size)
|
||||||
|
self.loadProgressBar.setValue(0)
|
||||||
|
Receiver.send_message(u'openlp_process_events')
|
||||||
|
|
||||||
|
def incrementProgressBar(self):
|
||||||
|
"""
|
||||||
|
Increase the Progress Bar value by 1
|
||||||
|
"""
|
||||||
|
self.loadProgressBar.setValue(self.loadProgressBar.value() + 1)
|
||||||
|
Receiver.send_message(u'openlp_process_events')
|
||||||
|
|
||||||
|
def finishedProgressBar(self):
|
||||||
|
"""
|
||||||
|
Trigger it's removal after 2.5 second
|
||||||
|
"""
|
||||||
|
self.timer_id = self.startTimer(2500)
|
||||||
|
|
||||||
|
def timerEvent(self, event):
|
||||||
|
"""
|
||||||
|
Remove the Progress bar from view.
|
||||||
|
"""
|
||||||
|
if event.timerId() == self.timer_id:
|
||||||
|
self.timer_id = 0
|
||||||
|
self.loadProgressBar.hide()
|
||||||
|
Receiver.send_message(u'openlp_process_events')
|
||||||
|
@ -460,7 +460,11 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
service = []
|
service = []
|
||||||
write_list = []
|
write_list = []
|
||||||
total_size = 0
|
total_size = 0
|
||||||
|
Receiver.send_message(u'cursor_busy')
|
||||||
|
# Number of items + 1 to zip it
|
||||||
|
self.mainwindow.displayProgressBar(len(self.serviceItems) + 1)
|
||||||
for item in self.serviceItems:
|
for item in self.serviceItems:
|
||||||
|
self.mainwindow.incrementProgressBar()
|
||||||
service.append({u'serviceitem':
|
service.append({u'serviceitem':
|
||||||
item[u'service_item'].get_service_repr()})
|
item[u'service_item'].get_service_repr()})
|
||||||
if not item[u'service_item'].uses_file():
|
if not item[u'service_item'].uses_file():
|
||||||
@ -501,6 +505,7 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
log.debug(u'ServiceManager.saveFile - allowZip64 is %s' % allow_zip_64)
|
log.debug(u'ServiceManager.saveFile - allowZip64 is %s' % allow_zip_64)
|
||||||
zip = None
|
zip = None
|
||||||
success = True
|
success = True
|
||||||
|
self.mainwindow.incrementProgressBar()
|
||||||
try:
|
try:
|
||||||
zip = zipfile.ZipFile(path_file_name, 'w', zipfile.ZIP_STORED,
|
zip = zipfile.ZipFile(path_file_name, 'w', zipfile.ZIP_STORED,
|
||||||
allow_zip_64)
|
allow_zip_64)
|
||||||
@ -516,6 +521,8 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
finally:
|
finally:
|
||||||
if zip:
|
if zip:
|
||||||
zip.close()
|
zip.close()
|
||||||
|
self.mainwindow.finishedProgressBar()
|
||||||
|
Receiver.send_message(u'cursor_normal')
|
||||||
if success:
|
if success:
|
||||||
self.mainwindow.addRecentFile(path_file_name)
|
self.mainwindow.addRecentFile(path_file_name)
|
||||||
self.setModified(False)
|
self.setModified(False)
|
||||||
@ -576,13 +583,15 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
items = cPickle.load(fileTo)
|
items = cPickle.load(fileTo)
|
||||||
fileTo.close()
|
fileTo.close()
|
||||||
self.newFile()
|
self.newFile()
|
||||||
|
self.mainwindow.displayProgressBar(len(items))
|
||||||
for item in items:
|
for item in items:
|
||||||
|
self.mainwindow.incrementProgressBar()
|
||||||
serviceItem = ServiceItem()
|
serviceItem = ServiceItem()
|
||||||
serviceItem.from_service = True
|
serviceItem.from_service = True
|
||||||
serviceItem.renderer = self.mainwindow.renderer
|
serviceItem.renderer = self.mainwindow.renderer
|
||||||
serviceItem.set_from_service(item, self.servicePath)
|
serviceItem.set_from_service(item, self.servicePath)
|
||||||
self.validateItem(serviceItem)
|
self.validateItem(serviceItem)
|
||||||
self.addServiceItem(serviceItem)
|
self.addServiceItem(serviceItem, repaint=False)
|
||||||
if serviceItem.is_capable(ItemCapabilities.OnLoadUpdate):
|
if serviceItem.is_capable(ItemCapabilities.OnLoadUpdate):
|
||||||
Receiver.send_message(u'%s_service_load' %
|
Receiver.send_message(u'%s_service_load' %
|
||||||
serviceItem.name.lower(), serviceItem)
|
serviceItem.name.lower(), serviceItem)
|
||||||
@ -592,7 +601,6 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
self.setModified(False)
|
self.setModified(False)
|
||||||
QtCore.QSettings().setValue(
|
QtCore.QSettings().setValue(
|
||||||
'service/last file', QtCore.QVariant(fileName))
|
'service/last file', QtCore.QVariant(fileName))
|
||||||
Receiver.send_message(u'cursor_normal')
|
|
||||||
else:
|
else:
|
||||||
critical_error_message_box(
|
critical_error_message_box(
|
||||||
message=translate('OpenLP.ServiceManager',
|
message=translate('OpenLP.ServiceManager',
|
||||||
@ -623,6 +631,9 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
fileTo.close()
|
fileTo.close()
|
||||||
if zip:
|
if zip:
|
||||||
zip.close()
|
zip.close()
|
||||||
|
self.mainwindow.finishedProgressBar()
|
||||||
|
Receiver.send_message(u'cursor_normal')
|
||||||
|
self.repaintServiceList(-1, -1)
|
||||||
|
|
||||||
def loadLastFile(self):
|
def loadLastFile(self):
|
||||||
"""
|
"""
|
||||||
@ -1056,7 +1067,8 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
newItem)
|
newItem)
|
||||||
self.setModified()
|
self.setModified()
|
||||||
|
|
||||||
def addServiceItem(self, item, rebuild=False, expand=None, replace=False):
|
def addServiceItem(self, item, rebuild=False, expand=None, replace=False,
|
||||||
|
repaint=True):
|
||||||
"""
|
"""
|
||||||
Add a Service item to the list
|
Add a Service item to the list
|
||||||
|
|
||||||
@ -1089,7 +1101,8 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
self.serviceItems.append({u'service_item': item,
|
self.serviceItems.append({u'service_item': item,
|
||||||
u'order': len(self.serviceItems) + 1,
|
u'order': len(self.serviceItems) + 1,
|
||||||
u'expanded': expand})
|
u'expanded': expand})
|
||||||
self.repaintServiceList(len(self.serviceItems) - 1, -1)
|
if repaint:
|
||||||
|
self.repaintServiceList(len(self.serviceItems) - 1, -1)
|
||||||
else:
|
else:
|
||||||
self.serviceItems.insert(self.dropPosition,
|
self.serviceItems.insert(self.dropPosition,
|
||||||
{u'service_item': item, u'order': self.dropPosition,
|
{u'service_item': item, u'order': self.dropPosition,
|
||||||
|
@ -77,7 +77,7 @@ class ImageMediaItem(MediaManagerItem):
|
|||||||
u'thumbnails')
|
u'thumbnails')
|
||||||
check_directory_exists(self.servicePath)
|
check_directory_exists(self.servicePath)
|
||||||
self.loadList(SettingsManager.load_list(
|
self.loadList(SettingsManager.load_list(
|
||||||
self.settingsSection, self.settingsSection))
|
self.settingsSection, self.settingsSection), True)
|
||||||
|
|
||||||
def addListViewToToolBar(self):
|
def addListViewToToolBar(self):
|
||||||
MediaManagerItem.addListViewToToolBar(self)
|
MediaManagerItem.addListViewToToolBar(self)
|
||||||
@ -107,8 +107,13 @@ class ImageMediaItem(MediaManagerItem):
|
|||||||
SettingsManager.set_list(self.settingsSection,
|
SettingsManager.set_list(self.settingsSection,
|
||||||
self.settingsSection, self.getFileList())
|
self.settingsSection, self.getFileList())
|
||||||
|
|
||||||
def loadList(self, list):
|
def loadList(self, list, initialLoad=False):
|
||||||
|
Receiver.send_message(u'cursor_busy')
|
||||||
|
if not initialLoad:
|
||||||
|
self.parent.formparent.displayProgressBar(len(list))
|
||||||
for imageFile in list:
|
for imageFile in list:
|
||||||
|
if not initialLoad:
|
||||||
|
self.parent.formparent.incrementProgressBar()
|
||||||
filename = os.path.split(unicode(imageFile))[1]
|
filename = os.path.split(unicode(imageFile))[1]
|
||||||
thumb = os.path.join(self.servicePath, filename)
|
thumb = os.path.join(self.servicePath, filename)
|
||||||
if os.path.exists(thumb):
|
if os.path.exists(thumb):
|
||||||
@ -122,6 +127,9 @@ class ImageMediaItem(MediaManagerItem):
|
|||||||
item_name.setIcon(icon)
|
item_name.setIcon(icon)
|
||||||
item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(imageFile))
|
item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(imageFile))
|
||||||
self.listView.addItem(item_name)
|
self.listView.addItem(item_name)
|
||||||
|
Receiver.send_message(u'cursor_normal')
|
||||||
|
if not initialLoad:
|
||||||
|
self.parent.formparent.finishedProgressBar()
|
||||||
|
|
||||||
def generateSlideData(self, service_item, item=None, xmlVersion=False):
|
def generateSlideData(self, service_item, item=None, xmlVersion=False):
|
||||||
items = self.listView.selectedIndexes()
|
items = self.listView.selectedIndexes()
|
||||||
@ -201,4 +209,4 @@ class ImageMediaItem(MediaManagerItem):
|
|||||||
critical_error_message_box(UiStrings().LiveBGError,
|
critical_error_message_box(UiStrings().LiveBGError,
|
||||||
unicode(translate('ImagePlugin.MediaItem',
|
unicode(translate('ImagePlugin.MediaItem',
|
||||||
'There was a problem replacing your background, '
|
'There was a problem replacing your background, '
|
||||||
'the image file "%s" no longer exists.')) % filename)
|
'the image file "%s" no longer exists.')) % filename)
|
||||||
|
@ -158,7 +158,12 @@ class PresentationMediaItem(MediaManagerItem):
|
|||||||
titles = []
|
titles = []
|
||||||
for file in currlist:
|
for file in currlist:
|
||||||
titles.append(os.path.split(file)[1])
|
titles.append(os.path.split(file)[1])
|
||||||
|
Receiver.send_message(u'cursor_busy')
|
||||||
|
if not initialLoad:
|
||||||
|
self.parent.formparent.displayProgressBar(len(list))
|
||||||
for file in list:
|
for file in list:
|
||||||
|
if not initialLoad:
|
||||||
|
self.parent.formparent.incrementProgressBar()
|
||||||
if currlist.count(file) > 0:
|
if currlist.count(file) > 0:
|
||||||
continue
|
continue
|
||||||
filename = os.path.split(unicode(file))[1]
|
filename = os.path.split(unicode(file))[1]
|
||||||
@ -198,6 +203,9 @@ class PresentationMediaItem(MediaManagerItem):
|
|||||||
item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file))
|
item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file))
|
||||||
item_name.setIcon(icon)
|
item_name.setIcon(icon)
|
||||||
self.listView.addItem(item_name)
|
self.listView.addItem(item_name)
|
||||||
|
Receiver.send_message(u'cursor_normal')
|
||||||
|
if not initialLoad:
|
||||||
|
self.parent.formparent.finishedProgressBar()
|
||||||
|
|
||||||
def onDeleteClick(self):
|
def onDeleteClick(self):
|
||||||
"""
|
"""
|
||||||
@ -296,4 +304,4 @@ class PresentationMediaItem(MediaManagerItem):
|
|||||||
if self.controllers[controller].enabled():
|
if self.controllers[controller].enabled():
|
||||||
if filetype in self.controllers[controller].alsosupports:
|
if filetype in self.controllers[controller].alsosupports:
|
||||||
return controller
|
return controller
|
||||||
return None
|
return None
|
||||||
|
@ -293,7 +293,10 @@ def clean_song(manager, song):
|
|||||||
song.lyrics = unicode(sxml.extract_xml(), u'utf-8')
|
song.lyrics = unicode(sxml.extract_xml(), u'utf-8')
|
||||||
# Rebuild the verse order, to convert translated verse tags, which might
|
# Rebuild the verse order, to convert translated verse tags, which might
|
||||||
# have been added prior to 1.9.5.
|
# have been added prior to 1.9.5.
|
||||||
order = song.verse_order.strip().split()
|
if song.verse_order:
|
||||||
|
order = song.verse_order.strip().split()
|
||||||
|
else:
|
||||||
|
order = []
|
||||||
new_order = []
|
new_order = []
|
||||||
for verse_def in order:
|
for verse_def in order:
|
||||||
verse_type = VerseType.Tags[VerseType.from_loose_input(verse_def[0])]
|
verse_type = VerseType.Tags[VerseType.from_loose_input(verse_def[0])]
|
||||||
|
@ -32,7 +32,7 @@ The basic XML for storing the lyrics in the song database looks like this::
|
|||||||
<song version="1.0">
|
<song version="1.0">
|
||||||
<lyrics>
|
<lyrics>
|
||||||
<verse type="c" label="1" lang="en">
|
<verse type="c" label="1" lang="en">
|
||||||
<![CDATA[ ... ]]>
|
<![CDATA[Chorus virtual slide 1[---]Chorus virtual slide 2]]>
|
||||||
</verse>
|
</verse>
|
||||||
</lyrics>
|
</lyrics>
|
||||||
</song>
|
</song>
|
||||||
@ -129,18 +129,31 @@ class SongXML(object):
|
|||||||
|
|
||||||
The returned list has the following format::
|
The returned list has the following format::
|
||||||
|
|
||||||
[[{'lang': 'en', 'type': 'v', 'label': '1'}, u"English verse"],
|
[[{'type': 'v', 'label': '1'},
|
||||||
|
u"virtual slide 1[---]virtual slide 2"],
|
||||||
[{'lang': 'en', 'type': 'c', 'label': '1'}, u"English chorus"]]
|
[{'lang': 'en', 'type': 'c', 'label': '1'}, u"English chorus"]]
|
||||||
"""
|
"""
|
||||||
self.song_xml = None
|
self.song_xml = None
|
||||||
if xml[:5] == u'<?xml':
|
verse_list = []
|
||||||
|
if not xml.startswith(u'<?xml') and not xml.startswith(u'<song'):
|
||||||
|
# This is an old style song, without XML. Let's handle it correctly
|
||||||
|
# by iterating through the verses, and then recreating the internal
|
||||||
|
# xml object as well.
|
||||||
|
self.song_xml = objectify.fromstring(u'<song version="1.0" />')
|
||||||
|
self.lyrics = etree.SubElement(self.song_xml, u'lyrics')
|
||||||
|
verses = xml.split(u'\n\n')
|
||||||
|
for count, verse in enumerate(verses):
|
||||||
|
verse_list.append([{u'type': u'v', u'label': unicode(count)},
|
||||||
|
unicode(verse)])
|
||||||
|
self.add_verse_to_lyrics(u'v', unicode(count), verse)
|
||||||
|
return verse_list
|
||||||
|
elif xml.startswith(u'<?xml'):
|
||||||
xml = xml[38:]
|
xml = xml[38:]
|
||||||
try:
|
try:
|
||||||
self.song_xml = objectify.fromstring(xml)
|
self.song_xml = objectify.fromstring(xml)
|
||||||
except etree.XMLSyntaxError:
|
except etree.XMLSyntaxError:
|
||||||
log.exception(u'Invalid xml %s', xml)
|
log.exception(u'Invalid xml %s', xml)
|
||||||
xml_iter = self.song_xml.getiterator()
|
xml_iter = self.song_xml.getiterator()
|
||||||
verse_list = []
|
|
||||||
for element in xml_iter:
|
for element in xml_iter:
|
||||||
if element.tag == u'verse':
|
if element.tag == u'verse':
|
||||||
if element.text is None:
|
if element.text is None:
|
||||||
@ -226,7 +239,6 @@ class OpenLyrics(object):
|
|||||||
Convert the song to OpenLyrics Format.
|
Convert the song to OpenLyrics Format.
|
||||||
"""
|
"""
|
||||||
sxml = SongXML()
|
sxml = SongXML()
|
||||||
verse_list = sxml.get_verses(song.lyrics)
|
|
||||||
song_xml = objectify.fromstring(u'<song/>')
|
song_xml = objectify.fromstring(u'<song/>')
|
||||||
# Append the necessary meta data to the song.
|
# Append the necessary meta data to the song.
|
||||||
song_xml.set(u'xmlns', u'http://openlyrics.info/namespace/2009/song')
|
song_xml.set(u'xmlns', u'http://openlyrics.info/namespace/2009/song')
|
||||||
@ -268,17 +280,26 @@ class OpenLyrics(object):
|
|||||||
themes = etree.SubElement(properties, u'themes')
|
themes = etree.SubElement(properties, u'themes')
|
||||||
for topic in song.topics:
|
for topic in song.topics:
|
||||||
self._add_text_to_element(u'theme', themes, topic.name)
|
self._add_text_to_element(u'theme', themes, topic.name)
|
||||||
|
# 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)
|
||||||
for verse in verse_list:
|
for verse in verse_list:
|
||||||
verse_tag = u'%s%s' % (
|
verse_tag = verse[0][u'type'][0].lower()
|
||||||
verse[0][u'type'][0].lower(), verse[0][u'label'])
|
verse_number = verse[0][u'label']
|
||||||
element = \
|
# Create a list with all "virtual" verses.
|
||||||
self._add_text_to_element(u'verse', lyrics, None, verse_tag)
|
virtual_verses = verse[1].split(u'[---]')
|
||||||
if verse[0].has_key(u'lang'):
|
for index, virtual_verse in enumerate(virtual_verses):
|
||||||
element.set(u'lang', verse[0][u'lang'])
|
verse_def = verse_tag + verse_number
|
||||||
element = self._add_text_to_element(u'lines', element)
|
# We need "v1a" because we have more than one virtual verse.
|
||||||
for line in unicode(verse[1]).split(u'\n'):
|
if len(virtual_verses) > 1:
|
||||||
self._add_text_to_element(u'line', element, line)
|
verse_def += list(u'abcdefghijklmnopqrstuvwxyz')[index]
|
||||||
|
element = \
|
||||||
|
self._add_text_to_element(u'verse', lyrics, None, verse_def)
|
||||||
|
if verse[0].has_key(u'lang'):
|
||||||
|
element.set(u'lang', verse[0][u'lang'])
|
||||||
|
element = self._add_text_to_element(u'lines', element)
|
||||||
|
for line in virtual_verse.strip(u'\n').split(u'\n'):
|
||||||
|
self._add_text_to_element(u'line', element, line)
|
||||||
return self._extract_xml(song_xml)
|
return self._extract_xml(song_xml)
|
||||||
|
|
||||||
def xml_to_song(self, xml):
|
def xml_to_song(self, xml):
|
||||||
@ -446,6 +467,8 @@ class OpenLyrics(object):
|
|||||||
The song object.
|
The song object.
|
||||||
"""
|
"""
|
||||||
sxml = SongXML()
|
sxml = SongXML()
|
||||||
|
verses = {}
|
||||||
|
verse_def_list = []
|
||||||
for verse in lyrics.verse:
|
for verse in lyrics.verse:
|
||||||
text = u''
|
text = u''
|
||||||
for lines in verse.lines:
|
for lines in verse.lines:
|
||||||
@ -465,7 +488,15 @@ class OpenLyrics(object):
|
|||||||
lang = None
|
lang = None
|
||||||
if self._get(verse, u'lang'):
|
if self._get(verse, u'lang'):
|
||||||
lang = self._get(verse, u'lang')
|
lang = self._get(verse, u'lang')
|
||||||
sxml.add_verse_to_lyrics(verse_tag, verse_number, text, lang)
|
if verses.has_key((verse_tag, verse_number, lang)):
|
||||||
|
verses[(verse_tag, verse_number, lang)] += u'\n[---]\n' + text
|
||||||
|
else:
|
||||||
|
verses[(verse_tag, verse_number, lang)] = text
|
||||||
|
verse_def_list.append((verse_tag, verse_number, lang))
|
||||||
|
# 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(
|
||||||
|
verse[0], verse[1], verses[verse], verse[2])
|
||||||
song.lyrics = unicode(sxml.extract_xml(), u'utf-8')
|
song.lyrics = unicode(sxml.extract_xml(), u'utf-8')
|
||||||
# Process verse order
|
# Process verse order
|
||||||
if hasattr(properties, u'verseOrder'):
|
if hasattr(properties, u'verseOrder'):
|
||||||
|
Loading…
Reference in New Issue
Block a user