This commit is contained in:
Philip Ridout 2017-05-05 22:00:59 +01:00
parent 50ce8fd97e
commit 902a2161fb
4 changed files with 60 additions and 58 deletions

View File

@ -341,10 +341,10 @@ def parse_reference(reference, bible, language_selection, book_ref_id=False):
if not book_ref_id: if not book_ref_id:
book_ref_id = bible.get_book_ref_id_by_localised_name(book, language_selection) book_ref_id = bible.get_book_ref_id_by_localised_name(book, language_selection)
elif not bible.get_book_by_book_ref_id(book_ref_id): elif not bible.get_book_by_book_ref_id(book_ref_id):
return False return []
# We have not found the book so do not continue # We have not found the book so do not continue
if not book_ref_id: if not book_ref_id:
return False return []
ranges = match.group('ranges') ranges = match.group('ranges')
range_list = get_reference_match('range_separator').split(ranges) range_list = get_reference_match('range_separator').split(ranges)
ref_list = [] ref_list = []
@ -403,7 +403,7 @@ def parse_reference(reference, bible, language_selection, book_ref_id=False):
return ref_list return ref_list
else: else:
log.debug('Invalid reference: {text}'.format(text=reference)) log.debug('Invalid reference: {text}'.format(text=reference))
return None return []
class SearchResults(object): class SearchResults(object):

View File

@ -158,6 +158,7 @@ class BibleDB(Manager):
self.get_name() self.get_name()
if 'path' in kwargs: if 'path' in kwargs:
self.path = kwargs['path'] self.path = kwargs['path']
self._is_web_bible = None
def get_name(self): def get_name(self):
""" """
@ -426,6 +427,18 @@ class BibleDB(Manager):
return 0 return 0
return count return count
@property
def is_web_bible(self):
"""
A read only property indicating if the bible is a 'web bible'
:return: If the bible is a web bible.
:rtype: bool
"""
if self._is_web_bible == None:
self._is_web_bible = bool(self.get_object(BibleMeta, 'download_source'))
return self._is_web_bible
def dump_bible(self): def dump_bible(self):
""" """
Utility debugging method to dump the contents of a bible. Utility debugging method to dump the contents of a bible.

View File

@ -142,8 +142,8 @@ class BibleManager(OpenLPMixin, RegistryProperties):
log.debug('Bible Name: "{name}"'.format(name=name)) log.debug('Bible Name: "{name}"'.format(name=name))
self.db_cache[name] = bible self.db_cache[name] = bible
# Look to see if lazy load bible exists and get create getter. # Look to see if lazy load bible exists and get create getter.
source = self.db_cache[name].get_object(BibleMeta, 'download_source') if self.db_cache[name].is_web_bible:
if source: source = self.db_cache[name].get_object(BibleMeta, 'download_source')
download_name = self.db_cache[name].get_object(BibleMeta, 'download_name').value download_name = self.db_cache[name].get_object(BibleMeta, 'download_name').value
meta_proxy = self.db_cache[name].get_object(BibleMeta, 'proxy_server') meta_proxy = self.db_cache[name].get_object(BibleMeta, 'proxy_server')
web_bible = HTTPBible(self.parent, path=self.path, file=filename, download_source=source.value, web_bible = HTTPBible(self.parent, path=self.path, file=filename, download_source=source.value,
@ -278,7 +278,7 @@ class BibleManager(OpenLPMixin, RegistryProperties):
:param show_error: :param show_error:
""" """
if not bible or not ref_list: if not bible or not ref_list:
return None return []
return self.db_cache[bible].get_verses(ref_list, show_error) return self.db_cache[bible].get_verses(ref_list, show_error)
def get_language_selection(self, bible): def get_language_selection(self, bible):
@ -308,8 +308,13 @@ class BibleManager(OpenLPMixin, RegistryProperties):
:param bible: The bible to search in (unicode). :param bible: The bible to search in (unicode).
:param second_bible: The second bible (unicode). We do not search in this bible. :param second_bible: The second bible (unicode). We do not search in this bible.
:param text: The text to search for (unicode). :param text: The text to search for (unicode).
:return: The search results if valid, or None if the search is invalid.
:rtype: None, list
""" """
log.debug('BibleManager.verse_search("{bible}", "{text}")'.format(bible=bible, text=text)) log.debug('BibleManager.verse_search("{bible}", "{text}")'.format(bible=bible, text=text))
if not text:
return None
# If no bibles are installed, message is given. # If no bibles are installed, message is given.
if not bible: if not bible:
self.main_window.information_message( self.main_window.information_message(
@ -317,8 +322,7 @@ class BibleManager(OpenLPMixin, RegistryProperties):
UiStrings().BibleNoBibles) UiStrings().BibleNoBibles)
return None return None
# Check if the bible or second_bible is a web bible. # Check if the bible or second_bible is a web bible.
web_bible = self.db_cache[bible].get_object(BibleMeta, 'download_source') if self.db_cache[bible].is_web_bible:
if web_bible:
# If either Bible is Web, cursor is reset to normal and message is given. # If either Bible is Web, cursor is reset to normal and message is given.
self.application.set_normal_cursor() self.application.set_normal_cursor()
self.main_window.information_message( self.main_window.information_message(
@ -328,41 +332,8 @@ class BibleManager(OpenLPMixin, RegistryProperties):
'This means that the currently selected Bible is a Web Bible.') 'This means that the currently selected Bible is a Web Bible.')
) )
return None return None
# Shorter than 3 char searches break OpenLP with very long search times, thus they are blocked.
if len(text) - text.count(' ') < 3:
return None
# Fetch the results from db. If no results are found, return None, no message is given for this. # Fetch the results from db. If no results are found, return None, no message is given for this.
elif text: if text:
return self.db_cache[bible].verse_search(text)
else:
return None
def verse_search_while_typing(self, bible, second_bible, text):
"""
Does a verse search for the given bible and text.
This is used during "Search while typing"
It's the same thing as the normal text search, but it does not show the web Bible error.
(It would result in the error popping every time a char is entered or removed)
It also does not have a minimum text len, this is set in mediaitem.py
:param bible: The bible to search in (unicode).
:param second_bible: The second bible (unicode). We do not search in this bible.
:param text: The text to search for (unicode).
"""
# If no bibles are installed, message is given.
if not bible:
return None
# Check if the bible or second_bible is a web bible.
web_bible = self.db_cache[bible].get_object(BibleMeta, 'download_source')
second_web_bible = ''
if second_bible:
second_web_bible = self.db_cache[second_bible].get_object(BibleMeta, 'download_source')
if web_bible or second_web_bible:
# If either Bible is Web, cursor is reset to normal and search ends w/o any message.
self.application.set_normal_cursor()
return None
# Fetch the results from db. If no results are found, return None, no message is given for this.
elif text:
return self.db_cache[bible].verse_search(text) return self.db_cache[bible].verse_search(text)
else: else:
return None return None

View File

@ -175,8 +175,10 @@ class BibleMediaItem(MediaManagerItem):
self.select_tab.setVisible(False) self.select_tab.setVisible(False)
self.page_layout.addWidget(self.select_tab) self.page_layout.addWidget(self.select_tab)
# General Search Opions # General Search Opions
self.options_widget = QtWidgets.QGroupBox(translate('BiblesPlugin.MediaItem', 'Options'), self) self.options_tab = QtWidgets.QWidget()
self.general_bible_layout = QtWidgets.QFormLayout(self.options_widget) self.options_tab.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
self.search_tab_bar.addTab(translate('BiblesPlugin.MediaItem', 'Options'))
self.general_bible_layout = QtWidgets.QFormLayout(self.options_tab)
self.version_combo_box = create_horizontal_adjusting_combo_box(self, 'version_combo_box') self.version_combo_box = create_horizontal_adjusting_combo_box(self, 'version_combo_box')
self.general_bible_layout.addRow('{version}:'.format(version=UiStrings().Version), self.version_combo_box) self.general_bible_layout.addRow('{version}:'.format(version=UiStrings().Version), self.version_combo_box)
self.second_combo_box = create_horizontal_adjusting_combo_box(self, 'second_combo_box') self.second_combo_box = create_horizontal_adjusting_combo_box(self, 'second_combo_box')
@ -184,19 +186,23 @@ class BibleMediaItem(MediaManagerItem):
self.style_combo_box = create_horizontal_adjusting_combo_box(self, 'style_combo_box') self.style_combo_box = create_horizontal_adjusting_combo_box(self, 'style_combo_box')
self.style_combo_box.addItems(['', '', '']) self.style_combo_box.addItems(['', '', ''])
self.general_bible_layout.addRow(UiStrings().LayoutStyle, self.style_combo_box) self.general_bible_layout.addRow(UiStrings().LayoutStyle, self.style_combo_box)
self.search_button_layout = QtWidgets.QHBoxLayout() self.options_tab.setVisible(False)
self.page_layout.addWidget(self.options_tab)
# This widget is the easier way to reset the spacing of search_button_layout. (Because page_layout has had its
# spacing set to 0)
self.search_button_widget = QtWidgets.QWidget()
self.search_button_layout = QtWidgets.QHBoxLayout(self.search_button_widget)
self.search_button_layout.addStretch() self.search_button_layout.addStretch()
# Note: If we use QPushButton instead of the QToolButton, the icon will be larger than the Lock icon. # Note: If we use QPushButton instead of the QToolButton, the icon will be larger than the Lock icon.
self.clear_button = QtWidgets.QToolButton(self) self.clear_button = QtWidgets.QPushButton()
self.clear_button.setIcon(self.clear_icon) self.clear_button.setIcon(self.clear_icon)
self.save_results_button = QtWidgets.QToolButton(self) self.save_results_button = QtWidgets.QPushButton()
self.save_results_button.setIcon(self.save_results_icon) self.save_results_button.setIcon(self.save_results_icon)
self.search_button_layout.addWidget(self.clear_button) self.search_button_layout.addWidget(self.clear_button)
self.search_button_layout.addWidget(self.save_results_button) self.search_button_layout.addWidget(self.save_results_button)
self.search_button = QtWidgets.QPushButton(self) self.search_button = QtWidgets.QPushButton(self)
self.search_button_layout.addWidget(self.search_button) self.search_button_layout.addWidget(self.search_button)
self.general_bible_layout.addRow(self.search_button_layout) self.page_layout.addWidget(self.search_button_widget)
self.page_layout.addWidget(self.options_widget)
self.results_view_tab = QtWidgets.QTabBar(self) self.results_view_tab = QtWidgets.QTabBar(self)
self.results_view_tab.addTab('') self.results_view_tab.addTab('')
self.results_view_tab.addTab('') self.results_view_tab.addTab('')
@ -438,9 +444,13 @@ class BibleMediaItem(MediaManagerItem):
:param index: The tab selected (int) :param index: The tab selected (int)
:return: None :return: None
""" """
search_tab = index == 0 if index == 0 or index == 1:
self.search_tab.setVisible(search_tab) self.search_button.setEnabled(True)
self.select_tab.setVisible(not search_tab) else:
self.search_button.setEnabled(False)
self.search_tab.setVisible(index == 0)
self.select_tab.setVisible(index == 1)
self.options_tab.setVisible(index == 2)
self.on_focus() self.on_focus()
def on_results_view_tab_current_changed(self, index): def on_results_view_tab_current_changed(self, index):
@ -542,16 +552,15 @@ class BibleMediaItem(MediaManagerItem):
:return: None :return: None
""" """
new_selection = self.second_combo_box.currentData() new_selection = self.second_combo_box.currentData()
if self.list_view.count(): if self.saved_results:
# Exclusive or (^) the new and previous selections to detect if the user has switched between single and # Exclusive or (^) the new and previous selections to detect if the user has switched between single and
# dual bible mode # dual bible mode
if (new_selection is None) ^ (self.second_bible is None): if (new_selection is None) ^ (self.second_bible is None):
if critical_error_message_box( if critical_error_message_box(
message=translate('BiblesPlugin.MediaItem', message=translate('BiblesPlugin.MediaItem',
'OpenLP cannot combine single and dual Bible verse search results. ' 'OpenLP cannot combine single and dual Bible verse search results. '
'Do you want to clear your results and start a new search?'), 'Do you want to clear your saved results?'),
parent=self, question=True) == QtWidgets.QMessageBox.Yes: parent=self, question=True) == QtWidgets.QMessageBox.Yes:
self.display_results()
self.saved_results = [] self.saved_results = []
self.on_results_view_tab_total_update(ResultsTab.Saved) self.on_results_view_tab_total_update(ResultsTab.Saved)
else: else:
@ -706,6 +715,8 @@ class BibleMediaItem(MediaManagerItem):
This search is called on def text_search by 'Search' Text and Combined Searches. This search is called on def text_search by 'Search' Text and Combined Searches.
""" """
self.search_results = self.plugin.manager.verse_search(self.bible.name, text) self.search_results = self.plugin.manager.verse_search(self.bible.name, text)
if self.search_results is None:
return
if self.second_bible and self.search_results: if self.second_bible and self.search_results:
filtered_search_results = [] filtered_search_results = []
not_found_count = 0 not_found_count = 0
@ -774,9 +785,12 @@ class BibleMediaItem(MediaManagerItem):
:return: None :return: None
""" """
if Settings().value('bibles/is search while typing enabled'): if not Settings().value('bibles/is search while typing enabled') or \
if not self.search_timer.isActive(): not self.bible or self.bible.is_web_bible or \
self.search_timer.start() (self.second_bible and self.bible.is_web_bible):
return
if not self.search_timer.isActive():
self.search_timer.start()
def on_search_timer_timeout(self): def on_search_timer_timeout(self):
""" """
@ -969,6 +983,8 @@ class BibleMediaItem(MediaManagerItem):
""" """
Search for some Bible verses (by reference). Search for some Bible verses (by reference).
""" """
if self.bible is None:
return []
reference = self.plugin.manager.parse_ref(self.bible.name, string) reference = self.plugin.manager.parse_ref(self.bible.name, string)
search_results = self.plugin.manager.get_verses(self.bible.name, reference, showError) search_results = self.plugin.manager.get_verses(self.bible.name, reference, showError)
if search_results: if search_results:
@ -980,6 +996,8 @@ class BibleMediaItem(MediaManagerItem):
""" """
Create a media item from an item id. Create a media item from an item id.
""" """
if self.bible is None:
return []
reference = self.plugin.manager.parse_ref(self.bible.name, item_id) reference = self.plugin.manager.parse_ref(self.bible.name, item_id)
search_results = self.plugin.manager.get_verses(self.bible.name, reference, False) search_results = self.plugin.manager.get_verses(self.bible.name, reference, False)
items = self.build_display_results(self.bible, None, search_results) items = self.build_display_results(self.bible, None, search_results)