This commit is contained in:
Tim Bentley 2010-04-04 14:16:14 +01:00
commit 1cb25db4e9
4 changed files with 92 additions and 41 deletions

View File

@ -271,12 +271,23 @@ class SongMediaItem(MediaManagerItem):
self.edit_song_form.exec_() self.edit_song_form.exec_()
def onDeleteClick(self): def onDeleteClick(self):
item = self.ListView.currentItem() items = self.ListView.selectedIndexes()
if item: if items:
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] if len(items) == 1:
self.parent.songmanager.delete_song(item_id) del_message = self.trUtf8('Delete song?')
row = self.ListView.row(item) else:
self.ListView.takeItem(row) del_message = unicode(self.trUtf8('Delete %d song?')) % len(items)
ans = QtGui.QMessageBox.question(self,
self.trUtf8('Delete Confirmation'), del_message,
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok|
QtGui.QMessageBox.Cancel),
QtGui.QMessageBox.Ok)
if ans == QtGui.QMessageBox.Cancel:
return
for item in items:
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
self.parent.songmanager.delete_song(item_id)
self.onSearchTextButtonClick()
def generateSlideData(self, service_item): def generateSlideData(self, service_item):
raw_footer = [] raw_footer = []

View File

@ -44,7 +44,6 @@ if os.name == u'nt':
PAGE_BOTH = 6 PAGE_BOTH = 6
else: else:
import uno import uno
from com.sun.star.beans import PropertyValue
from com.sun.star.awt.FontWeight import BOLD from com.sun.star.awt.FontWeight import BOLD
from com.sun.star.awt.FontSlant import ITALIC from com.sun.star.awt.FontSlant import ITALIC
from com.sun.star.style.BreakType import PAGE_BEFORE, PAGE_AFTER, PAGE_BOTH from com.sun.star.style.BreakType import PAGE_BEFORE, PAGE_AFTER, PAGE_BOTH
@ -72,6 +71,7 @@ class SofImport(object):
""" """
self.song = None self.song = None
self.manager = songmanager self.manager = songmanager
self.process_started = False
def import_sof(self, filename): def import_sof(self, filename):
self.start_ooo() self.start_ooo()
@ -85,17 +85,9 @@ class SofImport(object):
TODO: The presentation/Impress plugin may already have it running TODO: The presentation/Impress plugin may already have it running
""" """
if os.name == u'nt': if os.name == u'nt':
manager = Dispatch(u'com.sun.star.ServiceManager') self.start_ooo_process()
manager._FlagAsMethod(u'Bridge_GetStruct') self.desktop = self.manager.createInstance(u'com.sun.star.frame.Desktop')
manager._FlagAsMethod(u'Bridge_GetValueObject')
self.desktop = manager.createInstance(u'com.sun.star.frame.Desktop')
else: else:
cmd = u'openoffice.org -nologo -norestore -minimized -invisible ' \
+ u'-nofirststartwizard ' \
+ '-accept="socket,host=localhost,port=2002;urp;"'
process = QtCore.QProcess()
process.startDetached(cmd)
process.waitForStarted()
context = uno.getComponentContext() context = uno.getComponentContext()
resolver = context.ServiceManager.createInstanceWithContext( resolver = context.ServiceManager.createInstanceWithContext(
u'com.sun.star.bridge.UnoUrlResolver', context) u'com.sun.star.bridge.UnoUrlResolver', context)
@ -107,12 +99,29 @@ class SofImport(object):
+ 'port=2002;urp;StarOffice.ComponentContext') + 'port=2002;urp;StarOffice.ComponentContext')
except: except:
pass pass
time.sleep(1) self.start_ooo_process()
loop += 1 loop += 1
manager = ctx.ServiceManager manager = ctx.ServiceManager
self.desktop = manager.createInstanceWithContext( self.desktop = manager.createInstanceWithContext(
"com.sun.star.frame.Desktop", ctx ) "com.sun.star.frame.Desktop", ctx )
def start_ooo_process(self):
try:
if os.name == u'nt':
self.manager = Dispatch(u'com.sun.star.ServiceManager')
self.manager._FlagAsMethod(u'Bridge_GetStruct')
self.manager._FlagAsMethod(u'Bridge_GetValueObject')
else:
cmd = u'openoffice.org -nologo -norestore -minimized -invisible ' \
+ u'-nofirststartwizard ' \
+ '-accept="socket,host=localhost,port=2002;urp;"'
process = QtCore.QProcess()
process.startDetached(cmd)
process.waitForStarted()
self.process_started = True
except:
pass
def open_ooo_file(self, filepath): def open_ooo_file(self, filepath):
""" """
Open the passed file in OpenOffice.org Writer Open the passed file in OpenOffice.org Writer
@ -129,10 +138,12 @@ class SofImport(object):
def close_ooo(self): def close_ooo(self):
""" """
Close down OpenOffice.org. Close RTF file. Note, on Windows we'll leave OOo running
TODO: Further checks that it have other docs open, e.g. Impress! Leave running on Windows
""" """
self.desktop.terminate() self.document.close(True)
if self.process_started:
self.desktop.terminate()
def process_doc(self): def process_doc(self):
""" """
@ -274,6 +285,7 @@ class SofImport(object):
number to work out which songbook we're in number to work out which songbook we're in
""" """
self.song.set_song_number(song_no) self.song.set_song_number(song_no)
self.song.set_alternate_title(song_no + u'.')
if int(song_no) <= 640: if int(song_no) <= 640:
self.song.set_song_book(u'Songs of Fellowship 1', self.song.set_song_book(u'Songs of Fellowship 1',
u'Kingsway Publications') u'Kingsway Publications')
@ -314,7 +326,10 @@ class SofImport(object):
if author2.find(u' ') == -1 and i < len(authors) - 1: if author2.find(u' ') == -1 and i < len(authors) - 1:
author2 = author2 + u' ' \ author2 = author2 + u' ' \
+ authors[i + 1].strip().split(u' ')[-1] + authors[i + 1].strip().split(u' ')[-1]
self.song.add_author(author2) if author2.endswith(u'.'):
author2 = author2[:-1]
if author2:
self.song.add_author(author2)
def add_verse_line(self, text): def add_verse_line(self, text):
""" """
@ -338,10 +353,10 @@ class SofImport(object):
if self.currentverse.strip() == u'': if self.currentverse.strip() == u'':
return return
if self.is_chorus: if self.is_chorus:
versetag = 'C' versetag = u'C'
splitat = None splitat = None
else: else:
versetag = 'V' versetag = u'V'
splitat = self.verse_splits(self.song.get_song_number()) splitat = self.verse_splits(self.song.get_song_number())
if splitat: if splitat:
ln = 0 ln = 0

View File

@ -46,6 +46,7 @@ class SongImport(object):
self.manager = song_manager self.manager = song_manager
self.title = u'' self.title = u''
self.song_number = u'' self.song_number = u''
self.alternate_title = u''
self.copyright = u'' self.copyright = u''
self.comment = u'' self.comment = u''
self.theme_name = u'' self.theme_name = u''
@ -73,7 +74,7 @@ class SongImport(object):
def get_song_number(self): def get_song_number(self):
""" """
Return the song number (also known as alternate title) Return the song number
""" """
return self.song_number return self.song_number
@ -83,9 +84,15 @@ class SongImport(object):
""" """
self.title = title self.title = title
def set_alternate_title(self, title):
"""
Set the alternate title
"""
self.alternate_title = title
def set_song_number(self, song_number): def set_song_number(self, song_number):
""" """
Set the song number/alternate title Set the song number
""" """
self.song_number = song_number self.song_number = song_number
@ -113,7 +120,7 @@ class SongImport(object):
def add_verse(self, verse, versetag): def add_verse(self, verse, versetag):
""" """
Add a verse. This is the whole verse, lines split by \n Add a verse. This is the whole verse, lines split by \n
Verse tag can be V1/C1/B1 etc, or 'V' and 'C' (will count the verses/ Verse tag can be V1/C1/B etc, or 'V' and 'C' (will count the verses/
choruses itself) or None, where it will assume verse choruses itself) or None, where it will assume verse
It will also attempt to detect duplicates. In this case it will just It will also attempt to detect duplicates. In this case it will just
add to the verse order add to the verse order
@ -122,15 +129,16 @@ class SongImport(object):
if oldverse.strip() == verse.strip(): if oldverse.strip() == verse.strip():
self.verse_order_list.append(oldversetag) self.verse_order_list.append(oldversetag)
return return
if versetag == u'C': if versetag.startswith(u'C'):
self.choruscount += 1 self.choruscount += 1
if versetag == u'C':
versetag += unicode(self.choruscount) versetag += unicode(self.choruscount)
if versetag == u'V' or not versetag: if versetag == u'V' or not versetag:
self.versecount += 1 self.versecount += 1
versetag = u'V' + unicode(self.versecount) versetag = u'V' + unicode(self.versecount)
self.verses.append([versetag, verse]) self.verses.append([versetag, verse.rstrip()])
self.verse_order_list.append(versetag) self.verse_order_list.append(versetag)
if self.choruscount > 0 and not versetag.startswith(u'C'): if versetag.startswith(u'V') and self.contains_verse(u'C1'):
self.verse_order_list.append(u'C1') self.verse_order_list.append(u'C1')
def repeat_verse(self): def repeat_verse(self):
@ -139,6 +147,9 @@ class SongImport(object):
""" """
self.verse_order_list.append(self.verse_order_list[-1]) self.verse_order_list.append(self.verse_order_list[-1])
def contains_verse(self, versetag):
return versetag in self.verse_order_list
def check_complete(self): def check_complete(self):
""" """
Check the mandatory fields are entered (i.e. title and a verse) Check the mandatory fields are entered (i.e. title and a verse)
@ -173,7 +184,8 @@ class SongImport(object):
""" """
song = Song() song = Song()
song.title = self.title song.title = self.title
song.search_title = self.remove_punctuation(self.title) song.search_title = self.remove_punctuation(self.title) \
+ '@' + self.alternate_title
song.song_number = self.song_number song.song_number = self.song_number
song.search_lyrics = u'' song.search_lyrics = u''
sxml = SongXMLBuilder() sxml = SongXMLBuilder()
@ -235,6 +247,7 @@ class SongImport(object):
print u'========================================' \ print u'========================================' \
+ u'========================================' + u'========================================'
print u'TITLE: ' + self.title print u'TITLE: ' + self.title
print u'ALT TITLE: ' + self.alternate_title
for (versetag, versetext) in self.verses: for (versetag, versetext) in self.verses:
print u'VERSE ' + versetag + u': ' + versetext print u'VERSE ' + versetag + u': ' + versetext
print u'ORDER: ' + u' '.join(self.verse_order_list) print u'ORDER: ' + u' '.join(self.verse_order_list)

View File

@ -27,7 +27,7 @@ import logging
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import Plugin, build_icon, PluginStatus from openlp.core.lib import Plugin, build_icon, PluginStatus, Receiver
from openlp.plugins.songs.lib import SongManager, SongMediaItem, SongsTab, \ from openlp.plugins.songs.lib import SongManager, SongMediaItem, SongsTab, \
SofImport SofImport
from openlp.plugins.songs.forms import OpenLPImportForm, OpenSongExportForm, \ from openlp.plugins.songs.forms import OpenLPImportForm, OpenSongExportForm, \
@ -187,8 +187,20 @@ class SongsPlugin(Plugin):
filename = QtGui.QFileDialog.getOpenFileName( filename = QtGui.QFileDialog.getOpenFileName(
None, self.trUtf8('Open Songs of Fellowship file'), None, self.trUtf8('Open Songs of Fellowship file'),
u'', u'Songs of Fellowship file (*.rtf *.RTF)') u'', u'Songs of Fellowship file (*.rtf *.RTF)')
sofimport = SofImport(self.songmanager) try:
sofimport.import_sof(unicode(filename)) sofimport = SofImport(self.songmanager)
sofimport.import_sof(unicode(filename))
except:
log.exception('Could not import SoF file')
QtGui.QMessageBox.critical(None,
self.ImportSongMenu.trUtf8('Import Error'),
self.ImportSongMenu.trUtf8('Error importing Songs of '
+ 'Fellowship file.\nOpenOffice.org must be installed'
+ ' and you must be using an unedited copy of the RTF'
+ ' included with the Songs of Fellowship Music Editions'),
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok),
QtGui.QMessageBox.Ok)
Receiver.send_message(u'load_song_list')
def onExportOpenlp1ItemClicked(self): def onExportOpenlp1ItemClicked(self):
self.openlp_export_form.show() self.openlp_export_form.show()