diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py
index c873fed7a..a661552c3 100644
--- a/openlp/core/lib/renderer.py
+++ b/openlp/core/lib/renderer.py
@@ -109,7 +109,7 @@ class Renderer:
"""
External API to sort out the text to pe placed on the frame
"""
- #print "########## Format Slide ##################"
+ print "########## Format Slide ##################"
log.debug(u'format_slide %s', words)
verses = []
words = words.replace("\r\n", "\n")
@@ -121,8 +121,8 @@ class Renderer:
text.append(line)
split_text = self._split_set_of_lines(text, False)
- #print "split text ", split_text
- #print "text ", text
+ print "split text ", split_text
+ print "text ", text
return split_text
# def render_screen(self, screennum):
diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py
index fe936f406..fa90f60e9 100644
--- a/openlp/core/lib/serviceitem.py
+++ b/openlp/core/lib/serviceitem.py
@@ -65,7 +65,6 @@ class ServiceItem():
if len(self.frames) == 0 and len(self.raw_slides) > 0 :
for slide in self.raw_slides:
formated = self.plugin.render_manager.format_slide(slide)
- #print formated
for format in formated:
frame = self.plugin.render_manager.generate_slide(format, self.raw_footer)
self.frames.append({u'title': format, u'image': frame})
diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py
index f0dc98c5f..f940b891f 100644
--- a/openlp/core/ui/servicemanager.py
+++ b/openlp/core/ui/servicemanager.py
@@ -132,7 +132,7 @@ class ServiceManager(QtGui.QWidget):
def addServiceItem(self, item):
self.serviceItems.append({u'data': item, u'order': len(self.serviceItems)+1})
treewidgetitem = QtGui.QTreeWidgetItem(self.ServiceManagerList)
- treewidgetitem.setText(0,item.title + u':' + item.shortname)
+ treewidgetitem.setText(0,item.title) # + u':' + item.shortname)
treewidgetitem.setIcon(0,item.iconic_representation)
treewidgetitem.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(len(self.serviceItems)))
treewidgetitem.setExpanded(True)
diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py
index cc13a79dd..4bf1a65a1 100644
--- a/openlp/core/ui/slidecontroller.py
+++ b/openlp/core/ui/slidecontroller.py
@@ -53,7 +53,7 @@ class SlideData(QtCore.QAbstractListModel):
self.beginInsertRows(QtCore.QModelIndex(), row, row)
log.info(u'insert row %d' % row)
# create a preview image
- frame1 = frame.scaled(QtCore.QSize(300, 225), QtCore.Qt.KeepAspectRatio,
+ frame1 = frame.scaled(QtCore.QSize(280, 210), QtCore.Qt.KeepAspectRatio,
QtCore.Qt.SmoothTransformation)
self.items.insert(row, (frame1, framenumber))
log.info(u'Items: %s' % self.items)
@@ -196,7 +196,7 @@ class SlideController(QtGui.QWidget):
sizePolicy.setHeightForWidth(
self.SlidePreview.sizePolicy().hasHeightForWidth())
self.SlidePreview.setSizePolicy(sizePolicy)
- self.SlidePreview.setMinimumSize(QtCore.QSize(250, 190))
+ self.SlidePreview.setMinimumSize(QtCore.QSize(280, 210))
self.SlidePreview.setFrameShape(QtGui.QFrame.Box)
self.SlidePreview.setFrameShadow(QtGui.QFrame.Plain)
self.SlidePreview.setLineWidth(1)
diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py
index 972aaed3c..2f498538e 100644
--- a/openlp/plugins/bibles/forms/bibleimportform.py
+++ b/openlp/plugins/bibles/forms/bibleimportform.py
@@ -23,19 +23,16 @@ import sys
import time
import logging
-from openlp.core.resources import *
-
from PyQt4 import QtCore, QtGui
-from PyQt4.QtGui import QDialog
from bibleimportdialog import Ui_BibleImportDialog
-from openlp.core.lib import Receiver
+from openlp.core.lib import Receiver, translate
-class BibleImportForm(QDialog, Ui_BibleImportDialog):
+class BibleImportForm(QtGui.QDialog, Ui_BibleImportDialog):
global log
log=logging.getLogger("BibleImportForm")
- log.info("BibleImportForm loaded")
+ log.info("BibleImportForm loaded")
"""
Class documentation goes here.
"""
@@ -43,7 +40,7 @@ class BibleImportForm(QDialog, Ui_BibleImportDialog):
"""
Constructor
"""
- QDialog.__init__(self, parent)
+ QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
self.biblemanager = biblemanager
self.config = config
@@ -53,9 +50,9 @@ class BibleImportForm(QDialog, Ui_BibleImportDialog):
self.AddressEdit.setText(self.config.get_config("proxy_address", ""))
self.UsernameEdit.setText(self.config.get_config("proxy_username", ""))
self.PasswordEdit.setText(self.config.get_config("proxy_password",""))
-
+
filepath = os.path.split(os.path.abspath(__file__))[0]
- filepath = os.path.abspath(os.path.join(filepath, '..', 'resources','crosswalkbooks.csv'))
+ filepath = os.path.abspath(os.path.join(filepath, '..', 'resources','crosswalkbooks.csv'))
fbibles=open(filepath, 'r')
self.bible_versions = {}
self.BibleComboBox.clear()
@@ -64,125 +61,136 @@ class BibleImportForm(QDialog, Ui_BibleImportDialog):
p = line.split(",")
self.bible_versions[p[0]] = p[1].replace('\n', '')
self.BibleComboBox.addItem(str(p[0]))
-
+
#Combo Boxes
QtCore.QObject.connect(self.LocationComboBox, QtCore.SIGNAL("activated(int)"), self.onLocationComboBoxSelected)
QtCore.QObject.connect(self.BibleComboBox, QtCore.SIGNAL("activated(int)"), self.onBibleComboBoxSelected)
- #Buttons
- QtCore.QObject.connect(self.ImportButton, QtCore.SIGNAL("pressed()"), self.onImportButtonClicked)
+ #Buttons
+ QtCore.QObject.connect(self.ImportButton, QtCore.SIGNAL("pressed()"), self.onImportButtonClicked)
QtCore.QObject.connect(self.CancelButton, QtCore.SIGNAL("pressed()"), self.onCancelButtonClicked)
QtCore.QObject.connect(self.VersesFileButton, QtCore.SIGNAL("pressed()"), self.onVersesFileButtonClicked)
QtCore.QObject.connect(self.BooksFileButton, QtCore.SIGNAL("pressed()"), self.onBooksFileButtonClicked)
- QtCore.QObject.connect(self.OsisFileButton, QtCore.SIGNAL("pressed()"), self.onOsisFileButtonClicked)
-
+ QtCore.QObject.connect(self.OsisFileButton, QtCore.SIGNAL("pressed()"), self.onOsisFileButtonClicked)
+
#Lost Focus
QtCore.QObject.connect(self.OSISLocationEdit, QtCore.SIGNAL("lostFocus()"), self.onOSISLocationEditLostFocus)
QtCore.QObject.connect(self.BooksLocationEdit, QtCore.SIGNAL("lostFocus()"),self.onBooksLocationEditLostFocus)
QtCore.QObject.connect(self.VerseLocationEdit, QtCore.SIGNAL("lostFocus()"), self.onVerseLocationEditLostFocus)
QtCore.QObject.connect(self.AddressEdit, QtCore.SIGNAL("lostFocus()"), self.onProxyAddressEditLostFocus)
QtCore.QObject.connect(self.UsernameEdit, QtCore.SIGNAL("lostFocus()"), self.onProxyUsernameEditLostFocus)
- QtCore.QObject.connect(self.PasswordEdit, QtCore.SIGNAL("lostFocus()"), self.onProxyPasswordEditLostFocus)
+ QtCore.QObject.connect(self.PasswordEdit, QtCore.SIGNAL("lostFocus()"), self.onProxyPasswordEditLostFocus)
def onVersesFileButtonClicked(self):
filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file',self.config.get_last_dir(1))
if filename != "":
- self.VerseLocationEdit.setText(filename)
+ self.VerseLocationEdit.setText(filename)
self.config.set_last_dir(filename, 1)
- self.setCsv()
-
+ self.setCsv()
+
def onBooksFileButtonClicked(self):
filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file',self.config.get_last_dir(2))
- if filename != "":
- self.BooksLocationEdit.setText(filename)
+ if filename != "":
+ self.BooksLocationEdit.setText(filename)
self.config.set_last_dir(filename, 2)
- self.setCsv()
-
+ self.setCsv()
+
def onOsisFileButtonClicked(self):
filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file',self.config.get_last_dir(3))
- if filename != "":
+ if filename != "":
self.OSISLocationEdit.setText(filename)
self.config.set_last_dir(filename, 3)
self.setOsis()
-
+
def onOSISLocationEditLostFocus(self):
if len(self.OSISLocationEdit.displayText() ) > 0:
self.setOsis()
else:
- if self.bible_type == "OSIS": # Was OSIS and is not any more stops lostFocus running mad
- self.bible_type = None
+ # Was OSIS and is not any more stops lostFocus running mad
+ if self.bible_type == "OSIS":
+ self.bible_type = None
self.freeAll()
-
+
def onBooksLocationEditLostFocus(self):
self.checkOsis()
-
+
def onVerseLocationEditLostFocus(self):
self.checkOsis()
-
+
def onProxyAddressEditLostFocus(self):
self.config.set_config("proxy_address", str(self.AddressEdit.displayText()))
def onProxyUsernameEditLostFocus(self):
self.config.set_config("proxy_username", str(self.UsernameEdit.displayText()))
-
+
def onProxyPasswordEditLostFocus(self):
self.config.set_config("proxy_password", str(self.PasswordEdit.displayText()))
-
+
def onLocationComboBoxSelected(self):
- self.checkHttp()
-
+ self.checkHttp()
+
def onBibleComboBoxSelected(self):
self.checkHttp()
self.BibleNameEdit.setText(str(self.BibleComboBox.currentText()))
-
+
def onCancelButtonClicked(self):
# tell import to stop
- Receiver().send_message("openlpstopimport")
+ Receiver().send_message("openlpstopimport")
# tell bibleplugin to reload the bibles
Receiver().send_message("openlpreloadbibles")
- self.close()
-
+ self.close()
+
def onImportButtonClicked(self):
if self.biblemanager != None:
if not self.bible_type == None and len(self.BibleNameEdit.displayText()) > 0:
self.MessageLabel.setText("Import Started")
- self.ProgressBar.setMinimum(0)
+ self.ProgressBar.setMinimum(0)
self.setMax(65)
self.ProgressBar.setValue(0)
self.biblemanager.process_dialog(self)
self.importBible()
self.MessageLabel.setText("Import Complete")
- self.ProgressBar.setValue(self.barmax)
+ self.ProgressBar.setValue(self.barmax)
# tell bibleplugin to reload the bibles
- Receiver().send_message("openlpreloadbibles")
+ Receiver().send_message("openlpreloadbibles")
+ message = u'Bible import completered'
+ reply = QtGui.QMessageBox.information(self,
+ translate(u'BibleMediaItem', u'Information'),
+ translate(u'BibleMediaItem', message))
def setMax(self, max):
- log.debug("set Max %s", max)
+ log.debug("set Max %s", max)
self.barmax = max
- self.ProgressBar.setMaximum(max)
+ self.ProgressBar.setMaximum(max)
def incrementProgressBar(self, text ):
log.debug("IncrementBar %s", text)
self.MessageLabel.setText("Import processing " + text)
self.ProgressBar.setValue(self.ProgressBar.value()+1)
-
+
def importBible(self):
log.debug("Import Bible ")
if self.bible_type == "OSIS":
- self.biblemanager.register_osis_file_bible(str(self.BibleNameEdit.displayText()), self.OSISLocationEdit.displayText())
+ loaded = self.biblemanager.register_osis_file_bible(str(self.BibleNameEdit.displayText()),
+ self.OSISLocationEdit.displayText())
elif self.bible_type == "CSV":
- self.biblemanager.register_csv_file_bible(str(self.BibleNameEdit.displayText()), self.BooksLocationEdit.displayText(), self.VerseLocationEdit.displayText())
+ loaded = self.biblemanager.register_csv_file_bible(str(self.BibleNameEdit.displayText()),
+ self.BooksLocationEdit.displayText(), self.VerseLocationEdit.displayText())
else:
self.setMax(1) # set a value as it will not be needed
bible = self.bible_versions[str(self.BibleComboBox.currentText())]
- self.biblemanager.register_http_bible(str(self.BibleComboBox.currentText()), \
+ loaded = self.biblemanager.register_http_bible(str(self.BibleComboBox.currentText()), \
str(self.LocationComboBox.currentText()), \
str(bible), \
str(self.AddressEdit.displayText()), \
str(self.UsernameEdit .displayText()), \
- str(self.PasswordEdit.displayText()))
- self.biblemanager.save_meta_data(str(self.BibleNameEdit.displayText()), str(self.VersionNameEdit.displayText()), str(self.CopyrightEdit.displayText()), str(self.PermisionEdit.displayText()))
+ str(self.PasswordEdit.displayText()))
+ if loaded:
+ self.biblemanager.save_meta_data(str(self.BibleNameEdit.displayText()),
+ str(self.VersionNameEdit.displayText()),
+ str(self.CopyrightEdit.displayText()),
+ str(self.PermisionEdit.displayText()))
self.bible_type = None
self.freeAll() # free the screen state restrictions
self.resetAll() # reset all the screen fields
@@ -191,16 +199,18 @@ class BibleImportForm(QDialog, Ui_BibleImportDialog):
if len(self.BooksLocationEdit.displayText()) > 0 or len(self.VerseLocationEdit.displayText()) > 0:
self.setCsv()
else:
- if self.bible_type == "CSV": # Was CSV and is not any more stops lostFocus running mad
- self.bible_type = None
+ # Was CSV and is not any more stops lostFocus running mad
+ if self.bible_type == "CSV":
+ self.bible_type = None
self.freeAll()
-
+
def checkHttp(self):
if self.BibleComboBox.currentIndex() != 0 : # First slot is blank so no bible
self.setHttp()
else:
- if self.bible_type == "HTTP": # Was HTTP and is not any more stops lostFocus running mad
- self.bible_type = None
+ # Was HTTP and is not any more stops lostFocus running mad
+ if self.bible_type == "HTTP":
+ self.bible_type = None
self.freeAll()
def blockCsv(self):
@@ -208,48 +218,48 @@ class BibleImportForm(QDialog, Ui_BibleImportDialog):
self.VerseLocationEdit.setReadOnly(True)
self.BooksFileButton.setEnabled(False)
self.VersesFileButton.setEnabled(False)
-
+
def setCsv(self):
- self.bible_type = "CSV"
+ self.bible_type = "CSV"
self.BooksLocationEdit.setReadOnly(False)
- self.VerseLocationEdit.setReadOnly(False)
+ self.VerseLocationEdit.setReadOnly(False)
self.BooksFileButton.setEnabled(True)
self.VersesFileButton.setEnabled(True)
self.blockOsis()
- self.blockHttp()
-
+ self.blockHttp()
+
def setOsis(self):
- self.bible_type = "OSIS"
+ self.bible_type = "OSIS"
self.OSISLocationEdit.setReadOnly(False)
- self.OsisFileButton.setEnabled(True)
+ self.OsisFileButton.setEnabled(True)
self.blockCsv()
- self.blockHttp()
-
+ self.blockHttp()
+
def blockOsis(self):
self.OSISLocationEdit.setReadOnly(True)
self.OsisFileButton.setEnabled(False)
-
+
def setHttp(self):
- self.bible_type = "HTTP"
+ self.bible_type = "HTTP"
self.LocationComboBox.setEnabled(True)
- self.BibleComboBox.setEnabled(True)
+ self.BibleComboBox.setEnabled(True)
self.blockCsv()
- self.blockOsis()
-
+ self.blockOsis()
+
def blockHttp(self):
- self.LocationComboBox.setEnabled(False)
- self.BibleComboBox.setEnabled(False)
-
+ self.LocationComboBox.setEnabled(False)
+ self.BibleComboBox.setEnabled(False)
+
def freeAll(self):
- if self.bible_type == None: # only reset if no bible type set.
+ if self.bible_type == None: # only reset if no bible type set.
self.BooksLocationEdit.setReadOnly(False)
- self.VerseLocationEdit.setReadOnly(False)
+ self.VerseLocationEdit.setReadOnly(False)
self.BooksFileButton.setEnabled(True)
self.VersesFileButton.setEnabled(True)
self.OSISLocationEdit.setReadOnly(False)
- self.OsisFileButton.setEnabled(True)
+ self.OsisFileButton.setEnabled(True)
self.LocationComboBox.setEnabled(True)
- self.BibleComboBox.setEnabled(True)
+ self.BibleComboBox.setEnabled(True)
def resetAll(self):
self.BooksLocationEdit.setText("")
diff --git a/openlp/plugins/bibles/lib/bibleDBimpl.py b/openlp/plugins/bibles/lib/bibleDBimpl.py
index d5a5b48d2..15de38201 100644
--- a/openlp/plugins/bibles/lib/bibleDBimpl.py
+++ b/openlp/plugins/bibles/lib/bibleDBimpl.py
@@ -38,7 +38,7 @@ class BibleDBImpl(BibleCommon):
self.config = config
self.biblefile = os.path.join(biblepath, biblename+u'.sqlite')
log.debug( "Load bible %s on path %s", biblename, self.biblefile)
- db_type = self.config.get_config(u'db type')
+ db_type = self.config.get_config(u'db type', u'sqlite')
if db_type == u'sqlite':
self.db = create_engine("sqlite:///" + self.biblefile)
else:
@@ -101,6 +101,7 @@ class BibleDBImpl(BibleCommon):
return book
def save_meta(self, key, value):
+ log.debug( "save_meta %s/%s", key, value)
metadata.bind.echo = False
session = self.session()
bmeta= BibleMeta()
diff --git a/openlp/plugins/bibles/lib/bibleOSISimpl.py b/openlp/plugins/bibles/lib/bibleOSISimpl.py
index 8b4001c4c..d5551ae86 100644
--- a/openlp/plugins/bibles/lib/bibleOSISimpl.py
+++ b/openlp/plugins/bibles/lib/bibleOSISimpl.py
@@ -15,7 +15,7 @@ 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
"""
-import os
+import os
import os.path
import logging
from openlp.plugins.bibles.lib.bibleDBimpl import BibleDBImpl
@@ -23,28 +23,28 @@ from openlp.core.lib import Receiver
from PyQt4 import QtCore
class BibleOSISImpl():
- global log
+ global log
log=logging.getLogger(u'BibleOSISImpl')
log.info(u'BibleOSISImpl loaded')
-
+
def __init__(self, biblepath, bibledb):
self.bibledb = bibledb
self.booksOfBible = {} # books of the bible linked to bibleid {osis , name}
self.abbrevOfBible = {} # books of the bible linked to bibleid {osis ,Abbrev }
-
+
filepath = os.path.split(os.path.abspath(__file__))[0]
- filepath = os.path.abspath(os.path.join(filepath, '..', 'resources','osisbooks.csv'))
+ filepath = os.path.abspath(os.path.join(filepath, '..', 'resources','osisbooks.csv'))
fbibles=open(filepath, 'r')
for line in fbibles:
p = line.split(",")
self.booksOfBible[p[0]] = p[1].replace('\n', '')
- self.abbrevOfBible[p[0]] = p[2].replace('\n', '')
+ self.abbrevOfBible[p[0]] = p[2].replace('\n', '')
self.loadbible = True
QtCore.QObject.connect(Receiver().get_receiver(),QtCore.SIGNAL("openlpstopimport"),self.stop_import)
-
+
def stop_import(self):
self.loadbible= False
-
+
def load_data(self, osisfile, dialogobject=None):
osis=open(osisfile, 'r')
@@ -61,27 +61,27 @@ class BibleOSISImpl():
pos = file.find(verseText)
if pos > -1: # we have a verse
epos= file.find(">", pos)
- ref = file[pos+15:epos-1] # Book Reference
-
+ ref = file[pos+15:epos-1] # Book Reference
+
#lets find the bible text only
pos = epos + 1 # find start of text
epos = file.find("", pos) # end of text
- text = file[pos : epos]
+ text = unicode(file[pos : epos], u'utf8')
#print pos, e, f[pos:e] # Found Basic Text
#remove tags of extra information
text = self.remove_block(u'
', text)
- text = self.remove_block(u'', text)
- text = self.remove_block(u'', text)
-
- text = self.remove_tag(u'', text)
+ text = self.remove_block(u'', text)
+
+ text = self.remove_tag(u'')
while pos > -1:
epos = text.find(u'', pos)
@@ -90,7 +90,7 @@ class BibleOSISImpl():
pos = -1
else:
text = text[:pos] + text[epos + 4: ]
- pos = text.find(u'')
+ pos = text.find(u'')
pos = text.find(u'')
while pos > -1:
@@ -98,9 +98,9 @@ class BibleOSISImpl():
text = text[:pos] + text[epos + 4: ]
#print "X", pos, epos, text
pos = text.find(u'')
-
+
p = ref.split(u'.', 3) # split up the reference
- #print p, ">>>", text
+ #print p, ">>>", text
if book_ptr != p[0]:
if book_ptr == None: # first time through
@@ -113,14 +113,14 @@ class BibleOSISImpl():
book_ptr = p[0]
book = self.bibledb.create_book(self.booksOfBible[p[0]] , self.abbrevOfBible[p[0]], testament)
dialogobject.incrementProgressBar(self.booksOfBible[p[0]] )
- Receiver().send_message("openlpprocessevents")
+ Receiver().send_message("openlpprocessevents")
count = 0
self.bibledb.add_verse(book.id, p[1], p[2], text)
count += 1
if count % 3 == 0: #Every 3 verses repaint the screen
- Receiver().send_message("openlpprocessevents")
+ Receiver().send_message("openlpprocessevents")
count = 0
-
+
def remove_block(self, start_tag, end_tag, text):
"""
removes a block of text between two tags
@@ -134,9 +134,9 @@ class BibleOSISImpl():
pos = -1
else:
text = text[:pos] + text[epos + len(end_tag): ]
- pos = text.find(start_tag)
+ pos = text.find(start_tag)
return text
-
+
def remove_tag(self, start_tag, text):
"""
removes a single tag
@@ -146,5 +146,5 @@ class BibleOSISImpl():
while pos > -1:
epos = text.find(u'/>', pos)
text = text[:pos] + text[epos + 2: ]
- pos = text.find(start_tag)
+ pos = text.find(start_tag)
return text
diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py
index c881c9202..210d0460b 100644
--- a/openlp/plugins/bibles/lib/manager.py
+++ b/openlp/plugins/bibles/lib/manager.py
@@ -128,7 +128,10 @@ class BibleManager():
nbible.save_meta("proxyid", proxyid) # store the proxy userid
if proxypass != None and proxypass != "":
nbible.save_meta("proxypass", proxypass) # store the proxy password
-
+ return True
+ else:
+ log.debug( "register_http_file_bible %s not created already exists", biblename)
+ return False
def register_csv_file_bible(self, biblename, booksfile, versefile):
"""
@@ -143,6 +146,10 @@ class BibleManager():
self.bible_db_cache[biblename] = nbible # cache the database for use later
bcsv = BibleCSVImpl(nbible) # create the loader and pass in the database
bcsv.load_data(booksfile, versefile, self.dialogobject)
+ return True
+ else:
+ log.debug( "register_csv_file_bible %s not created already exists", biblename)
+ return False
def register_osis_file_bible(self, biblename, osisfile):
"""
@@ -157,6 +164,10 @@ class BibleManager():
self.bible_db_cache[biblename] = nbible # cache the database for use later
bcsv = BibleOSISImpl(self.biblePath, nbible) # create the loader and pass in the database
bcsv.load_data(osisfile, self.dialogobject)
+ return True
+ else:
+ log.debug( "register_OSIS_file_bible %s , %s not created already exists", biblename, osisfile)
+ return False
def get_bibles(self, mode="full"):
log.debug("get_bibles")
diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py
index 634d6d7a3..db54b1896 100644
--- a/openlp/plugins/bibles/lib/mediaitem.py
+++ b/openlp/plugins/bibles/lib/mediaitem.py
@@ -283,7 +283,7 @@ class BibleMediaItem(MediaManagerItem):
self.initialiseBible(bible) # use the first bible as the trigger
def onAdvancedVersionComboBox(self):
- self.initialiseBible(str(self.AdvancedVersionComboBox.currentText())) # restet the bible info
+ self.initialiseBible(str(self.AdvancedVersionComboBox.currentText())) # reset the bible info
def onAdvancedBookComboBox(self):
self.initialiseBible(str(self.AdvancedVersionComboBox.currentText())) # reset the bible info
@@ -291,7 +291,7 @@ class BibleMediaItem(MediaManagerItem):
def onBibleNewClick(self):
self.bibleimportform = BibleImportForm(self.parent.config, self.parent.biblemanager, self)
self.bibleimportform.exec_()
- pass
+ self.reloadBibles()
def onAdvancedFromVerse(self):
frm = self.AdvancedFromVerse.currentText()
@@ -417,22 +417,14 @@ class BibleMediaItem(MediaManagerItem):
def initialiseBible(self, bible):
log.debug(u"initialiseBible %s", bible)
- current_book = str(self.AdvancedBookComboBox.currentText())
- chapter_count = self.parent.biblemanager.get_book_chapter_count(bible,
- current_book)[0]
- log.debug(u'Book change bible %s book %s ChapterCount %s', bible,
- current_book, chapter_count)
- if chapter_count == None:
- # Only change the search details if the book is missing from the new bible
- books = self.parent.biblemanager.get_bible_books(str(
- self.AdvancedVersionComboBox.currentText()))
- self.AdvancedBookComboBox.clear()
- first = True
- for book in books:
- self.AdvancedBookComboBox.addItem(book.name)
- if first:
- first = False
- self.initialiseChapterVerse(bible, book.name)
+ books = self.parent.biblemanager.get_bible_books(str(bible))
+ self.AdvancedBookComboBox.clear()
+ first = True
+ for book in books:
+ self.AdvancedBookComboBox.addItem(book.name)
+ if first:
+ first = False
+ self.initialiseChapterVerse(bible, book.name)
def initialiseChapterVerse(self, bible, book):
log.debug(u"initialiseChapterVerse %s , %s", bible, book)
diff --git a/openlp/plugins/custom/lib/__init__.py b/openlp/plugins/custom/lib/__init__.py
index 0cd9a4d66..dde02b5f6 100644
--- a/openlp/plugins/custom/lib/__init__.py
+++ b/openlp/plugins/custom/lib/__init__.py
@@ -3,7 +3,7 @@
"""
OpenLP - Open Source Lyrics Projection
Copyright (c) 2008 Raoul Snyman
-Portions copyright (c) 2008 Martin Thompson, Tim Bentley
+Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley
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
@@ -23,6 +23,3 @@ from customserviceitem import CustomServiceItem
from manager import CustomManager
from customtab import CustomTab
from mediaitem import CustomMediaItem
-
-__all__ = ['CustomManager', 'CustomTab', 'CustomMediaItem', 'CustomServiceItem','TextListData']
-
diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py
index 64294135f..0d2311462 100644
--- a/openlp/plugins/custom/lib/mediaitem.py
+++ b/openlp/plugins/custom/lib/mediaitem.py
@@ -228,11 +228,11 @@ class CustomMediaItem(MediaManagerItem):
self.parent.service_manager.addServiceItem(service_item)
def generateSlideData(self, service_item):
- indexes = self.CustomListView.selectedIndexes()
raw_slides =[]
raw_footer = []
slide = None
theme = None
+ indexes = self.CustomListView.selectedIndexes()
for index in indexes:
id = self.CustomListData.getId(index)
customSlide = self.parent.custommanager.get_custom(id)
diff --git a/openlp/plugins/custom/lib/textlistdata.py b/openlp/plugins/custom/lib/textlistdata.py
index 6774b230c..547e978f8 100644
--- a/openlp/plugins/custom/lib/textlistdata.py
+++ b/openlp/plugins/custom/lib/textlistdata.py
@@ -1,3 +1,22 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+"""
+OpenLP - Open Source Lyrics Projection
+Copyright (c) 2008 Raoul Snyman
+Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley
+
+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
+"""
import logging
from PyQt4 import QtCore, QtGui
@@ -7,16 +26,16 @@ class TextListData(QtCore.QAbstractListModel):
An abstract list of strings
"""
global log
- log=logging.getLogger(u'TextListData')
+ log = logging.getLogger(u'TextListData')
log.info(u'started')
def __init__(self):
QtCore.QAbstractListModel.__init__(self)
- self.items=[] # will be a list of (database id , title) tuples
+ self.items = [] # will be a list of (database id , title) tuples
def resetStore(self):
#reset list so can be reloaded
- self.items=[]
+ self.items = []
def rowCount(self, parent):
return len(self.items)
@@ -36,7 +55,7 @@ class TextListData(QtCore.QAbstractListModel):
self.insertRow(len(self.items), id, title)
def data(self, index, role):
- row=index.row()
+ row = index.row()
if row > len(self.items): # if the last row is selected and deleted, we then get called with an empty row!
return QtCore.QVariant()
if role == QtCore.Qt.DisplayRole:
diff --git a/openlp/plugins/songs/forms/__init__.py b/openlp/plugins/songs/forms/__init__.py
index 5f75b5a45..26b623778 100644
--- a/openlp/plugins/songs/forms/__init__.py
+++ b/openlp/plugins/songs/forms/__init__.py
@@ -3,7 +3,7 @@
"""
OpenLP - Open Source Lyrics Projection
Copyright (c) 2008 Raoul Snyman
-Portions copyright (c) 2008 Martin Thompson, Tim Bentley,
+Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley,
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
diff --git a/openlp/plugins/songs/forms/authorsdialog.py b/openlp/plugins/songs/forms/authorsdialog.py
index 99b9714f2..0fd81a353 100644
--- a/openlp/plugins/songs/forms/authorsdialog.py
+++ b/openlp/plugins/songs/forms/authorsdialog.py
@@ -8,6 +8,7 @@
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
+from openlp.plugins.songs.lib import TextListData
class Ui_AuthorsDialog(object):
def setupUi(self, AuthorsDialog):
@@ -17,14 +18,13 @@ class Ui_AuthorsDialog(object):
self.DialogLayout.setSpacing(8)
self.DialogLayout.setMargin(8)
self.DialogLayout.setObjectName("DialogLayout")
- self.AuthorListView = QtGui.QTableWidget(AuthorsDialog)
- self.AuthorListView.setDragEnabled(True)
+
+ self.AuthorListView = QtGui.QListView()
self.AuthorListView.setAlternatingRowColors(True)
- self.AuthorListView.setColumnCount(0)
- self.AuthorListView.setObjectName("AuthorListView")
- self.AuthorListView.setColumnCount(0)
- self.AuthorListView.setRowCount(0)
+ self.AuthorListData = TextListData()
+ self.AuthorListView.setModel(self.AuthorListData)
self.DialogLayout.addWidget(self.AuthorListView)
+
self.AuthorDetails = QtGui.QGroupBox(AuthorsDialog)
self.AuthorDetails.setMinimumSize(QtCore.QSize(0, 0))
self.AuthorDetails.setObjectName("AuthorDetails")
@@ -107,7 +107,7 @@ class Ui_AuthorsDialog(object):
self.FirstNameLabel.setText(QtGui.QApplication.translate("AuthorsDialog", "First Name:", None, QtGui.QApplication.UnicodeUTF8))
self.LastNameLabel.setText(QtGui.QApplication.translate("AuthorsDialog", "Last Name:", None, QtGui.QApplication.UnicodeUTF8))
self.ClearButton.setToolTip(QtGui.QApplication.translate("AuthorsDialog", "Clear Selection", None, QtGui.QApplication.UnicodeUTF8))
- self.ClearButton.setText(QtGui.QApplication.translate("AuthorsDialog", "New", None, QtGui.QApplication.UnicodeUTF8))
+ self.ClearButton.setText(QtGui.QApplication.translate("AuthorsDialog", "Clear", None, QtGui.QApplication.UnicodeUTF8))
self.AddUpdateButton.setToolTip(QtGui.QApplication.translate("AuthorsDialog", "Add Update Author", None, QtGui.QApplication.UnicodeUTF8))
self.AddUpdateButton.setText(QtGui.QApplication.translate("AuthorsDialog", "Save", None, QtGui.QApplication.UnicodeUTF8))
self.DeleteButton.setToolTip(QtGui.QApplication.translate("AuthorsDialog", "Delete Author", None, QtGui.QApplication.UnicodeUTF8))
diff --git a/openlp/plugins/songs/forms/authorsform.py b/openlp/plugins/songs/forms/authorsform.py
index 876758934..2f8eafcee 100644
--- a/openlp/plugins/songs/forms/authorsform.py
+++ b/openlp/plugins/songs/forms/authorsform.py
@@ -2,7 +2,7 @@
"""
OpenLP - Open Source Lyrics Projection
Copyright (c) 2008 Raoul Snyman
-Portions copyright (c) 2008 Martin Thompson, Tim Bentley, Carsten Tinggaard
+Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley, Carsten Tinggaard
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
@@ -17,12 +17,9 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
"""
from PyQt4 import QtGui, QtCore
-from PyQt4.QtCore import pyqtSignature
-
-from openlp.core.resources import *
-from openlp.plugins.songs.lib.classes import *
from openlp.plugins.songs.forms.authorsdialog import Ui_AuthorsDialog
+from openlp.plugins.songs.lib import TextListData
class AuthorsForm(QtGui.QDialog, Ui_AuthorsDialog):
"""
@@ -35,57 +32,51 @@ class AuthorsForm(QtGui.QDialog, Ui_AuthorsDialog):
QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
self.songmanager = songmanager
- self.AuthorListView.setColumnCount(2)
- self.AuthorListView.setColumnHidden(0, True)
- self.AuthorListView.setColumnWidth(1, 300)
- #self.AuthorListView.setHorizontalHeaderLabels(QtCore.QStringList([" ","Author"]))
- self.AuthorListView.horizontalHeader().setVisible(False)
- self.AuthorListView.verticalHeader().setVisible(False)
- self.currentrow = 0
+ self.currentRow = 0
self.author = None
+ QtCore.QObject.connect(self.DeleteButton,
+ QtCore.SIGNAL('pressed()'), self.onDeleteButtonClick)
+ QtCore.QObject.connect(self.ClearButton,
+ QtCore.SIGNAL('pressed()'), self.onClearButtonClick)
+ QtCore.QObject.connect(self.AddUpdateButton,
+ QtCore.SIGNAL('pressed()'), self.onAddUpdateButtonClick)
+ QtCore.QObject.connect(self.DisplayEdit,
+ QtCore.SIGNAL('lostFocus()'), self.onDisplayEditLostFocus)
+ QtCore.QObject.connect(self.AuthorListView,
+ QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onAuthorListViewItemClicked)
+
def load_form(self):
"""
Refresh the screen and rest fields
"""
- self.on_ClearButton_clicked() # tidy up screen
+ self.AuthorListData.resetStore()
+ self.onClearButtonClick() # tidy up screen
authors = self.songmanager.get_authors()
- self.AuthorListView.clear() # clear the results
- #self.AuthorListView.setHorizontalHeaderLabels(QtCore.QStringList([" ","Author"]))
- self.AuthorListView.horizontalHeader().setVisible(False)
- self.AuthorListView.verticalHeader().setVisible(False)
- self.AuthorListView.setRowCount(0)
for author in authors:
- row_count = self.AuthorListView.rowCount()
- self.AuthorListView.setRowCount(row_count + 1)
- author_id = QtGui.QTableWidgetItem(str(author.id))
- self.AuthorListView.setItem(row_count, 0, author_id)
- display_name = QtGui.QTableWidgetItem(author.display_name)
- display_name.setFlags(QtCore.Qt.ItemIsSelectable)
- self.AuthorListView.setItem(row_count, 1, display_name)
- self.AuthorListView.setRowHeight(row_count, 20)
- row_count = self.AuthorListView.rowCount()
- if self.currentrow > row_count:
+ self.AuthorListData.addRow(author.id,author.display_name)
+ #rowCount is number of rows BUT test should be Zero based
+ row_count = self.AuthorListData.rowCount(None) - 1
+ if self.currentRow > row_count:
# in case we have delete the last row of the table
- self.currentrow = row_count
- self.AuthorListView.selectRow(self.currentrow) # set selected row to previous selected row
+ self.currentRow = row_count
+ row = self.AuthorListData.createIndex(self.currentRow, 0)
+ if row.isValid():
+ self.AuthorListView.selectionModel().setCurrentIndex(row,
+ QtGui.QItemSelectionModel.SelectCurrent)
self._validate_form()
- @pyqtSignature("")
- def on_DeleteButton_clicked(self):
+ def onDeleteButtonClick(self):
"""
Delete the author is the Author is not attached to any songs
"""
self.songmanager.delete_author(self.author.id)
- self.on_ClearButton_clicked()
self.load_form()
- @pyqtSignature("")
- def on_DisplayEdit_lostFocus(self):
+ def onDisplayEditLostFocus(self):
self._validate_form()
- @pyqtSignature("")
- def on_AddUpdateButton_clicked(self):
+ def onAddUpdateButtonClick(self):
"""
Sent New or update details to the database
"""
@@ -95,38 +86,33 @@ class AuthorsForm(QtGui.QDialog, Ui_AuthorsDialog):
self.author.first_name = unicode(self.FirstNameEdit.displayText())
self.author.last_name = unicode(self.LastNameEdit.displayText())
self.songmanager.save_author(self.author)
- self.on_ClearButton_clicked()
+ self.onClearButtonClick()
self.load_form()
- self._validate_form()
-
- @pyqtSignature("")
- def on_ClearButton_clicked(self):
+ def onClearButtonClick(self):
"""
Tidy up screen if clear button pressed
"""
- self.DisplayEdit.setText("")
- self.FirstNameEdit.setText("")
- self.LastNameEdit.setText("")
- self.MessageLabel.setText("")
+ self.DisplayEdit.setText(u'')
+ self.FirstNameEdit.setText(u'')
+ self.LastNameEdit.setText(u'')
+ self.MessageLabel.setText(u'')
self.DeleteButton.setEnabled(False)
self.author = None
self._validate_form()
- @pyqtSignature("QTableWidgetItem*")
- def on_AuthorListView_itemClicked(self, item):
+ def onAuthorListViewItemClicked(self, index):
"""
An Author has been selected display it
If the author is attached to a Song prevent delete
"""
- self.currentrow = self.AuthorListView.currentRow()
- id = int(self.AuthorListView.item(self.currentrow, 0).text())
+ self.currentRow = index.row()
+ id = int(self.AuthorListData.getId(index))
self.author = self.songmanager.get_author(id)
self.DisplayEdit.setText(self.author.display_name)
self.FirstNameEdit.setText(self.author.first_name)
self.LastNameEdit.setText(self.author.last_name)
- #songs = self.songmanager.get_song_authors_for_author(id)
if len(self.author.songs) > 0:
self.MessageLabel.setText("Author in use 'Delete' is disabled")
self.DeleteButton.setEnabled(False)
@@ -136,7 +122,8 @@ class AuthorsForm(QtGui.QDialog, Ui_AuthorsDialog):
self._validate_form()
def _validate_form(self):
- if len(self.DisplayEdit.displayText()) == 0: # We need at lease a display name
+ # We need at lease a display name
+ if len(self.DisplayEdit.displayText()) == 0:
self.AddUpdateButton.setEnabled(False)
else:
self.AddUpdateButton.setEnabled(True)
diff --git a/openlp/plugins/songs/forms/editsongdialog.py b/openlp/plugins/songs/forms/editsongdialog.py
index bb173853d..caa0064bc 100644
--- a/openlp/plugins/songs/forms/editsongdialog.py
+++ b/openlp/plugins/songs/forms/editsongdialog.py
@@ -61,6 +61,7 @@ class Ui_EditSongDialog(object):
self.VerseEditLayout.setObjectName("VerseEditLayout")
self.VerseListWidget = QtGui.QListWidget(self.VerseEditWidget)
self.VerseListWidget.setObjectName("VerseListWidget")
+ self.VerseListWidget.setAlternatingRowColors(True)
self.VerseEditLayout.addWidget(self.VerseListWidget)
self.VerseButtonWidget = QtGui.QWidget(self.VerseEditWidget)
self.VerseButtonWidget.setObjectName("VerseButtonWidget")
@@ -108,10 +109,10 @@ class Ui_EditSongDialog(object):
self.ThemeSelectionComboItem = QtGui.QComboBox(self.ThemeGroupBox)
self.ThemeSelectionComboItem.setObjectName("ThemeSelectionComboItem")
self.ThemeLayout.addWidget(self.ThemeSelectionComboItem)
- self.ThemeAddItem = QtGui.QPushButton(self.ThemeGroupBox)
- self.ThemeAddItem.setMaximumSize(QtCore.QSize(110, 16777215))
- self.ThemeAddItem.setObjectName("ThemeAddItem")
- self.ThemeLayout.addWidget(self.ThemeAddItem)
+# self.ThemeAddItem = QtGui.QPushButton(self.ThemeGroupBox)
+# self.ThemeAddItem.setMaximumSize(QtCore.QSize(110, 16777215))
+# self.ThemeAddItem.setObjectName("ThemeAddItem")
+# self.ThemeLayout.addWidget(self.ThemeAddItem)
self.DetailsLayout.addWidget(self.ThemeGroupBox)
self.TopLayout.addWidget(self.TextWidget)
self.AdditionalWidget = QtGui.QWidget(self.TopWidget)
@@ -234,12 +235,12 @@ class Ui_EditSongDialog(object):
self.AddTopicsToSongButton.setObjectName("AddTopicsToSongButton")
self.TopicAddLayout.addWidget(self.AddTopicsToSongButton)
self.TopicLayout.addWidget(self.TopicAddWidget)
- self.ToticsListView = QtGui.QTableWidget(self.TopicGroupBox)
- self.ToticsListView.setAlternatingRowColors(True)
- self.ToticsListView.setObjectName("ToticsListView")
- self.ToticsListView.setColumnCount(0)
- self.ToticsListView.setRowCount(0)
- self.TopicLayout.addWidget(self.ToticsListView)
+ self.TopicsListView = QtGui.QTableWidget(self.TopicGroupBox)
+ self.TopicsListView.setAlternatingRowColors(True)
+ self.TopicsListView.setObjectName("TopicsListView")
+ self.TopicsListView.setColumnCount(0)
+ self.TopicsListView.setRowCount(0)
+ self.TopicLayout.addWidget(self.TopicsListView)
self.TopicRemoveWidget = QtGui.QWidget(self.TopicGroupBox)
self.TopicRemoveWidget.setObjectName("TopicRemoveWidget")
self.TopicRemoveLayout = QtGui.QHBoxLayout(self.TopicRemoveWidget)
@@ -305,15 +306,14 @@ class Ui_EditSongDialog(object):
EditSongDialog.setTabOrder(self.AlternativeEdit, self.VerseOrderEdit)
EditSongDialog.setTabOrder(self.VerseOrderEdit, self.CommentsEdit)
EditSongDialog.setTabOrder(self.CommentsEdit, self.ThemeSelectionComboItem)
- EditSongDialog.setTabOrder(self.ThemeSelectionComboItem, self.ThemeAddItem)
- EditSongDialog.setTabOrder(self.ThemeAddItem, self.AuthorAddtoSongItem)
+ EditSongDialog.setTabOrder(self.ThemeSelectionComboItem, self.AuthorAddtoSongItem)
EditSongDialog.setTabOrder(self.AuthorAddtoSongItem, self.AuthorsListView)
EditSongDialog.setTabOrder(self.AuthorsListView, self.AuthorRemoveItem)
EditSongDialog.setTabOrder(self.AuthorRemoveItem, self.SongbookCombo)
EditSongDialog.setTabOrder(self.SongbookCombo, self.AddSongBookButton)
EditSongDialog.setTabOrder(self.AddSongBookButton, self.SongTopicCombo)
- EditSongDialog.setTabOrder(self.SongTopicCombo, self.ToticsListView)
- EditSongDialog.setTabOrder(self.ToticsListView, self.pushButton)
+ EditSongDialog.setTabOrder(self.SongTopicCombo, self.TopicsListView)
+ EditSongDialog.setTabOrder(self.TopicsListView, self.pushButton)
EditSongDialog.setTabOrder(self.pushButton, self.CopyrightEditItem)
EditSongDialog.setTabOrder(self.CopyrightEditItem, self.CopyrightInsertItem)
EditSongDialog.setTabOrder(self.CopyrightInsertItem, self.CCLNumberEdit)
@@ -330,7 +330,6 @@ class Ui_EditSongDialog(object):
self.VerseOrderLabel.setText(QtGui.QApplication.translate("EditSongDialog", "Verse Order:", None, QtGui.QApplication.UnicodeUTF8))
self.CommentsLabel.setText(QtGui.QApplication.translate("EditSongDialog", "Comments:", None, QtGui.QApplication.UnicodeUTF8))
self.ThemeGroupBox.setTitle(QtGui.QApplication.translate("EditSongDialog", "Theme", None, QtGui.QApplication.UnicodeUTF8))
- self.ThemeAddItem.setText(QtGui.QApplication.translate("EditSongDialog", "Add a Theme", None, QtGui.QApplication.UnicodeUTF8))
self.AuthorsGroupBox.setTitle(QtGui.QApplication.translate("EditSongDialog", "Authors", None, QtGui.QApplication.UnicodeUTF8))
self.AuthorAddtoSongItem.setText(QtGui.QApplication.translate("EditSongDialog", "Add to Song", None, QtGui.QApplication.UnicodeUTF8))
self.AuthorRemoveItem.setText(QtGui.QApplication.translate("EditSongDialog", "Remove", None, QtGui.QApplication.UnicodeUTF8))
diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py
index c32c3bf78..e33b54c28 100644
--- a/openlp/plugins/songs/forms/editsongform.py
+++ b/openlp/plugins/songs/forms/editsongform.py
@@ -3,7 +3,7 @@
"""
OpenLP - Open Source Lyrics Projection
Copyright (c) 2008 Raoul Snyman
-Portions copyright (c) 2008 Martin Thompson, Tim Bentley,
+Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley,
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
@@ -69,6 +69,8 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
def initialise(self):
self.loadAuthors()
+ self.loadTopics()
+ self.loadBooks()
def loadAuthors(self):
authors = self.songmanager.get_authors()
@@ -76,6 +78,18 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
for author in authors:
self.AuthorsSelectionComboItem.addItem(author.display_name)
+ def loadTopics(self):
+ topics = self.songmanager.get_topics()
+ self.SongTopicCombo.clear()
+ for topic in topics:
+ self.SongTopicCombo.addItem(topic.name)
+
+ def loadBooks(self):
+ books = self.songmanager.get_books()
+ self.SongbookCombo.clear()
+ for book in books:
+ self.SongbookCombo.addItem(book.name)
+
def loadSong(self, id):
self.song = self.songmanager.get_song(id)
self.TitleEditItem.setText(self.song.title)
@@ -111,6 +125,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
"""
self.topics_form.load_form()
self.topics_form.exec_()
+ self.loadTopics()
def onAddSongBookButtonClicked(self):
"""
@@ -118,6 +133,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
"""
self.song_book_form.load_form()
self.song_book_form.exec_()
+ self.loadBooks()
def onAddVerseButtonClicked(self):
self.verse_form.setVerse('')
diff --git a/openlp/plugins/songs/forms/songbookdialog.py b/openlp/plugins/songs/forms/songbookdialog.py
index 2efb5697f..9a53d5f28 100644
--- a/openlp/plugins/songs/forms/songbookdialog.py
+++ b/openlp/plugins/songs/forms/songbookdialog.py
@@ -8,6 +8,7 @@
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
+from openlp.plugins.songs.lib import TextListData
class Ui_SongBookDialog(object):
def setupUi(self, SongBookDialog):
@@ -17,10 +18,13 @@ class Ui_SongBookDialog(object):
self.DialogLayout.setSpacing(8)
self.DialogLayout.setMargin(8)
self.DialogLayout.setObjectName("DialogLayout")
- self.BookSongListView = QtGui.QTableWidget(SongBookDialog)
- self.BookSongListView.setObjectName("BookSongListView")
- self.BookSongListView.setColumnCount(0)
- self.BookSongListView.setRowCount(0)
+
+ self.BookSongListView = QtGui.QListView()
+ self.BookSongListView.setAlternatingRowColors(True)
+ self.BookSongListData = TextListData()
+ self.BookSongListView.setModel(self.BookSongListData)
+ self.DialogLayout.addWidget(self.BookSongListView)
+
self.DialogLayout.addWidget(self.BookSongListView)
self.SongBookGroup = QtGui.QGroupBox(SongBookDialog)
self.SongBookGroup.setMinimumSize(QtCore.QSize(0, 200))
diff --git a/openlp/plugins/songs/forms/songbookform.py b/openlp/plugins/songs/forms/songbookform.py
index 033ad33bd..57b08a855 100644
--- a/openlp/plugins/songs/forms/songbookform.py
+++ b/openlp/plugins/songs/forms/songbookform.py
@@ -2,7 +2,7 @@
"""
OpenLP - Open Source Lyrics Projection
Copyright (c) 2008 Raoul Snyman
-Portions copyright (c) 2008 Martin Thompson, Tim Bentley, Carsten Tinggaard
+Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley, Carsten Tinggaard
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
@@ -17,45 +17,110 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
"""
-from openlp.core.resources import *
-
from PyQt4 import QtGui, QtCore
-from PyQt4.QtGui import QDialog
-from PyQt4.QtCore import pyqtSignature
from songbookdialog import Ui_SongBookDialog
+from openlp.plugins.songs.lib.classes import Book
-class SongBookForm(QDialog, Ui_SongBookDialog):
+class SongBookForm(QtGui.QDialog, Ui_SongBookDialog):
"""
Class documentation goes here.
"""
- def __init__(self,songmanager, parent = None):
+ def __init__(self, songmanager, parent = None):
"""
Constructor
"""
- QDialog.__init__(self, parent)
+ QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
self.songmanager = songmanager
-
- def load_form(self):
- A = 1
+ self.currentRow = 0
+ self.songbook = None
- @pyqtSignature("QTableWidgetItem*")
- def on_BookSongListView_itemClicked(self, item):
+ QtCore.QObject.connect(self.DeleteButton,
+ QtCore.SIGNAL('pressed()'), self.onDeleteButtonClick)
+ QtCore.QObject.connect(self.ClearButton,
+ QtCore.SIGNAL('pressed()'), self.onClearButtonClick)
+ QtCore.QObject.connect(self.AddUpdateButton,
+ QtCore.SIGNAL('pressed()'), self.onAddUpdateButtonClick)
+ QtCore.QObject.connect(self.NameEdit,
+ QtCore.SIGNAL('lostFocus()'), self.onBookNameEditLostFocus)
+ QtCore.QObject.connect(self.BookSongListView,
+ QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onBooksListViewItemClicked)
+
+ def load_form(self):
"""
- Slot documentation goes here.
+ Refresh the screen and rest fields
"""
- print "bslv ic " + str(item)
-
- @pyqtSignature("")
- def on_DeleteButton_clicked(self):
+ self.BookSongListData.resetStore()
+ self.onClearButtonClick() # tidy up screen
+ Books = self.songmanager.get_books()
+ for Book in Books:
+ self.BookSongListData.addRow(Book.id,Book.name)
+ #rowCount is number of rows BUT test should be Zero based
+ row_count = self.BookSongListData.rowCount(None) - 1
+ if self.currentRow > row_count:
+ # in case we have delete the last row of the table
+ self.currentRow = row_count
+ row = self.BookSongListData.createIndex(self.currentRow, 0)
+ if row.isValid():
+ self.BookSongListView.selectionModel().setCurrentIndex(row,
+ QtGui.QItemSelectionModel.SelectCurrent)
+ self._validate_form()
+
+ def onDeleteButtonClick(self):
"""
- Slot documentation goes here.
+ Delete the Book is the Book is not attached to any songs
"""
- print "db c "
-
- @pyqtSignature("")
- def on_AddUpdateButton_clicked(self):
+ self.songmanager.delete_book(self.Book.id)
+ self.load_form()
+
+ def onBookNameEditLostFocus(self):
+ self._validate_form()
+
+ def onAddUpdateButtonClick(self):
"""
- Slot documentation goes here.
+ Sent New or update details to the database
"""
- print "au c "
+ if self.Book == None:
+ self.Book = Book()
+ self.Book.name = unicode(self.NameEdit.displayText())
+ self.Book.publisher = unicode(self.PublisherEdit.displayText())
+ self.songmanager.save_book(self.Book)
+ self.onClearButtonClick()
+ self.load_form()
+
+ def onClearButtonClick(self):
+ """
+ Tidy up screen if clear button pressed
+ """
+ self.NameEdit.setText(u'')
+ self.PublisherEdit.setText(u'')
+ self.MessageLabel.setText(u'')
+ self.DeleteButton.setEnabled(False)
+ self.AddUpdateButton.setEnabled(True)
+ self.Book = None
+ self._validate_form()
+
+ def onBooksListViewItemClicked(self, index):
+ """
+ An Book has been selected display it
+ If the Book is attached to a Song prevent delete
+ """
+ self.currentRow = index.row()
+ id = int(self.BookSongListData.getId(index))
+ self.Book = self.songmanager.get_book(id)
+
+ self.NameEdit.setText(self.Book.name)
+ self.PublisherEdit.setText(self.Book.publisher)
+ if len(self.Book.songs) > 0:
+ self.MessageLabel.setText("Book in use 'Delete' is disabled")
+ self.DeleteButton.setEnabled(False)
+ else:
+ self.MessageLabel.setText("Book is not used")
+ self.DeleteButton.setEnabled(True)
+ self._validate_form()
+
+ def _validate_form(self):
+ if len(self.NameEdit.displayText()) == 0: # We need at lease a display name
+ self.AddUpdateButton.setEnabled(False)
+ else:
+ self.AddUpdateButton.setEnabled(True)
diff --git a/openlp/plugins/songs/forms/topicsdialog.py b/openlp/plugins/songs/forms/topicsdialog.py
index b6f51d003..68411f552 100644
--- a/openlp/plugins/songs/forms/topicsdialog.py
+++ b/openlp/plugins/songs/forms/topicsdialog.py
@@ -8,6 +8,7 @@
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
+from openlp.plugins.songs.lib import TextListData
class Ui_TopicsDialog(object):
def setupUi(self, TopicsDialog):
@@ -35,13 +36,13 @@ class Ui_TopicsDialog(object):
self.gridLayout.addWidget(self.DeleteButton, 1, 3, 1, 1)
self.AddUpdateButton = QtGui.QPushButton(self.TopicGroupBox)
icon1 = QtGui.QIcon()
- icon1.addPixmap(QtGui.QPixmap(":/system/system_settings.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon1.addPixmap(QtGui.QPixmap(":/services/service_save.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.AddUpdateButton.setIcon(icon1)
self.AddUpdateButton.setObjectName("AddUpdateButton")
self.gridLayout.addWidget(self.AddUpdateButton, 1, 4, 1, 1)
self.ClearButton = QtGui.QPushButton(self.TopicGroupBox)
icon2 = QtGui.QIcon()
- icon2.addPixmap(QtGui.QPixmap(":/songs/song_edit.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon2.addPixmap(QtGui.QPixmap(":/services/service_new.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.ClearButton.setIcon(icon2)
self.ClearButton.setObjectName("ClearButton")
self.gridLayout.addWidget(self.ClearButton, 1, 2, 1, 1)
@@ -49,11 +50,13 @@ class Ui_TopicsDialog(object):
self.MessageLabel = QtGui.QLabel(TopicsDialog)
self.MessageLabel.setObjectName("MessageLabel")
self.gridLayout_2.addWidget(self.MessageLabel, 3, 0, 1, 1)
- self.TopicsListView = QtGui.QTableWidget(TopicsDialog)
- self.TopicsListView.setObjectName("TopicsListView")
- self.TopicsListView.setColumnCount(0)
- self.TopicsListView.setRowCount(0)
+
+ self.TopicsListView = QtGui.QListView()
+ self.TopicsListView.setAlternatingRowColors(True)
+ self.TopicsListData = TextListData()
+ self.TopicsListView.setModel(self.TopicsListData)
self.gridLayout_2.addWidget(self.TopicsListView, 0, 0, 1, 1)
+
self.ButtonBox = QtGui.QDialogButtonBox(TopicsDialog)
self.ButtonBox.setOrientation(QtCore.Qt.Horizontal)
self.ButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok)
@@ -69,8 +72,11 @@ class Ui_TopicsDialog(object):
TopicsDialog.setWindowTitle(QtGui.QApplication.translate("TopicsDialog", "Topic Maintenance", None, QtGui.QApplication.UnicodeUTF8))
self.TopicGroupBox.setTitle(QtGui.QApplication.translate("TopicsDialog", "Topic", None, QtGui.QApplication.UnicodeUTF8))
self.TopicNameLabel.setText(QtGui.QApplication.translate("TopicsDialog", "Topic Name:", None, QtGui.QApplication.UnicodeUTF8))
+
self.DeleteButton.setToolTip(QtGui.QApplication.translate("TopicsDialog", "Delete Author", None, QtGui.QApplication.UnicodeUTF8))
+ self.DeleteButton.setText(QtGui.QApplication.translate("AuthorsDialog", "Delete", None, QtGui.QApplication.UnicodeUTF8))
self.AddUpdateButton.setToolTip(QtGui.QApplication.translate("TopicsDialog", "Add Update Author", None, QtGui.QApplication.UnicodeUTF8))
+ self.AddUpdateButton.setText(QtGui.QApplication.translate("AuthorsDialog", "Save", None, QtGui.QApplication.UnicodeUTF8))
self.ClearButton.setToolTip(QtGui.QApplication.translate("TopicsDialog", "Clear Selection", None, QtGui.QApplication.UnicodeUTF8))
-
+ self.ClearButton.setText(QtGui.QApplication.translate("TopicsDialog", "Clear", None, QtGui.QApplication.UnicodeUTF8))
diff --git a/openlp/plugins/songs/forms/topicsform.py b/openlp/plugins/songs/forms/topicsform.py
index bc66219fb..4540ff7cc 100644
--- a/openlp/plugins/songs/forms/topicsform.py
+++ b/openlp/plugins/songs/forms/topicsform.py
@@ -2,7 +2,7 @@
"""
OpenLP - Open Source Lyrics Projection
Copyright (c) 2008 Raoul Snyman
-Portions copyright (c) 2008 Martin Thompson, Tim Bentley, Carsten Tinggaard
+Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley, Carsten Tinggaard
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
@@ -16,15 +16,14 @@ 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 openlp.core.resources import *
from PyQt4 import QtGui, QtCore
-from PyQt4.QtGui import QDialog
-from PyQt4.QtCore import pyqtSignature
+from openlp.plugins.songs.lib import TextListData
-from topicsdialog import Ui_TopicsDialog
+from openlp.plugins.songs.forms.topicsdialog import Ui_TopicsDialog
+from openlp.plugins.songs.lib.classes import Topic
-class TopicsForm(QDialog, Ui_TopicsDialog):
+class TopicsForm(QtGui.QDialog, Ui_TopicsDialog):
"""
Class documentation goes here.
"""
@@ -32,24 +31,95 @@ class TopicsForm(QDialog, Ui_TopicsDialog):
"""
Constructor
"""
- QDialog.__init__(self, parent)
+ QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
self.songmanager = songmanager
- #self.connect()
+ self.currentRow = 0
+ self.topic = None
+
+ QtCore.QObject.connect(self.DeleteButton,
+ QtCore.SIGNAL('pressed()'), self.onDeleteButtonClick)
+ QtCore.QObject.connect(self.ClearButton,
+ QtCore.SIGNAL('pressed()'), self.onClearButtonClick)
+ QtCore.QObject.connect(self.AddUpdateButton,
+ QtCore.SIGNAL('pressed()'), self.onAddUpdateButtonClick)
+ QtCore.QObject.connect(self.TopicNameEdit,
+ QtCore.SIGNAL('lostFocus()'), self.onTopicNameEditLostFocus)
+ QtCore.QObject.connect(self.TopicsListView,
+ QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onTopicsListViewItemClicked)
def load_form(self):
- A = 1
+ """
+ Refresh the screen and rest fields
+ """
+ self.TopicsListData.resetStore()
+ self.onClearButtonClick() # tidy up screen
+ topics = self.songmanager.get_topics()
+ for topic in topics:
+ self.TopicsListData.addRow(topic.id,topic.name)
+ #rowCount is number of rows BUT test should be Zero based
+ row_count = self.TopicsListData.rowCount(None) - 1
+ if self.currentRow > row_count:
+ # in case we have delete the last row of the table
+ self.currentRow = row_count
+ row = self.TopicsListData.createIndex(self.currentRow, 0)
+ if row.isValid():
+ self.TopicsListView.selectionModel().setCurrentIndex(row,
+ QtGui.QItemSelectionModel.SelectCurrent)
+ self._validate_form()
- #@pyqtSignature("")
- def onDeleteButtonClicked(self):
+ def onDeleteButtonClick(self):
"""
- Slot documentation goes here.
+ Delete the Topic is the Topic is not attached to any songs
"""
- print "db clicked"
+ self.songmanager.delete_topic(self.topic.id)
+ self.load_form()
- #@pyqtSignature("")
- def onAddUpdateButtonClicked(self):
+ def onTopicNameEditLostFocus(self):
+ self._validate_form()
+
+ def onAddUpdateButtonClick(self):
"""
- Slot documentation goes here.
+ Sent New or update details to the database
"""
- print "au clicked"
+ if self.topic == None:
+ self.topic = Topic()
+ self.topic.name = unicode(self.TopicNameEdit.displayText())
+ self.songmanager.save_topic(self.topic)
+ self.onClearButtonClick()
+ self.load_form()
+
+ def onClearButtonClick(self):
+ """
+ Tidy up screen if clear button pressed
+ """
+ self.TopicNameEdit.setText(u'')
+ self.MessageLabel.setText(u'')
+ self.DeleteButton.setEnabled(False)
+ self.AddUpdateButton.setEnabled(True)
+ self.topic = None
+ self._validate_form()
+
+ def onTopicsListViewItemClicked(self, index):
+ """
+ An Topic has been selected display it
+ If the Topic is attached to a Song prevent delete
+ """
+ self.currentRow = index.row()
+ id = int(self.TopicsListData.getId(index))
+ self.topic = self.songmanager.get_topic(id)
+
+ self.TopicNameEdit.setText(self.topic.name)
+ if len(self.topic.songs) > 0:
+ self.MessageLabel.setText("Topic in use 'Delete' is disabled")
+ self.DeleteButton.setEnabled(False)
+ else:
+ self.MessageLabel.setText("Topic is not used")
+ self.DeleteButton.setEnabled(True)
+ self._validate_form()
+
+ def _validate_form(self):
+ if len(self.TopicNameEdit.displayText()) == 0: # We need at lease a display name
+ self.AddUpdateButton.setEnabled(False)
+ else:
+ self.AddUpdateButton.setEnabled(True)
diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py
index 699daee1b..0bc7d70f2 100644
--- a/openlp/plugins/songs/lib/__init__.py
+++ b/openlp/plugins/songs/lib/__init__.py
@@ -3,7 +3,7 @@
"""
OpenLP - Open Source Lyrics Projection
Copyright (c) 2008 Raoul Snyman
-Portions copyright (c) 2008 Martin Thompson, Tim Bentley
+Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley
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
@@ -17,10 +17,7 @@ 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 textlistdata import TextListData
from manager import SongManager
from songstab import SongsTab
from mediaitem import SongMediaItem
-#from xml import SongOpenXml
-
-#__all__ = ['SongManager', 'SongsTab', 'SongMediaItem']
diff --git a/openlp/plugins/songs/lib/manager.py b/openlp/plugins/songs/lib/manager.py
index 2dcc600c9..b3ab11c96 100644
--- a/openlp/plugins/songs/lib/manager.py
+++ b/openlp/plugins/songs/lib/manager.py
@@ -3,7 +3,7 @@
"""
OpenLP - Open Source Lyrics Projection
Copyright (c) 2008 Raoul Snyman
-Portions copyright (c) 2008 Martin Thompson, Tim Bentley
+Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley
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
@@ -23,7 +23,7 @@ import sys
from sqlalchemy import asc, desc
from openlp.plugins.songs.lib.models import init_models, metadata, session, \
- engine, songs_table, Song, Author, Topic
+ engine, songs_table, Song, Author, Topic, Book
import logging
@@ -34,7 +34,7 @@ class SongManager():
"""
global log
- log=logging.getLogger('SongManager')
+ log = logging.getLogger('SongManager')
log.info('Song manager loaded')
def __init__(self, config):
@@ -45,7 +45,7 @@ class SongManager():
self.config = config
log.debug('Song Initialising')
self.db_url = u''
- db_type = self.config.get_config(u'db type')
+ db_type = self.config.get_config(u'db type', u'sqlite')
if db_type == u'sqlite':
self.db_url = u'sqlite:///' + self.config.get_data_path() + \
u'/songs.sqlite'
@@ -134,11 +134,85 @@ class SongManager():
def delete_author(self, authorid):
"""
- Delete the author and refresh the author cache
+ Delete the author
"""
+ author = self.get_author(authorid)
try:
self.session.delete(author)
self.session.commit()
return True
except:
+ log.error("Errow thrown %s", sys.exc_info()[1])
+ return False
+
+ def get_topics(self):
+ """
+ Returns a list of all the topics
+ """
+ return self.session.query(Topic).order_by(Topic.name).all()
+
+ def get_topic(self, id):
+ """
+ Details of the Topic
+ """
+ return self.session.query(Topic).get(id)
+
+ def save_topic(self, topic):
+ """
+ Save the Topic
+ """
+ try:
+ self.session.add(topic)
+ self.session.commit()
+ return True
+ except:
+ return False
+
+ def delete_topic(self, topicid):
+ """
+ Delete the topic
+ """
+ topic = self.get_topic(topicid)
+ try:
+ self.session.delete(topic)
+ self.session.commit()
+ return True
+ except:
+ log.error("Errow thrown %s", sys.exc_info()[1])
+ return False
+
+ def get_books(self):
+ """
+ Returns a list of all the Books
+ """
+ return self.session.query(Book).order_by(Book.name).all()
+
+ def get_book(self, id):
+ """
+ Details of the Books
+ """
+ return self.session.query(Book).get(id)
+
+ def save_book(self, book):
+ """
+ Save the Book
+ """
+ try:
+ self.session.add(book)
+ self.session.commit()
+ return True
+ except:
+ return False
+
+ def delete_book(self, bookid):
+ """
+ Delete the Book
+ """
+ book = self.get_book(bookid)
+ try:
+ self.session.delete(book)
+ self.session.commit()
+ return True
+ except:
+ log.error("Errow thrown %s", sys.exc_info()[1])
return False
diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py
index 02c2a1817..ee5a0b4ee 100644
--- a/openlp/plugins/songs/lib/mediaitem.py
+++ b/openlp/plugins/songs/lib/mediaitem.py
@@ -3,7 +3,7 @@
"""
OpenLP - Open Source Lyrics Projection
Copyright (c) 2008 Raoul Snyman
-Portions copyright (c) 2008 Martin Thompson, Tim Bentley
+Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley
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
@@ -21,9 +21,33 @@ import logging
from PyQt4 import QtCore, QtGui
-from openlp.core.lib import MediaManagerItem, translate
+from openlp.core.lib import MediaManagerItem, translate, ServiceItem
from openlp.plugins.songs.forms import EditSongForm
+from openlp.plugins.songs.lib import TextListData
+
+class SongList(QtGui.QListView):
+
+ def __init__(self,parent=None,name=None):
+ QtGui.QListView.__init__(self,parent)
+
+ def mouseMoveEvent(self, event):
+ """
+ Drag and drop event does not care what data is selected
+ as the recepient will use events to request the data move
+ just tell it what plugin to call
+ """
+ if event.buttons() != QtCore.Qt.LeftButton:
+ return
+ drag = QtGui.QDrag(self)
+ mimeData = QtCore.QMimeData()
+ drag.setMimeData(mimeData)
+ mimeData.setText(u'Song')
+
+ dropAction = drag.start(QtCore.Qt.CopyAction)
+
+ if dropAction == QtCore.Qt.CopyAction:
+ self.close()
class SongMediaItem(MediaManagerItem):
"""
@@ -98,19 +122,29 @@ class SongMediaItem(MediaManagerItem):
self.SearchLayout.addWidget(self.SearchTextButton, 3, 2, 1, 1)
# Add the song widget to the page layout
self.PageLayout.addWidget(self.SongWidget)
- self.SongListView = QtGui.QTableWidget()
- self.SongListView.setColumnCount(2)
- self.SongListView.setColumnHidden(0, True)
- self.SongListView.setColumnWidth(1, 240)
- self.SongListView.setShowGrid(False)
- self.SongListView.setSortingEnabled(False)
+
+ self.SongListView = SongList()
self.SongListView.setAlternatingRowColors(True)
- self.SongListView.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
- self.SongListView.horizontalHeader().setVisible(False)
- self.SongListView.verticalHeader().setVisible(False)
- self.SongListView.setGeometry(QtCore.QRect(10, 100, 256, 591))
+ self.SongListData = TextListData()
+ self.SongListView.setModel(self.SongListData)
+ self.SongListView.setDragEnabled(True)
+
+# self.SongListView = QtGui.QTableWidget()
+# self.SongListView.setColumnCount(2)
+# self.SongListView.setColumnHidden(0, True)
+# self.SongListView.setColumnWidth(1, 240)
+# self.SongListView.setShowGrid(False)
+# self.SongListView.setSortingEnabled(False)
+# self.SongListView.setAlternatingRowColors(True)
+# self.SongListView.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+# self.SongListView.horizontalHeader().setVisible(False)
+# self.SongListView.verticalHeader().setVisible(False)
+# self.SongListView.setGeometry(QtCore.QRect(10, 100, 256, 591))
self.SongListView.setObjectName('SongListView')
+
self.PageLayout.addWidget(self.SongListView)
+ self.SongListView.setDragEnabled(True)
+
# Signals and slots
QtCore.QObject.connect(self.SearchTextButton,
QtCore.SIGNAL('pressed()'), self.onSearchTextButtonClick)
@@ -118,8 +152,8 @@ class SongMediaItem(MediaManagerItem):
QtCore.SIGNAL('pressed()'), self.onClearTextButtonClick)
QtCore.QObject.connect(self.SearchTextEdit,
QtCore.SIGNAL('textChanged(const QString&)'), self.onSearchTextEditChanged)
- QtCore.QObject.connect(self.SongListView,
- QtCore.SIGNAL('itemPressed(QTableWidgetItem * item)'), self.onSongSelected)
+# QtCore.QObject.connect(self.SongListView,
+# QtCore.SIGNAL('itemPressed(QTableWidgetItem * item)'), self.onSongSelected)
#define and add the context menu
self.SongListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
self.SongListView.addAction(self.contextMenuAction(self.SongListView,
@@ -148,26 +182,18 @@ class SongMediaItem(MediaManagerItem):
self.SearchTypeComboBox.addItem(translate('SongMediaItem', u'Authors'))
def displayResults(self, searchresults):
- log.debug("_search results")
- self.SongListView.clear() # clear the results
- self.SongListView.horizontalHeader().setVisible(False)
- self.SongListView.verticalHeader().setVisible(False)
- self.SongListView.setRowCount(0)
+ log.debug("display results")
+ self.SongListData.resetStore()
#log.debug("Records returned from search %s", len(searchresults))
for song in searchresults:
- row_count = self.SongListView.rowCount()
- self.SongListView.setRowCount(row_count + 1)
- song_index = QtGui.QTableWidgetItem(str(song.id))
- self.SongListView.setItem(row_count, 0, song_index)
author_list = u''
for author in song.authors:
if author_list != u'':
author_list = author_list + u', '
author_list = author_list + author.display_name
- song_detail = QtGui.QTableWidgetItem(
- u'%s (%s)' % (str(song.title), str(author_list)))
- self.SongListView.setItem(row_count, 1, song_detail)
- self.SongListView.setRowHeight(row_count, 20)
+ song_detail = str(u'%s (%s)' % (str(song.title), str(author_list)))
+
+ self.SongListData.addRow(song.id,song_detail)
def onClearTextButtonClick(self):
"""
@@ -197,26 +223,57 @@ class SongMediaItem(MediaManagerItem):
#searchresults = self.songmanager.get_song_from_author(searchtext)
self.displayResults(search_results)
- def onSongSelected(self, item):
- print item
-
def onSongNewClick(self):
self.edit_song_form.exec_()
def onSongEditClick(self):
- current_row = self.SongListView.currentRow()
- id = int(self.SongListView.item(current_row, 0).text())
- self.edit_song_form.loadSong(id)
- self.edit_song_form.exec_()
+ indexes = self.SongListView.selectedIndexes()
+ for index in indexes:
+ id = self.SongListData.getId(index)
+ self.edit_song_form.loadSong(id)
+ self.edit_song_form.exec_()
def onSongDeleteClick(self):
- pass
+ indexes = self.SongListView.selectedIndexes()
+ for index in indexes:
+ id = self.SongListData.getId(index)
+ self.parent.songmanager.delete_song(id)
+ self.SongListData.deleteRow(index)
def onSongPreviewClick(self):
- pass
+ service_item = ServiceItem(self.parent)
+ service_item.addIcon( ":/media/media_song.png")
+ self.generateSlideData(service_item)
+ self.parent.preview_controller.addServiceItem(service_item)
+
+ def generateSlideData(self, service_item):
+ raw_slides =[]
+ raw_footer = []
+ indexes = self.SongListView.selectedIndexes()
+ for index in indexes:
+ id = self.SongListData.getId(index)
+ song = self.parent.songmanager.get_song(id)
+ if song.theme_name == None or len(song.theme_name) == 0:
+ service_item.theme = None
+ else:
+ service_item.theme = song.theme_name
+ verses = song.lyrics.split(u'\n\n')
+ for verse in verses:
+ raw_slides.append(verse)
+ service_item.raw_slides = raw_slides
+ service_item.title = song.title
+ raw_footer.append(str(u'%s \n%s \n' % (song.title, song.copyright )))
+ raw_footer.append(song.copyright)
+ service_item.raw_footer = raw_footer
def onSongLiveClick(self):
- pass
+ service_item = ServiceItem(self.parent)
+ service_item.addIcon( ":/media/media_song.png")
+ self.generateSlideData(service_item)
+ self.parent.live_controller.addServiceItem(service_item)
def onSongAddClick(self):
- pass
+ service_item = ServiceItem(self.parent)
+ service_item.addIcon( ":/media/media_song.png")
+ self.generateSlideData(service_item)
+ self.parent.service_manager.addServiceItem(service_item)
diff --git a/openlp/plugins/songs/lib/textlistdata.py b/openlp/plugins/songs/lib/textlistdata.py
new file mode 100644
index 000000000..547e978f8
--- /dev/null
+++ b/openlp/plugins/songs/lib/textlistdata.py
@@ -0,0 +1,80 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+"""
+OpenLP - Open Source Lyrics Projection
+Copyright (c) 2008 Raoul Snyman
+Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley
+
+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
+"""
+import logging
+
+from PyQt4 import QtCore, QtGui
+
+class TextListData(QtCore.QAbstractListModel):
+ """
+ An abstract list of strings
+ """
+ global log
+ log = logging.getLogger(u'TextListData')
+ log.info(u'started')
+
+ def __init__(self):
+ QtCore.QAbstractListModel.__init__(self)
+ self.items = [] # will be a list of (database id , title) tuples
+
+ def resetStore(self):
+ #reset list so can be reloaded
+ self.items = []
+
+ def rowCount(self, parent):
+ return len(self.items)
+
+ def insertRow(self, row, id, title):
+ self.beginInsertRows(QtCore.QModelIndex(),row,row)
+ log.debug("insert row %d:%s for id %d" % (row,title, id))
+ self.items.insert(row, (id, title))
+ self.endInsertRows()
+
+ def removeRow(self, row):
+ self.beginRemoveRows(QtCore.QModelIndex(), row,row)
+ self.items.pop(row)
+ self.endRemoveRows()
+
+ def addRow(self, id, title):
+ self.insertRow(len(self.items), id, title)
+
+ def data(self, index, role):
+ row = index.row()
+ if row > len(self.items): # if the last row is selected and deleted, we then get called with an empty row!
+ return QtCore.QVariant()
+ if role == QtCore.Qt.DisplayRole:
+ retval = self.items[row][1]
+ else:
+ retval = QtCore.QVariant()
+ if type(retval) is not type(QtCore.QVariant):
+ return QtCore.QVariant(retval)
+ else:
+ return retval
+
+ def getIdList(self):
+ filelist = [item[0] for item in self.items];
+ return filelist
+
+ def getId(self, index):
+ row = index.row()
+ return self.items[row][0]
+
+ def deleteRow(self, index):
+ row = index.row()
+ self.removeRow(row)
diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py
index 6387094b7..adfd59297 100644
--- a/openlp/plugins/songs/songsplugin.py
+++ b/openlp/plugins/songs/songsplugin.py
@@ -49,8 +49,8 @@ class SongsPlugin(Plugin):
def get_media_manager_item(self):
# Create the MediaManagerItem object
- self.MediaManagerItem = SongMediaItem(self, self.icon, 'Songs')
- return self.MediaManagerItem
+ self.media_item = SongMediaItem(self, self.icon, 'Songs')
+ return self.media_item
def add_import_menu_item(self, import_menu):
self.ImportSongMenu = QtGui.QMenu(import_menu)
@@ -127,3 +127,12 @@ class SongsPlugin(Plugin):
if event.event_type == EventType.ThemeListChanged:
log.debug(u'New Theme request received')
#self.edit_custom_form.loadThemes(self.theme_manager.getThemes())
+ if event.event_type == EventType.LoadServiceItem and event.payload == 'Song':
+ log.debug(u'Load Service Item received')
+ self.media_item.onSongAddClick()
+ if event.event_type == EventType.PreviewShow and event.payload == 'Song':
+ log.debug(u'Load Preview Item received ')
+ self.media_item.onSongPreviewClick()
+ if event.event_type == EventType.LiveShow and event.payload == 'Song':
+ log.debug(u'Load Live Show Item received')
+ self.media_item.onSongLiveClick()