openlp/openlp/plugins/bibles/lib/mediaitem.py

970 lines
50 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
2013-01-01 16:33:41 +00:00
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
###############################################################################
# OpenLP - Open Source Lyrics Projection #
# --------------------------------------------------------------------------- #
2015-01-18 13:39:21 +00:00
# Copyright (c) 2008-2015 OpenLP Developers #
# --------------------------------------------------------------------------- #
# 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 #
###############################################################################
import logging
from PyQt4 import QtCore, QtGui
2013-12-13 17:44:05 +00:00
from openlp.core.common import Registry, Settings, UiStrings, translate
from openlp.core.lib import MediaManagerItem, ItemCapabilities, ServiceItemContext, create_separated_list
2011-02-05 18:29:49 +00:00
from openlp.core.lib.searchedit import SearchEdit
from openlp.core.lib.ui import set_case_insensitive_completer, create_horizontal_adjusting_combo_box, \
2013-01-01 16:33:41 +00:00
critical_error_message_box, find_and_set_in_combo_box, build_icon
from openlp.core.utils import get_locale_key
from openlp.plugins.bibles.forms import BibleImportForm, EditBibleForm
2013-01-01 16:33:41 +00:00
from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, VerseReferenceList, get_reference_separator, \
LanguageSelection, BibleStrings
from openlp.plugins.bibles.lib.db import BiblesResourcesDB
2010-02-27 15:31:23 +00:00
log = logging.getLogger(__name__)
2013-03-17 10:23:15 +00:00
2011-02-14 14:23:56 +00:00
class BibleSearch(object):
"""
Enumeration class for the different search methods for the "quick search".
"""
Reference = 1
Text = 2
class BibleMediaItem(MediaManagerItem):
"""
This is the custom media manager item for Bibles.
"""
2013-08-31 18:17:38 +00:00
log.info('Bible Media Item loaded')
2013-03-07 13:14:31 +00:00
def __init__(self, parent, plugin):
2013-08-31 18:17:38 +00:00
self.lock_icon = build_icon(':/bibles/bibles_search_lock.png')
self.unlock_icon = build_icon(':/bibles/bibles_search_unlock.png')
2013-03-07 13:14:31 +00:00
MediaManagerItem.__init__(self, parent, plugin)
def setup_item(self):
"""
Do some additional setup.
"""
# Place to store the search results for both bibles.
2013-03-19 19:43:22 +00:00
self.settings = self.plugin.settings_tab
2013-03-19 22:00:50 +00:00
self.quick_preview_allowed = True
2013-03-23 06:46:41 +00:00
self.has_search = True
2010-09-01 17:27:38 +00:00
self.search_results = {}
2010-11-15 17:47:33 +00:00
self.second_search_results = {}
2013-03-19 22:00:50 +00:00
self.check_search_result()
2013-08-31 18:17:38 +00:00
Registry().register_function('bibles_load_list', self.reload_bibles)
2013-04-18 17:45:14 +00:00
def __check_second_bible(self, bible, second_bible):
"""
Check if the first item is a second bible item or not.
"""
2013-03-19 22:00:50 +00:00
bitem = self.list_view.item(0)
if not bitem.flags() & QtCore.Qt.ItemIsSelectable:
# The item is the "No Search Results" item.
2013-03-19 22:00:50 +00:00
self.list_view.clear()
2014-03-09 10:26:28 +00:00
self.display_results(bible, second_bible)
return
else:
2013-04-18 17:45:14 +00:00
item_second_bible = self._decode_qt_object(bitem, 'second_bible')
2013-01-01 16:33:41 +00:00
if item_second_bible and second_bible or not item_second_bible and not second_bible:
2014-03-09 10:26:28 +00:00
self.display_results(bible, second_bible)
elif critical_error_message_box(
message=translate('BiblesPlugin.MediaItem',
2014-03-09 10:26:28 +00:00
'You cannot combine single and dual Bible verse search results. '
'Do you want to delete your search results and start a new search?'),
parent=self, question=True) == QtGui.QMessageBox.Yes:
2013-03-19 22:00:50 +00:00
self.list_view.clear()
2014-03-09 10:26:28 +00:00
self.display_results(bible, second_bible)
2013-04-18 17:45:14 +00:00
def _decode_qt_object(self, bitem, key):
reference = bitem.data(QtCore.Qt.UserRole)
2013-08-31 18:17:38 +00:00
obj = reference[str(key)]
return str(obj).strip()
2013-03-19 22:00:50 +00:00
def required_icons(self):
"""
Set which icons the media manager tab should show
"""
MediaManagerItem.required_icons(self)
self.has_import_icon = True
self.has_new_icon = False
self.has_edit_icon = True
self.has_delete_icon = True
self.add_to_service_item = False
2009-09-26 09:11:39 +00:00
2014-03-09 10:26:28 +00:00
def add_search_tab(self, prefix, name):
self.search_tab_bar.addTab(name)
tab = QtGui.QWidget()
2013-08-31 18:17:38 +00:00
tab.setObjectName(prefix + 'Tab')
tab.setSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
layout = QtGui.QGridLayout(tab)
2013-08-31 18:17:38 +00:00
layout.setObjectName(prefix + 'Layout')
setattr(self, prefix + 'Tab', tab)
setattr(self, prefix + 'Layout', layout)
2014-03-09 10:26:28 +00:00
def add_search_fields(self, prefix, name):
2011-04-29 11:33:04 +00:00
"""
Creates and adds generic search tab.
2014-03-09 10:26:28 +00:00
:param prefix: The prefix of the tab, this is either ``quick`` or ``advanced``.
:param name: The translated string to display.
2011-04-29 11:33:04 +00:00
"""
2013-08-31 18:17:38 +00:00
if prefix == 'quick':
idx = 2
else:
idx = 5
2013-08-31 18:17:38 +00:00
tab = getattr(self, prefix + 'Tab')
layout = getattr(self, prefix + 'Layout')
2014-03-09 10:26:28 +00:00
version_label = QtGui.QLabel(tab)
version_label.setObjectName(prefix + 'VersionLabel')
layout.addWidget(version_label, idx, 0, QtCore.Qt.AlignRight)
version_combo_box = create_horizontal_adjusting_combo_box(tab, prefix + 'VersionComboBox')
version_label.setBuddy(version_combo_box)
layout.addWidget(version_combo_box, idx, 1, 1, 2)
second_label = QtGui.QLabel(tab)
second_label.setObjectName(prefix + 'SecondLabel')
layout.addWidget(second_label, idx + 1, 0, QtCore.Qt.AlignRight)
second_combo_box = create_horizontal_adjusting_combo_box(tab, prefix + 'SecondComboBox')
version_label.setBuddy(second_combo_box)
layout.addWidget(second_combo_box, idx + 1, 1, 1, 2)
style_label = QtGui.QLabel(tab)
style_label.setObjectName(prefix + 'StyleLabel')
layout.addWidget(style_label, idx + 2, 0, QtCore.Qt.AlignRight)
style_combo_box = create_horizontal_adjusting_combo_box(tab, prefix + 'StyleComboBox')
style_combo_box.addItems(['', '', ''])
layout.addWidget(style_combo_box, idx + 2, 1, 1, 2)
2013-03-19 22:00:50 +00:00
search_button_layout = QtGui.QHBoxLayout()
2013-08-31 18:17:38 +00:00
search_button_layout.setObjectName(prefix + 'search_button_layout')
2013-03-19 22:00:50 +00:00
search_button_layout.addStretch()
2014-03-09 10:26:28 +00:00
lock_button = QtGui.QToolButton(tab)
lock_button.setIcon(self.unlock_icon)
lock_button.setCheckable(True)
lock_button.setObjectName(prefix + 'LockButton')
search_button_layout.addWidget(lock_button)
search_button = QtGui.QPushButton(tab)
search_button.setObjectName(prefix + 'SearchButton')
search_button_layout.addWidget(search_button)
2013-03-19 22:00:50 +00:00
layout.addLayout(search_button_layout, idx + 3, 1, 1, 2)
self.page_layout.addWidget(tab)
tab.setVisible(False)
2014-03-09 10:26:28 +00:00
lock_button.toggled.connect(self.on_lock_button_toggled)
second_combo_box.currentIndexChanged.connect(self.on_second_bible_combobox_index_changed)
2014-03-09 10:26:28 +00:00
setattr(self, prefix + 'VersionLabel', version_label)
setattr(self, prefix + 'VersionComboBox', version_combo_box)
setattr(self, prefix + 'SecondLabel', second_label)
setattr(self, prefix + 'SecondComboBox', second_combo_box)
setattr(self, prefix + 'StyleLabel', style_label)
setattr(self, prefix + 'StyleComboBox', style_combo_box)
setattr(self, prefix + 'LockButton', lock_button)
2013-08-31 18:17:38 +00:00
setattr(self, prefix + 'SearchButtonLayout', search_button_layout)
2014-03-09 10:26:28 +00:00
setattr(self, prefix + 'SearchButton', search_button)
2011-04-29 11:33:04 +00:00
2013-03-19 22:00:50 +00:00
def add_end_header_bar(self):
2014-03-09 10:26:28 +00:00
self.search_tab_bar = QtGui.QTabBar(self)
self.search_tab_bar.setExpanding(False)
self.search_tab_bar.setObjectName('search_tab_bar')
self.page_layout.addWidget(self.search_tab_bar)
2010-11-12 21:51:18 +00:00
# Add the Quick Search tab.
2014-03-09 10:26:28 +00:00
self.add_search_tab('quick', translate('BiblesPlugin.MediaItem', 'Quick'))
self.quick_search_label = QtGui.QLabel(self.quickTab)
self.quick_search_label.setObjectName('quick_search_label')
self.quickLayout.addWidget(self.quick_search_label, 0, 0, QtCore.Qt.AlignRight)
self.quick_search_edit = SearchEdit(self.quickTab)
self.quick_search_edit.setSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Fixed)
self.quick_search_edit.setObjectName('quick_search_edit')
self.quick_search_label.setBuddy(self.quick_search_edit)
self.quickLayout.addWidget(self.quick_search_edit, 0, 1, 1, 2)
self.add_search_fields('quick', translate('BiblesPlugin.MediaItem', 'Quick'))
self.quickTab.setVisible(True)
2010-11-12 21:51:18 +00:00
# Add the Advanced Search tab.
2014-03-09 10:26:28 +00:00
self.add_search_tab('advanced', UiStrings().Advanced)
self.advanced_book_label = QtGui.QLabel(self.advancedTab)
self.advanced_book_label.setObjectName('advanced_book_label')
self.advancedLayout.addWidget(self.advanced_book_label, 0, 0, QtCore.Qt.AlignRight)
self.advanced_book_combo_box = create_horizontal_adjusting_combo_box(self.advancedTab,
'advanced_book_combo_box')
self.advanced_book_label.setBuddy(self.advanced_book_combo_box)
self.advancedLayout.addWidget(self.advanced_book_combo_box, 0, 1, 1, 2)
self.advanced_chapter_label = QtGui.QLabel(self.advancedTab)
self.advanced_chapter_label.setObjectName('advanced_chapter_label')
self.advancedLayout.addWidget(self.advanced_chapter_label, 1, 1, 1, 2)
self.advanced_verse_label = QtGui.QLabel(self.advancedTab)
self.advanced_verse_label.setObjectName('advanced_verse_label')
self.advancedLayout.addWidget(self.advanced_verse_label, 1, 2)
self.advanced_from_label = QtGui.QLabel(self.advancedTab)
self.advanced_from_label.setObjectName('advanced_from_label')
self.advancedLayout.addWidget(self.advanced_from_label, 3, 0, QtCore.Qt.AlignRight)
self.advanced_from_chapter = QtGui.QComboBox(self.advancedTab)
self.advanced_from_chapter.setObjectName('advanced_from_chapter')
self.advancedLayout.addWidget(self.advanced_from_chapter, 3, 1)
self.advanced_from_verse = QtGui.QComboBox(self.advancedTab)
self.advanced_from_verse.setObjectName('advanced_from_verse')
self.advancedLayout.addWidget(self.advanced_from_verse, 3, 2)
self.advanced_to_label = QtGui.QLabel(self.advancedTab)
self.advanced_to_label.setObjectName('advanced_to_label')
self.advancedLayout.addWidget(self.advanced_to_label, 4, 0, QtCore.Qt.AlignRight)
self.advanced_to_chapter = QtGui.QComboBox(self.advancedTab)
self.advanced_to_chapter.setObjectName('advanced_to_chapter')
self.advancedLayout.addWidget(self.advanced_to_chapter, 4, 1)
self.advanced_to_verse = QtGui.QComboBox(self.advancedTab)
self.advanced_to_verse.setObjectName('advanced_to_verse')
self.advancedLayout.addWidget(self.advanced_to_verse, 4, 2)
self.add_search_fields('advanced', UiStrings().Advanced)
# Combo Boxes
2014-03-09 10:26:28 +00:00
self.quickVersionComboBox.activated.connect(self.update_auto_completer)
self.quickSecondComboBox.activated.connect(self.update_auto_completer)
self.advancedVersionComboBox.activated.connect(self.on_advanced_version_combo_box)
self.advancedSecondComboBox.activated.connect(self.on_advanced_second_combo_box)
self.advanced_book_combo_box.activated.connect(self.on_advanced_book_combo_box)
self.advanced_from_chapter.activated.connect(self.on_advanced_from_chapter)
self.advanced_from_verse.activated.connect(self.on_advanced_from_verse)
self.advanced_to_chapter.activated.connect(self.on_advanced_to_chapter)
QtCore.QObject.connect(self.quick_search_edit, QtCore.SIGNAL('searchTypeChanged(int)'),
self.update_auto_completer)
self.quickVersionComboBox.activated.connect(self.update_auto_completer)
self.quickStyleComboBox.activated.connect(self.on_quick_style_combo_box_changed)
self.advancedStyleComboBox.activated.connect(self.on_advanced_style_combo_box_changed)
# Buttons
2014-03-09 10:26:28 +00:00
self.advancedSearchButton.clicked.connect(self.on_advanced_search_button)
self.quickSearchButton.clicked.connect(self.on_quick_search_button)
# Other stuff
2014-03-09 10:26:28 +00:00
self.quick_search_edit.returnPressed.connect(self.on_quick_search_button)
self.search_tab_bar.currentChanged.connect(self.on_search_tab_bar_current_changed)
2013-04-18 09:27:11 +00:00
def on_focus(self):
if self.quickTab.isVisible():
2014-03-09 10:26:28 +00:00
self.quick_search_edit.setFocus()
else:
2014-03-09 10:26:28 +00:00
self.advanced_book_combo_box.setFocus()
2013-02-07 07:08:35 +00:00
def config_update(self):
2013-08-31 18:17:38 +00:00
log.debug('config_update')
if Settings().value(self.settings_section + '/second bibles'):
self.quickSecondLabel.setVisible(True)
self.quickSecondComboBox.setVisible(True)
self.advancedSecondLabel.setVisible(True)
self.advancedSecondComboBox.setVisible(True)
self.quickSecondLabel.setVisible(True)
self.quickSecondComboBox.setVisible(True)
else:
self.quickSecondLabel.setVisible(False)
self.quickSecondComboBox.setVisible(False)
self.advancedSecondLabel.setVisible(False)
self.advancedSecondComboBox.setVisible(False)
self.quickSecondLabel.setVisible(False)
self.quickSecondComboBox.setVisible(False)
self.quickStyleComboBox.setCurrentIndex(self.settings.layout_style)
self.advancedStyleComboBox.setCurrentIndex(self.settings.layout_style)
def retranslateUi(self):
2013-08-31 18:17:38 +00:00
log.debug('retranslateUi')
2014-03-09 10:26:28 +00:00
self.quick_search_label.setText(translate('BiblesPlugin.MediaItem', 'Find:'))
2013-08-31 18:17:38 +00:00
self.quickVersionLabel.setText('%s:' % UiStrings().Version)
2013-01-01 16:33:41 +00:00
self.quickSecondLabel.setText(translate('BiblesPlugin.MediaItem', 'Second:'))
self.quickStyleLabel.setText(UiStrings().LayoutStyle)
2013-01-01 16:33:41 +00:00
self.quickStyleComboBox.setItemText(LayoutStyle.VersePerSlide, UiStrings().VersePerSlide)
self.quickStyleComboBox.setItemText(LayoutStyle.VersePerLine, UiStrings().VersePerLine)
self.quickStyleComboBox.setItemText(LayoutStyle.Continuous, UiStrings().Continuous)
self.quickLockButton.setToolTip(translate('BiblesPlugin.MediaItem',
2014-03-09 10:26:28 +00:00
'Toggle to keep or clear the previous results.'))
self.quickSearchButton.setText(UiStrings().Search)
2014-03-09 10:26:28 +00:00
self.advanced_book_label.setText(translate('BiblesPlugin.MediaItem', 'Book:'))
self.advanced_chapter_label.setText(translate('BiblesPlugin.MediaItem', 'Chapter:'))
self.advanced_verse_label.setText(translate('BiblesPlugin.MediaItem', 'Verse:'))
self.advanced_from_label.setText(translate('BiblesPlugin.MediaItem', 'From:'))
self.advanced_to_label.setText(translate('BiblesPlugin.MediaItem', 'To:'))
2013-08-31 18:17:38 +00:00
self.advancedVersionLabel.setText('%s:' % UiStrings().Version)
2013-01-01 16:33:41 +00:00
self.advancedSecondLabel.setText(translate('BiblesPlugin.MediaItem', 'Second:'))
self.advancedStyleLabel.setText(UiStrings().LayoutStyle)
2013-01-01 16:33:41 +00:00
self.advancedStyleComboBox.setItemText(LayoutStyle.VersePerSlide, UiStrings().VersePerSlide)
self.advancedStyleComboBox.setItemText(LayoutStyle.VersePerLine, UiStrings().VersePerLine)
self.advancedStyleComboBox.setItemText(LayoutStyle.Continuous, UiStrings().Continuous)
self.advancedLockButton.setToolTip(translate('BiblesPlugin.MediaItem',
2014-03-09 10:26:28 +00:00
'Toggle to keep or clear the previous results.'))
self.advancedSearchButton.setText(UiStrings().Search)
def initialise(self):
2013-08-31 18:17:38 +00:00
log.debug('bible manager initialise')
2011-05-28 09:53:37 +00:00
self.plugin.manager.media = self
2014-03-09 10:26:28 +00:00
self.load_bibles()
self.quick_search_edit.set_search_types([
2013-08-31 18:17:38 +00:00
(BibleSearch.Reference, ':/bibles/bibles_search_reference.png',
2013-01-01 16:33:41 +00:00
translate('BiblesPlugin.MediaItem', 'Scripture Reference'),
translate('BiblesPlugin.MediaItem', 'Search Scripture Reference...')),
2013-08-31 18:17:38 +00:00
(BibleSearch.Text, ':/bibles/bibles_search_text.png',
2013-01-01 16:33:41 +00:00
translate('BiblesPlugin.MediaItem', 'Text Search'),
translate('BiblesPlugin.MediaItem', 'Search Text...'))
])
2014-03-09 10:26:28 +00:00
self.quick_search_edit.set_current_search_type(Settings().value('%s/last search type' % self.settings_section))
2013-02-07 07:08:35 +00:00
self.config_update()
2013-08-31 18:17:38 +00:00
log.debug('bible manager initialise complete')
2014-03-09 10:26:28 +00:00
def load_bibles(self):
2013-08-31 18:17:38 +00:00
log.debug('Loading Bibles')
self.quickVersionComboBox.clear()
self.quickSecondComboBox.clear()
self.advancedVersionComboBox.clear()
self.advancedSecondComboBox.clear()
2013-08-31 18:17:38 +00:00
self.quickSecondComboBox.addItem('')
self.advancedSecondComboBox.addItem('')
# Get all bibles and sort the list.
2013-08-31 18:17:38 +00:00
bibles = list(self.plugin.manager.get_bibles().keys())
bibles = [_f for _f in bibles if _f]
bibles.sort(key=get_locale_key)
# Load the bibles into the combo boxes.
self.quickVersionComboBox.addItems(bibles)
self.quickSecondComboBox.addItems(bibles)
self.advancedVersionComboBox.addItems(bibles)
self.advancedSecondComboBox.addItems(bibles)
# set the default value
2013-08-31 18:17:38 +00:00
bible = Settings().value(self.settings_section + '/advanced bible')
2011-04-11 18:15:02 +00:00
if bible in bibles:
find_and_set_in_combo_box(self.advancedVersionComboBox, bible)
2014-03-09 10:26:28 +00:00
self.initialise_advanced_bible(str(bible))
elif bibles:
2014-03-09 10:26:28 +00:00
self.initialise_advanced_bible(bibles[0])
2013-08-31 18:17:38 +00:00
bible = Settings().value(self.settings_section + '/quick bible')
find_and_set_in_combo_box(self.quickVersionComboBox, bible)
2013-02-07 11:33:47 +00:00
def reload_bibles(self, process=False):
2013-08-31 18:17:38 +00:00
log.debug('Reloading Bibles')
2011-05-28 09:53:37 +00:00
self.plugin.manager.reload_bibles()
2014-03-09 10:26:28 +00:00
self.load_bibles()
# If called from first time wizard re-run, process any new bibles.
if process:
self.plugin.app_startup()
2014-03-09 10:26:28 +00:00
self.update_auto_completer()
2014-03-09 10:26:28 +00:00
def initialise_advanced_bible(self, bible, last_book_id=None):
"""
2014-03-09 10:26:28 +00:00
This initialises the given bible, which means that its book names and their chapter numbers is added to the
combo boxes on the 'Advanced Search' Tab. This is not of any importance of the 'Quick Search' Tab.
2012-05-17 15:13:09 +00:00
2014-03-09 10:26:28 +00:00
:param bible: The bible to initialise (unicode).
2014-05-02 06:50:54 +00:00
:param last_book_id: The "book reference id" of the book which is chosen at the moment. (int)
"""
2014-03-09 10:26:28 +00:00
log.debug('initialise_advanced_bible %s, %s', bible, last_book_id)
2011-05-28 09:53:37 +00:00
book_data = self.plugin.manager.get_books(bible)
2014-03-09 10:26:28 +00:00
second_bible = self.advancedSecondComboBox.currentText()
if second_bible != '':
second_book_data = self.plugin.manager.get_books(second_bible)
book_data_temp = []
for book in book_data:
2014-03-09 10:26:28 +00:00
for second_book in second_book_data:
if book['book_reference_id'] == second_book['book_reference_id']:
book_data_temp.append(book)
book_data = book_data_temp
2014-03-09 10:26:28 +00:00
self.advanced_book_combo_box.clear()
2010-09-26 13:38:40 +00:00
first = True
2012-04-23 20:21:38 +00:00
initialise_chapter_verse = False
2012-04-12 20:58:11 +00:00
language_selection = self.plugin.manager.get_language_selection(bible)
book_names = BibleStrings().BookNames
2010-09-26 13:38:40 +00:00
for book in book_data:
2014-03-09 10:26:28 +00:00
row = self.advanced_book_combo_box.count()
if language_selection == LanguageSelection.Bible:
2014-03-09 10:26:28 +00:00
self.advanced_book_combo_box.addItem(book['name'])
elif language_selection == LanguageSelection.Application:
2013-08-31 18:17:38 +00:00
data = BiblesResourcesDB.get_book_by_id(book['book_reference_id'])
2014-03-09 10:26:28 +00:00
self.advanced_book_combo_box.addItem(book_names[data['abbreviation']])
elif language_selection == LanguageSelection.English:
2013-08-31 18:17:38 +00:00
data = BiblesResourcesDB.get_book_by_id(book['book_reference_id'])
2014-03-09 10:26:28 +00:00
self.advanced_book_combo_box.addItem(data['name'])
self.advanced_book_combo_box.setItemData(row, book['book_reference_id'])
2010-09-26 13:38:40 +00:00
if first:
first = False
first_book = book
initialise_chapter_verse = True
2013-08-31 18:17:38 +00:00
if last_book_id and last_book_id == int(book['book_reference_id']):
2014-03-09 10:26:28 +00:00
index = self.advanced_book_combo_box.findData(book['book_reference_id'])
if index == -1:
# Not Found.
index = 0
2014-03-09 10:26:28 +00:00
self.advanced_book_combo_box.setCurrentIndex(index)
initialise_chapter_verse = False
if initialise_chapter_verse:
2014-03-09 10:26:28 +00:00
self.initialise_chapter_verse(bible, first_book['name'], first_book['book_reference_id'])
2014-03-09 10:26:28 +00:00
def initialise_chapter_verse(self, bible, book, book_ref_id):
log.debug('initialise_chapter_verse %s, %s, %s', bible, book, book_ref_id)
book = self.plugin.manager.get_book_by_id(bible, book_ref_id)
self.chapter_count = self.plugin.manager.get_chapter_count(bible, book)
2013-01-01 16:33:41 +00:00
verse_count = self.plugin.manager.get_verse_count_by_book_ref_id(bible, book_ref_id, 1)
if verse_count == 0:
self.advancedSearchButton.setEnabled(False)
2013-01-01 16:33:41 +00:00
critical_error_message_box(message=translate('BiblesPlugin.MediaItem', 'Bible not fully loaded.'))
2010-09-26 13:38:40 +00:00
else:
self.advancedSearchButton.setEnabled(True)
2014-03-09 10:26:28 +00:00
self.adjust_combo_box(1, self.chapter_count, self.advanced_from_chapter)
self.adjust_combo_box(1, self.chapter_count, self.advanced_to_chapter)
self.adjust_combo_box(1, verse_count, self.advanced_from_verse)
self.adjust_combo_box(1, verse_count, self.advanced_to_verse)
2010-01-29 21:26:24 +00:00
2014-03-09 10:26:28 +00:00
def update_auto_completer(self):
"""
2014-05-02 06:50:54 +00:00
This updates the bible book completion list for the search field. The completion depends on the bible. It is
only updated when we are doing a reference search, otherwise the auto completion list is removed.
"""
2014-03-09 10:26:28 +00:00
log.debug('update_auto_completer')
# Save the current search type to the configuration.
2014-03-09 10:26:28 +00:00
Settings().setValue('%s/last search type' % self.settings_section, self.quick_search_edit.current_search_type())
# Save the current bible to the configuration.
2013-08-31 18:17:38 +00:00
Settings().setValue(self.settings_section + '/quick bible', self.quickVersionComboBox.currentText())
books = []
2011-02-13 15:51:19 +00:00
# We have to do a 'Reference Search'.
2014-03-09 10:26:28 +00:00
if self.quick_search_edit.current_search_type() == BibleSearch.Reference:
2011-05-28 09:53:37 +00:00
bibles = self.plugin.manager.get_bibles()
2012-05-17 18:57:01 +00:00
bible = self.quickVersionComboBox.currentText()
if bible:
2010-12-03 19:53:56 +00:00
book_data = bibles[bible].get_books()
2014-03-09 10:26:28 +00:00
second_bible = self.quickSecondComboBox.currentText()
if second_bible != '':
second_book_data = bibles[second_bible].get_books()
book_data_temp = []
for book in book_data:
2014-03-09 10:26:28 +00:00
for second_book in second_book_data:
if book.book_reference_id == second_book.book_reference_id:
book_data_temp.append(book)
book_data = book_data_temp
2013-01-01 16:33:41 +00:00
language_selection = self.plugin.manager.get_language_selection(bible)
if language_selection == LanguageSelection.Bible:
2013-08-31 18:17:38 +00:00
books = [book.name + ' ' for book in book_data]
elif language_selection == LanguageSelection.Application:
book_names = BibleStrings().BookNames
for book in book_data:
2013-01-01 16:33:41 +00:00
data = BiblesResourcesDB.get_book_by_id(book.book_reference_id)
2013-08-31 18:17:38 +00:00
books.append(str(book_names[data['abbreviation']]) + ' ')
elif language_selection == LanguageSelection.English:
for book in book_data:
2013-01-01 16:33:41 +00:00
data = BiblesResourcesDB.get_book_by_id(book.book_reference_id)
2013-08-31 18:17:38 +00:00
books.append(data['name'] + ' ')
books.sort(key=get_locale_key)
2014-03-09 10:26:28 +00:00
set_case_insensitive_completer(books, self.quick_search_edit)
def on_second_bible_combobox_index_changed(self, selection):
"""
Activate the style combobox only when no second bible is selected
"""
if selection == 0:
self.quickStyleComboBox.setEnabled(True)
self.advancedStyleComboBox.setEnabled(True)
else:
self.quickStyleComboBox.setEnabled(False)
self.advancedStyleComboBox.setEnabled(False)
2013-03-19 20:05:13 +00:00
def on_import_click(self):
2013-08-31 18:17:38 +00:00
if not hasattr(self, 'import_wizard'):
2013-01-01 16:33:41 +00:00
self.import_wizard = BibleImportForm(self, self.plugin.manager, self.plugin)
# If the import was not cancelled then reload.
if self.import_wizard.exec_():
2013-02-07 11:33:47 +00:00
self.reload_bibles()
2013-03-19 22:00:50 +00:00
def on_edit_click(self):
if self.quickTab.isVisible():
2012-05-17 18:57:01 +00:00
bible = self.quickVersionComboBox.currentText()
elif self.advancedTab.isVisible():
2012-05-17 18:57:01 +00:00
bible = self.advancedVersionComboBox.currentText()
2012-04-04 19:34:14 +00:00
if bible:
2014-03-09 10:26:28 +00:00
self.edit_bible_form = EditBibleForm(self, self.main_window, self.plugin.manager)
2014-03-17 19:05:55 +00:00
self.edit_bible_form.load_bible(bible)
2014-03-09 10:26:28 +00:00
if self.edit_bible_form.exec_():
2013-02-07 11:33:47 +00:00
self.reload_bibles()
2013-03-19 22:00:50 +00:00
def on_delete_click(self):
2014-04-12 20:19:22 +00:00
"""
When the delete button is pressed
"""
bible = None
if self.quickTab.isVisible():
2012-05-17 18:57:01 +00:00
bible = self.quickVersionComboBox.currentText()
elif self.advancedTab.isVisible():
2012-05-17 18:57:01 +00:00
bible = self.advancedVersionComboBox.currentText()
2012-04-04 19:34:14 +00:00
if bible:
2014-03-09 10:26:28 +00:00
if QtGui.QMessageBox.question(
self, UiStrings().ConfirmDelete,
translate('BiblesPlugin.MediaItem', 'Are you sure you want to completely delete "%s" Bible from '
2014-04-12 20:19:22 +00:00
'OpenLP?\n\nYou will need to re-import this Bible to use it '
'again.') % bible,
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No),
2014-03-09 10:26:28 +00:00
QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No:
return
self.plugin.manager.delete_bible(bible)
2013-02-07 11:33:47 +00:00
self.reload_bibles()
2014-03-09 10:26:28 +00:00
def on_search_tab_bar_current_changed(self, index):
if index == 0:
self.advancedTab.setVisible(False)
self.quickTab.setVisible(True)
2014-03-09 10:26:28 +00:00
self.quick_search_edit.setFocus()
else:
self.quickTab.setVisible(False)
self.advancedTab.setVisible(True)
2014-03-09 10:26:28 +00:00
self.advanced_book_combo_box.setFocus()
2014-03-09 10:26:28 +00:00
def on_lock_button_toggled(self, checked):
if checked:
2013-04-18 17:45:14 +00:00
self.sender().setIcon(self.lock_icon)
else:
2013-04-18 17:45:14 +00:00
self.sender().setIcon(self.unlock_icon)
2014-03-09 10:26:28 +00:00
def on_quick_style_combo_box_changed(self):
self.settings.layout_style = self.quickStyleComboBox.currentIndex()
self.advancedStyleComboBox.setCurrentIndex(self.settings.layout_style)
2013-03-25 06:22:11 +00:00
self.settings.layout_style_combo_box.setCurrentIndex(self.settings.layout_style)
2013-08-31 18:17:38 +00:00
Settings().setValue(self.settings_section + '/verse layout style', self.settings.layout_style)
2014-03-09 10:26:28 +00:00
def on_advanced_style_combo_box_changed(self):
self.settings.layout_style = self.advancedStyleComboBox.currentIndex()
self.quickStyleComboBox.setCurrentIndex(self.settings.layout_style)
2013-03-25 06:22:11 +00:00
self.settings.layout_style_combo_box.setCurrentIndex(self.settings.layout_style)
2013-08-31 18:17:38 +00:00
Settings().setValue(self.settings_section + '/verse layout style', self.settings.layout_style)
2014-03-09 10:26:28 +00:00
def on_advanced_version_combo_box(self):
2013-08-31 18:17:38 +00:00
Settings().setValue(self.settings_section + '/advanced bible', self.advancedVersionComboBox.currentText())
2014-03-09 10:26:28 +00:00
self.initialise_advanced_bible(
self.advancedVersionComboBox.currentText(),
self.advanced_book_combo_box.itemData(int(self.advanced_book_combo_box.currentIndex())))
2014-03-09 10:26:28 +00:00
def on_advanced_second_combo_box(self):
self.initialise_advanced_bible(
self.advancedVersionComboBox.currentText(),
self.advanced_book_combo_box.itemData(int(self.advanced_book_combo_box.currentIndex())))
2014-03-09 10:26:28 +00:00
def on_advanced_book_combo_box(self):
item = int(self.advanced_book_combo_box.currentIndex())
self.initialise_chapter_verse(
2012-05-17 18:57:01 +00:00
self.advancedVersionComboBox.currentText(),
2014-03-09 10:26:28 +00:00
self.advanced_book_combo_box.currentText(),
self.advanced_book_combo_box.itemData(item))
2014-03-09 10:26:28 +00:00
def on_advanced_from_verse(self):
chapter_from = int(self.advanced_from_chapter.currentText())
chapter_to = int(self.advanced_to_chapter.currentText())
if chapter_from == chapter_to:
2012-05-17 18:57:01 +00:00
bible = self.advancedVersionComboBox.currentText()
2014-03-09 10:26:28 +00:00
book_ref_id = self.advanced_book_combo_box.itemData(int(self.advanced_book_combo_box.currentIndex()))
verse_from = int(self.advanced_from_verse.currentText())
2013-01-01 16:33:41 +00:00
verse_count = self.plugin.manager.get_verse_count_by_book_ref_id(bible, book_ref_id, chapter_to)
2014-03-09 10:26:28 +00:00
self.adjust_combo_box(verse_from, verse_count, self.advanced_to_verse, True)
2010-09-22 18:46:02 +00:00
2014-03-09 10:26:28 +00:00
def on_advanced_to_chapter(self):
2012-05-17 18:57:01 +00:00
bible = self.advancedVersionComboBox.currentText()
2014-03-09 10:26:28 +00:00
book_ref_id = self.advanced_book_combo_box.itemData(int(self.advanced_book_combo_box.currentIndex()))
chapter_from = int(self.advanced_from_chapter.currentText())
chapter_to = int(self.advanced_to_chapter.currentText())
verse_from = int(self.advanced_from_verse.currentText())
verse_to = int(self.advanced_to_verse.currentText())
2013-01-01 16:33:41 +00:00
verse_count = self.plugin.manager.get_verse_count_by_book_ref_id(bible, book_ref_id, chapter_to)
if chapter_from == chapter_to and verse_from > verse_to:
2014-03-09 10:26:28 +00:00
self.adjust_combo_box(verse_from, verse_count, self.advanced_to_verse)
2010-09-22 18:46:02 +00:00
else:
2014-03-09 10:26:28 +00:00
self.adjust_combo_box(1, verse_count, self.advanced_to_verse)
2014-03-09 10:26:28 +00:00
def on_advanced_from_chapter(self):
2012-05-17 18:57:01 +00:00
bible = self.advancedVersionComboBox.currentText()
2014-03-09 10:26:28 +00:00
book_ref_id = self.advanced_book_combo_box.itemData(
int(self.advanced_book_combo_box.currentIndex()))
chapter_from = int(self.advanced_from_chapter.currentText())
chapter_to = int(self.advanced_to_chapter.currentText())
2013-01-01 16:33:41 +00:00
verse_count = self.plugin.manager.get_verse_count_by_book_ref_id(bible, book_ref_id, chapter_from)
2014-03-09 10:26:28 +00:00
self.adjust_combo_box(1, verse_count, self.advanced_from_verse)
if chapter_from > chapter_to:
2014-03-09 10:26:28 +00:00
self.adjust_combo_box(1, verse_count, self.advanced_to_verse)
self.adjust_combo_box(chapter_from, self.chapter_count, self.advanced_to_chapter)
elif chapter_from == chapter_to:
2014-03-09 10:26:28 +00:00
self.adjust_combo_box(chapter_from, self.chapter_count, self.advanced_to_chapter)
self.adjust_combo_box(1, verse_count, self.advanced_to_verse, True)
else:
2014-03-09 10:26:28 +00:00
self.adjust_combo_box(chapter_from, self.chapter_count, self.advanced_to_chapter, True)
2014-03-09 10:26:28 +00:00
def adjust_combo_box(self, range_from, range_to, combo, restore=False):
"""
2010-11-12 17:54:34 +00:00
Adjusts the given como box to the given values.
2014-03-09 10:26:28 +00:00
:param range_from: The first number of the range (int).
:param range_to: The last number of the range (int).
:param combo: The combo box itself (QComboBox).
2014-05-02 06:50:54 +00:00
:param restore: If True, then the combo's currentText will be restored after adjusting (if possible).
"""
2014-03-09 10:26:28 +00:00
log.debug('adjust_combo_box %s, %s, %s', combo, range_from, range_to)
if restore:
2012-05-17 18:57:01 +00:00
old_text = combo.currentText()
2010-09-26 13:38:40 +00:00
combo.clear()
2013-08-31 18:17:38 +00:00
combo.addItems(list(map(str, list(range(range_from, range_to + 1)))))
2010-09-26 17:23:58 +00:00
if restore and combo.findText(old_text) != -1:
combo.setCurrentIndex(combo.findText(old_text))
2010-09-26 13:38:40 +00:00
2014-03-09 10:26:28 +00:00
def on_advanced_search_button(self):
"""
2010-11-12 17:54:34 +00:00
Does an advanced search and saves the search results.
"""
2013-08-31 18:17:38 +00:00
log.debug('Advanced Search Button clicked')
self.advancedSearchButton.setEnabled(False)
2013-02-03 19:23:12 +00:00
self.application.process_events()
2012-05-17 18:57:01 +00:00
bible = self.advancedVersionComboBox.currentText()
second_bible = self.advancedSecondComboBox.currentText()
2014-03-09 10:26:28 +00:00
book = self.advanced_book_combo_box.currentText()
book_ref_id = self.advanced_book_combo_box.itemData(int(self.advanced_book_combo_box.currentIndex()))
chapter_from = self.advanced_from_chapter.currentText()
chapter_to = self.advanced_to_chapter.currentText()
verse_from = self.advanced_from_verse.currentText()
verse_to = self.advanced_to_verse.currentText()
2013-08-31 18:17:38 +00:00
verse_separator = get_reference_separator('sep_v_display')
range_separator = get_reference_separator('sep_r_display')
2013-01-01 16:33:41 +00:00
verse_range = chapter_from + verse_separator + verse_from + range_separator + chapter_to + \
verse_separator + verse_to
2014-03-09 10:26:28 +00:00
verse_text = '%s %s' % (book, verse_range)
2013-02-03 19:23:12 +00:00
self.application.set_busy_cursor()
2014-03-09 10:26:28 +00:00
self.search_results = self.plugin.manager.get_verses(bible, verse_text, book_ref_id)
2010-11-15 17:47:33 +00:00
if second_bible:
2014-03-09 10:26:28 +00:00
self.second_search_results = self.plugin.manager.get_verses(second_bible, verse_text, book_ref_id)
if not self.advancedLockButton.isChecked():
2013-03-19 22:00:50 +00:00
self.list_view.clear()
if self.list_view.count() != 0:
2013-04-18 17:45:14 +00:00
self.__check_second_bible(bible, second_bible)
2011-02-24 21:07:12 +00:00
elif self.search_results:
2014-03-09 10:26:28 +00:00
self.display_results(bible, second_bible)
self.advancedSearchButton.setEnabled(True)
2013-03-19 22:00:50 +00:00
self.check_search_result()
2013-02-03 19:23:12 +00:00
self.application.set_normal_cursor()
2014-03-09 10:26:28 +00:00
def on_quick_search_button(self):
2010-11-16 18:33:37 +00:00
"""
2014-05-02 06:50:54 +00:00
Does a quick search and saves the search results. Quick search can either be "Reference Search" or
"Text Search".
2010-11-16 18:33:37 +00:00
"""
2013-08-31 18:17:38 +00:00
log.debug('Quick Search Button clicked')
self.quickSearchButton.setEnabled(False)
2013-02-03 19:23:12 +00:00
self.application.process_events()
2012-05-17 18:57:01 +00:00
bible = self.quickVersionComboBox.currentText()
second_bible = self.quickSecondComboBox.currentText()
2014-03-09 10:26:28 +00:00
text = self.quick_search_edit.text()
if self.quick_search_edit.current_search_type() == BibleSearch.Reference:
2011-02-13 15:51:19 +00:00
# We are doing a 'Reference Search'.
2011-05-28 09:53:37 +00:00
self.search_results = self.plugin.manager.get_verses(bible, text)
2010-11-15 17:47:33 +00:00
if second_bible and self.search_results:
2014-03-09 10:26:28 +00:00
self.second_search_results = \
self.plugin.manager.get_verses(second_bible, text, self.search_results[0].book.book_reference_id)
2010-10-08 17:37:34 +00:00
else:
2010-11-09 17:23:18 +00:00
# We are doing a 'Text Search'.
2013-02-03 19:23:12 +00:00
self.application.set_busy_cursor()
2011-05-28 09:53:37 +00:00
bibles = self.plugin.manager.get_bibles()
2013-01-01 16:33:41 +00:00
self.search_results = self.plugin.manager.verse_search(bible, second_bible, text)
2010-11-15 17:47:33 +00:00
if second_bible and self.search_results:
text = []
new_search_results = []
count = 0
passage_not_found = False
for verse in self.search_results:
2013-01-01 16:33:41 +00:00
db_book = bibles[second_bible].get_book_by_book_ref_id(verse.book.book_reference_id)
if not db_book:
2013-08-31 18:17:38 +00:00
log.debug('Passage "%s %d:%d" not found in Second Bible' %
2014-03-21 18:23:35 +00:00
(verse.book.name, verse.chapter, verse.verse))
passage_not_found = True
count += 1
continue
new_search_results.append(verse)
2014-03-09 10:26:28 +00:00
text.append((verse.book.book_reference_id, verse.chapter, verse.verse, verse.verse))
if passage_not_found:
2014-03-09 10:26:28 +00:00
QtGui.QMessageBox.information(
self, translate('BiblesPlugin.MediaItem', 'Information'),
2013-01-01 16:33:41 +00:00
translate('BiblesPlugin.MediaItem', 'The second Bible does not contain all the verses '
2014-03-09 10:26:28 +00:00
'that are in the main Bible. Only verses found in both Bibles will be shown. %d '
'verses have not been included in the results.') % count,
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
self.search_results = new_search_results
2013-01-01 16:33:41 +00:00
self.second_search_results = bibles[second_bible].get_verses(text)
if not self.quickLockButton.isChecked():
2013-03-19 22:00:50 +00:00
self.list_view.clear()
if self.list_view.count() != 0 and self.search_results:
2013-04-18 17:45:14 +00:00
self.__check_second_bible(bible, second_bible)
2010-09-20 18:55:14 +00:00
elif self.search_results:
2014-03-09 10:26:28 +00:00
self.display_results(bible, second_bible)
self.quickSearchButton.setEnabled(True)
2013-03-19 22:00:50 +00:00
self.check_search_result()
2013-02-03 19:23:12 +00:00
self.application.set_normal_cursor()
2014-03-09 10:26:28 +00:00
def display_results(self, bible, second_bible=''):
2011-02-01 00:33:50 +00:00
"""
2014-05-02 06:50:54 +00:00
Displays the search results in the media manager. All data needed for further action is saved for/in each row.
2011-02-01 00:33:50 +00:00
"""
2014-03-09 10:26:28 +00:00
items = self.build_display_results(bible, second_bible, self.search_results)
for bible_verse in items:
2013-03-19 22:00:50 +00:00
self.list_view.addItem(bible_verse)
self.list_view.selectAll()
self.search_results = {}
self.second_search_results = {}
2011-02-01 00:33:50 +00:00
2014-03-09 10:26:28 +00:00
def build_display_results(self, bible, second_bible, search_results):
2010-09-26 13:38:40 +00:00
"""
2014-05-02 06:50:54 +00:00
Displays the search results in the media manager. All data needed for further action is saved for/in each row.
2010-09-26 13:38:40 +00:00
"""
2013-08-31 18:17:38 +00:00
verse_separator = get_reference_separator('sep_v_display')
version = self.plugin.manager.get_meta_data(bible, 'name').value
copyright = self.plugin.manager.get_meta_data(bible, 'copyright').value
permissions = self.plugin.manager.get_meta_data(bible, 'permissions').value
second_version = ''
second_copyright = ''
second_permissions = ''
2010-11-15 17:47:33 +00:00
if second_bible:
2013-08-31 18:17:38 +00:00
second_version = self.plugin.manager.get_meta_data(second_bible, 'name').value
second_copyright = self.plugin.manager.get_meta_data(second_bible, 'copyright').value
second_permissions = self.plugin.manager.get_meta_data(second_bible, 'permissions').value
items = []
2012-04-12 20:58:11 +00:00
language_selection = self.plugin.manager.get_language_selection(bible)
for count, verse in enumerate(search_results):
book = None
if language_selection == LanguageSelection.Bible:
book = verse.book.name
elif language_selection == LanguageSelection.Application:
book_names = BibleStrings().BookNames
2013-01-01 16:33:41 +00:00
data = BiblesResourcesDB.get_book_by_id(verse.book.book_reference_id)
2013-08-31 18:17:38 +00:00
book = str(book_names[data['abbreviation']])
elif language_selection == LanguageSelection.English:
2013-01-01 16:33:41 +00:00
data = BiblesResourcesDB.get_book_by_id(verse.book.book_reference_id)
2013-08-31 18:17:38 +00:00
book = data['name']
2011-03-22 16:21:10 +00:00
data = {
2012-05-17 15:13:09 +00:00
'book': book,
'chapter': verse.chapter,
'verse': verse.verse,
'bible': bible,
'version': version,
'copyright': copyright,
'permissions': permissions,
'text': verse.text,
'second_bible': second_bible,
'second_version': second_version,
'second_copyright': second_copyright,
'second_permissions': second_permissions,
2013-08-31 18:17:38 +00:00
'second_text': ''
2011-03-22 16:21:10 +00:00
}
2010-11-15 17:47:33 +00:00
if second_bible:
2010-11-29 19:02:58 +00:00
try:
2013-08-31 18:17:38 +00:00
data['second_text'] = self.second_search_results[count].text
2010-11-29 19:02:58 +00:00
except IndexError:
2013-08-31 18:17:38 +00:00
log.exception('The second_search_results does not have as many verses as the search_results.')
2010-11-29 19:02:58 +00:00
break
2013-08-31 18:17:38 +00:00
bible_text = '%s %d%s%d (%s, %s)' % (book, verse.chapter, verse_separator, verse.verse, version,
2014-04-12 20:19:22 +00:00
second_version)
2010-09-26 13:38:40 +00:00
else:
2013-08-31 18:17:38 +00:00
bible_text = '%s %d%s%d (%s)' % (book, verse.chapter, verse_separator, verse.verse, version)
2010-09-26 13:38:40 +00:00
bible_verse = QtGui.QListWidgetItem(bible_text)
2012-05-17 15:13:09 +00:00
bible_verse.setData(QtCore.Qt.UserRole, data)
items.append(bible_verse)
return items
2010-09-15 16:52:22 +00:00
2014-03-09 10:26:28 +00:00
def generate_slide_data(self, service_item, item=None, xml_version=False, remote=False,
context=ServiceItemContext.Service):
2010-08-28 17:05:45 +00:00
"""
2014-03-09 10:26:28 +00:00
Generate the slide data. Needs to be implemented by the plugin.
:param service_item: The service item to be built on
:param item: The Song item to be used
:param xml_version: The xml version (not used)
:param remote: Triggered from remote
:param context: Why is it being generated
2010-08-28 17:05:45 +00:00
"""
2013-08-31 18:17:38 +00:00
log.debug('generating slide data')
if item:
items = item
else:
2013-03-19 22:00:50 +00:00
items = self.list_view.selectedItems()
if not items:
return False
2013-08-31 18:17:38 +00:00
bible_text = ''
2011-01-08 19:24:56 +00:00
old_item = None
old_chapter = -1
2010-09-01 17:27:38 +00:00
raw_slides = []
raw_title = []
2011-03-20 20:50:19 +00:00
verses = VerseReferenceList()
for bitem in items:
2013-04-18 17:45:14 +00:00
book = self._decode_qt_object(bitem, 'book')
chapter = int(self._decode_qt_object(bitem, 'chapter'))
verse = int(self._decode_qt_object(bitem, 'verse'))
bible = self._decode_qt_object(bitem, 'bible')
version = self._decode_qt_object(bitem, 'version')
copyright = self._decode_qt_object(bitem, 'copyright')
permissions = self._decode_qt_object(bitem, 'permissions')
text = self._decode_qt_object(bitem, 'text')
second_bible = self._decode_qt_object(bitem, 'second_bible')
second_version = self._decode_qt_object(bitem, 'second_version')
second_copyright = self._decode_qt_object(bitem, 'second_copyright')
second_permissions = self._decode_qt_object(bitem, 'second_permissions')
second_text = self._decode_qt_object(bitem, 'second_text')
2011-03-20 20:50:19 +00:00
verses.add(book, chapter, verse, version, copyright, permissions)
2014-03-09 10:26:28 +00:00
verse_text = self.format_verse(old_chapter, chapter, verse)
2010-11-15 17:47:33 +00:00
if second_bible:
bible_text = '%s%s\n\n%s %s' % (verse_text, text, verse_text, second_text)
2011-01-14 17:46:59 +00:00
raw_slides.append(bible_text.rstrip())
2013-08-31 18:17:38 +00:00
bible_text = ''
# If we are 'Verse Per Slide' then create a new slide.
2011-02-18 03:15:09 +00:00
elif self.settings.layout_style == LayoutStyle.VersePerSlide:
bible_text = '%s%s' % (verse_text, text)
2011-01-14 17:46:59 +00:00
raw_slides.append(bible_text.rstrip())
2013-08-31 18:17:38 +00:00
bible_text = ''
# If we are 'Verse Per Line' then force a new line.
2011-02-18 03:15:09 +00:00
elif self.settings.layout_style == LayoutStyle.VersePerLine:
bible_text = '%s%s%s\n' % (bible_text, verse_text, text)
# We have to be 'Continuous'.
else:
bible_text = '%s %s%s\n' % (bible_text, verse_text, text)
2013-08-31 18:17:38 +00:00
bible_text = bible_text.strip(' ')
2011-01-08 19:24:56 +00:00
if not old_item:
start_item = bitem
2014-03-09 10:26:28 +00:00
elif self.check_title(bitem, old_item):
raw_title.append(self.format_title(start_item, old_item))
start_item = bitem
old_item = bitem
old_chapter = chapter
2011-03-20 20:50:19 +00:00
# Add footer
service_item.raw_footer.append(verses.format_verses())
if second_bible:
2013-01-01 16:33:41 +00:00
verses.add_version(second_version, second_copyright, second_permissions)
2011-03-20 20:50:19 +00:00
service_item.raw_footer.append(verses.format_versions())
2014-03-09 10:26:28 +00:00
raw_title.append(self.format_title(start_item, bitem))
# If there are no more items we check whether we have to add bible_text.
if bible_text:
2011-01-14 17:46:59 +00:00
raw_slides.append(bible_text.lstrip())
2010-10-08 17:37:34 +00:00
# Service Item: Capabilities
2013-01-01 16:33:41 +00:00
if self.settings.layout_style == LayoutStyle.Continuous and not second_bible:
2010-09-22 18:46:02 +00:00
# Split the line but do not replace line breaks in renderer.
2010-08-29 12:49:45 +00:00
service_item.add_capability(ItemCapabilities.NoLineBreaks)
2011-08-28 17:45:13 +00:00
service_item.add_capability(ItemCapabilities.CanPreview)
service_item.add_capability(ItemCapabilities.CanLoop)
service_item.add_capability(ItemCapabilities.CanWordSplit)
service_item.add_capability(ItemCapabilities.CanEditTitle)
2010-10-08 17:37:34 +00:00
# Service Item: Title
2012-02-16 20:36:35 +00:00
service_item.title = create_separated_list(raw_title)
2010-10-08 17:37:34 +00:00
# Service Item: Theme
if not self.settings.bible_theme:
service_item.theme = None
else:
2011-02-18 03:15:09 +00:00
service_item.theme = self.settings.bible_theme
2011-06-01 06:47:19 +00:00
for slide in raw_slides:
2012-06-10 13:39:45 +00:00
service_item.add_from_text(slide)
return True
2014-03-09 10:26:28 +00:00
def format_title(self, start_bitem, old_bitem):
2010-09-16 16:22:23 +00:00
"""
2014-05-02 06:50:54 +00:00
This method is called, when we have to change the title, because we are at the end of a verse range. E. g. if we
want to add Genesis 1:1-6 as well as Daniel 2:14.
2014-03-09 10:26:28 +00:00
:param start_bitem: The first item of a range.
:param old_bitem: The last item of a range.
2010-09-16 16:22:23 +00:00
"""
2013-08-31 18:17:38 +00:00
verse_separator = get_reference_separator('sep_v_display')
range_separator = get_reference_separator('sep_r_display')
2013-04-18 17:45:14 +00:00
old_chapter = self._decode_qt_object(old_bitem, 'chapter')
old_verse = self._decode_qt_object(old_bitem, 'verse')
start_book = self._decode_qt_object(start_bitem, 'book')
start_chapter = self._decode_qt_object(start_bitem, 'chapter')
start_verse = self._decode_qt_object(start_bitem, 'verse')
start_bible = self._decode_qt_object(start_bitem, 'bible')
start_second_bible = self._decode_qt_object(start_bitem, 'second_bible')
2010-11-15 17:47:33 +00:00
if start_second_bible:
2013-08-31 18:17:38 +00:00
bibles = '%s, %s' % (start_bible, start_second_bible)
2010-09-16 16:22:23 +00:00
else:
2010-12-17 13:21:55 +00:00
bibles = start_bible
if start_chapter == old_chapter:
if start_verse == old_verse:
verse_range = start_chapter + verse_separator + start_verse
2010-09-16 16:22:23 +00:00
else:
2013-01-01 16:33:41 +00:00
verse_range = start_chapter + verse_separator + start_verse + range_separator + old_verse
2010-12-17 13:21:55 +00:00
else:
verse_range = start_chapter + verse_separator + start_verse + \
range_separator + old_chapter + verse_separator + old_verse
2013-08-31 18:17:38 +00:00
return '%s %s (%s)' % (start_book, verse_range, bibles)
2010-09-16 16:35:19 +00:00
2014-03-09 10:26:28 +00:00
def check_title(self, bitem, old_bitem):
2010-09-16 16:22:23 +00:00
"""
2014-05-02 06:50:54 +00:00
This method checks if we are at the end of an verse range. If that is the case, we return True, otherwise False.
E. g. if we added Genesis 1:1-6, but the next verse is Daniel 2:14, we return True.
2014-03-09 10:26:28 +00:00
:param bitem: The item we are dealing with at the moment.
:param old_bitem: The item we were previously dealing with.
2010-09-16 16:22:23 +00:00
"""
# Get all the necessary meta data.
2013-04-18 17:45:14 +00:00
book = self._decode_qt_object(bitem, 'book')
chapter = int(self._decode_qt_object(bitem, 'chapter'))
verse = int(self._decode_qt_object(bitem, 'verse'))
bible = self._decode_qt_object(bitem, 'bible')
second_bible = self._decode_qt_object(bitem, 'second_bible')
old_book = self._decode_qt_object(old_bitem, 'book')
old_chapter = int(self._decode_qt_object(old_bitem, 'chapter'))
old_verse = int(self._decode_qt_object(old_bitem, 'verse'))
old_bible = self._decode_qt_object(old_bitem, 'bible')
old_second_bible = self._decode_qt_object(old_bitem, 'second_bible')
2013-01-01 16:33:41 +00:00
if old_bible != bible or old_second_bible != second_bible or old_book != book:
2010-12-13 14:24:16 +00:00
# The bible, second bible or book has changed.
2010-09-16 16:22:23 +00:00
return True
elif old_verse + 1 != verse and old_chapter == chapter:
# We are still in the same chapter, but a verse has been skipped.
2010-09-16 16:22:23 +00:00
return True
2014-03-21 18:23:35 +00:00
elif old_chapter + 1 == chapter and (verse != 1 or old_verse !=
self.plugin.manager.get_verse_count(old_bible, old_book, old_chapter)):
2014-05-02 06:50:54 +00:00
# We are in the following chapter, but the last verse was not the last verse of the chapter or the current
# verse is not the first one of the chapter.
2010-09-16 16:22:23 +00:00
return True
2012-04-01 11:16:08 +00:00
return False
2010-09-16 16:22:23 +00:00
2014-03-09 10:26:28 +00:00
def format_verse(self, old_chapter, chapter, verse):
"""
2014-05-02 06:50:54 +00:00
Formats and returns the text, each verse starts with, for the given chapter and verse. The text is either
surrounded by round, square, curly brackets or no brackets at all. For example::
2014-05-02 06:42:17 +00:00
'{su}1:1{/su}'
2014-03-09 10:26:28 +00:00
:param old_chapter: The previous verse's chapter number (int).
:param chapter: The chapter number (int).
:param verse: The verse number (int).
"""
2013-08-31 18:17:38 +00:00
verse_separator = get_reference_separator('sep_v_display')
if not self.settings.is_verse_number_visible:
2013-08-31 20:04:36 +00:00
return ''
2011-02-18 03:15:09 +00:00
if not self.settings.show_new_chapters or old_chapter != chapter:
2013-08-31 18:17:38 +00:00
verse_text = str(chapter) + verse_separator + str(verse)
2010-08-29 12:49:45 +00:00
else:
2013-08-31 18:17:38 +00:00
verse_text = str(verse)
2011-02-18 03:15:09 +00:00
if self.settings.display_style == DisplayStyle.Round:
return '{su}(%s){/su} ' % verse_text
2011-03-22 16:21:10 +00:00
if self.settings.display_style == DisplayStyle.Curly:
return '{su}{%s}{/su} ' % verse_text
2011-03-22 16:21:10 +00:00
if self.settings.display_style == DisplayStyle.Square:
return '{su}[%s]{/su} ' % verse_text
return '{su}%s{/su} ' % verse_text
def search(self, string, showError):
"""
Search for some Bible verses (by reference).
"""
2012-05-17 18:57:01 +00:00
bible = self.quickVersionComboBox.currentText()
2013-01-01 16:33:41 +00:00
search_results = self.plugin.manager.get_verses(bible, string, False, showError)
if search_results:
2014-03-09 10:26:28 +00:00
verse_text = ' '.join([verse.text for verse in search_results])
return [[string, verse_text]]
2011-05-17 18:48:04 +00:00
return []
2013-03-19 22:00:50 +00:00
def create_item_from_id(self, item_id):
"""
Create a media item from an item id.
"""
2012-05-17 18:57:01 +00:00
bible = self.quickVersionComboBox.currentText()
2011-05-28 09:53:37 +00:00
search_results = self.plugin.manager.get_verses(bible, item_id, False)
2014-03-09 10:26:28 +00:00
items = self.build_display_results(bible, '', search_results)
return items