Allow editing of author types and fix bug in servicemanager

bzr-revno: 2403
This commit is contained in:
Samuel Mehrbrodt 2014-07-14 17:25:59 +01:00 committed by Tim Bentley
commit 6c40962afb
5 changed files with 71 additions and 7 deletions

View File

@ -1103,7 +1103,7 @@ class ServiceManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ServiceManage
Moves the cursor selection up the window. Called by the up arrow. Moves the cursor selection up the window. Called by the up arrow.
""" """
item = self.service_manager_list.currentItem() item = self.service_manager_list.currentItem()
item_before = self.service_manager_list.item_above(item) item_before = self.service_manager_list.itemAbove(item)
if item_before is None: if item_before is None:
return return
self.service_manager_list.setCurrentItem(item_before) self.service_manager_list.setCurrentItem(item_before)

View File

@ -138,6 +138,9 @@ class Ui_EditSongDialog(object):
self.author_remove_layout = QtGui.QHBoxLayout() self.author_remove_layout = QtGui.QHBoxLayout()
self.author_remove_layout.setObjectName('author_remove_layout') self.author_remove_layout.setObjectName('author_remove_layout')
self.author_remove_layout.addStretch() self.author_remove_layout.addStretch()
self.author_edit_button = QtGui.QPushButton(self.authors_group_box)
self.author_edit_button.setObjectName('author_edit_button')
self.author_remove_layout.addWidget(self.author_edit_button)
self.author_remove_button = QtGui.QPushButton(self.authors_group_box) self.author_remove_button = QtGui.QPushButton(self.authors_group_box)
self.author_remove_button.setObjectName('author_remove_button') self.author_remove_button.setObjectName('author_remove_button')
self.author_remove_layout.addWidget(self.author_remove_button) self.author_remove_layout.addWidget(self.author_remove_button)
@ -305,6 +308,7 @@ class Ui_EditSongDialog(object):
translate('SongsPlugin.EditSongForm', 'Title && Lyrics')) translate('SongsPlugin.EditSongForm', 'Title && Lyrics'))
self.authors_group_box.setTitle(SongStrings.Authors) self.authors_group_box.setTitle(SongStrings.Authors)
self.author_add_button.setText(translate('SongsPlugin.EditSongForm', '&Add to Song')) self.author_add_button.setText(translate('SongsPlugin.EditSongForm', '&Add to Song'))
self.author_edit_button.setText(translate('SongsPlugin.EditSongForm', '&Edit Author Type'))
self.author_remove_button.setText(translate('SongsPlugin.EditSongForm', '&Remove')) self.author_remove_button.setText(translate('SongsPlugin.EditSongForm', '&Remove'))
self.maintenance_button.setText(translate('SongsPlugin.EditSongForm', '&Manage Authors, Topics, Song Books')) self.maintenance_button.setText(translate('SongsPlugin.EditSongForm', '&Manage Authors, Topics, Song Books'))
self.topics_group_box.setTitle(SongStrings.Topic) self.topics_group_box.setTitle(SongStrings.Topic)

View File

@ -70,6 +70,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog, RegistryProperties):
self.setupUi(self) self.setupUi(self)
# Connecting signals and slots # Connecting signals and slots
self.author_add_button.clicked.connect(self.on_author_add_button_clicked) self.author_add_button.clicked.connect(self.on_author_add_button_clicked)
self.author_edit_button.clicked.connect(self.on_author_edit_button_clicked)
self.author_remove_button.clicked.connect(self.on_author_remove_button_clicked) self.author_remove_button.clicked.connect(self.on_author_remove_button_clicked)
self.authors_list_view.itemClicked.connect(self.on_authors_list_view_clicked) self.authors_list_view.itemClicked.connect(self.on_authors_list_view_clicked)
self.topic_add_button.clicked.connect(self.on_topic_add_button_clicked) self.topic_add_button.clicked.connect(self.on_topic_add_button_clicked)
@ -334,6 +335,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog, RegistryProperties):
""" """
self.verse_edit_button.setEnabled(False) self.verse_edit_button.setEnabled(False)
self.verse_delete_button.setEnabled(False) self.verse_delete_button.setEnabled(False)
self.author_edit_button.setEnabled(False)
self.author_remove_button.setEnabled(False) self.author_remove_button.setEnabled(False)
self.topic_remove_button.setEnabled(False) self.topic_remove_button.setEnabled(False)
@ -354,12 +356,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog, RegistryProperties):
# Types # Types
self.author_types_combo_box.clear() self.author_types_combo_box.clear()
self.author_types_combo_box.addItem('')
# Don't iterate over the dictionary to give them this specific order # Don't iterate over the dictionary to give them this specific order
self.author_types_combo_box.addItem(AuthorType.Types[AuthorType.Words], AuthorType.Words) for author_type in AuthorType.SortedTypes:
self.author_types_combo_box.addItem(AuthorType.Types[AuthorType.Music], AuthorType.Music) self.author_types_combo_box.addItem(AuthorType.Types[author_type], author_type)
self.author_types_combo_box.addItem(AuthorType.Types[AuthorType.WordsAndMusic], AuthorType.WordsAndMusic)
self.author_types_combo_box.addItem(AuthorType.Types[AuthorType.Translation], AuthorType.Translation)
def load_topics(self): def load_topics(self):
""" """
@ -596,9 +595,32 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog, RegistryProperties):
""" """
Run a set of actions when an author in the list is selected (mainly enable the delete button). Run a set of actions when an author in the list is selected (mainly enable the delete button).
""" """
if self.authors_list_view.count() > 1: count = self.authors_list_view.count()
if count > 0:
self.author_edit_button.setEnabled(True)
if count > 1:
# There must be at least one author
self.author_remove_button.setEnabled(True) self.author_remove_button.setEnabled(True)
def on_author_edit_button_clicked(self):
"""
Show a dialog to change the type of an author when the edit button is clicked
"""
self.author_edit_button.setEnabled(False)
item = self.authors_list_view.currentItem()
author_id, author_type = item.data(QtCore.Qt.UserRole)
choice, ok = QtGui.QInputDialog.getItem(self, translate('SongsPlugin.EditSongForm', 'Edit Author Type'),
translate('SongsPlugin.EditSongForm', 'Choose type for this author'),
AuthorType.TranslatedTypes,
current=AuthorType.SortedTypes.index(author_type),
editable=False)
if not ok:
return
author = self.manager.get_object(Author, author_id)
author_type = AuthorType.from_translated_text(choice)
item.setData(QtCore.Qt.UserRole, (author_id, author_type))
item.setText(author.get_display_name(author_type))
def on_author_remove_button_clicked(self): def on_author_remove_button_clicked(self):
""" """
Remove the author from the list when the delete button is clicked. Remove the author from the list when the delete button is clicked.

View File

@ -69,17 +69,42 @@ class AuthorType(object):
The 'words+music' type is not an official type, but is provided for convenience. The 'words+music' type is not an official type, but is provided for convenience.
""" """
NoType = ''
Words = 'words' Words = 'words'
Music = 'music' Music = 'music'
WordsAndMusic = 'words+music' WordsAndMusic = 'words+music'
Translation = 'translation' Translation = 'translation'
Types = { Types = {
NoType: '',
Words: translate('SongsPlugin.AuthorType', 'Words', 'Author who wrote the lyrics of a song'), Words: translate('SongsPlugin.AuthorType', 'Words', 'Author who wrote the lyrics of a song'),
Music: translate('SongsPlugin.AuthorType', 'Music', 'Author who wrote the music of a song'), Music: translate('SongsPlugin.AuthorType', 'Music', 'Author who wrote the music of a song'),
WordsAndMusic: translate('SongsPlugin.AuthorType', 'Words and Music', WordsAndMusic: translate('SongsPlugin.AuthorType', 'Words and Music',
'Author who wrote both lyrics and music of a song'), 'Author who wrote both lyrics and music of a song'),
Translation: translate('SongsPlugin.AuthorType', 'Translation', 'Author who translated the song') Translation: translate('SongsPlugin.AuthorType', 'Translation', 'Author who translated the song')
} }
SortedTypes = [
NoType,
Words,
Music,
WordsAndMusic
]
TranslatedTypes = [
Types[NoType],
Types[Words],
Types[Music],
Types[WordsAndMusic]
]
@staticmethod
def from_translated_text(translated_type):
"""
Get the AuthorType from a translated string.
:param translated_type: Translated Author type.
"""
for key, value in AuthorType.Types.items():
if value == translated_type:
return key
return AuthorType.NoType
class Book(BaseModel): class Book(BaseModel):

View File

@ -112,3 +112,16 @@ class TestDB(TestCase):
# THEN: It should have been removed and the other author should still be there # THEN: It should have been removed and the other author should still be there
self.assertEqual(1, len(song.authors_songs)) self.assertEqual(1, len(song.authors_songs))
self.assertEqual(None, song.authors_songs[0].author_type) self.assertEqual(None, song.authors_songs[0].author_type)
def test_get_author_type_from_translated_text(self):
"""
Test getting an author type from translated text
"""
# GIVEN: A string with an author type
author_type_name = AuthorType.Types[AuthorType.Words]
# WHEN: We call the method
author_type = AuthorType.from_translated_text(author_type_name)
# THEN: The type should be correct
self.assertEqual(author_type, AuthorType.Words)