forked from openlp/openlp
Upgrade Songs Database to version 2
Change SQL layer to SQLALChemy Fix the UI to use new layer More changes to editsong dialog Force suffix of sqlite bzr-revno: 280
This commit is contained in:
parent
534ad57dc4
commit
7397c42ac4
@ -64,9 +64,9 @@ class PluginConfig(object):
|
||||
def set_data_path(self, path):
|
||||
return self.set_config('data path', os.path.basename(path))
|
||||
|
||||
def get_files(self, default_suffixes=None):
|
||||
def get_files(self, suffix=None):
|
||||
returnfiles = []
|
||||
suffix = self.get_config("suffix name", default_suffixes)
|
||||
#suffix = self.get_config("suffix name", default_suffixes)
|
||||
try:
|
||||
files = os.listdir(self.get_data_path())
|
||||
except:
|
||||
|
@ -20,12 +20,32 @@ import logging
|
||||
import sqlite3
|
||||
from openlp.core.lib import PluginConfig
|
||||
|
||||
from sqlalchemy import *
|
||||
from sqlalchemy.sql import select
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import scoped_session, sessionmaker, mapper, relation, clear_mappers
|
||||
|
||||
from openlp.plugins.songs.lib.tables import *
|
||||
from openlp.plugins.songs.lib.classes import *
|
||||
|
||||
clear_mappers()
|
||||
mapper(Author, authors_table)
|
||||
mapper(Book, song_books_table)
|
||||
mapper(Song, songs_table,
|
||||
properties={'authors': relation(Author, backref='songs',
|
||||
secondary=authors_songs_table),
|
||||
'book': relation(Book, backref='songs'),
|
||||
'topics': relation(Topic, backref='songs',
|
||||
secondary=songs_topics_table)})
|
||||
mapper(Topic, topics_table)
|
||||
|
||||
class MigrateSongs():
|
||||
def __init__(self, display):
|
||||
self.display = display
|
||||
self.config = PluginConfig("Songs")
|
||||
self.data_path = self.config.get_data_path()
|
||||
self.database_files = self.config.get_files("olp3")
|
||||
self.data_path = self.config.get_data_path()
|
||||
self.database_files = self.config.get_files("sqlite")
|
||||
print self.database_files
|
||||
|
||||
def process(self):
|
||||
self.display.output("Songs processing started");
|
||||
@ -38,33 +58,29 @@ class MigrateSongs():
|
||||
self._v1_9_0_authors(database)
|
||||
self._v1_9_0_topics(database)
|
||||
self._v1_9_0_songbook(database)
|
||||
self._v1_9_0_songauthors(database)
|
||||
self._v1_9_0_songtopics(database)
|
||||
self._v1_9_0_songs(database)
|
||||
self._v1_9_0_songs_update(database)
|
||||
|
||||
conn = sqlite3.connect(self.data_path+os.sep+database)
|
||||
conn.text_factory = str
|
||||
c = conn.cursor()
|
||||
c.execute("""select * from songs where songtitle like '%Come now%'""")
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
self.display.output("Migration 1.9.0 Finished for " + database);
|
||||
|
||||
def _v1_9_0_authors(self, database):
|
||||
self.display.sub_output("Authors Started for "+database);
|
||||
conn = sqlite3.connect(self.data_path+os.sep+database)
|
||||
conn.text_factory = str
|
||||
conn.execute("""alter table authors add column first_name varchar(40);""")
|
||||
conn.execute("""alter table authors add column first_name varchar(128);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("first name created")
|
||||
conn.execute("""alter table authors add column last_name varchar(40);""")
|
||||
conn.execute("""alter table authors add column last_name varchar(128);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("last name created")
|
||||
conn.execute("""create index if not exists author1 on authors (authorname ASC,authorid ASC);""")
|
||||
conn.execute("""create index if not exists author1 on authors (display_name ASC,id ASC);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("index author1 created")
|
||||
conn.execute("""create index if not exists author2 on authors (last_name ASC,authorid ASC);""")
|
||||
conn.execute("""create index if not exists author2 on authors (last_name ASC,id ASC);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("index author2 created")
|
||||
conn.execute("""create index if not exists author3 on authors (first_name ASC,authorid ASC);""")
|
||||
conn.execute("""create index if not exists author3 on authors (first_name ASC,id ASC);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("index author3 created")
|
||||
self.display.sub_output("Author Data Migration started")
|
||||
@ -78,7 +94,7 @@ class MigrateSongs():
|
||||
afn = dispname[:pos]
|
||||
aln = dispname[pos + 1:len(dispname)]
|
||||
#txt = text[2]
|
||||
s = "update authors set first_name = '" + afn + "' ,last_name = '" + aln + "' where authorid = " +str(author[0])
|
||||
s = "update authors set first_name = '" + afn + "' ,last_name = '" + aln + "' where id = " +str(author[0])
|
||||
text1 = c.execute(s)
|
||||
|
||||
conn.commit()
|
||||
@ -90,13 +106,13 @@ class MigrateSongs():
|
||||
self.display.sub_output("Topics Started for "+database);
|
||||
conn = sqlite3.connect(self.data_path+os.sep+database)
|
||||
conn.text_factory = str
|
||||
conn.execute("""create table if not exists topics (topic_id integer Primary Key ASC AUTOINCREMENT);""")
|
||||
conn.execute("""create table if not exists topics (id integer Primary Key ASC AUTOINCREMENT);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("Topic table created")
|
||||
conn.execute("""alter table topics add column topic_name varchar(40);""")
|
||||
conn.execute("""alter table topics add column name varchar(128);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("topicname added")
|
||||
conn.execute("""create index if not exists topic1 on topics (topic_name ASC,topic_id ASC);""")
|
||||
conn.execute("""create index if not exists topic1 on topics (name ASC,id ASC);""")
|
||||
conn.commit()
|
||||
conn.close()
|
||||
self.display.sub_output("index topic1 created")
|
||||
@ -106,25 +122,129 @@ class MigrateSongs():
|
||||
def _v1_9_0_songbook(self, database):
|
||||
self.display.sub_output("SongBook Started for "+database);
|
||||
conn = sqlite3.connect(self.data_path+os.sep+database)
|
||||
conn.text_factory = str
|
||||
conn.execute("""create table if not exists songbook (songbook_id integer Primary Key ASC AUTOINCREMENT);""")
|
||||
conn.execute("""create table if not exists song_books (id integer Primary Key ASC AUTOINCREMENT);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("SongBook table created")
|
||||
conn.execute("""alter table songbook add column songbook_name varchar(40);""")
|
||||
conn.execute("""alter table song_books add column name varchar(128);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("songbook_name added")
|
||||
conn.execute("""alter table songbook add column songbook_publisher varchar(40);""")
|
||||
conn.execute("""alter table song_books add column publisher varchar(128);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("songbook_publisher added")
|
||||
conn.execute("""create index if not exists songbook1 on songbook (songbook_name ASC,songbook_id ASC);""")
|
||||
conn.execute("""create index if not exists songbook1 on song_books (name ASC,id ASC);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("index songbook1 created")
|
||||
conn.execute("""create index if not exists songbook2 on songbook (songbook_publisher ASC,songbook_id ASC);""")
|
||||
conn.execute("""create index if not exists songbook2 on song_books (publisher ASC,id ASC);""")
|
||||
conn.commit()
|
||||
conn.close()
|
||||
self.display.sub_output("index songbook2 created")
|
||||
self.display.sub_output("SongBook Completed");
|
||||
|
||||
def _v1_9_0_songtopics(self, database):
|
||||
self.display.sub_output("Songtopics Started for "+database);
|
||||
conn = sqlite3.connect(self.data_path+os.sep+database)
|
||||
conn.execute("""create table if not exists song_topics (song_id integer Primary Key ASC );""")
|
||||
conn.commit()
|
||||
self.display.sub_output("Songtopics table created")
|
||||
conn.execute("""alter table song_topics add column topic_id interger;""")
|
||||
conn.commit()
|
||||
self.display.sub_output("songtopics_topic_id added")
|
||||
conn.execute("""create index if not exists songtopic1 on song_topics (topic_id ASC,song_id ASC);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("index songbook1 created")
|
||||
conn.execute("""create index if not exists songbook2 on song_topics (song_id ASC,topic_id ASC);""")
|
||||
conn.commit()
|
||||
conn.close()
|
||||
self.display.sub_output("index songbook2 created")
|
||||
self.display.sub_output("SongTopics Completed");
|
||||
|
||||
def _v1_9_0_songauthors(self, database):
|
||||
self.display.sub_output("SongAuthors Started for "+database);
|
||||
conn = sqlite3.connect(self.data_path+os.sep+database)
|
||||
conn.execute("""alter table songauthors rename to authors_songs;""")
|
||||
conn.commit()
|
||||
conn.close()
|
||||
self.display.sub_output("Table Renamed")
|
||||
self.display.sub_output("SongAuthors Completed");
|
||||
|
||||
|
||||
def _v1_9_0_songs(self, database):
|
||||
self.display.sub_output("Songs Started for "+database);
|
||||
conn = sqlite3.connect(self.data_path+os.sep+database)
|
||||
conn.execute("""alter table songs add column song_book_id interger;""")
|
||||
conn.commit()
|
||||
self.display.sub_output("songs_song_book_id added")
|
||||
conn.execute("""alter table songs add column verse_order varchar(128);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("songs verse_order added")
|
||||
conn.execute("""alter table songs add column comments text;""")
|
||||
conn.commit()
|
||||
self.display.sub_output("songs comments added")
|
||||
conn.execute("""alter table songs add ccli_number varchar(64);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("songs ccli_number added")
|
||||
conn.execute("""alter table songs add song_number varchar(64);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("songs song_number added")
|
||||
conn.execute("""alter table songs add theme_name varchar(128);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("songs theme_name added")
|
||||
conn.execute("""alter table songs add search_title varchar(255);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("songs search_title added")
|
||||
conn.execute("""alter table songs add search_lyrics text;""")
|
||||
conn.commit()
|
||||
self.display.sub_output("songs search_lyrics added")
|
||||
|
||||
conn.execute("""create index if not exists songs1 on songs (search_lyrics ASC,id ASC);""")
|
||||
conn.commit()
|
||||
self.display.sub_output("index songs1 created")
|
||||
conn.execute("""create index if not exists songs2 on songs (search_title ASC,id ASC);""")
|
||||
conn.commit()
|
||||
conn.close()
|
||||
self.display.sub_output("index songs2 created")
|
||||
self.display.sub_output("Songs Completed");
|
||||
|
||||
|
||||
|
||||
def _v1_9_0_songs_update(self, database):
|
||||
self.display.sub_output("Songs Started for "+database);
|
||||
self.db = create_engine("sqlite:///"+self.data_path+os.sep+database, encoding='utf-8' , convert_unicode=False, assert_unicode=False)
|
||||
|
||||
self.db.echo = True
|
||||
metadata.bind = self.db
|
||||
metadata.bind.echo = False
|
||||
Session = scoped_session(sessionmaker(autoflush=True, autocommit=False))
|
||||
Session.configure(bind=self.db)
|
||||
#create missing table
|
||||
songs_topics_table.create()
|
||||
songs = Session.query(Song).all()
|
||||
for song in songs:
|
||||
t=song.title.replace("&", "and")
|
||||
t=t.replace("'", "")
|
||||
t=t.replace(",", "")
|
||||
t=t.replace(";", "")
|
||||
t=t.replace(":", "")
|
||||
t=t.replace("(", "")
|
||||
t=t.replace(")", "")
|
||||
t=t.replace("{", "")
|
||||
t=t.replace("}", "")
|
||||
t=t.replace("?", "")
|
||||
song.search_title = t
|
||||
t=song.lyrics.replace("&", "and")
|
||||
t=t.replace("'", "")
|
||||
t=t.replace(",", "")
|
||||
t=t.replace(";", "")
|
||||
t=t.replace(":", "")
|
||||
t=t.replace("(", "")
|
||||
t=t.replace(")", "")
|
||||
t=t.replace("{", "")
|
||||
t=t.replace("}", "")
|
||||
t=t.replace("?", "")
|
||||
song.search_lyrics = t
|
||||
song.song_book_id = 0
|
||||
Session.save_or_update(song)
|
||||
Session.commit()
|
||||
|
||||
def run_cmd(self, cmd):
|
||||
f_i, f_o = os.popen4(cmd)
|
||||
|
@ -46,10 +46,10 @@ class BibleManager():
|
||||
self.bibleHTTPCache = {} # dict of bible http readers
|
||||
self.biblePath = self.config.get_data_path()
|
||||
self.proxyname = self.config.get_config("proxy name") #get proxy name for screen
|
||||
self.bibleSuffix = self.config.get_config("suffix name", u'bible3,sqlite')
|
||||
self.bibleSuffix = "sqlite"
|
||||
self.dialogobject = None
|
||||
|
||||
files = self.config.get_files()
|
||||
files = self.config.get_files(self.bibleSuffix)
|
||||
log.debug("Bible Files %s", files )
|
||||
|
||||
for f in files:
|
||||
|
@ -82,7 +82,7 @@ class TestBibleManager:
|
||||
|
||||
def testGetBibleBooks(self):
|
||||
log.debug( "\n.......testGetBibleBooks")
|
||||
c = self.bm.get_bible_books_full("NIV")
|
||||
c = self.bm.get_bible_books("NIV")
|
||||
for c1 in c:
|
||||
log.debug( c1)
|
||||
assert(c1 in c)
|
||||
|
@ -53,7 +53,7 @@ class TestBibleManager:
|
||||
def testRegisterOSISBibleFiles(self):
|
||||
# Register a bible from files
|
||||
log.debug("\n.......testRegisterOSISBibleFiles")
|
||||
self.bm.register_OSIS_file_bible("asv",'asv.osis')
|
||||
self.bm.register_osis_file_bible("asv",'asv.osis')
|
||||
b = self.bm.get_bibles()
|
||||
for b1 in b:
|
||||
log.debug( b1)
|
||||
|
@ -23,76 +23,71 @@ from PyQt4.QtGui import QDialog
|
||||
from PyQt4.QtCore import pyqtSignature
|
||||
|
||||
from authorsdialog import Ui_AuthorsDialog
|
||||
from openlp.plugins.songs.lib.classes import *
|
||||
|
||||
class AuthorsForm(QDialog, Ui_AuthorsDialog):
|
||||
"""
|
||||
Class documentation goes here.
|
||||
Class to control the Maintenance of Authors Dialog
|
||||
"""
|
||||
def __init__(self, songmanager, parent = None):
|
||||
"""
|
||||
Constructor
|
||||
Set up the screen and common data
|
||||
"""
|
||||
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.authorid = 0 # this is the selected authorid for updates and deletes
|
||||
self.candelete = False
|
||||
self.currentrow = 0
|
||||
self.songmanager = songmanager
|
||||
self.author = None
|
||||
|
||||
def load_form(self):
|
||||
list = self.songmanager.get_authors()
|
||||
"""
|
||||
Refresh the screen and rest fields
|
||||
"""
|
||||
self.on_ClearButton_clicked() # tidy up screen
|
||||
authors = self.songmanager.get_authors()
|
||||
self.AuthorListView.clear() # clear the results
|
||||
self.AuthorListView.setHorizontalHeaderLabels(QtCore.QStringList([" ","Author"]))
|
||||
self.AuthorListView.setRowCount(0)
|
||||
for id, txt in list:
|
||||
for author in authors:
|
||||
c = self.AuthorListView.rowCount()
|
||||
self.AuthorListView.setRowCount(c+1)
|
||||
twi = QtGui.QTableWidgetItem(str(id))
|
||||
twi = QtGui.QTableWidgetItem(str(author.id))
|
||||
self.AuthorListView.setItem(c , 0, twi)
|
||||
twi = QtGui.QTableWidgetItem(str(txt))
|
||||
#twi.setFlags(Not QtCore.Qt.ItemIsSelectable & QtCore.Qt.ItemIsEnabled)
|
||||
twi = QtGui.QTableWidgetItem(str(author.display_name))
|
||||
twi.setFlags(QtCore.Qt.ItemIsSelectable)
|
||||
self.AuthorListView.setItem(c , 1, twi)
|
||||
self.AuthorListView.setRowHeight(c, 20)
|
||||
c = self.AuthorListView.rowCount()
|
||||
if self.currentrow > c: # incase we have delete the last row of the table
|
||||
self.currentrow = c
|
||||
self.AuthorListView.selectRow(self.currentrow)
|
||||
|
||||
@pyqtSignature("")
|
||||
def on_buttonBox_accepted(self):
|
||||
"""
|
||||
Slot documentation goes here.
|
||||
"""
|
||||
print "bb acc"
|
||||
|
||||
@pyqtSignature("")
|
||||
def on_buttonBox_rejected(self):
|
||||
"""
|
||||
Slot documentation goes here.
|
||||
"""
|
||||
print "bb rej"
|
||||
|
||||
self.AuthorListView.selectRow(self.currentrow) # set selected row to previous selected row
|
||||
|
||||
@pyqtSignature("")
|
||||
def on_DeleteButton_clicked(self):
|
||||
"""
|
||||
Slot documentation goes here.
|
||||
Delete the author is the Author is not attached to any songs
|
||||
"""
|
||||
if self.candelete == True:
|
||||
self.songmanager.delete_author(self.authorid)
|
||||
self.songmanager.delete_author(self.author.id)
|
||||
self.on_ClearButton_clicked()
|
||||
self.load_form()
|
||||
|
||||
@pyqtSignature("")
|
||||
def on_AddUpdateButton_clicked(self):
|
||||
"""
|
||||
Slot documentation goes here.
|
||||
Sent New or update details to the database
|
||||
"""
|
||||
self.songmanager.save_author(str(self.DisplayEdit.displayText()),str(self.FirstNameEdit.displayText()) ,str(self.LastNameEdit.displayText()) , self.authorid)
|
||||
if self.author == None:
|
||||
self.author = Author()
|
||||
self.author.display_name = unicode(self.DisplayEdit.displayText())
|
||||
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.load_form()
|
||||
|
||||
@ -100,13 +95,14 @@ class AuthorsForm(QDialog, Ui_AuthorsDialog):
|
||||
@pyqtSignature("")
|
||||
def on_ClearButton_clicked(self):
|
||||
"""
|
||||
Slot documentation goes here.
|
||||
Tidy up screen if clear button pressed
|
||||
"""
|
||||
self.authorid = 0
|
||||
self.DisplayEdit.setText("")
|
||||
self.FirstNameEdit.setText("")
|
||||
self.LastNameEdit.setText("")
|
||||
self.MessageLabel.setText("")
|
||||
self.candelete = True
|
||||
self.author = None
|
||||
|
||||
@pyqtSignature("QTableWidgetItem*")
|
||||
def on_AuthorListView_itemClicked(self, item):
|
||||
@ -115,14 +111,14 @@ class AuthorsForm(QDialog, Ui_AuthorsDialog):
|
||||
"""
|
||||
self.currentrow = self.AuthorListView.currentRow()
|
||||
id = int(self.AuthorListView.item(self.currentrow, 0).text())
|
||||
author = self.songmanager.get_author(id)
|
||||
self.authorid = author[0]
|
||||
self.DisplayEdit.setText(author[1])
|
||||
self.FirstNameEdit.setText(author[2])
|
||||
self.LastNameEdit.setText(author[3])
|
||||
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(songs) > 0:
|
||||
self.MessageLabel.setText("Author is attached to Songs")
|
||||
self.MessageLabel.setText("Author in use 'Delete' is disabled")
|
||||
self.candelete = False
|
||||
else:
|
||||
self.MessageLabel.setText("Author is not used")
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
# Form implementation generated from reading ui file 'editsongdialog.ui'
|
||||
#
|
||||
# Created: Tue Jan 6 19:54:19 2009
|
||||
# Created: Fri Jan 9 18:44:05 2009
|
||||
# by: PyQt4 UI code generator 4.4.3
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
@ -12,7 +12,7 @@ from PyQt4 import QtCore, QtGui
|
||||
class Ui_EditSongDialog(object):
|
||||
def setupUi(self, EditSongDialog):
|
||||
EditSongDialog.setObjectName("EditSongDialog")
|
||||
EditSongDialog.resize(734, 761)
|
||||
EditSongDialog.resize(734, 756)
|
||||
icon = QtGui.QIcon()
|
||||
icon.addPixmap(QtGui.QPixmap(":/icon/openlp.org-icon-32.bmp"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||
EditSongDialog.setWindowIcon(icon)
|
||||
@ -41,12 +41,6 @@ class Ui_EditSongDialog(object):
|
||||
self.AlternativeEdit = QtGui.QLineEdit(self.TextWidget)
|
||||
self.AlternativeEdit.setObjectName("AlternativeEdit")
|
||||
self.gridLayout.addWidget(self.AlternativeEdit, 3, 0, 1, 1)
|
||||
self.VerseOrderLabel = QtGui.QLabel(self.TextWidget)
|
||||
self.VerseOrderLabel.setObjectName("VerseOrderLabel")
|
||||
self.gridLayout.addWidget(self.VerseOrderLabel, 4, 0, 1, 1)
|
||||
self.VerseOrderEdit = QtGui.QLineEdit(self.TextWidget)
|
||||
self.VerseOrderEdit.setObjectName("VerseOrderEdit")
|
||||
self.gridLayout.addWidget(self.VerseOrderEdit, 5, 0, 1, 1)
|
||||
self.LyricsLabel = QtGui.QLabel(self.TextWidget)
|
||||
self.LyricsLabel.setObjectName("LyricsLabel")
|
||||
self.gridLayout.addWidget(self.LyricsLabel, 6, 0, 1, 1)
|
||||
@ -55,6 +49,12 @@ class Ui_EditSongDialog(object):
|
||||
self.LyricsTextEdit.setAcceptRichText(False)
|
||||
self.LyricsTextEdit.setObjectName("LyricsTextEdit")
|
||||
self.gridLayout.addWidget(self.LyricsTextEdit, 7, 0, 1, 1)
|
||||
self.VerseOrderEdit = QtGui.QLineEdit(self.TextWidget)
|
||||
self.VerseOrderEdit.setObjectName("VerseOrderEdit")
|
||||
self.gridLayout.addWidget(self.VerseOrderEdit, 5, 0, 1, 1)
|
||||
self.VerseOrderLabel = QtGui.QLabel(self.TextWidget)
|
||||
self.VerseOrderLabel.setObjectName("VerseOrderLabel")
|
||||
self.gridLayout.addWidget(self.VerseOrderLabel, 4, 0, 1, 1)
|
||||
self.Selectedroup = QtGui.QWidget(self.TopWidget)
|
||||
self.Selectedroup.setGeometry(QtCore.QRect(329, 0, 381, 531))
|
||||
self.Selectedroup.setObjectName("Selectedroup")
|
||||
@ -164,7 +164,7 @@ class Ui_EditSongDialog(object):
|
||||
self.CopyrightInsertItem.setObjectName("CopyrightInsertItem")
|
||||
self.gridLayout_4.addWidget(self.CopyrightInsertItem, 0, 1, 1, 1)
|
||||
self.ThemeGroupBox = QtGui.QGroupBox(self.TopWidget)
|
||||
self.ThemeGroupBox.setGeometry(QtCore.QRect(0, 540, 711, 66))
|
||||
self.ThemeGroupBox.setGeometry(QtCore.QRect(0, 630, 711, 66))
|
||||
self.ThemeGroupBox.setObjectName("ThemeGroupBox")
|
||||
self.horizontalLayout_2 = QtGui.QHBoxLayout(self.ThemeGroupBox)
|
||||
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
||||
@ -175,6 +175,14 @@ class Ui_EditSongDialog(object):
|
||||
self.ThemeAddItem.setMaximumSize(QtCore.QSize(110, 16777215))
|
||||
self.ThemeAddItem.setObjectName("ThemeAddItem")
|
||||
self.horizontalLayout_2.addWidget(self.ThemeAddItem)
|
||||
self.CommentGroup = QtGui.QGroupBox(self.TopWidget)
|
||||
self.CommentGroup.setGeometry(QtCore.QRect(10, 530, 701, 111))
|
||||
self.CommentGroup.setObjectName("CommentGroup")
|
||||
self.gridLayout_5 = QtGui.QGridLayout(self.CommentGroup)
|
||||
self.gridLayout_5.setObjectName("gridLayout_5")
|
||||
self.CommentsEdit = QtGui.QTextEdit(self.CommentGroup)
|
||||
self.CommentsEdit.setObjectName("CommentsEdit")
|
||||
self.gridLayout_5.addWidget(self.CommentsEdit, 0, 0, 1, 1)
|
||||
self.ButtonBox = QtGui.QDialogButtonBox(EditSongDialog)
|
||||
self.ButtonBox.setGeometry(QtCore.QRect(570, 720, 156, 27))
|
||||
self.ButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save)
|
||||
@ -189,8 +197,8 @@ class Ui_EditSongDialog(object):
|
||||
EditSongDialog.setWindowTitle(QtGui.QApplication.translate("EditSongDialog", "Song Editor", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.TitleLabel.setText(QtGui.QApplication.translate("EditSongDialog", "Title:", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.AlternativeTitleLabel.setText(QtGui.QApplication.translate("EditSongDialog", "Alternative Title:", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.VerseOrderLabel.setText(QtGui.QApplication.translate("EditSongDialog", "Verse Order:", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.LyricsLabel.setText(QtGui.QApplication.translate("EditSongDialog", "Lyrics:", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.VerseOrderLabel.setText(QtGui.QApplication.translate("EditSongDialog", "Verse Order:", 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.AddAuthorsButton.setText(QtGui.QApplication.translate("EditSongDialog", "Add Authors", None, QtGui.QApplication.UnicodeUTF8))
|
||||
@ -208,5 +216,5 @@ class Ui_EditSongDialog(object):
|
||||
self.CopyrightInsertItem.setText(QtGui.QApplication.translate("EditSongDialog", "©", 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.CommentGroup.setTitle(QtGui.QApplication.translate("EditSongDialog", "Comments", None, QtGui.QApplication.UnicodeUTF8))
|
||||
|
||||
|
@ -17,7 +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 PyQt4 import QtCore, QtGui
|
||||
from PyQt4.QtGui import QWidget
|
||||
from PyQt4.QtCore import pyqtSignature
|
||||
|
||||
@ -44,20 +44,42 @@ class EditSongForm(QWidget, Ui_EditSongDialog):
|
||||
self.topics_form = TopicsForm(self.songmanager)
|
||||
self.song_book_form = SongBookForm(self.songmanager)
|
||||
self.initialise()
|
||||
|
||||
self.AuthorsListView.setColumnCount(2)
|
||||
self.AuthorsListView.setColumnHidden(0, True)
|
||||
self.AuthorsListView.setColumnWidth(1, 200)
|
||||
self.AuthorsListView.setShowGrid(False)
|
||||
self.AuthorsListView.setSortingEnabled(False)
|
||||
self.AuthorsListView.setAlternatingRowColors(True)
|
||||
|
||||
|
||||
def initialise(self):
|
||||
list = self.songmanager.get_authors()
|
||||
self.AuthorsSelectionComboItem.clear()
|
||||
for i in list:
|
||||
self.AuthorsSelectionComboItem.addItem( i.get_author_name())
|
||||
self.AuthorsSelectionComboItem.addItem( i.display_name)
|
||||
|
||||
def load_song(self, songid):
|
||||
self.songid = songid
|
||||
song = self.songmanager.get_song(songid)
|
||||
|
||||
self.TitleEditItem.setText(song[1])
|
||||
self.LyricsTextEdit.setText(song[2])
|
||||
self.CopyrightEditItem.setText(song[3])
|
||||
self.TitleEditItem.setText(song.title)
|
||||
self.LyricsTextEdit.setText(song.lyrics)
|
||||
self.CopyrightEditItem.setText(song.copyright)
|
||||
|
||||
self.AuthorsListView.clear() # clear the results
|
||||
self.AuthorsListView.setHorizontalHeaderLabels(QtCore.QStringList(["","Author"]))
|
||||
self.AuthorsListView.setVerticalHeaderLabels(QtCore.QStringList([""]))
|
||||
self.AuthorsListView.setRowCount(0)
|
||||
|
||||
for author in song.authors:
|
||||
c = self.AuthorsListView.rowCount()
|
||||
self.AuthorsListView.setRowCount(c+1)
|
||||
twi = QtGui.QTableWidgetItem(str(author.id))
|
||||
self.AuthorsListView.setItem(c , 0, twi)
|
||||
twi = QtGui.QTableWidgetItem(str(author.display_name))
|
||||
self.AuthorsListView.setItem(c , 1, twi)
|
||||
self.AuthorsListView.setRowHeight(c, 20)
|
||||
|
||||
|
||||
@pyqtSignature("")
|
||||
def on_AddAuthorsButton_clicked(self):
|
||||
|
@ -30,12 +30,12 @@ def init_models(url):
|
||||
bind=create_engine(url)))
|
||||
|
||||
|
||||
mapper(Author, authors_table)
|
||||
mapper(Book, song_books_table)
|
||||
mapper(Song, songs_table,
|
||||
properties={'authors': relation(Author, backref='songs',
|
||||
secondary=authors_songs_table),
|
||||
'book': relation(Book, backref='songs'),
|
||||
'topics': relation(Topic, backref='songs',
|
||||
secondary=songs_topics_table)})
|
||||
mapper(Topic, topics_table)
|
||||
#mapper(Author, authors_table)
|
||||
#mapper(Book, song_books_table)
|
||||
#mapper(Song, songs_table,
|
||||
# properties={'authors': relation(Author, backref='songs',
|
||||
# secondary=authors_songs_table),
|
||||
# 'book': relation(Book, backref='songs'),
|
||||
# 'topics': relation(Topic, backref='songs',
|
||||
# secondary=songs_topics_table)})
|
||||
#mapper(Topic, topics_table)
|
||||
|
@ -25,31 +25,29 @@ import string
|
||||
|
||||
from sqlalchemy import *
|
||||
from sqlalchemy.sql import select
|
||||
from sqlalchemy.orm import sessionmaker, mapper
|
||||
from sqlalchemy.types import Text, Unicode
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import scoped_session, sessionmaker, mapper, relation, clear_mappers
|
||||
|
||||
from openlp.plugins.songs.lib.tables import *
|
||||
from openlp.plugins.songs.lib.classes import *
|
||||
from openlp.core.utils import ConfigHelper
|
||||
|
||||
from songtable import Author
|
||||
|
||||
import logging
|
||||
|
||||
class SongDBException(Exception):
|
||||
pass
|
||||
class SongInvalidDatabaseError(Exception):
|
||||
pass
|
||||
|
||||
metadata = MetaData()
|
||||
clear_mappers() # some reason we need this
|
||||
mapper(Author, authors_table)
|
||||
mapper(Book, song_books_table)
|
||||
mapper(Song, songs_table,
|
||||
properties={'authors': relation(Author, backref='songs',
|
||||
secondary=authors_songs_table),
|
||||
'book': relation(Book, backref='songs'),
|
||||
'topics': relation(Topic, backref='songs',
|
||||
secondary=songs_topics_table)})
|
||||
mapper(Topic, topics_table)
|
||||
|
||||
author_table = Table('authors', metadata,
|
||||
Column('authorid', Integer, primary_key=True),
|
||||
Column('authorname', Unicode(length=40)),
|
||||
Column('first_name', Unicode(length=40)),
|
||||
Column('last_name',Unicode(length=40)),
|
||||
)
|
||||
|
||||
mapper(Author,author_table)
|
||||
|
||||
class SongDBImpl():
|
||||
global log
|
||||
log=logging.getLogger("SongDBImpl")
|
||||
@ -66,22 +64,16 @@ class SongDBImpl():
|
||||
else:
|
||||
raise SongInvalidDatabaseError("Database not mysql or sqlite")
|
||||
self.db.echo = True
|
||||
#self.db.convert_unicode=False
|
||||
metadata.bind = self.db
|
||||
metadata.bind.echo = False
|
||||
self.Session = sessionmaker(autoflush=True, autocommit=False)
|
||||
self.Session = scoped_session(sessionmaker(autoflush=True, autocommit=False))
|
||||
self.Session.configure(bind=self.db)
|
||||
#self.authors_table = Table('authors', metadata, autoload=True)
|
||||
#self.settings = Table('settings', metadata, autoload=True)
|
||||
#self.songauthors = Table('songauthors', metadata, autoload=True)
|
||||
#self.songs = Table('songs', metadata, autoload=True)
|
||||
|
||||
def add_author(self, author_name, first_name, last_name):
|
||||
log.debug( "add_author %s,%s,%s", author_name, first_name, last_name)
|
||||
def save_author(self, author):
|
||||
log.debug( "add_author %s,%s,%s", author.display_name, author.first_name, author.last_name)
|
||||
metadata.bind.echo = True
|
||||
session = self.Session()
|
||||
authorsmeta = Author(authorname=author_name, first_name=first_name,last_name=last_name)
|
||||
session.add(authorsmeta)
|
||||
session.save_or_update(author)
|
||||
session.commit()
|
||||
|
||||
def save_meta(self, key, value):
|
||||
@ -102,27 +94,37 @@ class SongDBImpl():
|
||||
|
||||
def get_song(self, songid):
|
||||
log.debug( "get_song ")
|
||||
metadata.bind.echo = True
|
||||
s = text (""" select * FROM songs where songid = :c """)
|
||||
return self.db.execute(s, c=songid).fetchone()
|
||||
# metadata.bind.echo = True
|
||||
# s = text (""" select * FROM songs where songid = :c """)
|
||||
# return self.db.execute(s, c=songid).fetchone()
|
||||
metadata.bind.echo = False
|
||||
session = self.Session()
|
||||
return session.query(Song).get(songid)
|
||||
|
||||
def get_authors(self):
|
||||
log.debug( "get_authors ")
|
||||
metadata.bind.echo = False
|
||||
session = self.Session()
|
||||
return session.query(Author).order_by(Author.authorname).all()
|
||||
return session.query(Author).order_by(Author.display_name).all()
|
||||
|
||||
def get_author(self, authorid):
|
||||
log.debug( "get_author %s" , authorid)
|
||||
metadata.bind.echo = True
|
||||
s = text (""" select * FROM authors where authorid = :i """)
|
||||
return self.db.execute(s, i=authorid).fetchone()
|
||||
# metadata.bind.echo = True
|
||||
# s = text (""" select * FROM authors where authorid = :i """)
|
||||
# return self.db.execute(s, i=authorid).fetchone()
|
||||
session = self.Session()
|
||||
return session.query(Author).get(authorid)
|
||||
|
||||
|
||||
def delete_author(self, authorid):
|
||||
log.debug( "delete_author %s" , authorid)
|
||||
metadata.bind.echo = True
|
||||
s = text (""" delete FROM authors where authorid = :i """)
|
||||
return self.db.execute(s, i=authorid)
|
||||
# metadata.bind.echo = True
|
||||
# s = text (""" delete FROM authors where authorid = :i """)
|
||||
# return self.db.execute(s, i=authorid)
|
||||
session = self.Session()
|
||||
author = session.query(Author).get(authorid)
|
||||
session.delete(author)
|
||||
session.commit()
|
||||
|
||||
def update_author(self, authorid, author_name, first_name, last_name):
|
||||
log.debug( "update_author %s,%s,%s,%s" , authorid, author_name, first_name, last_name)
|
||||
@ -133,7 +135,7 @@ class SongDBImpl():
|
||||
def get_song_authors_for_author(self, authorid):
|
||||
log.debug( "get_song_authors for author %s ", authorid)
|
||||
metadata.bind.echo = False
|
||||
s = text (""" select * FROM songauthors where authorid = :c """)
|
||||
s = text (""" select * FROM authors_songs where author_id = :c """)
|
||||
return self.db.execute(s, c=authorid).fetchall()
|
||||
|
||||
def get_song_authors_for_song(self, songid):
|
||||
@ -145,18 +147,24 @@ class SongDBImpl():
|
||||
def get_song_from_lyrics(self,searchtext):
|
||||
log.debug( "get_song_from_lyrics %s",searchtext)
|
||||
metadata.bind.echo = False
|
||||
searchtext = "%"+searchtext+"%"
|
||||
s = text (""" SELECT s.songid AS songid, s.songtitle AS songtitle, a.authorname AS authorname FROM songs s OUTER JOIN songauthors sa ON s.songid = sa.songid OUTER JOIN authors a ON sa.authorid = a.authorid WHERE s.lyrics LIKE :t ORDER BY s.songtitle ASC """)
|
||||
log.debug("Records returned from search %s", len(self.db.execute(s, t=searchtext).fetchall()))
|
||||
return self.db.execute(s, t=searchtext).fetchall()
|
||||
searchtext = unicode("%"+searchtext+"%")
|
||||
# s = text (""" SELECT s.songid AS songid, s.songtitle AS songtitle, a.authorname AS authorname FROM songs s OUTER JOIN songauthors sa ON s.songid = sa.songid OUTER JOIN authors a ON sa.authorid = a.authorid WHERE s.lyrics LIKE :t ORDER BY s.songtitle ASC """)
|
||||
# log.debug("Records returned from search %s", len(self.db.execute(s, t=searchtext).fetchall()))
|
||||
# return self.db.execute(s, t=searchtext).fetchall()
|
||||
metadata.bind.echo = False
|
||||
session = self.Session()
|
||||
return session.query(Song).filter(Song.search_lyrics.like(searchtext)).order_by(Song.title).all()
|
||||
|
||||
def get_song_from_title(self,searchtext):
|
||||
log.debug( "get_song_from_title %s",searchtext)
|
||||
# metadata.bind.echo = False
|
||||
searchtext = unicode("%"+searchtext+"%")
|
||||
# s = text (""" SELECT s.songid AS songid, s.songtitle AS songtitle, a.authorname AS authorname FROM songs s OUTER JOIN songauthors sa ON s.songid = sa.songid OUTER JOIN authors a ON sa.authorid = a.authorid WHERE s.songtitle LIKE :t ORDER BY s.songtitle ASC """)
|
||||
# log.debug("Records returned from search %s", len(self.db.execute(s, t=searchtext).fetchall()))
|
||||
# return self.db.execute(s, t=searchtext).fetchall()
|
||||
metadata.bind.echo = False
|
||||
searchtext = "%"+searchtext+"%"
|
||||
s = text (""" SELECT s.songid AS songid, s.songtitle AS songtitle, a.authorname AS authorname FROM songs s OUTER JOIN songauthors sa ON s.songid = sa.songid OUTER JOIN authors a ON sa.authorid = a.authorid WHERE s.songtitle LIKE :t ORDER BY s.songtitle ASC """)
|
||||
log.debug("Records returned from search %s", len(self.db.execute(s, t=searchtext).fetchall()))
|
||||
return self.db.execute(s, t=searchtext).fetchall()
|
||||
session = self.Session()
|
||||
return session.query(Song).filter(Song.search_title.like(searchtext)).order_by(Song.title).all()
|
||||
|
||||
def get_song_from_author(self,searchtext):
|
||||
log.debug( "get_song_from_author %s",searchtext)
|
||||
|
@ -42,11 +42,11 @@ class SongManager():
|
||||
self.songDBCache = None
|
||||
self.authorcache = None
|
||||
self.songPath = self.config.get_data_path()
|
||||
self.songSuffix = self.config.get_config("suffix name", u'olp3,sqlite')
|
||||
self.songSuffix = "sqlite"
|
||||
log.debug("Song Path %s and suffix %s", self.songPath, self.songSuffix )
|
||||
self.dialogobject = None
|
||||
|
||||
files = self.config.get_files()
|
||||
files = self.config.get_files(self.songSuffix)
|
||||
if len(files) > 0:
|
||||
log.debug("Song File %s", files )
|
||||
self.songDBCache = SongDBImpl(self.songPath,files[0], self.songSuffix)
|
||||
@ -81,14 +81,11 @@ class SongManager():
|
||||
"""
|
||||
return self.songDBCache.get_author(authorid)
|
||||
|
||||
def save_author(self, author_name, first_name, last_name, id = 0):
|
||||
def save_author(self, author):
|
||||
"""
|
||||
Save the Author and refresh the cache
|
||||
"""
|
||||
if id == 0:
|
||||
self.songDBCache.add_author(author_name, first_name, last_name)
|
||||
else:
|
||||
self.songDBCache.update_author(id, author_name, first_name, last_name)
|
||||
self.songDBCache.save_author(author)
|
||||
self.get_authors(True) # Updates occured refresh the cache
|
||||
return True
|
||||
|
||||
|
@ -17,7 +17,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
"""
|
||||
class Author(object):
|
||||
def __init__(self, authorname, first_name, last_name):
|
||||
#self.authorid = authorid
|
||||
self.authorname =authorname
|
||||
self.first_name =first_name
|
||||
self.last_name =last_name
|
||||
|
@ -25,7 +25,8 @@ from openlp.core.resources import *
|
||||
from openlp.core.lib import Plugin,PluginUtils, MediaManagerItem
|
||||
from forms import EditSongForm, OpenLPImportForm, OpenSongImportForm, \
|
||||
OpenLPExportForm, OpenSongExportForm
|
||||
from openlp.plugins.songs.lib import SongManager
|
||||
from openlp.plugins.songs.lib import SongManager
|
||||
from openlp.plugins.songs.lib.classes import *
|
||||
|
||||
class SongsPlugin(Plugin, PluginUtils):
|
||||
global log
|
||||
@ -46,7 +47,6 @@ class SongsPlugin(Plugin, PluginUtils):
|
||||
self.icon.addPixmap(QtGui.QPixmap(':/media/media_song.png'),
|
||||
QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||
self.songmanager = SongManager(self.config)
|
||||
self.searchresults = {} # place to store the search results
|
||||
|
||||
def get_media_manager_item(self):
|
||||
# Create the MediaManagerItem object
|
||||
@ -210,18 +210,19 @@ class SongsPlugin(Plugin, PluginUtils):
|
||||
|
||||
def onSearchTextButton(self):
|
||||
searchtext = str(self.SearchTextEdit.displayText() )
|
||||
searchresults = []
|
||||
ct = self.SearchTypeComboBox.currentText()
|
||||
if self.SearchTypeComboBox.currentText()=="Titles":
|
||||
log.debug("Titles Search")
|
||||
self.searchresults = self.songmanager.get_song_from_title(searchtext)
|
||||
searchresults = self.songmanager.get_song_from_title(searchtext)
|
||||
elif self.SearchTypeComboBox.currentText()=="Lyrics":
|
||||
log.debug("Lyrics Search")
|
||||
self.searchresults = self.songmanager.get_song_from_lyrics(searchtext)
|
||||
searchresults = self.songmanager.get_song_from_lyrics(searchtext)
|
||||
elif self.SearchTypeComboBox.currentText()=="Authors":
|
||||
log.debug("Authors Search")
|
||||
self.searchresults = self.songmanager.get_song_from_author(searchtext)
|
||||
searchresults = self.songmanager.get_song_from_author(searchtext)
|
||||
|
||||
self._display_results()
|
||||
self._display_results(searchresults)
|
||||
|
||||
def onSongSelected(self, item):
|
||||
print item
|
||||
@ -259,21 +260,22 @@ class SongsPlugin(Plugin, PluginUtils):
|
||||
def onExportOpenSongItemClicked(self):
|
||||
self.opensong_export_form.show()
|
||||
|
||||
def _display_results(self):
|
||||
def _display_results(self, searchresults):
|
||||
log.debug("_search results")
|
||||
self.SongListView.clear() # clear the results
|
||||
self.SongListView.setHorizontalHeaderLabels(QtCore.QStringList(["","Song Name","Author"]))
|
||||
self.SongListView.setVerticalHeaderLabels(QtCore.QStringList([""]))
|
||||
self.SongListView.setRowCount(0)
|
||||
log.debug("Records returned from search %s", len(self.searchresults))
|
||||
for id, txt, name in self.searchresults:
|
||||
c = self.SongListView.rowCount()
|
||||
self.SongListView.setRowCount(c+1)
|
||||
twi = QtGui.QTableWidgetItem(str(id))
|
||||
self.SongListView.setItem(c , 0, twi)
|
||||
twi = QtGui.QTableWidgetItem(str(txt))
|
||||
self.SongListView.setItem(c , 1, twi)
|
||||
twi = QtGui.QTableWidgetItem(str(name))
|
||||
self.SongListView.setItem(c , 2, twi)
|
||||
self.SongListView.setRowHeight(c, 20)
|
||||
log.debug("Records returned from search %s", len(searchresults))
|
||||
for song in searchresults:
|
||||
for author in song.authors:
|
||||
c = self.SongListView.rowCount()
|
||||
self.SongListView.setRowCount(c+1)
|
||||
twi = QtGui.QTableWidgetItem(str(song.id))
|
||||
self.SongListView.setItem(c , 0, twi)
|
||||
twi = QtGui.QTableWidgetItem(str(song.title))
|
||||
self.SongListView.setItem(c , 1, twi)
|
||||
twi = QtGui.QTableWidgetItem(str(author.display_name))
|
||||
self.SongListView.setItem(c , 2, twi)
|
||||
self.SongListView.setRowHeight(c, 20)
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>734</width>
|
||||
<height>761</height>
|
||||
<height>756</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@ -63,16 +63,6 @@
|
||||
<item row="3" column="0">
|
||||
<widget class="QLineEdit" name="AlternativeEdit"/>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="VerseOrderLabel">
|
||||
<property name="text">
|
||||
<string>Verse Order:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QLineEdit" name="VerseOrderEdit"/>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QLabel" name="LyricsLabel">
|
||||
<property name="text">
|
||||
@ -90,6 +80,16 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QLineEdit" name="VerseOrderEdit"/>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="VerseOrderLabel">
|
||||
<property name="text">
|
||||
<string>Verse Order:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
<zorder>TitleLabel</zorder>
|
||||
<zorder>TitleEditItem</zorder>
|
||||
@ -351,17 +351,13 @@
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
<zorder>CopyrightEditItem</zorder>
|
||||
<zorder>CCLLabel</zorder>
|
||||
<zorder>CCLNumberEdit</zorder>
|
||||
<zorder>CopyrightInsertItem</zorder>
|
||||
</widget>
|
||||
</widget>
|
||||
<widget class="QGroupBox" name="ThemeGroupBox">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>540</y>
|
||||
<y>630</y>
|
||||
<width>711</width>
|
||||
<height>66</height>
|
||||
</rect>
|
||||
@ -388,6 +384,24 @@
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QGroupBox" name="CommentGroup">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>10</x>
|
||||
<y>530</y>
|
||||
<width>701</width>
|
||||
<height>111</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Comments</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_5">
|
||||
<item row="0" column="0">
|
||||
<widget class="QTextEdit" name="CommentsEdit"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
<widget class="QDialogButtonBox" name="ButtonBox">
|
||||
<property name="geometry">
|
||||
|
Loading…
Reference in New Issue
Block a user