Verse tagging changes etc

bzr-revno: 679
This commit is contained in:
Tim Bentley 2009-11-29 19:11:47 +00:00
commit 1f0a37d4ba
14 changed files with 413 additions and 136 deletions

View File

@ -31,9 +31,9 @@ class PluginStatus(object):
""" """
Defines the status of the plugin Defines the status of the plugin
""" """
Active = 0 Active = 1
Inactive = 1 Inactive = 0
Disabled = 2 Disabled = -1
class Plugin(QtCore.QObject): class Plugin(QtCore.QObject):
""" """

View File

@ -1,4 +1,4 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 # vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
############################################################################### ###############################################################################
@ -49,6 +49,7 @@ class Renderer(object):
self._theme = None self._theme = None
self._bg_image_filename = None self._bg_image_filename = None
self._frame = None self._frame = None
self._frameOp = None
self.bg_frame = None self.bg_frame = None
self.bg_image = None self.bg_image = None
@ -134,6 +135,8 @@ class Renderer(object):
frame_height) frame_height)
self._frame = QtGui.QImage(frame_width, frame_height, self._frame = QtGui.QImage(frame_width, frame_height,
QtGui.QImage.Format_ARGB32_Premultiplied) QtGui.QImage.Format_ARGB32_Premultiplied)
self._frameOp = QtGui.QImage(frame_width, frame_height,
QtGui.QImage.Format_ARGB32_Premultiplied)
if self._bg_image_filename and not self.bg_image: if self._bg_image_filename and not self.bg_image:
self.scale_bg_image() self.scale_bg_image()
if self.bg_frame is None: if self.bg_frame is None:
@ -255,13 +258,14 @@ class Renderer(object):
bbox1 = self._render_lines_unaligned(footer_lines, True) bbox1 = self._render_lines_unaligned(footer_lines, True)
# reset the frame. first time do not worry about what you paint on. # reset the frame. first time do not worry about what you paint on.
self._frame = QtGui.QImage(self.bg_frame) self._frame = QtGui.QImage(self.bg_frame)
self._frameOp = QtGui.QImage(self.bg_frame)
x, y = self._correctAlignment(self._rect, bbox) x, y = self._correctAlignment(self._rect, bbox)
bbox = self._render_lines_unaligned(lines, False, (x, y), True) bbox = self._render_lines_unaligned(lines, False, (x, y), True)
if footer_lines: if footer_lines:
bbox = self._render_lines_unaligned(footer_lines, True, bbox = self._render_lines_unaligned(footer_lines, True,
(self._rect_footer.left(), self._rect_footer.top()), True) (self._rect_footer.left(), self._rect_footer.top()), True)
log.debug(u'generate_frame_from_lines - Finish') log.debug(u'generate_frame_from_lines - Finish')
return self._frame return {u'main':self._frame, u'trans':self._frameOp}
def _generate_background_frame(self): def _generate_background_frame(self):
""" """
@ -569,6 +573,22 @@ class Renderer(object):
if draw: if draw:
painter.drawText(x, y + metrics.ascent(), line) painter.drawText(x, y + metrics.ascent(), line)
painter.end() painter.end()
# Print 2nd image with 50% weight
painter = QtGui.QPainter()
painter.begin(self._frameOp)
painter.setRenderHint(QtGui.QPainter.Antialiasing);
painter.setOpacity(0.5)
painter.setFont(font)
if color is None:
if footer:
painter.setPen(QtGui.QColor(self._theme.font_footer_color))
else:
painter.setPen(QtGui.QColor(self._theme.font_main_color))
else:
painter.setPen(QtGui.QColor(color))
if draw:
painter.drawText(x, y + metrics.ascent(), line)
painter.end()
return (w, h) return (w, h)
def snoop_Image(self, image, image2=None): def snoop_Image(self, image, image2=None):

View File

@ -104,7 +104,8 @@ class ServiceItem(object):
for line in format: for line in format:
lines += line + u'\n' lines += line + u'\n'
title = lines.split(u'\n')[0] title = lines.split(u'\n')[0]
self._display_frames.append({u'title': title, u'text': lines}) self._display_frames.append({u'title': title, \
u'text': lines, u'verseTag': slide[u'verseTag'] })
log.log(15, u'Formatting took %4s' % (time.time() - before)) log.log(15, u'Formatting took %4s' % (time.time() - before))
elif self.service_item_type == ServiceItemType.Image: elif self.service_item_type == ServiceItemType.Image:
for slide in self._raw_frames: for slide in self._raw_frames:
@ -147,7 +148,7 @@ class ServiceItem(object):
self._raw_frames.append( self._raw_frames.append(
{u'title': title, u'image': image}) {u'title': title, u'image': image})
def add_from_text(self, title, raw_slide): def add_from_text(self, title, raw_slide, verseTag=None):
""" """
Add a text slide to the service item. Add a text slide to the service item.
@ -160,7 +161,7 @@ class ServiceItem(object):
self.service_item_type = ServiceItemType.Text self.service_item_type = ServiceItemType.Text
title = title.split(u'\n')[0] title = title.split(u'\n')[0]
self._raw_frames.append( self._raw_frames.append(
{u'title': title, u'raw_slide': raw_slide}) {u'title': title, u'raw_slide': raw_slide, u'verseTag':verseTag})
def add_from_command(self, path, file_name, image): def add_from_command(self, path, file_name, image):
""" """

View File

@ -24,6 +24,7 @@
import logging import logging
import os import os
import time
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from PyQt4.phonon import Phonon from PyQt4.phonon import Phonon
@ -110,6 +111,7 @@ class MainDisplay(DisplayWidget):
self.timer_id = 0 self.timer_id = 0
self.firstTime = True self.firstTime = True
self.mediaLoaded = False self.mediaLoaded = False
self.hasTransition = False
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'alert_text'), self.displayAlert) QtCore.SIGNAL(u'alert_text'), self.displayAlert)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
@ -127,6 +129,7 @@ class MainDisplay(DisplayWidget):
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'media_stop'), self.onMediaStop) QtCore.SIGNAL(u'media_stop'), self.onMediaStop)
def setup(self, screenNumber): def setup(self, screenNumber):
""" """
Sets up the screen on a particular screen. Sets up the screen on a particular screen.
@ -183,27 +186,34 @@ class MainDisplay(DisplayWidget):
if not self.primary: if not self.primary:
self.setVisible(True) self.setVisible(True)
def frameView(self, frame): def frameView(self, frame, transition=False):
""" """
Called from a slide controller to display a frame Called from a slide controller to display a frame
if the alert is in progress the alert is added on top if the alert is in progress the alert is added on top
``frame`` ``frame``
Image frame to be rendered Image frame to be rendered
""" """
self.frame = frame
if self.timer_id != 0 : if self.timer_id != 0 :
self.displayAlert() self.displayAlert()
elif not self.displayBlank: elif not self.displayBlank:
# self.setWindowOpacity(0.5) if transition:
# self.show() if self.hasTransition:
self.display.setPixmap(QtGui.QPixmap.fromImage(frame)) delay = 0.01
# QtCore.QTimer.singleShot(500, self.aa ) self.display.setPixmap(QtGui.QPixmap.fromImage(self.frame[u'trans']))
self.repaint()
time.sleep(delay)
self.display.setPixmap(QtGui.QPixmap.fromImage(frame[u'trans']))
self.repaint()
time.sleep(delay)
self.hasTransition = True
self.display.setPixmap(QtGui.QPixmap.fromImage(frame[u'main']))
self.repaint()
else:
self.display.setPixmap(QtGui.QPixmap.fromImage(frame))
if not self.isVisible(): if not self.isVisible():
self.setVisible(True) self.setVisible(True)
self.showFullScreen() self.showFullScreen()
# self.frame = frame
# def aa(self):
# self.setWindowOpacity(1)
def blankDisplay(self, blanked=True): def blankDisplay(self, blanked=True):
if blanked: if blanked:

View File

@ -86,7 +86,10 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog):
self.VersionNumberLabel.setText(self.activePlugin.version) self.VersionNumberLabel.setText(self.activePlugin.version)
self.AboutTextBrowser.setHtml(self.activePlugin.about()) self.AboutTextBrowser.setHtml(self.activePlugin.about())
self.programaticChange = True self.programaticChange = True
self.StatusComboBox.setCurrentIndex(int(self.activePlugin.status)) status = 1
if self.activePlugin.status == PluginStatus.Active:
status = 0
self.StatusComboBox.setCurrentIndex(status)
self.StatusComboBox.setEnabled(True) self.StatusComboBox.setEnabled(True)
self.programaticChange = False self.programaticChange = False
@ -108,10 +111,11 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog):
def onStatusComboBoxChanged(self, status): def onStatusComboBoxChanged(self, status):
if self.programaticChange: if self.programaticChange:
return return
self.activePlugin.toggle_status(status) if status == 0:
if status == PluginStatus.Active: self.activePlugin.toggle_status(PluginStatus.Active)
self.activePlugin.initialise() self.activePlugin.initialise()
else: else:
self.activePlugin.toggle_status(PluginStatus.Inactive)
self.activePlugin.finalise() self.activePlugin.finalise()
status_text = 'Inactive' status_text = 'Inactive'
if self.activePlugin.status == PluginStatus.Active: if self.activePlugin.status == PluginStatus.Active:

View File

@ -433,9 +433,9 @@ class ServiceManager(QtGui.QWidget):
{u'serviceitem':item[u'service_item'].get_service_repr()}) {u'serviceitem':item[u'service_item'].get_service_repr()})
if item[u'service_item'].service_item_type == ServiceItemType.Image or \ if item[u'service_item'].service_item_type == ServiceItemType.Image or \
item[u'service_item'].service_item_type == ServiceItemType.Command: item[u'service_item'].service_item_type == ServiceItemType.Command:
for frame in item[u'service_item'].frames: for frame in item[u'service_item'].get_frames:
path_from = unicode(os.path.join( path_from = unicode(os.path.join(
item[u'service_item'].service_item_path, frame[u'title'])) item[u'service_item'].service_item_path, frame.get_frame_title()))
zip.write(path_from) zip.write(path_from)
file = open(servicefile, u'wb') file = open(servicefile, u'wb')
cPickle.dump(service, file) cPickle.dump(service, file)

View File

@ -89,6 +89,7 @@ class SlideController(QtGui.QWidget):
self.selectedRow = 0 self.selectedRow = 0
self.serviceItem = None self.serviceItem = None
self.Panel = QtGui.QWidget(parent.ControlSplitter) self.Panel = QtGui.QWidget(parent.ControlSplitter)
self.slideList = {}
# Layout for holding panel # Layout for holding panel
self.PanelLayout = QtGui.QVBoxLayout(self.Panel) self.PanelLayout = QtGui.QVBoxLayout(self.Panel)
self.PanelLayout.setSpacing(0) self.PanelLayout.setSpacing(0)
@ -352,14 +353,14 @@ class SlideController(QtGui.QWidget):
self.Songbar.actions[action].setVisible(False) self.Songbar.actions[action].setVisible(False)
if item.verse_order: if item.verse_order:
verses = item.verse_order.split(u' ') verses = item.verse_order.split(u' ')
for verse in verses: # for verse in verses:
if not verse or int(verse) > 12: # if not verse or int(verse) > 12:
break # break
try: # try:
self.Songbar.actions[verse].setVisible(True) # self.Songbar.actions[verse].setVisible(True)
except: # except:
#More than 20 verses hard luck # #More than 20 verses hard luck
pass # pass
self.Songbar.setVisible(True) self.Songbar.setVisible(True)
elif item.is_image(): elif item.is_image():
#Not sensible to allow loops with 1 frame #Not sensible to allow loops with 1 frame
@ -416,7 +417,6 @@ class SlideController(QtGui.QWidget):
#If old item was a command tell it to stop #If old item was a command tell it to stop
if self.serviceItem and self.serviceItem.is_command(): if self.serviceItem and self.serviceItem.is_command():
self.onMediaStop() self.onMediaStop()
self.enableToolBar(item)
if item.is_command(): if item.is_command():
if self.isLive: if self.isLive:
Receiver.send_message(u'%s_start' % item.name.lower(), \ Receiver.send_message(u'%s_start' % item.name.lower(), \
@ -427,17 +427,18 @@ class SlideController(QtGui.QWidget):
self.onMediaStart(item) self.onMediaStart(item)
self.displayServiceManagerItems(item, slideno) self.displayServiceManagerItems(item, slideno)
def displayServiceManagerItems(self, serviceitem, slideno): def displayServiceManagerItems(self, serviceItem, slideno):
""" """
Loads a ServiceItem into the system from ServiceManager Loads a ServiceItem into the system from ServiceManager
Display the slide number passed Display the slide number passed
""" """
log.debug(u'displayServiceManagerItems Start') log.debug(u'displayServiceManagerItems Start')
self.slideList = {}
width = self.parent.ControlSplitter.sizes()[self.split] width = self.parent.ControlSplitter.sizes()[self.split]
#Set pointing cursor when we have somthing to point at #Set pointing cursor when we have somthing to point at
self.PreviewListWidget.setCursor(QtCore.Qt.PointingHandCursor) self.PreviewListWidget.setCursor(QtCore.Qt.PointingHandCursor)
before = time.time() before = time.time()
self.serviceItem = serviceitem self.serviceItem = serviceItem
self.PreviewListWidget.clear() self.PreviewListWidget.clear()
self.PreviewListWidget.setRowCount(0) self.PreviewListWidget.setRowCount(0)
self.PreviewListWidget.setColumnWidth(0, width) self.PreviewListWidget.setColumnWidth(0, width)
@ -446,8 +447,11 @@ class SlideController(QtGui.QWidget):
self.PreviewListWidget.rowCount() + 1) self.PreviewListWidget.rowCount() + 1)
item = QtGui.QTableWidgetItem() item = QtGui.QTableWidgetItem()
slide_height = 0 slide_height = 0
#It is a Image #It is a based Text Render
if not self.serviceItem.is_text(): if self.serviceItem.is_text():
self.slideList[frame[u'verseTag']] = framenumber
item.setText(frame[u'text'])
else:
label = QtGui.QLabel() label = QtGui.QLabel()
label.setMargin(4) label.setMargin(4)
pixmap = self.parent.RenderManager.resize_image(frame[u'image']) pixmap = self.parent.RenderManager.resize_image(frame[u'image'])
@ -455,8 +459,6 @@ class SlideController(QtGui.QWidget):
label.setPixmap(QtGui.QPixmap.fromImage(pixmap)) label.setPixmap(QtGui.QPixmap.fromImage(pixmap))
self.PreviewListWidget.setCellWidget(framenumber, 0, label) self.PreviewListWidget.setCellWidget(framenumber, 0, label)
slide_height = width * self.parent.RenderManager.screen_ratio slide_height = width * self.parent.RenderManager.screen_ratio
else:
item.setText(frame[u'text'])
self.PreviewListWidget.setItem(framenumber, 0, item) self.PreviewListWidget.setItem(framenumber, 0, item)
if slide_height != 0: if slide_height != 0:
self.PreviewListWidget.setRowHeight(framenumber, slide_height) self.PreviewListWidget.setRowHeight(framenumber, slide_height)
@ -468,6 +470,7 @@ class SlideController(QtGui.QWidget):
self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount()) self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount())
else: else:
self.PreviewListWidget.selectRow(slideno) self.PreviewListWidget.selectRow(slideno)
self.enableToolBar(serviceItem)
self.onSlideSelected() self.onSlideSelected()
self.PreviewListWidget.setFocus() self.PreviewListWidget.setFocus()
log.log(15, u'Display Rendering took %4s' % (time.time() - before)) log.log(15, u'Display Rendering took %4s' % (time.time() - before))
@ -517,10 +520,10 @@ class SlideController(QtGui.QWidget):
else: else:
before = time.time() before = time.time()
frame = self.serviceItem.get_rendered_frame(row) frame = self.serviceItem.get_rendered_frame(row)
self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame)) self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame[u'main']))
log.log(15, u'Slide Rendering took %4s' % (time.time() - before)) log.log(15, u'Slide Rendering took %4s' % (time.time() - before))
if self.isLive: if self.isLive:
self.parent.mainDisplay.frameView(frame) self.parent.mainDisplay.frameView(frame, True)
self.selectedRow = row self.selectedRow = row
def onSlideChange(self, row): def onSlideChange(self, row):

View File

@ -276,8 +276,8 @@ class BibleMediaItem(MediaManagerItem):
def initialise(self): def initialise(self):
log.debug(u'bible manager initialise') log.debug(u'bible manager initialise')
self.loadBibles()
self.parent.biblemanager.media = self self.parent.biblemanager.media = self
self.loadBibles()
self.configUpdated() self.configUpdated()
log.debug(u'bible manager initialise complete') log.debug(u'bible manager initialise complete')

View File

@ -23,6 +23,7 @@
############################################################################### ###############################################################################
import logging import logging
import re
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
@ -110,6 +111,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
self.AuthorsListView.setAlternatingRowColors(True) self.AuthorsListView.setAlternatingRowColors(True)
self.TopicsListView.setSortingEnabled(False) self.TopicsListView.setSortingEnabled(False)
self.TopicsListView.setAlternatingRowColors(True) self.TopicsListView.setAlternatingRowColors(True)
self.findVerseSplit = re.compile(u'---\[\]---\n', re.UNICODE)
def initialise(self): def initialise(self):
self.VerseEditButton.setEnabled(False) self.VerseEditButton.setEnabled(False)
@ -216,11 +218,17 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
songXML = SongXMLParser(self.song.lyrics) songXML = SongXMLParser(self.song.lyrics)
verseList = songXML.get_verses() verseList = songXML.get_verses()
for verse in verseList: for verse in verseList:
self.VerseListWidget.addItem(verse[1]) variant = u'%s:%s' % (verse[0][u'type'], verse[0][u'label'])
item = QtGui.QListWidgetItem(verse[1])
item.setData(QtCore.Qt.UserRole, QtCore.QVariant(variant))
self.VerseListWidget.addItem(item)
else: else:
verses = self.song.lyrics.split(u'\n\n') verses = self.song.lyrics.split(u'\n\n')
for verse in verses: for count, verse in enumerate(verses):
self.VerseListWidget.addItem(verse) item = QtGui.QListWidgetItem(verse)
variant = u'Verse:%s' % count + 1
item.setData(QtCore.Qt.UserRole, QtCore.QVariant(variant))
self.VerseListWidget.addItem(item)
# clear the results # clear the results
self.AuthorsListView.clear() self.AuthorsListView.clear()
for author in self.song.authors: for author in self.song.authors:
@ -308,15 +316,23 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
def onVerseAddButtonClicked(self): def onVerseAddButtonClicked(self):
self.verse_form.setVerse(u'') self.verse_form.setVerse(u'')
self.verse_form.exec_() self.verse_form.exec_()
self.VerseListWidget.addItem(self.verse_form.getVerse()) afterText, verse, subVerse = self.verse_form.getVerse()
data = u'%s:%s' %(verse, subVerse)
item = QtGui.QListWidgetItem(afterText)
item.setData(QtCore.Qt.UserRole, QtCore.QVariant(data))
item.setText(afterText)
self.VerseListWidget.addItem(item)
def onVerseEditButtonClicked(self): def onVerseEditButtonClicked(self):
item = self.VerseListWidget.currentItem() item = self.VerseListWidget.currentItem()
if item: if item:
tempText = item.text() tempText = item.text()
self.verse_form.setVerse(tempText) verseId = unicode((item.data(QtCore.Qt.UserRole)).toString())
self.verse_form.setVerse(tempText, True, verseId)
self.verse_form.exec_() self.verse_form.exec_()
afterText = self.verse_form.getVerse() afterText, verse, subVerse = self.verse_form.getVerse()
data = u'%s:%s' %(verse, subVerse)
item.setData(QtCore.Qt.UserRole, QtCore.QVariant(data))
item.setText(afterText) item.setText(afterText)
#number of lines has change #number of lines has change
if len(tempText.split(u'\n')) != len(afterText.split(u'\n')): if len(tempText.split(u'\n')) != len(afterText.split(u'\n')):
@ -335,17 +351,29 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
if self.VerseListWidget.count() > 0: if self.VerseListWidget.count() > 0:
for row in range(0, self.VerseListWidget.count()): for row in range(0, self.VerseListWidget.count()):
item = self.VerseListWidget.item(row) item = self.VerseListWidget.item(row)
field = unicode((item.data(QtCore.Qt.UserRole)).toString())
verse_list += u'---[%s]---\n' % field
verse_list += item.text() verse_list += item.text()
verse_list += u'\n---\n' verse_list += u'\n'
self.verse_form.setVerse(verse_list) self.verse_form.setVerse(verse_list)
else: else:
self.verse_form.setVerse(u'') self.verse_form.setVerse(u'')
if self.verse_form.exec_(): if self.verse_form.exec_():
verse_list = self.verse_form.getVerse() verse_list = self.verse_form.getVerseAll()
verse_list = verse_list.replace(u'\r\n', u'\n') verse_list = unicode(verse_list.replace(u'\r\n', u'\n'))
self.VerseListWidget.clear() self.VerseListWidget.clear()
for row in verse_list.split(u'\n---\n'): for row in self.findVerseSplit.split(verse_list):
self.VerseListWidget.addItem(row) for match in row.split(u'---['):
for count, parts in enumerate(match.split(u']---\n')):
if len(parts) > 1:
if count == 0:
variant = parts
else:
if parts.endswith(u'\n'):
parts = parts.rstrip(u'\n')
item = QtGui.QListWidgetItem(parts)
item.setData(QtCore.Qt.UserRole, QtCore.QVariant(variant))
self.VerseListWidget.addItem(item)
self.VerseListWidget.repaint() self.VerseListWidget.repaint()
def onVerseDeleteButtonClicked(self): def onVerseDeleteButtonClicked(self):
@ -371,7 +399,14 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
if self.AuthorsListView.count() == 0: if self.AuthorsListView.count() == 0:
self.SongTabWidget.setCurrentIndex(2) self.SongTabWidget.setCurrentIndex(2)
self.AuthorsListView.setFocus() self.AuthorsListView.setFocus()
return False, self.trUtf8('You need to provide at least one author.') for verse in unicode(self.VerseOrderEdit.text()):
if verse.isdigit() or u' BC'.find(verse) > -1:
pass
else:
self.SongTabWidget.setCurrentIndex(0)
self.VerseOrderEdit.setFocus()
return False, \
self.trUtf8('Invalid verse entry - values must be Numeric, B or C')
return True, u'' return True, u''
def onTitleEditItemLostFocus(self): def onTitleEditItemLostFocus(self):
@ -443,15 +478,13 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
sxml.add_lyrics_to_song() sxml.add_lyrics_to_song()
count = 1 count = 1
text = u' ' text = u' '
verse_order = u''
for i in range (0, self.VerseListWidget.count()): for i in range (0, self.VerseListWidget.count()):
sxml.add_verse_to_lyrics(u'Verse', unicode(count), item = self.VerseListWidget.item(i)
unicode(self.VerseListWidget.item(i).text())) verseId = unicode((item.data(QtCore.Qt.UserRole)).toString())
bits = verseId.split(u':')
sxml.add_verse_to_lyrics(bits[0], bits[1], unicode(item.text()))
text = text + unicode(self.VerseListWidget.item(i).text()) + u' ' text = text + unicode(self.VerseListWidget.item(i).text()) + u' '
verse_order = verse_order + unicode(count) + u' '
count += 1 count += 1
if self.song.verse_order is None:
self.song.verse_order = verse_order
text = text.replace(u'\'', u'') text = text.replace(u'\'', u'')
text = text.replace(u',', u'') text = text.replace(u',', u'')
text = text.replace(u';', u'') text = text.replace(u';', u'')

View File

@ -1,52 +1,94 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
############################################################################### # Form implementation generated from reading ui file 'editversedialog.ui'
# OpenLP - Open Source Lyrics Projection # #
# --------------------------------------------------------------------------- # # Created: Fri Nov 27 18:35:12 2009
# Copyright (c) 2008-2009 Raoul Snyman # # by: PyQt4 UI code generator 4.6.2
# Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley, Carsten # #
# Tinggaard, Jon Tibble, Jonathan Corwin, Maikel Stuivenberg, Scott Guerrieri # # WARNING! All changes made in this file will be lost!
# --------------------------------------------------------------------------- #
# 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 #
###############################################################################
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
class Ui_EditVerseDialog(object): class Ui_EditVerseDialog(object):
def setupUi(self, EditVerseDialog): def setupUi(self, EditVerseDialog):
EditVerseDialog.setObjectName(u'EditVerseDialog') EditVerseDialog.setObjectName("EditVerseDialog")
EditVerseDialog.resize(492, 373) EditVerseDialog.resize(492, 494)
EditVerseDialog.setModal(True) EditVerseDialog.setModal(True)
self.DialogLayout = QtGui.QVBoxLayout(EditVerseDialog) self.widget = QtGui.QWidget(EditVerseDialog)
self.DialogLayout.setSpacing(8) self.widget.setGeometry(QtCore.QRect(9, 12, 471, 471))
self.DialogLayout.setMargin(8) self.widget.setObjectName("widget")
self.DialogLayout.setObjectName(u'DialogLayout') self.verticalLayout = QtGui.QVBoxLayout(self.widget)
self.VerseTextEdit = QtGui.QTextEdit(EditVerseDialog) self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout = QtGui.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.VerseListComboBox = QtGui.QComboBox(self.widget)
self.VerseListComboBox.setObjectName("VerseListComboBox")
self.VerseListComboBox.addItem("")
self.VerseListComboBox.setItemText(0, "")
self.VerseListComboBox.addItem("")
self.VerseListComboBox.addItem("")
self.VerseListComboBox.addItem("")
self.horizontalLayout.addWidget(self.VerseListComboBox)
self.SubVerseListComboBox = QtGui.QComboBox(self.widget)
self.SubVerseListComboBox.setObjectName("SubVerseListComboBox")
self.SubVerseListComboBox.addItem("")
self.SubVerseListComboBox.setItemText(0, "")
self.SubVerseListComboBox.addItem("")
self.SubVerseListComboBox.addItem("")
self.SubVerseListComboBox.addItem("")
self.SubVerseListComboBox.addItem("")
self.SubVerseListComboBox.addItem("")
self.SubVerseListComboBox.addItem("")
self.SubVerseListComboBox.addItem("")
self.SubVerseListComboBox.addItem("")
self.SubVerseListComboBox.addItem("")
self.SubVerseListComboBox.addItem("")
self.SubVerseListComboBox.addItem("")
self.horizontalLayout.addWidget(self.SubVerseListComboBox)
self.verticalLayout.addLayout(self.horizontalLayout)
self.VerseTextEdit = QtGui.QTextEdit(self.widget)
self.VerseTextEdit.setAcceptRichText(False) self.VerseTextEdit.setAcceptRichText(False)
self.VerseTextEdit.setObjectName(u'VerseTextEdit') self.VerseTextEdit.setObjectName("VerseTextEdit")
self.DialogLayout.addWidget(self.VerseTextEdit) self.verticalLayout.addWidget(self.VerseTextEdit)
self.ButtonBox = QtGui.QDialogButtonBox(EditVerseDialog) self.horizontalLayout_2 = QtGui.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.addVerse = QtGui.QPushButton(self.widget)
self.addVerse.setObjectName("addVerse")
self.horizontalLayout_2.addWidget(self.addVerse)
self.addChorus = QtGui.QPushButton(self.widget)
self.addChorus.setObjectName("addChorus")
self.horizontalLayout_2.addWidget(self.addChorus)
self.addBridge = QtGui.QPushButton(self.widget)
self.addBridge.setObjectName("addBridge")
self.horizontalLayout_2.addWidget(self.addBridge)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.ButtonBox = QtGui.QDialogButtonBox(self.widget)
self.ButtonBox.setOrientation(QtCore.Qt.Horizontal) self.ButtonBox.setOrientation(QtCore.Qt.Horizontal)
self.ButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save) self.ButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save)
self.ButtonBox.setObjectName(u'ButtonBox') self.ButtonBox.setObjectName("ButtonBox")
self.DialogLayout.addWidget(self.ButtonBox) self.verticalLayout.addWidget(self.ButtonBox)
self.retranslateUi(EditVerseDialog) self.retranslateUi(EditVerseDialog)
QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(u'accepted()'), EditVerseDialog.accept) QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL("accepted()"), EditVerseDialog.accept)
QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(u'rejected()'), EditVerseDialog.reject) QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL("rejected()"), EditVerseDialog.reject)
QtCore.QMetaObject.connectSlotsByName(EditVerseDialog) QtCore.QMetaObject.connectSlotsByName(EditVerseDialog)
self.VerseTextEdit.setFocus(QtCore.Qt.OtherFocusReason)
def retranslateUi(self, EditVerseDialog): def retranslateUi(self, EditVerseDialog):
EditVerseDialog.setWindowTitle(self.trUtf8('Edit Verse')) EditVerseDialog.setWindowTitle(QtGui.QApplication.translate("EditVerseDialog", "Edit Verse", None, QtGui.QApplication.UnicodeUTF8))
self.VerseListComboBox.setItemText(1, QtGui.QApplication.translate("EditVerseDialog", "Verse", None, QtGui.QApplication.UnicodeUTF8))
self.VerseListComboBox.setItemText(2, QtGui.QApplication.translate("EditVerseDialog", "Chorus", None, QtGui.QApplication.UnicodeUTF8))
self.VerseListComboBox.setItemText(3, QtGui.QApplication.translate("EditVerseDialog", "Bridge", None, QtGui.QApplication.UnicodeUTF8))
self.SubVerseListComboBox.setItemText(1, QtGui.QApplication.translate("EditVerseDialog", "1", None, QtGui.QApplication.UnicodeUTF8))
self.SubVerseListComboBox.setItemText(2, QtGui.QApplication.translate("EditVerseDialog", "1a", None, QtGui.QApplication.UnicodeUTF8))
self.SubVerseListComboBox.setItemText(3, QtGui.QApplication.translate("EditVerseDialog", "1b", None, QtGui.QApplication.UnicodeUTF8))
self.SubVerseListComboBox.setItemText(4, QtGui.QApplication.translate("EditVerseDialog", "2", None, QtGui.QApplication.UnicodeUTF8))
self.SubVerseListComboBox.setItemText(5, QtGui.QApplication.translate("EditVerseDialog", "2a", None, QtGui.QApplication.UnicodeUTF8))
self.SubVerseListComboBox.setItemText(6, QtGui.QApplication.translate("EditVerseDialog", "2b", None, QtGui.QApplication.UnicodeUTF8))
self.SubVerseListComboBox.setItemText(7, QtGui.QApplication.translate("EditVerseDialog", "3", None, QtGui.QApplication.UnicodeUTF8))
self.SubVerseListComboBox.setItemText(8, QtGui.QApplication.translate("EditVerseDialog", "4", None, QtGui.QApplication.UnicodeUTF8))
self.SubVerseListComboBox.setItemText(9, QtGui.QApplication.translate("EditVerseDialog", "5", None, QtGui.QApplication.UnicodeUTF8))
self.SubVerseListComboBox.setItemText(10, QtGui.QApplication.translate("EditVerseDialog", "6", None, QtGui.QApplication.UnicodeUTF8))
self.SubVerseListComboBox.setItemText(11, QtGui.QApplication.translate("EditVerseDialog", "7", None, QtGui.QApplication.UnicodeUTF8))
self.addVerse.setText(QtGui.QApplication.translate("EditVerseDialog", "Verse", None, QtGui.QApplication.UnicodeUTF8))
self.addChorus.setText(QtGui.QApplication.translate("EditVerseDialog", "Chorus", None, QtGui.QApplication.UnicodeUTF8))
self.addBridge.setText(QtGui.QApplication.translate("EditVerseDialog", "Bridge", None, QtGui.QApplication.UnicodeUTF8))

View File

@ -23,24 +23,65 @@
############################################################################### ###############################################################################
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from editversedialog import Ui_EditVerseDialog from editversedialog import Ui_EditVerseDialog
class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog):
""" """
This is the form that is used to edit the verses of the song. This is the form that is used to edit the verses of the song.
""" """
def __init__(self, parent=None): def __init__(self, parent=None):
""" """
Constructor Constructor
""" """
QtGui.QDialog.__init__(self, parent) QtGui.QDialog.__init__(self, parent)
self.setupUi(self) self.setupUi(self)
QtCore.QObject.connect(self.addVerse,
QtCore.SIGNAL(u'clicked()'), self.onAddVerse)
QtCore.QObject.connect(self.addChorus,
QtCore.SIGNAL(u'clicked()'), self.onAddChorus)
QtCore.QObject.connect(self.addBridge,
QtCore.SIGNAL(u'clicked()'), self.onAddBridge)
def setVerse(self, verse): def onAddBridge(self):
self.VerseTextEdit.setPlainText(verse) self.VerseTextEdit.insertPlainText(u'---[Bridge:1]---\n')
def onAddChorus(self):
self.VerseTextEdit.insertPlainText(u'---[Chorus:1]---\n')
def onAddVerse(self):
self.VerseTextEdit.insertPlainText(u'---[Verse:1]---\n')
def setVerse(self, text, single=False, tag=0):
posVerse = 0
posSub = 0
if single:
id = tag.split(u':')
posVerse = self.VerseListComboBox.findText(id[0], QtCore.Qt.MatchExactly)
posSub = self.SubVerseListComboBox.findText(id[1], QtCore.Qt.MatchExactly)
if posVerse == -1:
posVerse = 0
if posSub == -1:
posSub = 0
self.VerseListComboBox.setEnabled(True)
self.SubVerseListComboBox.setEnabled(True)
self.addBridge.setEnabled(False)
self.addChorus.setEnabled(False)
self.addVerse.setEnabled(False)
else:
self.VerseListComboBox.setEnabled(False)
self.SubVerseListComboBox.setEnabled(False)
self.addBridge.setEnabled(True)
self.addChorus.setEnabled(True)
self.addVerse.setEnabled(True)
self.VerseListComboBox.setCurrentIndex(posVerse)
self.SubVerseListComboBox.setCurrentIndex(posSub)
self.VerseTextEdit.setPlainText(text)
self.VerseTextEdit.setFocus(QtCore.Qt.OtherFocusReason) self.VerseTextEdit.setFocus(QtCore.Qt.OtherFocusReason)
def getVerse(self): def getVerse(self):
return self.VerseTextEdit.toPlainText() return self.VerseTextEdit.toPlainText(), \
unicode(self.VerseListComboBox.currentText()), \
unicode(self.SubVerseListComboBox.currentText())
def getVerseAll(self):
return self.VerseTextEdit.toPlainText()

View File

@ -295,7 +295,8 @@ class SongMediaItem(MediaManagerItem):
verseList = songXML.get_verses() verseList = songXML.get_verses()
for verse in verseList: for verse in verseList:
if verse[1]: if verse[1]:
service_item.add_from_text(verse[1][:30], verse[1]) verseTag = u'%s:%s' % (verse[0][u'type'], verse[0][u'label'])
service_item.add_from_text(verse[1][:30], verse[1], verseTag)
else: else:
verses = song.lyrics.split(u'\n\n') verses = song.lyrics.split(u'\n\n')
for slide in verses: for slide in verses:

View File

@ -1,45 +1,167 @@
<ui version="4.0" > <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>EditVerseDialog</class> <class>EditVerseDialog</class>
<widget class="QDialog" name="EditVerseDialog" > <widget class="QDialog" name="EditVerseDialog">
<property name="geometry" > <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>492</width> <width>492</width>
<height>373</height> <height>494</height>
</rect> </rect>
</property> </property>
<property name="windowTitle" > <property name="windowTitle">
<string>Dialog</string> <string>Dialog</string>
</property> </property>
<property name="modal" > <property name="modal">
<bool>true</bool> <bool>true</bool>
</property> </property>
<layout class="QVBoxLayout" name="DialogLayout" > <widget class="QWidget" name="">
<property name="spacing" > <property name="geometry">
<number>8</number> <rect>
<x>9</x>
<y>12</y>
<width>471</width>
<height>471</height>
</rect>
</property> </property>
<property name="margin" > <layout class="QVBoxLayout" name="verticalLayout">
<number>8</number> <item>
</property> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<widget class="QTextEdit" name="VerseTextEdit" > <widget class="QComboBox" name="VerseListComboBox">
<property name="acceptRichText" > <item>
<bool>false</bool> <property name="text">
</property> <string/>
</widget> </property>
</item> </item>
<item> <item>
<widget class="QDialogButtonBox" name="ButtonBox" > <property name="text">
<property name="orientation" > <string>Verse</string>
<enum>Qt::Horizontal</enum> </property>
</property> </item>
<property name="standardButtons" > <item>
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set> <property name="text">
</property> <string>Chorus</string>
</widget> </property>
</item> </item>
</layout> <item>
<property name="text">
<string>Bridge</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QComboBox" name="SubVerseListComboBox">
<item>
<property name="text">
<string/>
</property>
</item>
<item>
<property name="text">
<string>1</string>
</property>
</item>
<item>
<property name="text">
<string>1a</string>
</property>
</item>
<item>
<property name="text">
<string>1b</string>
</property>
</item>
<item>
<property name="text">
<string>2</string>
</property>
</item>
<item>
<property name="text">
<string>2a</string>
</property>
</item>
<item>
<property name="text">
<string>2b</string>
</property>
</item>
<item>
<property name="text">
<string>3</string>
</property>
</item>
<item>
<property name="text">
<string>4</string>
</property>
</item>
<item>
<property name="text">
<string>5</string>
</property>
</item>
<item>
<property name="text">
<string>6</string>
</property>
</item>
<item>
<property name="text">
<string>7</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QTextEdit" name="VerseTextEdit">
<property name="acceptRichText">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="addVerse">
<property name="text">
<string>Verse</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="addChorus">
<property name="text">
<string>Chorus</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="addBridge">
<property name="text">
<string>Bridge</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="ButtonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
</property>
</widget>
</item>
</layout>
</widget>
</widget> </widget>
<resources/> <resources/>
<connections> <connections>
@ -49,11 +171,11 @@
<receiver>EditVerseDialog</receiver> <receiver>EditVerseDialog</receiver>
<slot>accept()</slot> <slot>accept()</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel">
<x>248</x> <x>248</x>
<y>254</y> <y>254</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel">
<x>157</x> <x>157</x>
<y>274</y> <y>274</y>
</hint> </hint>
@ -65,11 +187,11 @@
<receiver>EditVerseDialog</receiver> <receiver>EditVerseDialog</receiver>
<slot>reject()</slot> <slot>reject()</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel">
<x>316</x> <x>316</x>
<y>260</y> <y>260</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel">
<x>286</x> <x>286</x>
<y>274</y> <y>274</y>
</hint> </hint>

View File

@ -1 +1 @@
1.9.0-678 1.9.0-679