diff --git a/openlp/core/lib/rendermanager.py b/openlp/core/lib/rendermanager.py index 3efc03858..6cb117b2b 100644 --- a/openlp/core/lib/rendermanager.py +++ b/openlp/core/lib/rendermanager.py @@ -53,7 +53,10 @@ class RenderManager(object): self.screen_list = screen_list self.theme_manager = theme_manager self.displays = len(screen_list) - self.current_display = screen_number + if (screen_number + 1) > len(screen_list): + self.current_display = 0 + else: + self.current_display = screen_number self.renderer = Renderer() self.calculate_default(self.screen_list[self.current_display][u'size']) self.theme = u'' diff --git a/openlp/plugins/songs/forms/__init__.py b/openlp/plugins/songs/forms/__init__.py index 26b623778..4bc392b81 100644 --- a/openlp/plugins/songs/forms/__init__.py +++ b/openlp/plugins/songs/forms/__init__.py @@ -23,6 +23,7 @@ from topicsform import TopicsForm from songbookform import SongBookForm from editverseform import EditVerseForm from editsongform import EditSongForm +from songmaintenanceform import SongMaintenanceForm from openlpexportform import OpenLPExportForm from openlpimportform import OpenLPImportForm diff --git a/openlp/plugins/songs/forms/authorsdialog.py b/openlp/plugins/songs/forms/authorsdialog.py index 44fe4c478..4e631b664 100644 --- a/openlp/plugins/songs/forms/authorsdialog.py +++ b/openlp/plugins/songs/forms/authorsdialog.py @@ -23,99 +23,56 @@ from openlp.core.lib import translate class Ui_AuthorsDialog(object): def setupUi(self, AuthorsDialog): AuthorsDialog.setObjectName(u'AuthorsDialog') - AuthorsDialog.resize(410, 505) - self.DialogLayout = QtGui.QVBoxLayout(AuthorsDialog) - self.DialogLayout.setSpacing(8) - self.DialogLayout.setMargin(8) - self.DialogLayout.setObjectName(u'DialogLayout') - self.AuthorListWidget = QtGui.QListWidget() - self.AuthorListWidget.setAlternatingRowColors(True) - self.DialogLayout.addWidget(self.AuthorListWidget) - self.AuthorDetails = QtGui.QGroupBox(AuthorsDialog) - self.AuthorDetails.setMinimumSize(QtCore.QSize(0, 0)) - self.AuthorDetails.setObjectName(u'AuthorDetails') - self.AuthorLayout = QtGui.QVBoxLayout(self.AuthorDetails) - self.AuthorLayout.setSpacing(8) - self.AuthorLayout.setMargin(8) - self.AuthorLayout.setObjectName(u'AuthorLayout') - self.DetailsWidget = QtGui.QWidget(self.AuthorDetails) - self.DetailsWidget.setObjectName(u'DetailsWidget') - self.DetailsLayout = QtGui.QFormLayout(self.DetailsWidget) - self.DetailsLayout.setMargin(0) - self.DetailsLayout.setSpacing(8) - self.DetailsLayout.setObjectName(u'DetailsLayout') - self.DisplayLabel = QtGui.QLabel(self.DetailsWidget) - self.DisplayLabel.setObjectName(u'DisplayLabel') - self.DetailsLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.DisplayLabel) - self.DisplayEdit = QtGui.QLineEdit(self.DetailsWidget) - self.DisplayEdit.setObjectName(u'DisplayEdit') - self.DetailsLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.DisplayEdit) - self.FirstNameLabel = QtGui.QLabel(self.DetailsWidget) + AuthorsDialog.resize(393, 147) + self.AuthorsLayout = QtGui.QFormLayout(AuthorsDialog) + self.AuthorsLayout.setMargin(8) + self.AuthorsLayout.setSpacing(8) + self.AuthorsLayout.setObjectName(u'AuthorsLayout') + self.FirstNameLabel = QtGui.QLabel(AuthorsDialog) self.FirstNameLabel.setObjectName(u'FirstNameLabel') - self.DetailsLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.FirstNameLabel) - self.FirstNameEdit = QtGui.QLineEdit(self.DetailsWidget) + self.AuthorsLayout.setWidget(0, + QtGui.QFormLayout.LabelRole, self.FirstNameLabel) + self.FirstNameEdit = QtGui.QLineEdit(AuthorsDialog) self.FirstNameEdit.setObjectName(u'FirstNameEdit') - self.DetailsLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.FirstNameEdit) - self.LastNameLabel = QtGui.QLabel(self.DetailsWidget) + self.AuthorsLayout.setWidget(0, + QtGui.QFormLayout.FieldRole, self.FirstNameEdit) + self.LastNameLabel = QtGui.QLabel(AuthorsDialog) self.LastNameLabel.setObjectName(u'LastNameLabel') - self.DetailsLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.LastNameLabel) - self.LastNameEdit = QtGui.QLineEdit(self.DetailsWidget) + self.AuthorsLayout.setWidget(1, + QtGui.QFormLayout.LabelRole, self.LastNameLabel) + self.LastNameEdit = QtGui.QLineEdit(AuthorsDialog) self.LastNameEdit.setObjectName(u'LastNameEdit') - self.DetailsLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.LastNameEdit) - self.AuthorLayout.addWidget(self.DetailsWidget) - self.MessageLabel = QtGui.QLabel(self.AuthorDetails) - self.MessageLabel.setObjectName(u'MessageLabel') - self.AuthorLayout.addWidget(self.MessageLabel) - self.ButtonWidget = QtGui.QWidget(self.AuthorDetails) - self.ButtonWidget.setMinimumSize(QtCore.QSize(0, 0)) - self.ButtonWidget.setObjectName(u'ButtonWidget') - self.ButtonLayout = QtGui.QHBoxLayout(self.ButtonWidget) - self.ButtonLayout.setSpacing(8) - self.ButtonLayout.setMargin(0) - self.ButtonLayout.setObjectName(u'ButtonLayout') - spacerItem = QtGui.QSpacerItem(198, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.ButtonLayout.addItem(spacerItem) - self.ClearButton = QtGui.QPushButton(self.ButtonWidget) - icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(u':/services/service_new.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.ClearButton.setIcon(icon) - self.ClearButton.setObjectName(u'ClearButton') - self.ButtonLayout.addWidget(self.ClearButton) - self.AddUpdateButton = QtGui.QPushButton(self.ButtonWidget) - icon1 = QtGui.QIcon() - icon1.addPixmap(QtGui.QPixmap(u':/services/service_save.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.AddUpdateButton.setIcon(icon1) - self.AddUpdateButton.setObjectName(u'AddUpdateButton') - self.ButtonLayout.addWidget(self.AddUpdateButton) - self.DeleteButton = QtGui.QPushButton(self.ButtonWidget) - icon2 = QtGui.QIcon() - icon2.addPixmap(QtGui.QPixmap(u':/services/service_delete.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.DeleteButton.setIcon(icon2) - self.DeleteButton.setObjectName(u'DeleteButton') - self.ButtonLayout.addWidget(self.DeleteButton) - self.AuthorLayout.addWidget(self.ButtonWidget) - self.DialogLayout.addWidget(self.AuthorDetails) - self.buttonBox = QtGui.QDialogButtonBox(AuthorsDialog) - self.buttonBox.setOrientation(QtCore.Qt.Horizontal) - self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok) - self.buttonBox.setObjectName(u'buttonBox') - self.DialogLayout.addWidget(self.buttonBox) + self.AuthorsLayout.setWidget(1, + QtGui.QFormLayout.FieldRole, self.LastNameEdit) + self.DisplayLabel = QtGui.QLabel(AuthorsDialog) + self.DisplayLabel.setObjectName(u'DisplayLabel') + self.AuthorsLayout.setWidget(2, + QtGui.QFormLayout.LabelRole, self.DisplayLabel) + self.DisplayEdit = QtGui.QLineEdit(AuthorsDialog) + self.DisplayEdit.setObjectName(u'DisplayEdit') + self.AuthorsLayout.setWidget(2, + QtGui.QFormLayout.FieldRole, self.DisplayEdit) + self.AuthorButtonBox = QtGui.QDialogButtonBox(AuthorsDialog) + self.AuthorButtonBox.setOrientation(QtCore.Qt.Horizontal) + self.AuthorButtonBox.setStandardButtons( + QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save) + self.AuthorButtonBox.setObjectName(u'AuthorButtonBox') + self.AuthorsLayout.setWidget(3, + QtGui.QFormLayout.FieldRole, self.AuthorButtonBox) self.retranslateUi(AuthorsDialog) - QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'accepted()'), AuthorsDialog.accept) - QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'rejected()'), AuthorsDialog.reject) + QtCore.QObject.connect(self.AuthorButtonBox, + QtCore.SIGNAL(u'accepted()'), AuthorsDialog.accept) + QtCore.QObject.connect(self.AuthorButtonBox, + QtCore.SIGNAL(u'rejected()'), AuthorsDialog.reject) QtCore.QMetaObject.connectSlotsByName(AuthorsDialog) def retranslateUi(self, AuthorsDialog): - AuthorsDialog.setWindowTitle(translate(u'AuthorsDialog', u'Author Maintenance')) - self.AuthorDetails.setTitle(translate(u'AuthorsDialog', u'Author Details')) - self.DisplayLabel.setText(translate(u'AuthorsDialog', u'Display Name:')) - self.FirstNameLabel.setText(translate(u'AuthorsDialog', u'First Name:')) - self.LastNameLabel.setText(translate(u'AuthorsDialog', u'Last Name:')) - self.ClearButton.setToolTip(translate(u'AuthorsDialog', u'Clear Selection')) - self.ClearButton.setText(translate(u'AuthorsDialog', u'Clear')) - self.AddUpdateButton.setToolTip(translate(u'AuthorsDialog', u'Add Update Author')) - self.AddUpdateButton.setText(translate(u'AuthorsDialog', u'Save')) - self.DeleteButton.setToolTip(translate(u'AuthorsDialog', u'Delete Author')) - self.DeleteButton.setText(translate(u'AuthorsDialog', u'Delete')) - self.buttonBox.setToolTip(translate(u'AuthorsDialog', u'Exit Screen')) + AuthorsDialog.setWindowTitle( + translate(u'AuthorsDialog', u'Author Maintenance')) + self.DisplayLabel.setText( + translate(u'AuthorsDialog', u'Display name:')) + self.FirstNameLabel.setText( + translate(u'AuthorsDialog', u'First name:')) + self.LastNameLabel.setText( + translate(u'AuthorsDialog', u'Last name:')) diff --git a/openlp/plugins/songs/forms/authorsform.py b/openlp/plugins/songs/forms/authorsform.py index 3a8478c93..0ce8b6d75 100644 --- a/openlp/plugins/songs/forms/authorsform.py +++ b/openlp/plugins/songs/forms/authorsform.py @@ -18,123 +18,82 @@ Place, Suite 330, Boston, MA 02111-1307 USA """ from PyQt4 import QtGui, QtCore from openlp.core.lib import translate -from openlp.plugins.songs.forms.authorsdialog import Ui_AuthorsDialog -from openlp.plugins.songs.lib.classes import Author +from authorsdialog import Ui_AuthorsDialog class AuthorsForm(QtGui.QDialog, Ui_AuthorsDialog): """ Class to control the Maintenance of Authors Dialog """ - def __init__(self, songmanager, parent = None): + def __init__(self, parent=None): """ Set up the screen and common data """ QtGui.QDialog.__init__(self, parent) self.setupUi(self) - self.songmanager = songmanager - self.currentRow = 0 - self.author = None + self.autoDisplayName = False + QtCore.QObject.connect(self.FirstNameEdit, + QtCore.SIGNAL(u'textEdited(QString)'), self.onFirstNameEditTextEdited) + QtCore.QObject.connect(self.LastNameEdit, + QtCore.SIGNAL(u'textEdited(QString)'), self.onLastNameEditTextEdited) - QtCore.QObject.connect(self.DeleteButton, - QtCore.SIGNAL(u'pressed()'), self.onDeleteButtonClick) - QtCore.QObject.connect(self.ClearButton, - QtCore.SIGNAL(u'pressed()'), self.onClearButtonClick) - QtCore.QObject.connect(self.AddUpdateButton, - QtCore.SIGNAL(u'pressed()'), self.onAddUpdateButtonClick) - QtCore.QObject.connect(self.DisplayEdit, - QtCore.SIGNAL(u'lostFocus()'), self.onDisplayEditLostFocus) - QtCore.QObject.connect(self.AuthorListWidget, - QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onAuthorListWidgetItemClicked) + def exec_(self, clear=True): + if clear: + self.FirstNameEdit.clear() + self.LastNameEdit.clear() + self.DisplayEdit.clear() + self.FirstNameEdit.setFocus() + return QtGui.QDialog.exec_(self) - def load_form(self): - """ - Refresh the screen and rest fields - """ - self.AuthorListWidget.clear() - # tidy up screen - self.onClearButtonClick() - authors = self.songmanager.get_authors() - for author in authors: - author_name = QtGui.QListWidgetItem(author.display_name) - author_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(author.id)) - self.AuthorListWidget.addItem(author_name) - if self.currentRow >= self.AuthorListWidget.count() : - self.AuthorListWidget.setCurrentRow(self.AuthorListWidget.count() - 1) + def onFirstNameEditTextEdited(self, text): + if not self.autoDisplayName: + return + display_name = text + if self.LastNameEdit.text() != u'': + display_name = display_name + u' ' + self.LastNameEdit.text() + self.DisplayEdit.setText(display_name) + + def onLastNameEditTextEdited(self, text): + if not self.autoDisplayName: + return + display_name = text + if self.FirstNameEdit.text() != u'': + display_name = self.FirstNameEdit.text() + u' ' + display_name + self.DisplayEdit.setText(display_name) + + def autoDisplayName(self): + return self.autoDisplayName + + def setAutoDisplayName(self, on): + self.autoDisplayName = on + + def accept(self): + if self.FirstNameEdit.text() == u'': + QtGui.QMessageBox.critical(self, + translate(u'AuthorsDialog', u'Error'), + translate(u'AuthorsDialog', u'You need to type in the first name of the author.'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + self.FirstNameEdit.setFocus() + return False + elif self.LastNameEdit.text() == u'': + QtGui.QMessageBox.critical(self, + translate(u'AuthorsDialog', u'Error'), + translate(u'AuthorsDialog', u'You need to type in the last name of the author.'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + self.LastNameEdit.setFocus() + return False + elif self.DisplayEdit.text() == u'': + if QtGui.QMessageBox.critical(self, + translate(u'AuthorsDialog', u'Error'), + translate(u'AuthorsDialog', u'You haven\'t set a display name for the author, would you like me to combine the first and last names for you?'), + QtGui.QMessageBox.StandardButtons( + QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) + ) == QtGui.QMessageBox.Yes: + self.DisplayEdit.setText(self.FirstNameEdit.text() + \ + u' ' + self.LastNameEdit.text()) + return QtGui.QDialog.accept(self) + else: + self.DisplayEdit.setFocus() + return False else: - self.AuthorListWidget.setCurrentRow(self.currentRow) - self._validate_form() - self.onAuthorListWidgetItemClicked() + return QtGui.QDialog.accept(self) - def onDeleteButtonClick(self): - """ - Delete the author is the Author is not attached to any songs - """ - self.songmanager.delete_author(self.author.id) - self.load_form() - - def onDisplayEditLostFocus(self): - self._validate_form() - - def onAddUpdateButtonClick(self): - """ - Sent New or update details to the database - """ - 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.onClearButtonClick() - self.load_form() - - def onClearButtonClick(self): - """ - Tidy up screen if clear button pressed - """ - 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() - self.DisplayEdit.setFocus() - - def onAuthorListWidgetItemClicked(self): - """ - An Author has been selected display it - If the author is attached to a Song prevent delete - """ - self.currentRow = self.AuthorListWidget.currentRow() - item = self.AuthorListWidget.currentItem() - if item is not None: - item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] - self.author = self.songmanager.get_author(item_id) - self.DisplayEdit.setText(self.author.display_name) - if self.author.first_name is None: - self.FirstNameEdit.setText(u'') - else: - self.FirstNameEdit.setText(self.author.first_name) - if self.author.last_name is None: - self.LastNameEdit.setText(u'') - else: - self.LastNameEdit.setText(self.author.last_name) - if len(self.author.songs) > 0: - self.MessageLabel.setText(translate(u'AuthorForm', u'Author in use "Delete" is disabled')) - self.DeleteButton.setEnabled(False) - else: - self.MessageLabel.setText(translate(u'AuthorForm', u'Author in not used')) - self.DeleteButton.setEnabled(True) - self._validate_form() - self.DisplayEdit.setFocus() - - def _validate_form(self): - """ - Validate the form and set if Add button if valid. - """ - # 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/songbookdialog.py b/openlp/plugins/songs/forms/songbookdialog.py index 90e9989cc..6cd1a5abc 100644 --- a/openlp/plugins/songs/forms/songbookdialog.py +++ b/openlp/plugins/songs/forms/songbookdialog.py @@ -23,97 +23,46 @@ from openlp.core.lib import translate class Ui_SongBookDialog(object): def setupUi(self, SongBookDialog): SongBookDialog.setObjectName(u'SongBookDialog') - SongBookDialog.resize(387, 531) - self.DialogLayout = QtGui.QVBoxLayout(SongBookDialog) - self.DialogLayout.setSpacing(8) - self.DialogLayout.setMargin(8) - self.DialogLayout.setObjectName(u'DialogLayout') - self.BookSongListWidget = QtGui.QListWidget() - self.BookSongListWidget.setAlternatingRowColors(True) - self.DialogLayout.addWidget(self.BookSongListWidget) - self.DialogLayout.addWidget(self.BookSongListWidget) - self.SongBookGroup = QtGui.QGroupBox(SongBookDialog) - self.SongBookGroup.setMinimumSize(QtCore.QSize(0, 200)) - self.SongBookGroup.setObjectName(u'SongBookGroup') - self.SongBookLayout = QtGui.QVBoxLayout(self.SongBookGroup) - self.SongBookLayout.setSpacing(8) + SongBookDialog.resize(367, 120) + self.SongBookLayout = QtGui.QFormLayout(SongBookDialog) self.SongBookLayout.setMargin(8) + self.SongBookLayout.setSpacing(8) self.SongBookLayout.setObjectName(u'SongBookLayout') - self.DetailsWidget = QtGui.QWidget(self.SongBookGroup) - self.DetailsWidget.setMinimumSize(QtCore.QSize(0, 0)) - self.DetailsWidget.setObjectName(u'DetailsWidget') - self.DetailsLayout = QtGui.QFormLayout(self.DetailsWidget) - self.DetailsLayout.setMargin(0) - self.DetailsLayout.setSpacing(8) - self.DetailsLayout.setObjectName(u'DetailsLayout') - self.NameLabel = QtGui.QLabel(self.DetailsWidget) + self.NameLabel = QtGui.QLabel(SongBookDialog) self.NameLabel.setObjectName(u'NameLabel') - self.DetailsLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.NameLabel) - self.NameEdit = QtGui.QLineEdit(self.DetailsWidget) + self.SongBookLayout.setWidget(0, + QtGui.QFormLayout.LabelRole, self.NameLabel) + self.NameEdit = QtGui.QLineEdit(SongBookDialog) self.NameEdit.setObjectName(u'NameEdit') - self.DetailsLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.NameEdit) - self.PublisherLabel = QtGui.QLabel(self.DetailsWidget) + self.SongBookLayout.setWidget(0, + QtGui.QFormLayout.FieldRole, self.NameEdit) + self.PublisherLabel = QtGui.QLabel(SongBookDialog) self.PublisherLabel.setObjectName(u'PublisherLabel') - self.DetailsLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.PublisherLabel) - self.PublisherEdit = QtGui.QLineEdit(self.DetailsWidget) + self.SongBookLayout.setWidget(1, + QtGui.QFormLayout.LabelRole, self.PublisherLabel) + self.PublisherEdit = QtGui.QLineEdit(SongBookDialog) self.PublisherEdit.setObjectName(u'PublisherEdit') - self.DetailsLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.PublisherEdit) - self.SongBookLayout.addWidget(self.DetailsWidget) - self.MessageLabel = QtGui.QLabel(self.SongBookGroup) - self.MessageLabel.setObjectName(u'MessageLabel') - self.SongBookLayout.addWidget(self.MessageLabel) - self.ButtonWidget = QtGui.QWidget(self.SongBookGroup) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.ButtonWidget.sizePolicy().hasHeightForWidth()) - self.ButtonWidget.setSizePolicy(sizePolicy) - self.ButtonWidget.setMinimumSize(QtCore.QSize(0, 0)) - self.ButtonWidget.setObjectName(u'ButtonWidget') - self.ButtonLayout = QtGui.QHBoxLayout(self.ButtonWidget) - self.ButtonLayout.setSpacing(8) - self.ButtonLayout.setMargin(0) - self.ButtonLayout.setObjectName(u'ButtonLayout') - spacerItem = QtGui.QSpacerItem(61, 24, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.ButtonLayout.addItem(spacerItem) - self.ClearButton = QtGui.QPushButton(self.ButtonWidget) - icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(u':/services/service_new.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.ClearButton.setIcon(icon) - self.ClearButton.setObjectName(u'ClearButton') - self.ButtonLayout.addWidget(self.ClearButton) - self.AddUpdateButton = QtGui.QPushButton(self.ButtonWidget) - icon1 = QtGui.QIcon() - icon1.addPixmap(QtGui.QPixmap(u':/services/service_save.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.AddUpdateButton.setIcon(icon1) - self.AddUpdateButton.setObjectName(u'AddUpdateButton') - self.ButtonLayout.addWidget(self.AddUpdateButton) - self.DeleteButton = QtGui.QPushButton(self.ButtonWidget) - icon2 = QtGui.QIcon() - icon2.addPixmap(QtGui.QPixmap(u':/services/service_delete.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.DeleteButton.setIcon(icon2) - self.DeleteButton.setObjectName(u'DeleteButton') - self.ButtonLayout.addWidget(self.DeleteButton) - self.SongBookLayout.addWidget(self.ButtonWidget) - self.DialogLayout.addWidget(self.SongBookGroup) + self.SongBookLayout.setWidget(1, + QtGui.QFormLayout.FieldRole, self.PublisherEdit) self.ButtonBox = QtGui.QDialogButtonBox(SongBookDialog) self.ButtonBox.setOrientation(QtCore.Qt.Horizontal) - self.ButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok) + self.ButtonBox.setStandardButtons( + QtGui.QDialogButtonBox.Save | QtGui.QDialogButtonBox.Cancel) self.ButtonBox.setObjectName(u'ButtonBox') - self.DialogLayout.addWidget(self.ButtonBox) + self.SongBookLayout.setWidget(2, + QtGui.QFormLayout.FieldRole, self.ButtonBox) + self.retranslateUi(SongBookDialog) - QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(u'accepted()'), SongBookDialog.accept) - QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(u'rejected()'), SongBookDialog.reject) + QtCore.QObject.connect(self.ButtonBox, + QtCore.SIGNAL(u'accepted()'), SongBookDialog.accept) + QtCore.QObject.connect(self.ButtonBox, + QtCore.SIGNAL(u'rejected()'), SongBookDialog.reject) QtCore.QMetaObject.connectSlotsByName(SongBookDialog) def retranslateUi(self, SongBookDialog): - SongBookDialog.setWindowTitle(translate(u'SongBookDialog', u'Book Song Maintenance')) - self.SongBookGroup.setTitle(translate(u'SongBookDialog', u'Song Book')) - self.NameLabel.setText(translate(u'SongBookDialog', u'Name:')) - self.PublisherLabel.setText(translate(u'SongBookDialog', u'Publisher:')) - self.ClearButton.setToolTip(translate(u'SongBookDialog', u'Clear Selection')) - self.ClearButton.setText(translate(u'SongBookDialog', u'Clear')) - self.AddUpdateButton.setToolTip(translate(u'SongBookDialog', u'Add Update Author')) - self.AddUpdateButton.setText(translate(u'SongBookDialog', u'Save')) - self.DeleteButton.setToolTip(translate(u'SongBookDialog', u'Delete Author')) - self.DeleteButton.setText(translate(u'SongBookDialog', u'Delete')) + SongBookDialog.setWindowTitle( + translate(u'SongBookDialog', u'Edit Book')) + self.NameLabel.setText( + translate(u'SongBookDialog', u'Name:')) + self.PublisherLabel.setText( + translate(u'SongBookDialog', u'Publisher:')) diff --git a/openlp/plugins/songs/forms/songbookform.py b/openlp/plugins/songs/forms/songbookform.py index e4771d4a3..d104d6749 100644 --- a/openlp/plugins/songs/forms/songbookform.py +++ b/openlp/plugins/songs/forms/songbookform.py @@ -20,109 +20,33 @@ Place, Suite 330, Boston, MA 02111-1307 USA from PyQt4 import QtGui, QtCore from openlp.core.lib import translate from songbookdialog import Ui_SongBookDialog -from openlp.plugins.songs.lib.classes import Book class SongBookForm(QtGui.QDialog, Ui_SongBookDialog): """ Class documentation goes here. """ - def __init__(self, songmanager, parent = None): + def __init__(self, parent=None): """ Constructor """ QtGui.QDialog.__init__(self, parent) self.setupUi(self) - self.songmanager = songmanager - self.currentRow = 0 - self.songbook = None - QtCore.QObject.connect(self.DeleteButton, - QtCore.SIGNAL(u'pressed()'), self.onDeleteButtonClick) - QtCore.QObject.connect(self.ClearButton, - QtCore.SIGNAL(u'pressed()'), self.onClearButtonClick) - QtCore.QObject.connect(self.AddUpdateButton, - QtCore.SIGNAL(u'pressed()'), self.onAddUpdateButtonClick) - QtCore.QObject.connect(self.NameEdit, - QtCore.SIGNAL(u'lostFocus()'), self.onBookNameEditLostFocus) - QtCore.QObject.connect(self.BookSongListWidget, - QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onBooksListViewItemClicked) - - def load_form(self): - """ - Refresh the screen and rest fields - """ - self.BookSongListWidget.clear() - self.onClearButtonClick() # tidy up screen - books = self.songmanager.get_books() - for book in books: - book_name = QtGui.QListWidgetItem(book.name) - book_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(book.id)) - self.BookSongListWidget.addItem(book_name) - if self.currentRow >= self.BookSongListWidget.count() : - self.BookSongListWidget.setCurrentRow(self.BookSongListWidget.count() - 1) - else: - self.BookSongListWidget.setCurrentRow(self.currentRow) - self.onBooksListViewItemClicked() - - def onDeleteButtonClick(self): - """ - Delete the Book is the Book is not attached to any songs - """ - self.songmanager.delete_book(self.Book.id) - self.load_form() - - def onBookNameEditLostFocus(self): - self._validate_form() - - def onAddUpdateButtonClick(self): - """ - Sent New or update details to the database - """ - 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 exec_(self, clear=True): + if clear: + self.NameEdit.clear() + self.PublisherEdit.clear() self.NameEdit.setFocus() + return QtGui.QDialog.exec_(self) - def onBooksListViewItemClicked(self): - """ - An Book has been selected display it - If the Book is attached to a Song prevent delete - """ - self.currentRow = self.BookSongListWidget.currentRow() - item = self.BookSongListWidget.currentItem() - if item is not None: - item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] - self.Book = self.songmanager.get_book(item_id) - self.NameEdit.setText(self.Book.name) - self.PublisherEdit.setText(self.Book.publisher) - if len(self.Book.songs) > 0: - self.MessageLabel.setText(translate(u'BookForm', u'Book in use "Delete" is disabled')) - self.DeleteButton.setEnabled(False) - else: - self.MessageLabel.setText(translate(u'BookForm', u'Book in not used')) - self.DeleteButton.setEnabled(True) - self._validate_form() - self.NameEdit.setFocus() - - def _validate_form(self): - # We need at lease a display name - if len(self.NameEdit.displayText()) == 0: - self.AddUpdateButton.setEnabled(False) + def accept(self): + if self.NameEdit.text() == u'': + QtGui.QMessageBox.critical(self, + translate(u'SongBookDialog', u'Error'), + translate(u'SongBookDialog', u'You need to type in a book name!'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + self.NameEdit.setFocus() + return False else: - self.AddUpdateButton.setEnabled(True) + return QtGui.QDialog.accept(self) + diff --git a/openlp/plugins/songs/forms/songmaintenancedialog.py b/openlp/plugins/songs/forms/songmaintenancedialog.py new file mode 100644 index 000000000..5aff9053e --- /dev/null +++ b/openlp/plugins/songs/forms/songmaintenancedialog.py @@ -0,0 +1,254 @@ +# -*- 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 +""" +from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate + +class Ui_SongMaintenanceDialog(object): + def setupUi(self, SongMaintenanceDialog): + SongMaintenanceDialog.setObjectName(u'SongMaintenanceDialog') + SongMaintenanceDialog.setWindowModality(QtCore.Qt.ApplicationModal) + SongMaintenanceDialog.resize(486, 361) + self.DialogLayout = QtGui.QVBoxLayout(SongMaintenanceDialog) + self.DialogLayout.setSpacing(8) + self.DialogLayout.setMargin(8) + self.DialogLayout.setObjectName(u'DialogLayout') + self.ContentWidget = QtGui.QWidget(SongMaintenanceDialog) + self.ContentWidget.setObjectName(u'ContentWidget') + self.ContentLayout = QtGui.QHBoxLayout(self.ContentWidget) + self.ContentLayout.setSpacing(8) + self.ContentLayout.setMargin(0) + self.ContentLayout.setObjectName(u'ContentLayout') + self.TypeListWidget = QtGui.QListWidget(self.ContentWidget) + sizePolicy = QtGui.QSizePolicy( + QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth( + self.TypeListWidget.sizePolicy().hasHeightForWidth()) + self.TypeListWidget.setSizePolicy(sizePolicy) + self.TypeListWidget.setViewMode(QtGui.QListView.IconMode) + self.TypeListWidget.setIconSize(QtCore.QSize(112, 100)); + self.TypeListWidget.setMovement(QtGui.QListView.Static); + self.TypeListWidget.setMaximumWidth(118); + self.TypeListWidget.setSpacing(3); + self.TypeListWidget.setSortingEnabled(False) + self.TypeListWidget.setUniformItemSizes(True) + self.TypeListWidget.setObjectName(u'TypeListWidget') + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(u':/songs/author_maintenance.png'), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + item = QtGui.QListWidgetItem(self.TypeListWidget) + item.setIcon(icon) + icon1 = QtGui.QIcon() + icon1.addPixmap(QtGui.QPixmap(u':/songs/topic_maintenance.png'), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + item = QtGui.QListWidgetItem(self.TypeListWidget) + item.setIcon(icon1) + icon2 = QtGui.QIcon() + icon2.addPixmap(QtGui.QPixmap(u':/songs/book_maintenance.png'), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + item = QtGui.QListWidgetItem(self.TypeListWidget) + item.setIcon(icon2) + self.ContentLayout.addWidget(self.TypeListWidget) + self.TypeStackedWidget = QtGui.QStackedWidget(self.ContentWidget) + self.TypeStackedWidget.setObjectName(u'TypeStackedWidget') + self.AuthorsPage = QtGui.QWidget() + self.AuthorsPage.setObjectName(u'AuthorsPage') + self.AuthorsLayout = QtGui.QVBoxLayout(self.AuthorsPage) + self.AuthorsLayout.setSpacing(4) + self.AuthorsLayout.setMargin(0) + self.AuthorsLayout.setObjectName(u'AuthorsLayout') + self.AuthorsListWidget = QtGui.QListWidget(self.AuthorsPage) + self.AuthorsListWidget.setObjectName(u'AuthorsListWidget') + self.AuthorsLayout.addWidget(self.AuthorsListWidget) + self.AuthorButtonWidget = QtGui.QWidget(self.AuthorsPage) + self.AuthorButtonWidget.setObjectName(u'AuthorButtonWidget') + self.AuthorButtonsLayout = QtGui.QHBoxLayout(self.AuthorButtonWidget) + self.AuthorButtonsLayout.setSpacing(8) + self.AuthorButtonsLayout.setMargin(0) + self.AuthorButtonsLayout.setObjectName(u'AuthorButtonsLayout') + spacerItem = QtGui.QSpacerItem(40, 20, + QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.AuthorButtonsLayout.addItem(spacerItem) + self.AuthorAddButton = QtGui.QPushButton(self.AuthorButtonWidget) + icon3 = QtGui.QIcon() + icon3.addPixmap(QtGui.QPixmap(u':/songs/author_add.png'), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.AuthorAddButton.setIcon(icon3) + self.AuthorAddButton.setObjectName(u'AuthorAddButton') + self.AuthorButtonsLayout.addWidget(self.AuthorAddButton) + self.AuthorEditButton = QtGui.QPushButton(self.AuthorButtonWidget) + icon4 = QtGui.QIcon() + icon4.addPixmap(QtGui.QPixmap(u':/songs/author_edit.png'), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.AuthorEditButton.setIcon(icon4) + self.AuthorEditButton.setObjectName(u'AuthorEditButton') + self.AuthorButtonsLayout.addWidget(self.AuthorEditButton) + self.AuthorDeleteButton = QtGui.QPushButton(self.AuthorButtonWidget) + icon5 = QtGui.QIcon() + icon5.addPixmap(QtGui.QPixmap(u':/songs/author_delete.png'), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.AuthorDeleteButton.setIcon(icon5) + self.AuthorDeleteButton.setObjectName(u'AuthorDeleteButton') + self.AuthorButtonsLayout.addWidget(self.AuthorDeleteButton) + self.AuthorsLayout.addWidget(self.AuthorButtonWidget) + self.AuthorsLine = QtGui.QFrame(self.AuthorsPage) + self.AuthorsLine.setFrameShape(QtGui.QFrame.HLine) + self.AuthorsLine.setFrameShadow(QtGui.QFrame.Sunken) + self.AuthorsLine.setObjectName(u'AuthorsLine') + self.AuthorsLayout.addWidget(self.AuthorsLine) + self.TypeStackedWidget.addWidget(self.AuthorsPage) + self.TopicsPage = QtGui.QWidget() + self.TopicsPage.setObjectName(u'TopicsPage') + self.TopicLayout = QtGui.QVBoxLayout(self.TopicsPage) + self.TopicLayout.setSpacing(4) + self.TopicLayout.setMargin(0) + self.TopicLayout.setObjectName(u'TopicLayout') + self.TopicsListWidget = QtGui.QListWidget(self.TopicsPage) + self.TopicsListWidget.setObjectName(u'TopicsListWidget') + self.TopicLayout.addWidget(self.TopicsListWidget) + self.TopicButtonWidget = QtGui.QWidget(self.TopicsPage) + self.TopicButtonWidget.setObjectName(u'TopicButtonWidget') + self.TopicButtonLayout = QtGui.QHBoxLayout(self.TopicButtonWidget) + self.TopicButtonLayout.setSpacing(8) + self.TopicButtonLayout.setMargin(0) + self.TopicButtonLayout.setObjectName(u'TopicButtonLayout') + TopicSpacerItem = QtGui.QSpacerItem(54, 20, + QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.TopicButtonLayout.addItem(TopicSpacerItem) + self.TopicAddButton = QtGui.QPushButton(self.TopicButtonWidget) + icon6 = QtGui.QIcon() + icon6.addPixmap(QtGui.QPixmap(u':/songs/topic_add.png'), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.TopicAddButton.setIcon(icon6) + self.TopicAddButton.setObjectName(u'TopicAddButton') + self.TopicButtonLayout.addWidget(self.TopicAddButton) + self.TopicEditButton = QtGui.QPushButton(self.TopicButtonWidget) + icon7 = QtGui.QIcon() + icon7.addPixmap(QtGui.QPixmap(u':/songs/topic_edit.png'), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.TopicEditButton.setIcon(icon7) + self.TopicEditButton.setObjectName(u'TopicEditButton') + self.TopicButtonLayout.addWidget(self.TopicEditButton) + self.TopicDeleteButton = QtGui.QPushButton(self.TopicButtonWidget) + icon8 = QtGui.QIcon() + icon8.addPixmap(QtGui.QPixmap(u':/songs/topic_delete.png'), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.TopicDeleteButton.setIcon(icon8) + self.TopicDeleteButton.setObjectName(u'TopicDeleteButton') + self.TopicButtonLayout.addWidget(self.TopicDeleteButton) + self.TopicLayout.addWidget(self.TopicButtonWidget) + self.TopicsLine = QtGui.QFrame(self.TopicsPage) + self.TopicsLine.setFrameShape(QtGui.QFrame.HLine) + self.TopicsLine.setFrameShadow(QtGui.QFrame.Sunken) + self.TopicsLine.setObjectName(u'TopicsLine') + self.TopicLayout.addWidget(self.TopicsLine) + self.TypeStackedWidget.addWidget(self.TopicsPage) + self.BooksPage = QtGui.QWidget() + self.BooksPage.setObjectName(u'BooksPage') + self.BookLayout = QtGui.QVBoxLayout(self.BooksPage) + self.BookLayout.setSpacing(4) + self.BookLayout.setMargin(0) + self.BookLayout.setObjectName(u'BookLayout') + self.BooksListWidget = QtGui.QListWidget(self.BooksPage) + self.BooksListWidget.setObjectName(u'BooksListWidget') + self.BookLayout.addWidget(self.BooksListWidget) + self.BookButtonWidget = QtGui.QWidget(self.BooksPage) + self.BookButtonWidget.setObjectName(u'BookButtonWidget') + self.BookButtonLayout = QtGui.QHBoxLayout(self.BookButtonWidget) + self.BookButtonLayout.setSpacing(8) + self.BookButtonLayout.setMargin(0) + self.BookButtonLayout.setObjectName(u'BookButtonLayout') + spacerItem2 = QtGui.QSpacerItem(54, 20, + QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.BookButtonLayout.addItem(spacerItem2) + self.BookAddButton = QtGui.QPushButton(self.BookButtonWidget) + icon9 = QtGui.QIcon() + icon9.addPixmap(QtGui.QPixmap(u':/songs/book_add.png'), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.BookAddButton.setIcon(icon9) + self.BookAddButton.setObjectName(u'BookAddButton') + self.BookButtonLayout.addWidget(self.BookAddButton) + self.BookEditButton = QtGui.QPushButton(self.BookButtonWidget) + icon10 = QtGui.QIcon() + icon10.addPixmap(QtGui.QPixmap(u':/songs/book_edit.png'), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.BookEditButton.setIcon(icon10) + self.BookEditButton.setObjectName(u'BookEditButton') + self.BookButtonLayout.addWidget(self.BookEditButton) + self.BookDeleteButton = QtGui.QPushButton(self.BookButtonWidget) + icon11 = QtGui.QIcon() + icon11.addPixmap(QtGui.QPixmap(u':/songs/book_delete.png'), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.BookDeleteButton.setIcon(icon11) + self.BookDeleteButton.setObjectName(u'BookDeleteButton') + self.BookButtonLayout.addWidget(self.BookDeleteButton) + self.BookLayout.addWidget(self.BookButtonWidget) + self.BooksLine = QtGui.QFrame(self.BooksPage) + self.BooksLine.setFrameShape(QtGui.QFrame.HLine) + self.BooksLine.setFrameShadow(QtGui.QFrame.Sunken) + self.BooksLine.setObjectName(u'BooksLine') + self.BookLayout.addWidget(self.BooksLine) + self.TypeStackedWidget.addWidget(self.BooksPage) + self.ContentLayout.addWidget(self.TypeStackedWidget) + self.DialogLayout.addWidget(self.ContentWidget) + self.MaintenanceButtonBox = QtGui.QDialogButtonBox(SongMaintenanceDialog) + self.MaintenanceButtonBox.setOrientation(QtCore.Qt.Horizontal) + self.MaintenanceButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Close) + self.MaintenanceButtonBox.setObjectName(u'MaintenanceButtonBox') + self.DialogLayout.addWidget(self.MaintenanceButtonBox) + + self.retranslateUi(SongMaintenanceDialog) + self.TypeStackedWidget.setCurrentIndex(0) + QtCore.QObject.connect(self.MaintenanceButtonBox, + QtCore.SIGNAL(u'rejected()'), SongMaintenanceDialog.accept) + QtCore.QObject.connect(self.TypeListWidget, + QtCore.SIGNAL(u'currentRowChanged(int)'), + self.TypeStackedWidget.setCurrentIndex) + QtCore.QMetaObject.connectSlotsByName(SongMaintenanceDialog) + + def retranslateUi(self, SongMaintenanceDialog): + SongMaintenanceDialog.setWindowTitle( + translate(u'SongMaintenanceDialog', u'Song Maintenance')) + self.TypeListWidget.item(0).setText( + translate(u'SongMaintenanceDialog', u'Authors')) + self.TypeListWidget.item(1).setText( + translate(u'SongMaintenanceDialog', u'Topics')) + self.TypeListWidget.item(2).setText( + translate(u'SongMaintenanceDialog', u'Books/Hymnals')) + self.AuthorAddButton.setText( + translate(u'SongMaintenanceDialog', u'Add')) + self.AuthorEditButton.setText( + translate(u'SongMaintenanceDialog', u'Edit')) + self.AuthorDeleteButton.setText( + translate(u'SongMaintenanceDialog', u'Delete')) + self.TopicAddButton.setText( + translate(u'SongMaintenanceDialog', u'Add')) + self.TopicEditButton.setText( + translate(u'SongMaintenanceDialog', u'Edit')) + self.TopicDeleteButton.setText( + translate(u'SongMaintenanceDialog', u'Delete')) + self.BookAddButton.setText( + translate(u'SongMaintenanceDialog', u'Add')) + self.BookEditButton.setText( + translate(u'SongMaintenanceDialog', u'Edit')) + self.BookDeleteButton.setText( + translate(u'SongMaintenanceDialog', u'Delete')) + diff --git a/openlp/plugins/songs/forms/songmaintenanceform.py b/openlp/plugins/songs/forms/songmaintenanceform.py new file mode 100644 index 000000000..edf9af332 --- /dev/null +++ b/openlp/plugins/songs/forms/songmaintenanceform.py @@ -0,0 +1,244 @@ +# -*- coding: utf-8 -*- +""" +OpenLP - Open Source Lyrics Projection +Copyright (c) 2008 Raoul Snyman +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 +Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA +""" + +from PyQt4 import QtGui, QtCore +from openlp.core.lib import translate +from openlp.plugins.songs.lib.classes import Author, Book, Topic +from songmaintenancedialog import Ui_SongMaintenanceDialog +from authorsform import AuthorsForm +from topicsform import TopicsForm +from songbookform import SongBookForm + +class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): + """ + Class documentation goes here. + """ + def __init__(self, songmanager, parent=None): + """ + Constructor + """ + QtGui.QDialog.__init__(self, parent) + self.setupUi(self) + self.songmanager = songmanager + self.authorform = AuthorsForm(self) + self.topicform = TopicsForm(self) + self.bookform = SongBookForm(self) + QtCore.QObject.connect(self.AuthorAddButton, + QtCore.SIGNAL(u'pressed()'), self.onAuthorAddButtonClick) + QtCore.QObject.connect(self.TopicAddButton, + QtCore.SIGNAL(u'pressed()'), self.onTopicAddButtonClick) + QtCore.QObject.connect(self.BookAddButton, + QtCore.SIGNAL(u'pressed()'), self.onBookAddButtonClick) + QtCore.QObject.connect(self.AuthorEditButton, + QtCore.SIGNAL(u'pressed()'), self.onAuthorEditButtonClick) + QtCore.QObject.connect(self.TopicEditButton, + QtCore.SIGNAL(u'pressed()'), self.onTopicEditButtonClick) + QtCore.QObject.connect(self.BookEditButton, + QtCore.SIGNAL(u'pressed()'), self.onBookEditButtonClick) + QtCore.QObject.connect(self.AuthorDeleteButton, + QtCore.SIGNAL(u'pressed()'), self.onAuthorDeleteButtonClick) + QtCore.QObject.connect(self.TopicDeleteButton, + QtCore.SIGNAL(u'pressed()'), self.onTopicDeleteButtonClick) + QtCore.QObject.connect(self.BookDeleteButton, + QtCore.SIGNAL(u'pressed()'), self.onBookDeleteButtonClick) + + def exec_(self): + self.TypeListWidget.setCurrentRow(0) + self.resetAuthors() + self.resetTopics() + self.resetBooks() + self.TypeListWidget.setFocus() + return QtGui.QDialog.exec_(self) + + def _getCurrentItemId(self, ListWidget): + item = ListWidget.currentItem() + if item is not None: + item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] + return item_id + else: + return -1 + + def _deleteItem(self, list_widget, get_func, del_func, reset_func, + dlg_title, del_text, err_text, sel_text): + item_id = self._getCurrentItemId(list_widget) + if item_id != -1: + item = get_func(item_id) + if QtGui.QMessageBox.warning(self, dlg_title, del_text, + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.No | QtGui.QMessageBox.Yes) + ) == QtGui.QMessageBox.Yes: + if item is not None and len(item.songs) == 0: + del_func(item.id) + reset_func() + else: + QtGui.QMessageBox.critical(self, dlg_title, err_text, + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + else: + QtGui.QMessageBox.critical(self, dlg_title, sel_text, + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + + def resetAuthors(self): + self.AuthorsListWidget.clear() + authors = self.songmanager.get_authors() + for author in authors: + if author.display_name is not None and author.display_name != u'': + author_name = QtGui.QListWidgetItem(author.display_name) + else: + author_name = QtGui.QListWidgetItem( + u'%s %s' % (author.first_name, author.last_name)) + author_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(author.id)) + self.AuthorsListWidget.addItem(author_name) + + def resetTopics(self): + self.TopicsListWidget.clear() + topics = self.songmanager.get_topics() + for topic in topics: + topic_name = QtGui.QListWidgetItem(topic.name) + topic_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(topic.id)) + self.TopicsListWidget.addItem(topic_name) + + def resetBooks(self): + self.BooksListWidget.clear() + books = self.songmanager.get_books() + for book in books: + book_name = QtGui.QListWidgetItem(book.name) + book_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(book.id)) + self.BooksListWidget.addItem(book_name) + + def onAuthorAddButtonClick(self): + self.authorform.setAutoDisplayName(True) + if self.authorform.exec_(): + author = Author.populate( + first_name=unicode(self.authorform.FirstNameEdit.text(), u'utf-8'), + last_name=unicode(self.authorform.LastNameEdit.text(), u'utf-8'), + display_name=unicode(self.authorform.DisplayEdit.text(), u'utf-8')) + if self.songmanager.save_author(author): + self.resetAuthors() + else: + QtGui.QMessageBox.critical(self, + translate(u'SongMaintenanceForm', u'Error'), + translate(u'SongMaintenanceForm', u'Couldn\'t add your author!'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + + def onTopicAddButtonClick(self): + if self.topicform.exec_(): + topic = Topic.populate(name=unicode(self.topicform.NameEdit.text(), u'utf-8')) + if self.songmanager.save_topic(topic): + self.resetTopics() + else: + QtGui.QMessageBox.critical(self, + translate(u'SongMaintenanceForm', u'Error'), + translate(u'SongMaintenanceForm', u'Couldn\'t add your topic!'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + + def onBookAddButtonClick(self): + if self.bookform.exec_(): + book = Book.populate(name=unicode(self.bookform.NameEdit.text(), u'utf-8'), + publisher=unicode(self.bookform.PublisherEdit.text(), u'utf-8')) + if self.songmanager.save_book(book): + self.resetBooks() + else: + QtGui.QMessageBox.critical(self, + translate(u'SongMaintenanceForm', u'Error'), + translate(u'SongMaintenanceForm', u'Couldn\'t add your book!'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + + def onAuthorEditButtonClick(self): + author_id = self._getCurrentItemId(self.AuthorsListWidget) + if author_id != -1: + author = self.songmanager.get_author(author_id) + self.authorform.setAutoDisplayName(False) + self.authorform.FirstNameEdit.setText(author.first_name) + self.authorform.LastNameEdit.setText(author.last_name) + self.authorform.DisplayEdit.setText(author.display_name) + if self.authorform.exec_(False): + author.first_name = unicode(self.authorform.FirstNameEdit.text(), u'utf-8') + author.last_name = unicode(self.authorform.LastNameEdit.text(), u'utf-8') + author.display_name = unicode(self.authorform.DisplayEdit.text(), u'utf-8') + if self.songmanager.save_author(author): + self.resetAuthors() + else: + QtGui.QMessageBox.critical(self, + translate(u'SongMaintenanceForm', u'Error'), + translate(u'SongMaintenanceForm', u'Couldn\'t save your author!'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + + def onTopicEditButtonClick(self): + topic_id = self._getCurrentItemId(self.TopicsListWidget) + if topic_id != -1: + topic = self.songmanager.get_topic(topic_id) + self.topicform.NameEdit.setText(topic.name) + if self.topicform.exec_(False): + topic.name = unicode(self.topicform.NameEdit.text(), u'utf-8') + if self.songmanager.save_topic(topic): + self.resetTopics() + else: + QtGui.QMessageBox.critical(self, + translate(u'SongMaintenanceForm', u'Error'), + translate(u'SongMaintenanceForm', u'Couldn\'t save your topic!'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + + def onBookEditButtonClick(self): + book_id = self._getCurrentItemId(self.BooksListWidget) + if book_id != -1: + book = self.songmanager.get_book(book_id) + self.bookform.NameEdit.setText(book.name) + self.bookform.PublisherEdit.setText(book.publisher) + if self.bookform.exec_(False): + book.name = unicode(self.bookform.NameEdit.text(), u'utf-8') + book.publisher = unicode(self.bookform.PublisherEdit.text(), u'utf-8') + if self.songmanager.save_book(book): + self.resetBooks() + else: + QtGui.QMessageBox.critical(self, + translate(u'SongMaintenanceForm', u'Error'), + translate(u'SongMaintenanceForm', u'Couldn\'t save your book!'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + + def onAuthorDeleteButtonClick(self): + """ + Delete the author if the author is not attached to any songs + """ + self._deleteItem(self.AuthorsListWidget, self.songmanager.get_author, + self.songmanager.delete_author, self.resetAuthors, + translate(u'SongMaintenanceForm', u'Delete Author'), + translate(u'SongMaintenanceForm', u'Are you sure you want to delete the selected author?'), + translate(u'SongMaintenanceForm', u'This author can\'t be deleted, they are currently assigned to at least one song!'), + translate(u'SongMaintenanceForm', u'No author selected!')) + + def onTopicDeleteButtonClick(self): + """ + Delete the Book is the Book is not attached to any songs + """ + self._deleteItem(self.TopicsListWidget, self.songmanager.get_topic, + self.songmanager.delete_topic, self.resetTopics, + translate(u'SongMaintenanceForm', u'Delete Topic'), + translate(u'SongMaintenanceForm', u'Are you sure you want to delete the selected topic?'), + translate(u'SongMaintenanceForm', u'This topic can\'t be deleted, it is currently assigned to at least one song!'), + translate(u'SongMaintenanceForm', u'No topic selected!')) + + def onBookDeleteButtonClick(self): + """ + Delete the Book is the Book is not attached to any songs + """ + self._deleteItem(self.BooksListWidget, self.songmanager.get_book, + self.songmanager.delete_book, self.resetBooks, + translate(u'SongMaintenanceForm', u'Delete Book'), + translate(u'SongMaintenanceForm', u'Are you sure you want to delete the selected book?'), + translate(u'SongMaintenanceForm', u'This book can\'t be deleted, it is currently assigned to at least one song!'), + translate(u'SongMaintenanceForm', u'No book selected!')) diff --git a/openlp/plugins/songs/forms/topicsdialog.py b/openlp/plugins/songs/forms/topicsdialog.py index 2a56837fa..b97e5c10f 100644 --- a/openlp/plugins/songs/forms/topicsdialog.py +++ b/openlp/plugins/songs/forms/topicsdialog.py @@ -23,66 +23,39 @@ from openlp.core.lib import translate class Ui_TopicsDialog(object): def setupUi(self, TopicsDialog): TopicsDialog.setObjectName(u'TopicsDialog') - TopicsDialog.resize(387, 463) - self.gridLayout_2 = QtGui.QGridLayout(TopicsDialog) - self.gridLayout_2.setObjectName(u'gridLayout_2') - self.TopicGroupBox = QtGui.QGroupBox(TopicsDialog) - self.TopicGroupBox.setObjectName(u'TopicGroupBox') - self.gridLayout = QtGui.QGridLayout(self.TopicGroupBox) - self.gridLayout.setObjectName(u'gridLayout') - self.TopicNameLabel = QtGui.QLabel(self.TopicGroupBox) - self.TopicNameLabel.setObjectName(u'TopicNameLabel') - self.gridLayout.addWidget(self.TopicNameLabel, 0, 0, 1, 1) - self.TopicNameEdit = QtGui.QLineEdit(self.TopicGroupBox) - self.TopicNameEdit.setObjectName(u'TopicNameEdit') - self.gridLayout.addWidget(self.TopicNameEdit, 0, 1, 1, 4) - spacerItem = QtGui.QSpacerItem(198, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout.addItem(spacerItem, 1, 0, 1, 2) - self.DeleteButton = QtGui.QPushButton(self.TopicGroupBox) - icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(u':/services/service_delete.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.DeleteButton.setIcon(icon) - self.DeleteButton.setObjectName(u'DeleteButton') - self.gridLayout.addWidget(self.DeleteButton, 1, 3, 1, 1) - self.AddUpdateButton = QtGui.QPushButton(self.TopicGroupBox) - icon1 = QtGui.QIcon() - icon1.addPixmap(QtGui.QPixmap(u':/services/service_save.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.AddUpdateButton.setIcon(icon1) - self.AddUpdateButton.setObjectName(u'AddUpdateButton') - self.gridLayout.addWidget(self.AddUpdateButton, 1, 4, 1, 1) - self.ClearButton = QtGui.QPushButton(self.TopicGroupBox) - icon2 = QtGui.QIcon() - icon2.addPixmap(QtGui.QPixmap(u':/services/service_new.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.ClearButton.setIcon(icon2) - self.ClearButton.setObjectName(u'ClearButton') - self.gridLayout.addWidget(self.ClearButton, 1, 2, 1, 1) - self.gridLayout_2.addWidget(self.TopicGroupBox, 1, 0, 1, 1) - self.MessageLabel = QtGui.QLabel(TopicsDialog) - self.MessageLabel.setObjectName(u'MessageLabel') - self.gridLayout_2.addWidget(self.MessageLabel, 3, 0, 1, 1) - self.TopicsListWidget = QtGui.QListWidget() - self.TopicsListWidget.setAlternatingRowColors(True) - self.gridLayout_2.addWidget(self.TopicsListWidget, 0, 0, 1, 1) - self.ButtonBox = QtGui.QDialogButtonBox(TopicsDialog) - self.ButtonBox.setOrientation(QtCore.Qt.Horizontal) - self.ButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok) - self.ButtonBox.setObjectName(u'ButtonBox') - self.gridLayout_2.addWidget(self.ButtonBox, 2, 0, 1, 1) + TopicsDialog.resize(365, 77) + self.TopicLayout = QtGui.QFormLayout(TopicsDialog) + self.TopicLayout.setFieldGrowthPolicy( + QtGui.QFormLayout.ExpandingFieldsGrow) + self.TopicLayout.setMargin(8) + self.TopicLayout.setSpacing(8) + self.TopicLayout.setObjectName(u'TopicLayout') + self.NameLabel = QtGui.QLabel(TopicsDialog) + self.NameLabel.setObjectName(u'NameLabel') + self.TopicLayout.setWidget(0, + QtGui.QFormLayout.LabelRole, self.NameLabel) + self.NameEdit = QtGui.QLineEdit(TopicsDialog) + self.NameEdit.setObjectName(u'NameEdit') + self.TopicLayout.setWidget(0, + QtGui.QFormLayout.FieldRole, self.NameEdit) + self.TopicButtonBox = QtGui.QDialogButtonBox(TopicsDialog) + self.TopicButtonBox.setOrientation(QtCore.Qt.Horizontal) + self.TopicButtonBox.setStandardButtons( + QtGui.QDialogButtonBox.Save | QtGui.QDialogButtonBox.Cancel) + self.TopicButtonBox.setObjectName(u'TopicButtonBox') + self.TopicLayout.setWidget(1, + QtGui.QFormLayout.FieldRole, self.TopicButtonBox) self.retranslateUi(TopicsDialog) - QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(u'accepted()'), TopicsDialog.accept) - QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(u'rejected()'), TopicsDialog.reject) + QtCore.QObject.connect(self.TopicButtonBox, + QtCore.SIGNAL(u'accepted()'), TopicsDialog.accept) + QtCore.QObject.connect(self.TopicButtonBox, + QtCore.SIGNAL(u'rejected()'), TopicsDialog.reject) QtCore.QMetaObject.connectSlotsByName(TopicsDialog) def retranslateUi(self, TopicsDialog): - TopicsDialog.setWindowTitle(translate(u'TopicsDialog', u'Topic Maintenance')) - self.TopicGroupBox.setTitle(translate(u'TopicsDialog', u'Topic')) - self.TopicNameLabel.setText(translate(u'TopicsDialog', u'Topic Name:')) - - self.DeleteButton.setToolTip(translate(u'TopicsDialog', u'Delete Author')) - self.DeleteButton.setText(translate(u'AuthorsDialog', u'Delete')) - self.AddUpdateButton.setToolTip(translate(u'TopicsDialog', u'Add Update Author')) - self.AddUpdateButton.setText(translate(u'AuthorsDialog', u'Save')) - self.ClearButton.setToolTip(translate(u'TopicsDialog', u'Clear Selection')) - self.ClearButton.setText(translate(u'TopicsDialog', u'Clear')) + TopicsDialog.setWindowTitle( + translate(u'TopicsDialog', u'Topic Maintenance')) + self.NameLabel.setText( + translate(u'TopicsDialog', u'Topic name:')) diff --git a/openlp/plugins/songs/forms/topicsform.py b/openlp/plugins/songs/forms/topicsform.py index f3fa87185..073abeb5e 100644 --- a/openlp/plugins/songs/forms/topicsform.py +++ b/openlp/plugins/songs/forms/topicsform.py @@ -18,112 +18,33 @@ Place, Suite 330, Boston, MA 02111-1307 USA """ from PyQt4 import QtGui, QtCore from openlp.core.lib import translate -from openlp.plugins.songs.forms.topicsdialog import Ui_TopicsDialog -from openlp.plugins.songs.lib.classes import Topic +from topicsdialog import Ui_TopicsDialog class TopicsForm(QtGui.QDialog, Ui_TopicsDialog): """ Class documentation goes here. """ - def __init__(self, songmanager, parent = None): + def __init__(self, parent=None): """ Constructor """ QtGui.QDialog.__init__(self, parent) self.setupUi(self) - self.songmanager = songmanager - self.currentRow = 0 - self.topic = None - QtCore.QObject.connect(self.DeleteButton, - QtCore.SIGNAL(u'pressed()'), self.onDeleteButtonClick) - QtCore.QObject.connect(self.ClearButton, - QtCore.SIGNAL(u'pressed()'), self.onClearButtonClick) - QtCore.QObject.connect(self.AddUpdateButton, - QtCore.SIGNAL(u'pressed()'), self.onAddUpdateButtonClick) - QtCore.QObject.connect(self.TopicNameEdit, - QtCore.SIGNAL(u'lostFocus()'), self.onTopicNameEditLostFocus) - QtCore.QObject.connect(self.TopicsListWidget, - QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onTopicsListWidgetItemClicked) + def exec_(self, clear=True): + if clear: + self.NameEdit.clear() + self.NameEdit.setFocus() + return QtGui.QDialog.exec_(self) - def load_form(self): - """ - Refresh the screen and rest fields - """ - self.TopicsListWidget.clear() - # tidy up screen - self.onClearButtonClick() - topics = self.songmanager.get_topics() - for topic in topics: - topic_name = QtGui.QListWidgetItem(topic.name) - topic_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(topic.id)) - self.TopicsListWidget.addItem(topic_name) - if self.currentRow >= self.TopicsListWidget.count() : - self.TopicsListWidget.setCurrentRow(self.TopicsListWidget.count() - 1) + def accept(self): + if self.NameEdit.text() == u'': + QtGui.QMessageBox.critical(self, + translate(u'SongBookDialog', u'Error'), + translate(u'SongBookDialog', u'You need to type in a topic name!'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + self.NameEdit.setFocus() + return False else: - self.TopicsListWidget.setCurrentRow(self.currentRow) - self._validate_form() - self.onTopicsListWidgetItemClicked() + return QtGui.QDialog.accept(self) - def onDeleteButtonClick(self): - """ - Delete the Topic is the Topic is not attached to any songs - """ - self.songmanager.delete_topic(self.topic.id) - self.load_form() - - def onTopicNameEditLostFocus(self): - self._validate_form() - - def onAddUpdateButtonClick(self): - """ - Sent New or update details to the database - """ - if self._validate_form(): - 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.topic = None - self._validate_form() - self.TopicNameEdit.setFocus() - - def onTopicsListWidgetItemClicked(self): - """ - An Topic has been selected display it - If the Topic is attached to a Song prevent delete - """ - self.currentRow = self.TopicsListWidget.currentRow() - item = self.TopicsListWidget.currentItem() - if item is not None: - item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] - self.topic = self.songmanager.get_topic(item_id) - self.TopicNameEdit.setText(self.topic.name) - if len(self.topic.songs) > 0: - self.MessageLabel.setText(translate(u'TopicForm', u'Topic in use "Delete" is disabled')) - self.DeleteButton.setEnabled(False) - else: - self.MessageLabel.setText(translate(u'TopicForm', u'Topic in not used')) - self.DeleteButton.setEnabled(True) - self._validate_form() - self.TopicNameEdit.setFocus() - - def _validate_form(self): - # We need at lease a display name - valid = True - if len(self.TopicNameEdit.displayText()) == 0: - valid = False - self.TopicNameEdit.setStyleSheet(u'background-color: red; color: white') - else: - self.TopicNameEdit.setStyleSheet(u'') - return valid diff --git a/openlp/plugins/songs/lib/classes.py b/openlp/plugins/songs/lib/classes.py index a693641d3..49dcd6dc1 100644 --- a/openlp/plugins/songs/lib/classes.py +++ b/openlp/plugins/songs/lib/classes.py @@ -43,7 +43,8 @@ class Book(BaseModel): """ Book model """ - pass + def __repr__(self): + return u'' % (str(self.id), self.name, self.publisher) class Song(BaseModel): """ diff --git a/openlp/plugins/songs/lib/manager.py b/openlp/plugins/songs/lib/manager.py index 8775a51b1..a3ad8423a 100644 --- a/openlp/plugins/songs/lib/manager.py +++ b/openlp/plugins/songs/lib/manager.py @@ -218,9 +218,9 @@ class SongManager(): self.session.add(book) self.session.commit() return True - except: + except Exception, e: self.session.rollback() - log.error(u'Errow thrown %s', sys.exc_info()[1]) + log.error(u'Errow thrown %s', e.args[0]) return False def delete_book(self, bookid): diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 0a3b01c5e..2b16fe564 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -20,9 +20,10 @@ Place, Suite 330, Boston, MA 02111-1307 USA import logging from PyQt4 import QtCore, QtGui -from openlp.core.lib import MediaManagerItem, translate, ServiceItem, SongXMLParser , contextMenuAction, contextMenuSeparator - -from openlp.plugins.songs.forms import EditSongForm, AuthorsForm, TopicsForm, SongBookForm +from openlp.core.lib import MediaManagerItem, translate, ServiceItem, \ + SongXMLParser, contextMenuAction, contextMenuSeparator +from openlp.plugins.songs.forms import EditSongForm, AuthorsForm, \ + TopicsForm, SongBookForm, SongMaintenanceForm class SongList(QtGui.QListWidget): @@ -59,9 +60,7 @@ class SongMediaItem(MediaManagerItem): self.ConfigSection = u'song' MediaManagerItem.__init__(self, parent, icon, title) self.edit_song_form = EditSongForm(self.parent.songmanager, self.parent.event_manager) - self.authors_form = AuthorsForm(self.parent.songmanager) - self.topics_form = TopicsForm(self.parent.songmanager) - self.song_book_form = SongBookForm(self.parent.songmanager) + self.song_maintenance_form = SongMaintenanceForm(self.parent.songmanager, self) def setupUi(self): # Add a toolbar @@ -94,18 +93,10 @@ class SongMediaItem(MediaManagerItem): translate(u'SongMediaItem', u'Add the selected song(s) to the service'), ':/system/system_add.png', self.onSongAddClick, 'SongAddItem') self.addToolbarSeparator() - ## Author Edit Button ## - self.addToolbarButton(translate(u'SongMediaItem', u'Edit Authors'), - translate(u'SongMediaItem', u'Maintain the list of Song Authors'), - ':/songs/song_author_edit.png', self.onEditAuthorClick, 'SongAuthorEditItem') - ## Author Edit Button ## - self.addToolbarButton(translate(u'SongMediaItem', u'Edit Books'), - translate(u'SongMediaItem', u'Maintain the list of Song Books'), - ':/songs/song_book_edit.png', self.onEditBookClick, 'SongAuthorEditItem') - ## Author Edit Button ## - self.addToolbarButton(translate(u'SongMediaItem', u'Edit Topics'), - translate(u'SongMediaItem', u'Maintain the list of Song Topics'), - ':/songs/song_topic_edit.png', self.onEditTopicClick, 'SongAuthorEditItem') + ## Song Maintenance Button ## + self.addToolbarButton(translate(u'SongMediaItem', u'Song Maintenance'), + translate(u'SongMediaItem', u'Maintain the lists of authors, topics and books'), + ':/songs/song_maintenance.png', self.onSongMaintenanceClick, 'SongMaintenanceItem') ## Add the songlist widget ## # Create the tab widget self.SongWidget = QtGui.QWidget(self) @@ -250,6 +241,9 @@ class SongMediaItem(MediaManagerItem): self.song_book_form.load_form() self.song_book_form.exec_() + def onSongMaintenanceClick(self): + self.song_maintenance_form.exec_() + def onSongEditClick(self): item = self.ListView.currentItem() if item is not None: diff --git a/openlp/plugins/songs/lib/models.py b/openlp/plugins/songs/lib/models.py index a609adf99..6f518b8c0 100644 --- a/openlp/plugins/songs/lib/models.py +++ b/openlp/plugins/songs/lib/models.py @@ -27,8 +27,8 @@ from openlp.plugins.songs.lib.classes import * def init_models(url): engine = create_engine(url) metadata.bind = engine - session = scoped_session(sessionmaker(autoflush=True, autocommit=False, - bind=engine)) + session = scoped_session(sessionmaker(autoflush=True, + autocommit=False, bind=engine)) mapper(Author, authors_table) mapper(Book, song_books_table) mapper(Song, songs_table, diff --git a/openlp/plugins/songs/lib/tables.py b/openlp/plugins/songs/lib/tables.py index 617c53b7d..b8fe0eeb0 100644 --- a/openlp/plugins/songs/lib/tables.py +++ b/openlp/plugins/songs/lib/tables.py @@ -31,7 +31,7 @@ authors_table = Table(u'authors', metadata, # Definition of the "song_books" table song_books_table = Table(u'song_books', metadata, - Column(u'id', types.Integer, primary_key=True), + Column(u'id', types.Integer, primary_key=True), Column(u'name', types.Unicode(128), nullable=False), Column(u'publisher', types.Unicode(128)) ) diff --git a/resources/forms/authorsdialog.ui b/resources/forms/authorsdialog.ui index 4be1ef2a7..41810b539 100644 --- a/resources/forms/authorsdialog.ui +++ b/resources/forms/authorsdialog.ui @@ -1,229 +1,104 @@ - + + AuthorsDialog - - + + 0 0 - 410 - 505 + 393 + 147 - + Author Maintenance - - + + 8 - + 8 - - - - true - - - true - - - 0 + + 8 + + + + + + + + + + + Display Name: - - - - - 0 - 0 - + + + + First Name: - - Author Details - - - - 8 - - - 8 - - - - - - 8 - - - 8 - - - 0 - - - - - Display Name: - - - - - - - - - - First Name: - - - - - - - - - - Last Name: - - - - - - - - - - - - - - - - - - - - - 0 - 0 - - - - - 8 - - - 0 - - - - - Qt::Horizontal - - - - 198 - 20 - - - - - - - - Clear Selection - - - New - - - - :/services/service_new.png:/services/service_new.png - - - - - - - Add Update Author - - - Save - - - - :/services/service_save.png:/services/service_save.png - - - - - - - Delete Author - - - Delete - - - - :/services/service_delete.png:/services/service_delete.png - - - - - - - - - - + + + Exit Screen - + Qt::Horizontal - - QDialogButtonBox::Ok + + QDialogButtonBox::Cancel|QDialogButtonBox::Save + + + + + + + + + + Last Name: - + - buttonBox + AuthorButtonBox accepted() AuthorsDialog accept() - + 248 254 - + 157 274 - buttonBox + AuthorButtonBox rejected() AuthorsDialog reject() - + 316 260 - + 286 274 diff --git a/resources/forms/songbookdialog.ui b/resources/forms/songbookdialog.ui index 54476ce98..f29d5fa14 100644 --- a/resources/forms/songbookdialog.ui +++ b/resources/forms/songbookdialog.ui @@ -1,195 +1,62 @@ - + + SongBookDialog - - + + 0 0 - 387 - 531 + 367 + 120 - + Book Song Maintenance - - + + 8 - + 8 - - - - - - - - 0 - 200 - + + 8 + + + + + Name: - - Song Book - - - - 8 - - - 8 - - - - - - 0 - 0 - - - - - 8 - - - 8 - - - 0 - - - - - Name: - - - - - - - - - - Publisher: - - - - - - - - - - - - - - 0 - 0 - - - - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 8 - - - 0 - - - - - Qt::Horizontal - - - - 61 - 24 - - - - - - - - Clear Selection - - - New - - - - :/services/service_new.png:/services/service_new.png - - - - - - - Add Update Author - - - Save - - - - :/services/service_save.png:/services/service_save.png - - - - - - - Delete Author - - - Delete - - - - :/services/service_delete.png:/services/service_delete.png - - - - - - - - - - + + + + + + + Publisher: + + + + + + + + + Qt::Horizontal - - QDialogButtonBox::Ok + + QDialogButtonBox::Cancel|QDialogButtonBox::Save - + @@ -198,11 +65,11 @@ SongBookDialog accept() - + 248 254 - + 157 274 @@ -214,11 +81,11 @@ SongBookDialog reject() - + 316 260 - + 286 274 diff --git a/resources/forms/songmaintenance.ui b/resources/forms/songmaintenance.ui new file mode 100644 index 000000000..878fd7849 --- /dev/null +++ b/resources/forms/songmaintenance.ui @@ -0,0 +1,442 @@ + + + SongMaintenanceDialog + + + Qt::ApplicationModal + + + + 0 + 0 + 486 + 361 + + + + Song Maintenance + + + + 8 + + + 8 + + + + + + 8 + + + 0 + + + + + + 0 + 0 + + + + + 130 + 0 + + + + + 130 + 16777215 + + + + false + + + false + + + QAbstractItemView::SingleSelection + + + + 32 + 32 + + + + false + + + false + + + false + + + true + + + false + + + false + + + + New Row + + + + + New Row + + + + + New Row + + + + + Types + + + + + +Authors + + + AlignHCenter|AlignVCenter|AlignCenter + + + + :/songs/author_maintenance.png:/songs/author_maintenance.png + + + + + +Topics + + + AlignHCenter|AlignVCenter|AlignCenter + + + + :/songs/topic_maintenance.png:/songs/topic_maintenance.png + + + + + +Books/Hymnals + + + AlignHCenter|AlignVCenter|AlignCenter + + + + :/songs/book_maintenance.png:/songs/book_maintenance.png + + + + + + + + 2 + + + + + 8 + + + 0 + + + + + + + + + 8 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Add + + + + :/songs/author_add.png:/songs/author_add.png + + + + + + + Edit + + + + :/songs/author_edit.png:/songs/author_edit.png + + + + + + + Delete + + + + :/songs/author_delete.png:/songs/author_delete.png + + + + + + + + + + Qt::Horizontal + + + + + + + + + 8 + + + 0 + + + + + + + + + 8 + + + 0 + + + + + Qt::Horizontal + + + + 54 + 20 + + + + + + + + Add + + + + :/songs/topic_add.png:/songs/topic_add.png + + + + + + + Edit + + + + :/songs/topic_edit.png:/songs/topic_edit.png + + + + + + + Delete + + + + :/songs/topic_delete.png:/songs/topic_delete.png + + + + + + + + + + Qt::Horizontal + + + + + + + + + 8 + + + 0 + + + + + + + + + 8 + + + 0 + + + + + Qt::Horizontal + + + + 54 + 20 + + + + + + + + Add + + + + :/songs/book_add.png:/songs/book_add.png + + + + + + + Edit + + + + :/songs/book_edit.png:/songs/book_edit.png + + + + + + + Delete + + + + :/songs/book_delete.png:/songs/book_delete.png + + + + + + + + + + Qt::Horizontal + + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + + + + + + + + MaintenanceButtonBox + rejected() + SongMaintenanceDialog + accept() + + + 242 + 340 + + + 242 + 180 + + + + + TypeTableWidget + cellClicked(int,int) + TypeStackedWidget + setCurrentIndex(int) + + + 72 + 163 + + + 311 + 163 + + + + + diff --git a/resources/forms/topicsdialog.ui b/resources/forms/topicsdialog.ui index 768681e33..ffee5761f 100644 --- a/resources/forms/topicsdialog.ui +++ b/resources/forms/topicsdialog.ui @@ -1,158 +1,52 @@ - + + TopicsDialog - - + + 0 0 - 471 - 470 + 365 + 77 - + Topic Maintenance - - + + + QFormLayout::ExpandingFieldsGrow + + 8 - + 8 - - - - Topic Details - - - - 8 - - - 8 - - - - - Topic Name: - - - - - - - - - - Qt::Horizontal - - - - 198 - 20 - - - - - - - - Delete Author - - - Delete - - - - :/services/service_delete.png:/services/service_delete.png - - - - - - - Add Update Author - - - Save - - - - :/services/service_save.png:/services/service_save.png - - - - - - - Clear Selection - - - New - - - - :/services/service_new.png:/services/service_new.png - - - - - - - - - - true + + 8 + + + + + Topic Name: - - - - Qt::Horizontal - - - QDialogButtonBox::Ok + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Save - + - - - ButtonBox - accepted() - TopicsDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - ButtonBox - rejected() - TopicsDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - + diff --git a/resources/images/author_add.png b/resources/images/author_add.png new file mode 100644 index 000000000..a12a38467 Binary files /dev/null and b/resources/images/author_add.png differ diff --git a/resources/images/author_delete.png b/resources/images/author_delete.png new file mode 100644 index 000000000..8a9391fd9 Binary files /dev/null and b/resources/images/author_delete.png differ diff --git a/resources/images/author_edit.png b/resources/images/author_edit.png new file mode 100644 index 000000000..354522f4e Binary files /dev/null and b/resources/images/author_edit.png differ diff --git a/resources/images/author_maintenance.png b/resources/images/author_maintenance.png new file mode 100644 index 000000000..9a1f55159 Binary files /dev/null and b/resources/images/author_maintenance.png differ diff --git a/resources/images/book_add.png b/resources/images/book_add.png new file mode 100644 index 000000000..a2d5c8413 Binary files /dev/null and b/resources/images/book_add.png differ diff --git a/resources/images/book_delete.png b/resources/images/book_delete.png new file mode 100644 index 000000000..293cf9666 Binary files /dev/null and b/resources/images/book_delete.png differ diff --git a/resources/images/book_edit.png b/resources/images/book_edit.png new file mode 100644 index 000000000..b708578e9 Binary files /dev/null and b/resources/images/book_edit.png differ diff --git a/resources/images/book_maintenance.png b/resources/images/book_maintenance.png new file mode 100644 index 000000000..a850e97c6 Binary files /dev/null and b/resources/images/book_maintenance.png differ diff --git a/resources/images/openlp-2.qrc b/resources/images/openlp-2.qrc index 14f05e56e..83c88c3e5 100644 --- a/resources/images/openlp-2.qrc +++ b/resources/images/openlp-2.qrc @@ -1,5 +1,18 @@ + topic_edit.png + author_add.png + author_delete.png + book_add.png + song_maintenance.png + topic_add.png + book_delete.png + book_edit.png + author_edit.png + topic_delete.png + book_maintenance.png + author_maintenance.png + topic_maintenance.png song_delete.png song_edit.png song_export.png diff --git a/resources/images/song_maintenance.png b/resources/images/song_maintenance.png new file mode 100644 index 000000000..860e1717e Binary files /dev/null and b/resources/images/song_maintenance.png differ diff --git a/resources/images/topic_add.png b/resources/images/topic_add.png new file mode 100644 index 000000000..3754fc60e Binary files /dev/null and b/resources/images/topic_add.png differ diff --git a/resources/images/topic_delete.png b/resources/images/topic_delete.png new file mode 100644 index 000000000..38a2ad5b5 Binary files /dev/null and b/resources/images/topic_delete.png differ diff --git a/resources/images/topic_edit.png b/resources/images/topic_edit.png new file mode 100644 index 000000000..03b8167d0 Binary files /dev/null and b/resources/images/topic_edit.png differ diff --git a/resources/images/topic_maintenance.png b/resources/images/topic_maintenance.png new file mode 100644 index 000000000..e3b8555dd Binary files /dev/null and b/resources/images/topic_maintenance.png differ