From 70660b7b71adb7153f0d9e66cb0ce90372742cb3 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 15 May 2011 20:07:40 +0100 Subject: [PATCH 1/6] Add Search to Custom and cleanups --- openlp/plugins/custom/lib/mediaitem.py | 104 ++++++++++++++++++++++++- openlp/plugins/songs/lib/mediaitem.py | 3 +- 2 files changed, 104 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 4bd3a8d4b..61c1887f8 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -29,13 +29,22 @@ import logging from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ - check_item_selected + check_item_selected, translate, check_search_result +from openlp.core.lib.searchedit import SearchEdit from openlp.core.lib.ui import UiStrings from openlp.plugins.custom.lib import CustomXMLParser from openlp.plugins.custom.lib.db import CustomSlide log = logging.getLogger(__name__) +class CustomSearch(object): + """ + An enumeration for song search methods. + """ + Titles = 1 + Themes = 2 + + class CustomMediaItem(MediaManagerItem): """ This is the custom media manager item for Custom Slides. @@ -53,6 +62,42 @@ class CustomMediaItem(MediaManagerItem): self.manager = parent.manager def addEndHeaderBar(self): + self.addToolbarSeparator() + ## Song Maintenance Button ## + self.searchWidget = QtGui.QWidget(self) + self.searchWidget.setObjectName(u'searchWidget') + self.searchLayout = QtGui.QVBoxLayout(self.searchWidget) + self.searchLayout.setObjectName(u'searchLayout') + self.searchTextLayout = QtGui.QFormLayout() + self.searchTextLayout.setObjectName(u'searchTextLayout') + self.searchTextLabel = QtGui.QLabel(self.searchWidget) + self.searchTextLabel.setObjectName(u'searchTextLabel') + self.searchTextEdit = SearchEdit(self.searchWidget) + self.searchTextEdit.setObjectName(u'searchTextEdit') + self.searchTextLabel.setBuddy(self.searchTextEdit) + self.searchTextLayout.addRow(self.searchTextLabel, self.searchTextEdit) + self.searchLayout.addLayout(self.searchTextLayout) + self.searchButtonLayout = QtGui.QHBoxLayout() + self.searchButtonLayout.setObjectName(u'searchButtonLayout') + self.searchButtonLayout.addStretch() + self.searchTextButton = QtGui.QPushButton(self.searchWidget) + self.searchTextButton.setObjectName(u'searchTextButton') + self.searchButtonLayout.addWidget(self.searchTextButton) + self.searchLayout.addLayout(self.searchButtonLayout) + self.pageLayout.addWidget(self.searchWidget) + # Signals and slots + QtCore.QObject.connect(self.searchTextEdit, + QtCore.SIGNAL(u'returnPressed()'), self.onSearchTextButtonClick) + QtCore.QObject.connect(self.searchTextButton, + QtCore.SIGNAL(u'pressed()'), self.onSearchTextButtonClick) + QtCore.QObject.connect(self.searchTextEdit, + QtCore.SIGNAL(u'textChanged(const QString&)'), + self.onSearchTextEditChanged) + QtCore.QObject.connect(self.searchTextEdit, + QtCore.SIGNAL(u'cleared()'), self.onClearTextButtonClick) + QtCore.QObject.connect(self.searchTextEdit, + QtCore.SIGNAL(u'searchTypeChanged(int)'), + self.onSearchTextButtonClick) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'custom_edit'), self.onRemoteEdit) QtCore.QObject.connect(Receiver.get_receiver(), @@ -62,9 +107,22 @@ class CustomMediaItem(MediaManagerItem): QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'custom_preview'), self.onPreviewClick) + def retranslateUi(self): + self.searchTextLabel.setText(u'%s:' % UiStrings().Search) + self.searchTextButton.setText(UiStrings().Search) + def initialise(self): + self.searchTextEdit.setSearchTypes([ + (CustomSearch.Titles, u':/songs/song_search_title.png', + translate('SongsPlugin.MediaItem', 'Titles')), + (CustomSearch.Themes, u':/slides/slide_theme.png', + UiStrings().Themes) + ]) self.loadList(self.manager.get_all_objects( CustomSlide, order_by_ref=CustomSlide.title)) + self.searchTextEdit.setCurrentSearchType(QtCore.QSettings().value( + u'%s/last search type' % self.settingsSection, + QtCore.QVariant(SongSearch.Entire)).toInt()[0]) # Called to redisplay the custom list screen edith from a search # or from the exit of the Custom edit dialog. If remote editing is # active trigger it and clean up so it will not update again. @@ -161,4 +219,46 @@ class CustomMediaItem(MediaManagerItem): else: raw_footer.append(u'') service_item.raw_footer = raw_footer - return True \ No newline at end of file + return True + + def onSearchTextButtonClick(self): + # Save the current search type to the configuration. + QtCore.QSettings().setValue(u'%s/last search type' % + self.settingsSection, + QtCore.QVariant(self.searchTextEdit.currentSearchType())) + # Reload the list considering the new search type. + search_keywords = unicode(self.searchTextEdit.displayText()) + search_results = [] + search_type = self.searchTextEdit.currentSearchType() + if search_type == CustomSearch.Titles: + log.debug(u'Titles Search') + search_results = self.parent.manager.get_all_objects(CustomSlide, + CustomSlide.title.like(u'%' + self.whitespace.sub(u' ', + search_keywords) + u'%')) + self.loadList(search_results) + elif search_type == CustomSearch.Themes: + log.debug(u'Theme Search') + search_results = self.parent.manager.get_all_objects(CustomSlide, + CustomSlide.theme_name.like(u'%' + self.whitespace.sub(u' ', + search_keywords) + u'%')) + self.loadList(search_results) + check_search_result(self.listView, search_results) + + def onSearchTextEditChanged(self, text): + """ + If search as type enabled invoke the search on each key press. + If the Lyrics are being searched do not start till 7 characters + have been entered. + """ + search_length = 2 + if len(text) > search_length: + self.onSearchTextButtonClick() + elif len(text) == 0: + self.onClearTextButtonClick() + + def onClearTextButtonClick(self): + """ + Clear the search text. + """ + self.searchTextEdit.clear() + self.onSearchTextButtonClick() diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 3b014d4b0..0be7f4ea0 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -197,7 +197,8 @@ class SongMediaItem(MediaManagerItem): elif search_type == SongSearch.Themes: log.debug(u'Theme Search') search_results = self.parent.manager.get_all_objects(Song, - Song.theme_name == search_keywords) + Song.theme_name.like(u'%' + self.whitespace.sub(u' ', + search_keywords) + u'%')) self.displayResultsSong(search_results) check_search_result(self.listView, search_results) From 070d71996123efabab01177197952980590e1dae Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 15 May 2011 20:18:50 +0100 Subject: [PATCH 2/6] Fixes --- openlp/core/lib/mediamanageritem.py | 2 ++ openlp/plugins/custom/lib/mediaitem.py | 7 +++---- openlp/plugins/songs/lib/mediaitem.py | 2 -- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 9c1a84c99..b4133943b 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -28,6 +28,7 @@ Provides the generic functions for interfacing plugins with the Media Manager. """ import logging import os +import re from PyQt4 import QtCore, QtGui @@ -90,6 +91,7 @@ class MediaManagerItem(QtGui.QWidget): """ QtGui.QWidget.__init__(self) self.parent = parent + self.whitespace = re.compile(r'\W+', re.UNICODE) #TODO: plugin should not be the parent in future self.plugin = parent # plugin visible_title = self.plugin.getString(StringContent.VisibleName) diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 61c1887f8..7a6d8a0b3 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -29,7 +29,7 @@ import logging from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ - check_item_selected, translate, check_search_result + check_item_selected, translate from openlp.core.lib.searchedit import SearchEdit from openlp.core.lib.ui import UiStrings from openlp.plugins.custom.lib import CustomXMLParser @@ -63,7 +63,6 @@ class CustomMediaItem(MediaManagerItem): def addEndHeaderBar(self): self.addToolbarSeparator() - ## Song Maintenance Button ## self.searchWidget = QtGui.QWidget(self) self.searchWidget.setObjectName(u'searchWidget') self.searchLayout = QtGui.QVBoxLayout(self.searchWidget) @@ -122,7 +121,7 @@ class CustomMediaItem(MediaManagerItem): CustomSlide, order_by_ref=CustomSlide.title)) self.searchTextEdit.setCurrentSearchType(QtCore.QSettings().value( u'%s/last search type' % self.settingsSection, - QtCore.QVariant(SongSearch.Entire)).toInt()[0]) + QtCore.QVariant(CustomSearch.Titles)).toInt()[0]) # Called to redisplay the custom list screen edith from a search # or from the exit of the Custom edit dialog. If remote editing is # active trigger it and clean up so it will not update again. @@ -242,7 +241,7 @@ class CustomMediaItem(MediaManagerItem): CustomSlide.theme_name.like(u'%' + self.whitespace.sub(u' ', search_keywords) + u'%')) self.loadList(search_results) - check_search_result(self.listView, search_results) + self.check_search_result() def onSearchTextEditChanged(self, text): """ diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 5648f78eb..2bb1c4cf6 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -26,7 +26,6 @@ import logging import locale -import re from PyQt4 import QtCore, QtGui from sqlalchemy.sql import or_ @@ -72,7 +71,6 @@ class SongMediaItem(MediaManagerItem): # which Song is required. self.remoteSong = -1 self.editItem = None - self.whitespace = re.compile(r'\W+', re.UNICODE) self.quickPreviewAllowed = True def addEndHeaderBar(self): From dfbf368c8a0fae25bd2e2743f3454fd866485c99 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 16 May 2011 18:58:52 +0100 Subject: [PATCH 3/6] Sort images --- openlp/plugins/images/lib/mediaitem.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 21b81128d..bd8f9853e 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -47,6 +47,7 @@ class ImageMediaItem(MediaManagerItem): self.IconPath = u'images/image' MediaManagerItem.__init__(self, parent, self, icon) self.quickPreviewAllowed = True + self.listView.setSortingEnabled(True) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'live_theme_changed'), self.liveThemeChanged) From 67be2937be563bb9d800db3a49491c3fb149b24d Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 18 May 2011 15:34:35 +0100 Subject: [PATCH 4/6] Fix description --- openlp/plugins/custom/lib/mediaitem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 4f7c6ff03..89f271a44 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -40,7 +40,7 @@ log = logging.getLogger(__name__) class CustomSearch(object): """ - An enumeration for song search methods. + An enumeration for custom search methods. """ Titles = 1 Themes = 2 From d6ea529411d33d71b75776d9d8cebf0875ffb172 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 18 May 2011 16:01:33 +0100 Subject: [PATCH 5/6] Fix description 2 --- openlp/plugins/custom/lib/mediaitem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 89f271a44..0316c82ce 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -248,7 +248,7 @@ class CustomMediaItem(MediaManagerItem): def onSearchTextEditChanged(self, text): """ If search as type enabled invoke the search on each key press. - If the Lyrics are being searched do not start till 7 characters + If the Title is being searched do not start till 2 characters have been entered. """ search_length = 2 From 0c2196339ac8e8794351291e15043e6d588c01ca Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 19 May 2011 05:48:10 +0100 Subject: [PATCH 6/6] Fix search order --- openlp/plugins/custom/lib/mediaitem.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 0316c82ce..66b1c3675 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -235,13 +235,13 @@ class CustomMediaItem(MediaManagerItem): log.debug(u'Titles Search') search_results = self.parent.manager.get_all_objects(CustomSlide, CustomSlide.title.like(u'%' + self.whitespace.sub(u' ', - search_keywords) + u'%')) + search_keywords) + u'%'), order_by_ref=CustomSlide.title) self.loadList(search_results) elif search_type == CustomSearch.Themes: log.debug(u'Theme Search') search_results = self.parent.manager.get_all_objects(CustomSlide, CustomSlide.theme_name.like(u'%' + self.whitespace.sub(u' ', - search_keywords) + u'%')) + search_keywords) + u'%'), order_by_ref=CustomSlide.title) self.loadList(search_results) self.check_search_result()