From 9da5a3223f4f3d5d8d24fbec85ad637bd8476b68 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 21 Jul 2009 19:10:14 +0100 Subject: [PATCH 1/3] Fix song conversions Fix focus for Song dialog Preserve state when moving serviceitems --- cnvdb.py | 3 +- openlp/core/ui/maindisplay.py | 12 ++++- openlp/core/ui/servicemanager.py | 53 ++++++++++++++++++---- openlp/plugins/songs/forms/authorsform.py | 3 +- openlp/plugins/songs/forms/songbookform.py | 3 +- openlp/plugins/songs/forms/topicsform.py | 3 +- openlp/plugins/songs/lib/mediaitem.py | 2 +- 7 files changed, 63 insertions(+), 16 deletions(-) diff --git a/cnvdb.py b/cnvdb.py index 4463ec887..a76c942a9 100755 --- a/cnvdb.py +++ b/cnvdb.py @@ -20,6 +20,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA """ import codecs import sys +import chardet def convert_file(inname, outname): """ @@ -31,7 +32,7 @@ def convert_file(inname, outname): ``outname`` The output file name. """ - infile = codecs.open(inname, 'r', encoding='iso-8859-1') + infile = codecs.open(inname, 'r', encoding='CP1252') writefile = codecs.open(outname, 'w', encoding='utf-8') for line in infile: #replace the quotes with quotes diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 183917549..a38891633 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -62,12 +62,22 @@ class MainDisplay(QtGui.QWidget): self.showFullScreen() else: self.showMinimized() + #Build a custom splash screen + self.InitialFrame = QtGui.QImage(screen[u'size'].width(), + screen[u'size'].height(), QtGui.QImage.Format_ARGB32_Premultiplied) + splash_image = QtGui.QImage(u':/graphics/openlp-splash-screen.png') + painter_image = QtGui.QPainter() + painter_image.begin(self.InitialFrame) + painter_image.fillRect(self.InitialFrame.rect(), QtCore.Qt.white) + painter_image.drawImage((screen[u'size'].width() - splash_image.width()) / 2, + (screen[u'size'].height() - splash_image.height()) / 2 , splash_image) + self.frameView(self.InitialFrame) + #Build a Black screen painter = QtGui.QPainter() self.blankFrame = QtGui.QImage(screen[u'size'].width(), screen[u'size'].height(), QtGui.QImage.Format_ARGB32_Premultiplied) painter.begin(self.blankFrame) painter.fillRect(self.blankFrame.rect(), QtCore.Qt.black) - self.frameView(self.blankFrame) def frameView(self, frame): """ diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 5229715c0..732768505 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -41,10 +41,39 @@ class ServiceManagerList(QtGui.QTreeWidget): if event.key() == QtCore.Qt.Key_Enter: self.parent.makeLive() event.accept() + elif event.key() == QtCore.Qt.Key_Home: + self.parent.onServiceTop() + event.accept() + elif event.key() == QtCore.Qt.Key_End: + self.parent.onServiceEnd() + event.accept() + elif event.key() == QtCore.Qt.Key_PageUp: + self.parent.onServiceUp() + event.accept() + elif event.key() == QtCore.Qt.Key_PageDown: + self.parent.onServiceDown() + event.accept() + elif event.key() == QtCore.Qt.Key_Up: + self.parent.onServiceUp() + event.accept() + elif event.key() == QtCore.Qt.Key_Down: + self.parent.onServiceDown() + event.accept() event.ignore() else: event.ignore() +class Iter(QtGui.QTreeWidgetItemIterator): + def __init__(self, *args): + QTreeWidgetItemIterator.__init__(self, *args) + def next(self): + self.__iadd__(1) + value = self.value() + if value: + return self.value() + else: + raise StopIteration + class ServiceManager(QtGui.QWidget): """ Manages the orders of service. Currently this involves taking @@ -159,7 +188,7 @@ class ServiceManager(QtGui.QWidget): temp = self.serviceItems[item] self.serviceItems.remove(self.serviceItems[item]) self.serviceItems.insert(0, temp) - self.repaintServiceList() + self.repaintServiceList(0, count) self.parent.OosChanged(False, self.serviceName) def onServiceUp(self): @@ -172,7 +201,7 @@ class ServiceManager(QtGui.QWidget): temp = self.serviceItems[item] self.serviceItems.remove(self.serviceItems[item]) self.serviceItems.insert(item - 1, temp) - self.repaintServiceList() + self.repaintServiceList(item - 1 , count) self.parent.OosChanged(False, self.serviceName) def onServiceDown(self): @@ -185,7 +214,7 @@ class ServiceManager(QtGui.QWidget): temp = self.serviceItems[item] self.serviceItems.remove(self.serviceItems[item]) self.serviceItems.insert(item + 1, temp) - self.repaintServiceList() + self.repaintServiceList(item + 1 , count) self.parent.OosChanged(False, self.serviceName) def onServiceEnd(self): @@ -197,7 +226,7 @@ class ServiceManager(QtGui.QWidget): temp = self.serviceItems[item] self.serviceItems.remove(self.serviceItems[item]) self.serviceItems.insert(len(self.serviceItems), temp) - self.repaintServiceList() + self.repaintServiceList(len(self.serviceItems) - 1, count) self.parent.OosChanged(False, self.serviceName) def onNewService(self): @@ -216,15 +245,19 @@ class ServiceManager(QtGui.QWidget): item, count = self.findServiceItem() if item is not -1: self.serviceItems.remove(self.serviceItems[item]) - self.repaintServiceList() + self.repaintServiceList(0, 0) self.parent.OosChanged(False, self.serviceName) - def repaintServiceList(self): + def repaintServiceList(self, serviceItem, serviceItemCount): """ Clear the existing service list and prepaint all the items Used when moving items as the move takes place in supporting array, and when regenerating all the items due to theme changes """ + aa = Iter(self.ServiceManagerList) + print aa + for a in aa: + print a #Correct order of idems in array count = 1 for item in self.serviceItems: @@ -232,20 +265,20 @@ class ServiceManager(QtGui.QWidget): count += 1 #Repaint the screen self.ServiceManagerList.clear() - for item in self.serviceItems: + for itemcount, item in enumerate(self.serviceItems): serviceitem = item[u'data'] treewidgetitem = QtGui.QTreeWidgetItem(self.ServiceManagerList) treewidgetitem.setText(0,serviceitem.title) treewidgetitem.setIcon(0,serviceitem.iconic_representation) treewidgetitem.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(item[u'order'])) treewidgetitem.setExpanded(item[u'expanded']) - count = 0 - for frame in serviceitem.frames: + for count , frame in enumerate(serviceitem.frames): treewidgetitem1 = QtGui.QTreeWidgetItem(treewidgetitem) text = frame[u'title'] treewidgetitem1.setText(0,text[:40]) treewidgetitem1.setData(0, QtCore.Qt.UserRole,QtCore.QVariant(count)) - count = count + 1 + if serviceItem == itemcount and serviceItemCount == count: + self.ServiceManagerList.setCurrentItem(treewidgetitem1) def onSaveService(self): """ diff --git a/openlp/plugins/songs/forms/authorsform.py b/openlp/plugins/songs/forms/authorsform.py index 256ac2002..f5191f094 100644 --- a/openlp/plugins/songs/forms/authorsform.py +++ b/openlp/plugins/songs/forms/authorsform.py @@ -63,6 +63,7 @@ class AuthorsForm(QtGui.QDialog, Ui_AuthorsDialog): else: self.AuthorListWidget.setCurrentRow(self.currentRow) self._validate_form() + self.onAuthorListWidgetItemClicked() def onDeleteButtonClick(self): """ @@ -100,7 +101,7 @@ class AuthorsForm(QtGui.QDialog, Ui_AuthorsDialog): self._validate_form() self.DisplayEdit.setFocus() - def onAuthorListWidgetItemClicked(self, index): + def onAuthorListWidgetItemClicked(self): """ An Author has been selected display it If the author is attached to a Song prevent delete diff --git a/openlp/plugins/songs/forms/songbookform.py b/openlp/plugins/songs/forms/songbookform.py index cc203cdb4..147c588fb 100644 --- a/openlp/plugins/songs/forms/songbookform.py +++ b/openlp/plugins/songs/forms/songbookform.py @@ -62,6 +62,7 @@ class SongBookForm(QtGui.QDialog, Ui_SongBookDialog): self.BookSongListWidget.setCurrentRow(self.BookSongListWidget.count() - 1) else: self.BookSongListWidget.setCurrentRow(self.currentRow) + self.onBooksListViewItemClicked() def onDeleteButtonClick(self): """ @@ -98,7 +99,7 @@ class SongBookForm(QtGui.QDialog, Ui_SongBookDialog): self._validate_form() self.NameEdit.setFocus() - def onBooksListViewItemClicked(self, index): + def onBooksListViewItemClicked(self): """ An Book has been selected display it If the Book is attached to a Song prevent delete diff --git a/openlp/plugins/songs/forms/topicsform.py b/openlp/plugins/songs/forms/topicsform.py index 825d1a66b..759e72ae3 100644 --- a/openlp/plugins/songs/forms/topicsform.py +++ b/openlp/plugins/songs/forms/topicsform.py @@ -63,6 +63,7 @@ class TopicsForm(QtGui.QDialog, Ui_TopicsDialog): else: self.TopicsListWidget.setCurrentRow(self.currentRow) self._validate_form() + self.onTopicsListWidgetItemClicked() def onDeleteButtonClick(self): """ @@ -97,7 +98,7 @@ class TopicsForm(QtGui.QDialog, Ui_TopicsDialog): self._validate_form() self.TopicNameEdit.setFocus() - def onTopicsListWidgetItemClicked(self, index): + def onTopicsListWidgetItemClicked(self): """ An Topic has been selected display it If the Topic is attached to a Song prevent delete diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index b49bcac95..0a3b01c5e 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -289,7 +289,7 @@ class SongMediaItem(MediaManagerItem): else: verses = song.lyrics.split(u'\n\n') for slide in verses: - service_item.add_from_text(slide[:30], slide) + service_item.add_from_text(slide[:30], unicode(slide)) service_item.title = song.title for author in song.authors: if len(author_list) > 1: From e788db767ae6d70eeed547b24bc6cf44075be2c9 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 21 Jul 2009 21:04:27 +0100 Subject: [PATCH 2/3] fix renderer to make shadows small for footers Add Keyboard events to servicemanager --- openlp/core/lib/renderer.py | 9 +++-- openlp/core/ui/servicemanager.py | 68 ++++++++++++++++++++++++++------ 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index a7e494302..957818132 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -40,6 +40,7 @@ class Renderer(object): self._debug = 0 self._right_margin = 64 # the amount of right indent self._shadow_offset = 5 + self._shadow_offset_footer = 3 self._outline_offset = 2 self.theme_name = None self._theme = None @@ -482,15 +483,17 @@ class Renderer(object): # dont allow alignment messing with footers if footer: align = 0 + shadow_offset = self._shadow_offset_footer else: align = int(self._theme .display_horizontalAlign) + shadow_offset = self._shadow_offset for linenum in range(len(lines)): line = lines[linenum] #find out how wide line is w , h = self._get_extent_and_render(line, footer, tlcorner=(x, y), draw=False) if self._theme.display_shadow: - w += self._shadow_offset - h += self._shadow_offset + w += shadow_offset + h += shadow_offset if self._theme.display_outline: # pixels either side w += 2 * self._outline_offset @@ -515,7 +518,7 @@ class Renderer(object): if live: # now draw the text, and any outlines/shadows if self._theme.display_shadow: - self._get_extent_and_render(line, footer, tlcorner=(x+self._shadow_offset,y+self._shadow_offset), + self._get_extent_and_render(line, footer, tlcorner=(x + shadow_offset, y + shadow_offset), draw=True, color = self._theme.display_shadow_color) if self._theme.display_outline: self._get_extent_and_render(line, footer, (x+self._outline_offset,y), draw=True, diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 732768505..f0f322e4c 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -54,10 +54,10 @@ class ServiceManagerList(QtGui.QTreeWidget): self.parent.onServiceDown() event.accept() elif event.key() == QtCore.Qt.Key_Up: - self.parent.onServiceUp() + self.parent.onMoveSelectionUp() event.accept() elif event.key() == QtCore.Qt.Key_Down: - self.parent.onServiceDown() + self.parent.onMoveSelectionDown() event.accept() event.ignore() else: @@ -65,14 +65,14 @@ class ServiceManagerList(QtGui.QTreeWidget): class Iter(QtGui.QTreeWidgetItemIterator): def __init__(self, *args): - QTreeWidgetItemIterator.__init__(self, *args) + QtGui.QTreeWidgetItemIterator.__init__(self, *args) def next(self): - self.__iadd__(1) - value = self.value() - if value: - return self.value() - else: - raise StopIteration + self.__iadd__(1) + value = self.value() + if value: + return self.value() + else: + return None class ServiceManager(QtGui.QWidget): """ @@ -163,6 +163,52 @@ class ServiceManager(QtGui.QWidget): self.servicePath = self.config.get_data_path() self.service_theme = self.config.get_config(u'theme service theme', u'') + def onMoveSelectionUp(self): + """ + Moves the selection up the window + Called by the up arrow + """ + it = Iter(self.ServiceManagerList) + item = it.value() + tempItem = None + setLastItem = False + while item is not None: + if item.isSelected() and tempItem is None: + setLastItem = True + item.setSelected(False) + if item.isSelected(): + #We are on the first record + if tempItem is not None: + tempItem.setSelected(True) + item.setSelected(False) + else: + tempItem = item + lastItem = item + item = it.next() + #Top Item was selected so set the last one + if setLastItem: + lastItem.setSelected(True) + + def onMoveSelectionDown(self): + """ + Moves the selection down the window + Called by the down arrow + """ + it = Iter(self.ServiceManagerList) + item = it.value() + firstItem = item + setSelected = False + while item is not None: + if setSelected: + setSelected = False + item.setSelected(True) + elif item.isSelected(): + item.setSelected(False) + setSelected = True + item = it.next() + if setSelected: + firstItem.setSelected(True) + def collapsed(self, item): """ Record if an item is collapsed @@ -254,10 +300,6 @@ class ServiceManager(QtGui.QWidget): Used when moving items as the move takes place in supporting array, and when regenerating all the items due to theme changes """ - aa = Iter(self.ServiceManagerList) - print aa - for a in aa: - print a #Correct order of idems in array count = 1 for item in self.serviceItems: From 8e0901ef67f956f854f114e095637c03040aa57b Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 22 Jul 2009 07:14:34 +0100 Subject: [PATCH 3/3] Fix bug where empty lists fail to display dialogs --- openlp/plugins/songs/forms/authorsform.py | 37 +++++++++++----------- openlp/plugins/songs/forms/songbookform.py | 23 +++++++------- openlp/plugins/songs/forms/topicsform.py | 21 ++++++------ 3 files changed, 42 insertions(+), 39 deletions(-) diff --git a/openlp/plugins/songs/forms/authorsform.py b/openlp/plugins/songs/forms/authorsform.py index f5191f094..3a8478c93 100644 --- a/openlp/plugins/songs/forms/authorsform.py +++ b/openlp/plugins/songs/forms/authorsform.py @@ -108,24 +108,25 @@ class AuthorsForm(QtGui.QDialog, Ui_AuthorsDialog): """ self.currentRow = self.AuthorListWidget.currentRow() item = self.AuthorListWidget.currentItem() - 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() + 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): diff --git a/openlp/plugins/songs/forms/songbookform.py b/openlp/plugins/songs/forms/songbookform.py index 147c588fb..e4771d4a3 100644 --- a/openlp/plugins/songs/forms/songbookform.py +++ b/openlp/plugins/songs/forms/songbookform.py @@ -106,17 +106,18 @@ class SongBookForm(QtGui.QDialog, Ui_SongBookDialog): """ self.currentRow = self.BookSongListWidget.currentRow() item = self.BookSongListWidget.currentItem() - 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() + 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): diff --git a/openlp/plugins/songs/forms/topicsform.py b/openlp/plugins/songs/forms/topicsform.py index 759e72ae3..f3fa87185 100644 --- a/openlp/plugins/songs/forms/topicsform.py +++ b/openlp/plugins/songs/forms/topicsform.py @@ -105,16 +105,17 @@ class TopicsForm(QtGui.QDialog, Ui_TopicsDialog): """ self.currentRow = self.TopicsListWidget.currentRow() item = self.TopicsListWidget.currentItem() - 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() + 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):