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

858 lines
41 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
###############################################################################
# OpenLP - Open Source Lyrics Projection #
# --------------------------------------------------------------------------- #
2010-12-26 11:04:47 +00:00
# Copyright (c) 2008-2011 Raoul Snyman #
# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael #
2011-03-24 19:04:02 +00:00
# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, #
# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, #
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund #
# --------------------------------------------------------------------------- #
# 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
2011-02-10 18:38:03 +00:00
from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \
translate, check_search_result
2011-02-05 18:29:49 +00:00
from openlp.core.lib.searchedit import SearchEdit
2011-02-10 04:06:16 +00:00
from openlp.core.lib.ui import UiStrings, add_widget_completer, \
2011-04-10 18:54:26 +00:00
media_item_combo_box, critical_error_message_box, find_and_set_in_combo_box
from openlp.plugins.bibles.forms import BibleImportForm
2011-02-18 03:15:09 +00:00
from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \
2011-03-20 20:50:19 +00:00
VerseReferenceList, get_reference_match
2010-02-27 15:31:23 +00:00
log = logging.getLogger(__name__)
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.
"""
log.info(u'Bible Media Item loaded')
2010-11-16 18:33:37 +00:00
def __init__(self, parent, plugin, icon):
2009-09-26 09:11:39 +00:00
self.IconPath = u'songs/song'
2010-11-16 18:33:37 +00:00
MediaManagerItem.__init__(self, parent, plugin, icon)
# Place to store the search results for both bibles.
2011-02-18 03:15:09 +00:00
self.settings = self.parent.settings_tab
self.quickPreviewAllowed = True
2010-09-01 17:27:38 +00:00
self.search_results = {}
2010-11-15 17:47:33 +00:00
self.second_search_results = {}
check_search_result(self.listView, self.search_results)
QtCore.QObject.connect(Receiver.get_receiver(),
2010-04-16 07:31:01 +00:00
QtCore.SIGNAL(u'bibles_load_list'), self.reloadBibles)
2009-09-26 09:11:39 +00:00
def requiredIcons(self):
MediaManagerItem.requiredIcons(self)
self.hasImportIcon = True
self.hasNewIcon = False
2009-09-26 09:11:39 +00:00
self.hasEditIcon = False
self.hasDeleteIcon = False
self.addToServiceItem = False
2009-09-26 09:11:39 +00:00
def addSearchTab(self, prefix, name):
2011-04-29 11:33:04 +00:00
"""
Creates and adds generic search tab.
``prefix``
The prefix of the tab, this is either ``quick`` or ``advanced``.
``name``
The translated string to display.
2011-04-29 11:33:04 +00:00
"""
tab = QtGui.QWidget()
tab.setObjectName(prefix + u'Tab')
layout = QtGui.QGridLayout(tab)
layout.setObjectName(prefix + u'Layout')
versionLabel = QtGui.QLabel(tab)
versionLabel.setObjectName(prefix + u'VersionLabel')
layout.addWidget(versionLabel, 0, 0, QtCore.Qt.AlignRight)
versionComboBox = media_item_combo_box(tab, prefix + u'VersionComboBox')
versionLabel.setBuddy(versionComboBox)
layout.addWidget(versionComboBox, 0, 1, 1, 2)
secondLabel = QtGui.QLabel(tab)
secondLabel.setObjectName(prefix + u'SecondLabel')
layout.addWidget(secondLabel, 1, 0, QtCore.Qt.AlignRight)
secondComboBox = media_item_combo_box(tab, prefix + u'SecondComboBox')
versionLabel.setBuddy(secondComboBox)
layout.addWidget(secondComboBox, 1, 1, 1, 2)
searchButtonLayout = QtGui.QHBoxLayout()
searchButtonLayout.setObjectName(prefix + u'SearchButtonLayout')
searchButtonLayout.addStretch()
searchButton = QtGui.QPushButton(tab)
searchButton.setObjectName(prefix + u'SearchButton')
searchButtonLayout.addWidget(searchButton)
self.searchTabWidget.addTab(tab, name)
2011-04-29 11:33:04 +00:00
setattr(self, prefix + u'Tab', tab)
setattr(self, prefix + u'Layout', layout)
setattr(self, prefix + u'VersionLabel', versionLabel)
setattr(self, prefix + u'VersionComboBox', versionComboBox)
setattr(self, prefix + u'SecondLabel', secondLabel)
setattr(self, prefix + u'SecondComboBox', secondComboBox)
setattr(self, prefix + u'SearchButtonLayout', searchButtonLayout)
setattr(self, prefix + u'SearchButton', searchButton)
2011-04-29 11:33:04 +00:00
2009-09-26 09:11:39 +00:00
def addEndHeaderBar(self):
self.searchTabWidget = QtGui.QTabWidget(self)
self.searchTabWidget.setSizePolicy(
QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
self.searchTabWidget.setObjectName(u'searchTabWidget')
2010-11-12 21:51:18 +00:00
# Add the Quick Search tab.
self.addSearchTab(
u'quick', translate('BiblesPlugin.MediaItem', 'Quick'))
self.quickSearchLabel = QtGui.QLabel(self.quickTab)
self.quickSearchLabel.setObjectName(u'quickSearchLabel')
self.quickLayout.addWidget(
self.quickSearchLabel, 2, 0, QtCore.Qt.AlignRight)
2011-02-05 18:29:49 +00:00
self.quickSearchEdit = SearchEdit(self.quickTab)
self.quickSearchEdit.setObjectName(u'quickSearchEdit')
self.quickSearchLabel.setBuddy(self.quickSearchEdit)
self.quickLayout.addWidget(self.quickSearchEdit, 2, 1, 1, 2)
self.quickLayoutLabel = QtGui.QLabel(self.quickTab)
self.quickLayoutLabel.setObjectName(u'quickClearLabel')
self.quickLayout.addWidget(
self.quickLayoutLabel, 3, 0, QtCore.Qt.AlignRight)
self.quickLayoutComboBox = media_item_combo_box(self.quickTab,
u'quickLayoutComboBox')
self.quickLayoutComboBox.addItems([u'', u'', u''])
self.quickLayout.addWidget(self.quickLayoutComboBox, 3, 1, 1, 2)
self.quickClearLabel = QtGui.QLabel(self.quickTab)
self.quickClearLabel.setObjectName(u'quickClearLabel')
2011-05-01 13:27:19 +00:00
self.quickLayout.addWidget(
self.quickClearLabel, 4, 0, QtCore.Qt.AlignRight)
2011-02-03 02:46:02 +00:00
self.quickClearComboBox = media_item_combo_box(self.quickTab,
u'quickClearComboBox')
self.quickLayout.addWidget(self.quickClearComboBox, 4, 1, 1, 2)
self.quickLayout.addLayout(self.quickSearchButtonLayout, 6, 1, 1, 2)
# Add a QWidget, so that the quick tab has as many rows as the advanced
# tab.
self.quickLayout.addWidget(QtGui.QWidget(), 7, 0)
2010-11-12 21:51:18 +00:00
# Add the Advanced Search tab.
self.addSearchTab(u'advanced', UiStrings().Advanced)
self.advancedBookLabel = QtGui.QLabel(self.advancedTab)
self.advancedBookLabel.setObjectName(u'advancedBookLabel')
self.advancedLayout.addWidget(self.advancedBookLabel, 2, 0,
QtCore.Qt.AlignRight)
2011-02-03 02:46:02 +00:00
self.advancedBookComboBox = media_item_combo_box(self.advancedTab,
u'advancedBookComboBox')
self.advancedBookLabel.setBuddy(self.advancedBookComboBox)
self.advancedLayout.addWidget(self.advancedBookComboBox, 2, 1, 1, 2)
self.advancedChapterLabel = QtGui.QLabel(self.advancedTab)
self.advancedChapterLabel.setObjectName(u'advancedChapterLabel')
self.advancedLayout.addWidget(self.advancedChapterLabel, 3, 1, 1, 2)
self.advancedVerseLabel = QtGui.QLabel(self.advancedTab)
self.advancedVerseLabel.setObjectName(u'advancedVerseLabel')
self.advancedLayout.addWidget(self.advancedVerseLabel, 3, 2)
self.advancedFromLabel = QtGui.QLabel(self.advancedTab)
self.advancedFromLabel.setObjectName(u'advancedFromLabel')
self.advancedLayout.addWidget(self.advancedFromLabel, 4, 0,
QtCore.Qt.AlignRight)
self.advancedFromChapter = QtGui.QComboBox(self.advancedTab)
self.advancedFromChapter.setObjectName(u'advancedFromChapter')
self.advancedLayout.addWidget(self.advancedFromChapter, 4, 1)
self.advancedFromVerse = QtGui.QComboBox(self.advancedTab)
self.advancedFromVerse.setObjectName(u'advancedFromVerse')
self.advancedLayout.addWidget(self.advancedFromVerse, 4, 2)
self.advancedToLabel = QtGui.QLabel(self.advancedTab)
self.advancedToLabel.setObjectName(u'advancedToLabel')
self.advancedLayout.addWidget(self.advancedToLabel, 5, 0,
QtCore.Qt.AlignRight)
self.advancedToChapter = QtGui.QComboBox(self.advancedTab)
self.advancedToChapter.setObjectName(u'advancedToChapter')
self.advancedLayout.addWidget(self.advancedToChapter, 5, 1)
self.advancedToVerse = QtGui.QComboBox(self.advancedTab)
self.advancedToVerse.setObjectName(u'advancedToVerse')
self.advancedLayout.addWidget(self.advancedToVerse, 5, 2)
self.advancedClearLabel = QtGui.QLabel(self.quickTab)
self.advancedClearLabel.setObjectName(u'advancedClearLabel')
self.advancedLayout.addWidget(self.advancedClearLabel, 6, 0,
QtCore.Qt.AlignRight)
2011-02-03 02:46:02 +00:00
self.advancedClearComboBox = media_item_combo_box(self.quickTab,
u'advancedClearComboBox')
self.advancedClearLabel.setBuddy(self.advancedClearComboBox)
self.advancedLayout.addWidget(self.advancedClearComboBox, 6, 1, 1, 2)
self.advancedLayout.addLayout(
self.advancedSearchButtonLayout, 7, 0, 1, 3)
# Add the search tab widget to the page layout.
self.pageLayout.addWidget(self.searchTabWidget)
# Combo Boxes
QtCore.QObject.connect(self.advancedVersionComboBox,
QtCore.SIGNAL(u'activated(int)'), self.onAdvancedVersionComboBox)
QtCore.QObject.connect(self.advancedBookComboBox,
QtCore.SIGNAL(u'activated(int)'), self.onAdvancedBookComboBox)
QtCore.QObject.connect(self.advancedFromChapter,
QtCore.SIGNAL(u'activated(int)'), self.onAdvancedFromChapter)
QtCore.QObject.connect(self.advancedFromVerse,
QtCore.SIGNAL(u'activated(int)'), self.onAdvancedFromVerse)
QtCore.QObject.connect(self.advancedToChapter,
QtCore.SIGNAL(u'activated(int)'), self.onAdvancedToChapter)
2011-02-05 18:29:49 +00:00
QtCore.QObject.connect(self.quickSearchEdit,
QtCore.SIGNAL(u'searchTypeChanged(int)'), self.updateAutoCompleter)
QtCore.QObject.connect(self.quickVersionComboBox,
QtCore.SIGNAL(u'activated(int)'), self.updateAutoCompleter)
QtCore.QObject.connect(
self.quickLayoutComboBox, QtCore.SIGNAL(u'activated(int)'),
self.onLayoutStyleComboBoxChanged)
# Buttons
QtCore.QObject.connect(self.advancedSearchButton,
QtCore.SIGNAL(u'pressed()'), self.onAdvancedSearchButton)
QtCore.QObject.connect(self.quickSearchButton,
QtCore.SIGNAL(u'pressed()'), self.onQuickSearchButton)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'config_updated'), self.configUpdated)
# Other stuff
QtCore.QObject.connect(self.quickSearchEdit,
2010-03-24 19:15:25 +00:00
QtCore.SIGNAL(u'returnPressed()'), self.onQuickSearchButton)
def configUpdated(self):
log.debug(u'configUpdated')
2010-11-15 17:47:33 +00:00
if QtCore.QSettings().value(self.settingsSection + u'/second bibles',
QtCore.QVariant(True)).toBool():
self.advancedSecondLabel.setVisible(True)
self.advancedSecondComboBox.setVisible(True)
self.quickSecondLabel.setVisible(True)
self.quickSecondComboBox.setVisible(True)
else:
self.advancedSecondLabel.setVisible(False)
self.advancedSecondComboBox.setVisible(False)
self.quickSecondLabel.setVisible(False)
self.quickSecondComboBox.setVisible(False)
self.quickLayoutComboBox.setCurrentIndex(self.settings.layout_style)
def retranslateUi(self):
log.debug(u'retranslateUi')
self.quickVersionLabel.setText(u'%s:' % UiStrings().Version)
self.quickSecondLabel.setText(
2010-11-15 17:47:33 +00:00
translate('BiblesPlugin.MediaItem', 'Second:'))
self.quickSearchLabel.setText(
2010-08-10 16:44:04 +00:00
translate('BiblesPlugin.MediaItem', 'Find:'))
self.quickSearchButton.setText(UiStrings().Search)
self.quickClearLabel.setText(
2010-08-10 16:44:04 +00:00
translate('BiblesPlugin.MediaItem', 'Results:'))
self.advancedVersionLabel.setText(u'%s:' % UiStrings().Version)
self.advancedSecondLabel.setText(
2010-11-15 17:47:33 +00:00
translate('BiblesPlugin.MediaItem', 'Second:'))
self.advancedBookLabel.setText(
2010-08-10 16:44:04 +00:00
translate('BiblesPlugin.MediaItem', 'Book:'))
self.advancedChapterLabel.setText(
2010-08-10 16:44:04 +00:00
translate('BiblesPlugin.MediaItem', 'Chapter:'))
self.advancedVerseLabel.setText(
2010-08-10 16:44:04 +00:00
translate('BiblesPlugin.MediaItem', 'Verse:'))
self.advancedFromLabel.setText(
2010-08-10 16:44:04 +00:00
translate('BiblesPlugin.MediaItem', 'From:'))
self.advancedToLabel.setText(
2010-08-10 16:44:04 +00:00
translate('BiblesPlugin.MediaItem', 'To:'))
self.advancedClearLabel.setText(
2010-08-10 16:44:04 +00:00
translate('BiblesPlugin.MediaItem', 'Results:'))
self.advancedSearchButton.setText(UiStrings().Search)
self.quickClearComboBox.addItem(
translate('BiblesPlugin.MediaItem', 'Clear'))
self.quickClearComboBox.addItem(
translate('BiblesPlugin.MediaItem', 'Keep'))
self.advancedClearComboBox.addItem(
translate('BiblesPlugin.MediaItem', 'Clear'))
self.advancedClearComboBox.addItem(
translate('BiblesPlugin.MediaItem', 'Keep'))
self.quickLayoutLabel.setText(UiStrings().LayoutStyle)
self.quickLayoutComboBox.setItemText(LayoutStyle.VersePerSlide,
UiStrings().VersePerSlide)
self.quickLayoutComboBox.setItemText(LayoutStyle.VersePerLine,
UiStrings().VersePerLine)
self.quickLayoutComboBox.setItemText(LayoutStyle.Continuous,
UiStrings().Continuous)
def initialise(self):
2009-10-08 05:02:39 +00:00
log.debug(u'bible manager initialise')
2010-02-04 17:38:21 +00:00
self.parent.manager.media = self
self.loadBibles()
2011-04-13 14:28:31 +00:00
bible = QtCore.QSettings().value(
self.settingsSection + u'/quick bible', QtCore.QVariant(
self.quickVersionComboBox.currentText())).toString()
find_and_set_in_combo_box(self.quickVersionComboBox, bible)
self.quickSearchEdit.setSearchTypes([
(BibleSearch.Reference, u':/bibles/bibles_search_reference.png',
translate('BiblesPlugin.MediaItem', 'Scripture Reference')),
(BibleSearch.Text, u':/bibles/bibles_search_text.png',
translate('BiblesPlugin.MediaItem', 'Text Search'))
])
self.quickSearchEdit.setCurrentSearchType(QtCore.QSettings().value(
u'%s/last search type' % self.settingsSection,
QtCore.QVariant(BibleSearch.Reference)).toInt()[0])
self.configUpdated()
2009-10-08 05:02:39 +00:00
log.debug(u'bible manager initialise complete')
2010-09-26 13:38:40 +00:00
def onImportClick(self):
if not hasattr(self, u'import_wizard'):
self.import_wizard = BibleImportForm(self, self.parent.manager,
2010-09-26 13:38:40 +00:00
self.parent)
2011-01-13 17:55:29 +00:00
# If the import was not cancelled then reload.
2010-11-19 21:34:15 +00:00
if self.import_wizard.exec_():
self.reloadBibles()
2010-09-26 13:38:40 +00:00
def loadBibles(self):
log.debug(u'Loading Bibles')
self.quickVersionComboBox.clear()
self.quickSecondComboBox.clear()
self.advancedVersionComboBox.clear()
self.advancedSecondComboBox.clear()
self.quickSecondComboBox.addItem(u'')
self.advancedSecondComboBox.addItem(u'')
# Get all bibles and sort the list.
bibles = self.parent.manager.get_bibles().keys()
bibles.sort()
# Load the bibles into the combo boxes.
for bible in bibles:
2010-05-09 20:02:38 +00:00
if bible:
self.quickVersionComboBox.addItem(bible)
self.quickSecondComboBox.addItem(bible)
self.advancedVersionComboBox.addItem(bible)
self.advancedSecondComboBox.addItem(bible)
# set the default value
2011-04-11 18:15:02 +00:00
bible = QtCore.QSettings().value(
self.settingsSection + u'/advanced bible',
QtCore.QVariant(u'')).toString()
2011-04-11 18:15:02 +00:00
if bible in bibles:
find_and_set_in_combo_box(self.advancedVersionComboBox, bible)
2011-04-11 18:27:01 +00:00
self.initialiseAdvancedBible(unicode(bible))
elif len(bibles):
self.initialiseAdvancedBible(bibles[0])
2010-09-26 13:38:40 +00:00
def reloadBibles(self):
log.debug(u'Reloading Bibles')
self.parent.manager.reload_bibles()
self.loadBibles()
def initialiseAdvancedBible(self, bible):
"""
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.
``bible``
The bible to initialise (unicode).
"""
log.debug(u'initialiseAdvancedBible %s', bible)
2010-09-26 13:38:40 +00:00
book_data = self.parent.manager.get_books(bible)
self.advancedBookComboBox.clear()
2010-09-26 13:38:40 +00:00
first = True
for book in book_data:
row = self.advancedBookComboBox.count()
self.advancedBookComboBox.addItem(book[u'name'])
self.advancedBookComboBox.setItemData(
2010-09-26 13:38:40 +00:00
row, QtCore.QVariant(book[u'chapters']))
if first:
first = False
self.initialiseChapterVerse(bible, book[u'name'],
book[u'chapters'])
def initialiseChapterVerse(self, bible, book, chapter_count):
2010-09-26 13:38:40 +00:00
log.debug(u'initialiseChapterVerse %s, %s', bible, book)
self.chapter_count = chapter_count
verse_count = self.parent.manager.get_verse_count(bible, book, 1)
if verse_count == 0:
self.advancedSearchButton.setEnabled(False)
critical_error_message_box(
message=translate('BiblePlugin.MediaItem',
2011-03-04 21:05:36 +00:00
'Bible not fully loaded.'))
2010-09-26 13:38:40 +00:00
else:
self.advancedSearchButton.setEnabled(True)
self.adjustComboBox(1, self.chapter_count, self.advancedFromChapter)
self.adjustComboBox(1, self.chapter_count, self.advancedToChapter)
self.adjustComboBox(1, verse_count, self.advancedFromVerse)
self.adjustComboBox(1, verse_count, self.advancedToVerse)
2010-01-29 21:26:24 +00:00
def updateAutoCompleter(self):
"""
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
2011-02-13 15:51:19 +00:00
reference search, otherwise the auto completion list is removed.
"""
# Save the current search type to the configuration.
QtCore.QSettings().setValue(u'%s/last search type' %
self.settingsSection,
QtCore.QVariant(self.quickSearchEdit.currentSearchType()))
# Save the current bible to the configuration.
2011-04-13 14:28:31 +00:00
QtCore.QSettings().setValue(self.settingsSection + u'/quick bible',
QtCore.QVariant(self.quickVersionComboBox.currentText()))
books = []
2011-02-13 15:51:19 +00:00
# We have to do a 'Reference Search'.
2011-02-14 14:23:56 +00:00
if self.quickSearchEdit.currentSearchType() == BibleSearch.Reference:
2010-12-03 19:53:56 +00:00
bibles = self.parent.manager.get_bibles()
bible = unicode(self.quickVersionComboBox.currentText())
if bible:
2010-12-03 19:53:56 +00:00
book_data = bibles[bible].get_books()
2011-04-13 18:18:25 +00:00
books = [book.name + u' ' for book in book_data]
2010-12-03 19:53:56 +00:00
books.sort()
2011-02-04 18:17:28 +00:00
add_widget_completer(books, self.quickSearchEdit)
def onAdvancedVersionComboBox(self):
QtCore.QSettings().setValue(self.settingsSection + u'/advanced bible',
QtCore.QVariant(self.advancedVersionComboBox.currentText()))
self.initialiseAdvancedBible(
unicode(self.advancedVersionComboBox.currentText()))
def onAdvancedBookComboBox(self):
item = int(self.advancedBookComboBox.currentIndex())
2009-09-15 18:56:56 +00:00
self.initialiseChapterVerse(
unicode(self.advancedVersionComboBox.currentText()),
unicode(self.advancedBookComboBox.currentText()),
self.advancedBookComboBox.itemData(item).toInt()[0])
def onAdvancedFromVerse(self):
chapter_from = int(self.advancedFromChapter.currentText())
chapter_to = int(self.advancedToChapter.currentText())
if chapter_from == chapter_to:
bible = unicode(self.advancedVersionComboBox.currentText())
book = unicode(self.advancedBookComboBox.currentText())
verse_from = int(self.advancedFromVerse.currentText())
verse_count = self.parent.manager.get_verse_count(bible, book,
chapter_to)
self.adjustComboBox(verse_from, verse_count,
self.advancedToVerse, True)
2010-09-22 18:46:02 +00:00
def onAdvancedToChapter(self):
bible = unicode(self.advancedVersionComboBox.currentText())
book = unicode(self.advancedBookComboBox.currentText())
chapter_from = int(self.advancedFromChapter.currentText())
chapter_to = int(self.advancedToChapter.currentText())
verse_from = int(self.advancedFromVerse.currentText())
verse_to = int(self.advancedToVerse.currentText())
verse_count = self.parent.manager.get_verse_count(bible, book,
chapter_to)
if chapter_from == chapter_to and verse_from > verse_to:
self.adjustComboBox(verse_from, verse_count, self.advancedToVerse)
2010-09-22 18:46:02 +00:00
else:
self.adjustComboBox(1, verse_count, self.advancedToVerse)
2010-09-26 13:38:40 +00:00
def onAdvancedFromChapter(self):
bible = unicode(self.advancedVersionComboBox.currentText())
book = unicode(self.advancedBookComboBox.currentText())
chapter_from = int(self.advancedFromChapter.currentText())
chapter_to = int(self.advancedToChapter.currentText())
verse_count = self.parent.manager.get_verse_count(bible, book,
chapter_from)
self.adjustComboBox(1, verse_count, self.advancedFromVerse)
if chapter_from > chapter_to:
self.adjustComboBox(1, verse_count, self.advancedToVerse)
self.adjustComboBox(chapter_from, self.chapter_count,
self.advancedToChapter)
elif chapter_from == chapter_to:
self.adjustComboBox(chapter_from, self.chapter_count,
self.advancedToChapter)
self.adjustComboBox(1, verse_count, self.advancedToVerse, True)
else:
self.adjustComboBox(chapter_from, self.chapter_count,
self.advancedToChapter, True)
def adjustComboBox(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.
``range_from``
The first number of the range (int).
``range_to``
The last number of the range (int).
``combo``
The combo box itself (QComboBox).
``restore``
If True, then the combo's currentText will be restored after
adjusting (if possible).
"""
2010-09-26 13:38:40 +00:00
log.debug(u'adjustComboBox %s, %s, %s', combo, range_from, range_to)
if restore:
2010-09-26 17:23:58 +00:00
old_text = unicode(combo.currentText())
2010-09-26 13:38:40 +00:00
combo.clear()
2011-03-10 17:56:42 +00:00
combo.addItems([unicode(i) for i in 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
def onAdvancedSearchButton(self):
"""
2010-11-12 17:54:34 +00:00
Does an advanced search and saves the search results.
"""
log.debug(u'Advanced Search Button pressed')
self.advancedSearchButton.setEnabled(False)
2011-01-22 15:19:05 +00:00
Receiver.send_message(u'openlp_process_events')
bible = unicode(self.advancedVersionComboBox.currentText())
second_bible = unicode(self.advancedSecondComboBox.currentText())
book = unicode(self.advancedBookComboBox.currentText())
chapter_from = self.advancedFromChapter.currentText()
chapter_to = self.advancedToChapter.currentText()
verse_from = self.advancedFromVerse.currentText()
verse_to = self.advancedToVerse.currentText()
2010-12-17 13:21:55 +00:00
verse_separator = get_reference_match(u'sep_v_display')
range_separator = get_reference_match(u'sep_r_display')
verse_range = chapter_from + verse_separator + verse_from + \
range_separator + chapter_to + verse_separator + verse_to
versetext = u'%s %s' % (book, verse_range)
2011-01-22 15:19:05 +00:00
Receiver.send_message(u'cursor_busy')
self.search_results = self.parent.manager.get_verses(bible, versetext)
2010-11-15 17:47:33 +00:00
if second_bible:
self.second_search_results = self.parent.manager.get_verses(
second_bible, versetext)
if self.advancedClearComboBox.currentIndex() == 0:
2010-07-07 16:03:30 +00:00
self.listView.clear()
2010-09-20 18:38:18 +00:00
if self.listView.count() != 0:
2011-02-01 13:39:17 +00:00
self.__checkSecondBible(bible, second_bible)
2011-02-24 21:07:12 +00:00
elif self.search_results:
2010-11-15 17:47:33 +00:00
self.displayResults(bible, second_bible)
self.advancedSearchButton.setEnabled(True)
check_search_result(self.listView, self.search_results)
Receiver.send_message(u'cursor_normal')
2011-01-22 15:19:05 +00:00
Receiver.send_message(u'openlp_process_events')
def onQuickSearchButton(self):
2010-11-16 18:33:37 +00:00
"""
Does a quick search and saves the search results. Quick search can
2011-02-13 15:51:19 +00:00
either be "Reference Search" or "Text Search".
2010-11-16 18:33:37 +00:00
"""
log.debug(u'Quick Search Button pressed')
self.quickSearchButton.setEnabled(False)
2011-01-22 15:19:05 +00:00
Receiver.send_message(u'openlp_process_events')
bible = unicode(self.quickVersionComboBox.currentText())
second_bible = unicode(self.quickSecondComboBox.currentText())
text = unicode(self.quickSearchEdit.text())
2011-02-14 14:23:56 +00:00
if self.quickSearchEdit.currentSearchType() == BibleSearch.Reference:
2011-02-13 15:51:19 +00:00
# We are doing a 'Reference Search'.
2010-09-30 18:40:10 +00:00
self.search_results = self.parent.manager.get_verses(bible, text)
2010-11-15 17:47:33 +00:00
if second_bible and self.search_results:
self.second_search_results = self.parent.manager.get_verses(
second_bible, text)
2010-10-08 17:37:34 +00:00
else:
2010-11-09 17:23:18 +00:00
# We are doing a 'Text Search'.
Receiver.send_message(u'cursor_busy')
bibles = self.parent.manager.get_bibles()
self.search_results = self.parent.manager.verse_search(bible,
2010-11-15 17:47:33 +00:00
second_bible, text)
if second_bible and self.search_results:
text = []
for verse in self.search_results:
text.append((verse.book.name, verse.chapter, verse.verse,
verse.verse))
2010-11-16 17:57:13 +00:00
self.second_search_results = \
bibles[second_bible].get_verses(text)
if self.quickClearComboBox.currentIndex() == 0:
self.listView.clear()
2010-09-20 18:55:14 +00:00
if self.listView.count() != 0 and self.search_results:
2011-02-01 13:39:17 +00:00
self.__checkSecondBible(bible, second_bible)
2010-09-20 18:55:14 +00:00
elif self.search_results:
2010-11-15 17:47:33 +00:00
self.displayResults(bible, second_bible)
self.quickSearchButton.setEnabled(True)
check_search_result(self.listView, self.search_results)
Receiver.send_message(u'cursor_normal')
2011-01-22 15:19:05 +00:00
Receiver.send_message(u'openlp_process_events')
2011-02-01 13:39:17 +00:00
def __checkSecondBible(self, bible, second_bible):
2011-02-01 00:33:50 +00:00
"""
Check if the first item is a second bible item or not.
"""
bitem = self.listView.item(0)
item_second_bible = self._decodeQtObject(bitem, 'second_bible')
if item_second_bible and second_bible or not item_second_bible and \
not second_bible:
self.displayResults(bible, second_bible)
elif critical_error_message_box(
message=translate('BiblePlugin.MediaItem',
2011-03-04 21:05:36 +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?'),
2011-02-01 00:33:50 +00:00
parent=self, question=True) == QtGui.QMessageBox.Yes:
self.listView.clear()
self.displayResults(bible, second_bible)
2010-11-15 17:47:33 +00:00
def displayResults(self, bible, second_bible=u''):
2010-09-26 13:38:40 +00:00
"""
Displays the search results in the media manager. All data needed for
further action is saved for/in each row.
"""
verse_separator = get_reference_match(u'sep_v_display')
2011-03-22 16:21:10 +00:00
version = self.parent.manager.get_meta_data(bible, u'Version').value
copyright = self.parent.manager.get_meta_data(bible, u'Copyright').value
permissions = \
self.parent.manager.get_meta_data(bible, u'Permissions').value
second_version = u''
second_copyright = u''
second_permissions = u''
2010-11-15 17:47:33 +00:00
if second_bible:
2011-03-22 16:21:10 +00:00
second_version = self.parent.manager.get_meta_data(
second_bible, u'Version').value
second_copyright = self.parent.manager.get_meta_data(
second_bible, u'Copyright').value
second_permissions = self.parent.manager.get_meta_data(
second_bible, u'Permissions').value
2010-09-26 13:38:40 +00:00
for count, verse in enumerate(self.search_results):
2011-03-22 16:21:10 +00:00
data = {
'book': QtCore.QVariant(verse.book.name),
'chapter': QtCore.QVariant(verse.chapter),
'verse': QtCore.QVariant(verse.verse),
'bible': QtCore.QVariant(bible),
'version': QtCore.QVariant(version),
'copyright': QtCore.QVariant(copyright),
'permissions': QtCore.QVariant(permissions),
'text': QtCore.QVariant(verse.text),
'second_bible': QtCore.QVariant(second_bible),
'second_version': QtCore.QVariant(second_version),
'second_copyright': QtCore.QVariant(second_copyright),
'second_permissions': QtCore.QVariant(second_permissions),
'second_text': QtCore.QVariant(u'')
}
2010-11-15 17:47:33 +00:00
if second_bible:
2010-11-29 19:02:58 +00:00
try:
2011-03-22 16:21:10 +00:00
data[u'second_text'] = QtCore.QVariant(
self.second_search_results[count].text)
2010-11-29 19:02:58 +00:00
except IndexError:
2011-03-22 16:21:10 +00:00
log.exception(u'The second_search_results does not have as '
'many verses as the search_results.')
2010-11-29 19:02:58 +00:00
break
bible_text = u' %s %d%s%d (%s, %s)' % (verse.book.name,
2011-03-22 16:21:10 +00:00
verse.chapter, verse_separator, verse.verse, version,
second_version)
2010-09-26 13:38:40 +00:00
else:
bible_text = u'%s %d%s%d (%s)' % (verse.book.name,
2011-03-22 16:21:10 +00:00
verse.chapter, verse_separator, verse.verse, version)
2010-09-26 13:38:40 +00:00
bible_verse = QtGui.QListWidgetItem(bible_text)
2011-03-22 16:21:10 +00:00
bible_verse.setData(QtCore.Qt.UserRole, QtCore.QVariant(data))
2010-09-26 13:38:40 +00:00
self.listView.addItem(bible_verse)
2010-11-13 20:13:24 +00:00
self.listView.selectAll()
2010-09-26 13:38:40 +00:00
self.search_results = {}
2010-11-15 17:47:33 +00:00
self.second_search_results = {}
2010-09-26 13:38:40 +00:00
2010-09-18 21:29:41 +00:00
def _decodeQtObject(self, bitem, key):
2010-09-16 16:22:23 +00:00
reference = bitem.data(QtCore.Qt.UserRole)
if isinstance(reference, QtCore.QVariant):
reference = reference.toPyObject()
obj = reference[QtCore.QString(key)]
2010-09-15 16:52:22 +00:00
if isinstance(obj, QtCore.QVariant):
obj = obj.toPyObject()
2010-12-17 13:21:55 +00:00
return unicode(obj).strip()
2010-09-15 16:52:22 +00:00
def generateSlideData(self, service_item, item=None, xmlVersion=False):
2010-08-28 17:05:45 +00:00
"""
2010-08-18 15:04:16 +00:00
Generates and formats the slides for the service item as well as the
service item's title.
2010-08-28 17:05:45 +00:00
"""
log.debug(u'generating slide data')
2010-07-07 16:03:30 +00:00
items = self.listView.selectedIndexes()
2010-08-06 07:23:32 +00:00
if len(items) == 0:
return False
2010-09-01 17:27:38 +00:00
bible_text = u''
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()
2010-08-29 12:49:45 +00:00
for item in items:
bitem = self.listView.item(item.row())
2010-09-18 21:29:41 +00:00
book = self._decodeQtObject(bitem, 'book')
chapter = int(self._decodeQtObject(bitem, 'chapter'))
verse = int(self._decodeQtObject(bitem, 'verse'))
bible = self._decodeQtObject(bitem, 'bible')
version = self._decodeQtObject(bitem, 'version')
copyright = self._decodeQtObject(bitem, 'copyright')
2010-10-05 18:44:54 +00:00
permissions = self._decodeQtObject(bitem, 'permissions')
2010-09-18 21:29:41 +00:00
text = self._decodeQtObject(bitem, 'text')
2010-11-15 17:47:33 +00:00
second_bible = self._decodeQtObject(bitem, 'second_bible')
second_version = self._decodeQtObject(bitem, 'second_version')
second_copyright = self._decodeQtObject(bitem, 'second_copyright')
2010-12-18 02:12:41 +00:00
second_permissions = \
self._decodeQtObject(bitem, 'second_permissions')
2010-11-15 17:47:33 +00:00
second_text = self._decodeQtObject(bitem, 'second_text')
2011-03-20 20:50:19 +00:00
verses.add(book, chapter, verse, version, copyright, permissions)
verse_text = self.formatVerse(old_chapter, chapter, verse)
2010-11-15 17:47:33 +00:00
if second_bible:
2011-01-15 12:14:24 +00:00
bible_text = u'%s %s\n\n%s %s' % (verse_text, text,
2010-12-18 02:12:41 +00:00
verse_text, second_text)
2011-01-14 17:46:59 +00:00
raw_slides.append(bible_text.rstrip())
bible_text = u''
# 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:
2011-01-15 11:56:40 +00:00
bible_text = u'%s %s' % (verse_text, text)
2011-01-14 17:46:59 +00:00
raw_slides.append(bible_text.rstrip())
bible_text = u''
# 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:
2011-01-15 11:56:40 +00:00
bible_text = u'%s %s %s\n' % (bible_text, verse_text, text)
# We have to be 'Continuous'.
else:
2011-01-15 11:56:40 +00:00
bible_text = u'%s %s %s\n' % (bible_text, verse_text, text)
2011-01-08 19:24:56 +00:00
if not old_item:
2010-09-16 16:22:23 +00:00
start_item = item
elif self.checkTitle(item, old_item):
2010-09-17 12:17:50 +00:00
raw_title.append(self.formatTitle(start_item, old_item))
2010-09-16 16:22:23 +00:00
start_item = item
old_item = item
old_chapter = chapter
2011-03-20 20:50:19 +00:00
# Add footer
service_item.raw_footer.append(verses.format_verses())
if second_bible:
verses.add_version(second_version, second_copyright,
second_permissions)
service_item.raw_footer.append(verses.format_versions())
2010-09-17 12:17:50 +00:00
raw_title.append(self.formatTitle(start_item, item))
# 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())
bible_text = u''
2010-10-08 17:37:34 +00:00
# Service Item: Capabilities
2011-02-18 03:15:09 +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)
service_item.add_capability(ItemCapabilities.AllowsPreview)
service_item.add_capability(ItemCapabilities.AllowsLoop)
2011-03-28 17:04:31 +00:00
service_item.add_capability(ItemCapabilities.AllowsWordSplit)
2010-10-08 17:37:34 +00:00
# Service Item: Title
2011-02-24 21:07:12 +00:00
service_item.title = u', '.join(raw_title)
2010-10-08 17:37:34 +00:00
# Service Item: Theme
2011-02-18 03:15:09 +00:00
if len(self.settings.bible_theme) == 0:
service_item.theme = None
else:
2011-02-18 03:15:09 +00:00
service_item.theme = self.settings.bible_theme
2011-03-10 17:56:42 +00:00
[service_item.add_from_text(slide[:30], slide) for slide in raw_slides]
return True
2010-09-16 16:57:21 +00:00
def formatTitle(self, start_item, old_item):
2010-09-16 16:22:23 +00:00
"""
This methode 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
2010-09-17 11:41:52 +00:00
Genesis 1:1-6 as well as Daniel 2:14.
``start_item``
The first item of a range.
``old_item``
The last item of a range.
2010-09-16 16:22:23 +00:00
"""
2010-12-17 13:21:55 +00:00
verse_separator = get_reference_match(u'sep_v_display')
range_separator = get_reference_match(u'sep_r_display')
2010-09-18 21:29:41 +00:00
old_bitem = self.listView.item(old_item.row())
2010-12-17 13:21:55 +00:00
old_chapter = self._decodeQtObject(old_bitem, 'chapter')
old_verse = self._decodeQtObject(old_bitem, 'verse')
2010-09-18 21:29:41 +00:00
start_bitem = self.listView.item(start_item.row())
start_book = self._decodeQtObject(start_bitem, 'book')
2010-12-17 13:21:55 +00:00
start_chapter = self._decodeQtObject(start_bitem, 'chapter')
start_verse = self._decodeQtObject(start_bitem, 'verse')
2010-09-18 21:29:41 +00:00
start_bible = self._decodeQtObject(start_bitem, 'bible')
2010-11-15 17:47:33 +00:00
start_second_bible = self._decodeQtObject(start_bitem, 'second_bible')
if start_second_bible:
2010-12-17 13:21:55 +00:00
bibles = u'%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:
2010-12-17 13:21:55 +00:00
verse_range = start_chapter + verse_separator + start_verse + \
range_separator + old_verse
else:
verse_range = start_chapter + verse_separator + start_verse + \
range_separator + old_chapter + verse_separator + old_verse
2011-03-10 17:56:42 +00:00
return u'%s %s (%s)' % (start_book, verse_range, bibles)
2010-09-16 16:35:19 +00:00
2010-09-16 16:22:23 +00:00
def checkTitle(self, item, old_item):
"""
This methode checks if we are at the end of an verse range. If that is
2010-11-16 17:57:13 +00:00
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.
``item``
The item we are dealing with at the moment.
``old_item``
The item we were previously dealing with.
2010-09-16 16:22:23 +00:00
"""
# Get all the necessary meta data.
2010-09-18 21:29:41 +00:00
bitem = self.listView.item(item.row())
book = self._decodeQtObject(bitem, 'book')
chapter = int(self._decodeQtObject(bitem, 'chapter'))
verse = int(self._decodeQtObject(bitem, 'verse'))
bible = self._decodeQtObject(bitem, 'bible')
2010-11-15 17:47:33 +00:00
second_bible = self._decodeQtObject(bitem, 'second_bible')
2010-09-18 21:29:41 +00:00
old_bitem = self.listView.item(old_item.row())
old_book = self._decodeQtObject(old_bitem, 'book')
old_chapter = int(self._decodeQtObject(old_bitem, 'chapter'))
old_verse = int(self._decodeQtObject(old_bitem, 'verse'))
old_bible = self._decodeQtObject(old_bitem, 'bible')
2010-11-15 17:47:33 +00:00
old_second_bible = self._decodeQtObject(old_bitem, 'second_bible')
if old_bible != bible or old_second_bible != second_bible or \
2010-09-16 16:22:23 +00:00
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
elif old_chapter + 1 == chapter and (verse != 1 or
old_verse != self.parent.manager.get_verse_count(
old_bible, old_book, old_chapter)):
# We are in the following chapter, but the last verse was not the
2010-11-12 17:54:34 +00:00
# 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
else:
return False
def formatVerse(self, old_chapter, chapter, verse):
"""
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::
u'{su}1:1{/su}'
``old_chapter``
The previous verse's chapter number (int).
``chapter``
The chapter number (int).
``verse``
The verse number (int).
"""
2010-12-17 13:21:55 +00:00
verse_separator = get_reference_match(u'sep_v_display')
2011-02-18 03:15:09 +00:00
if not self.settings.show_new_chapters or old_chapter != chapter:
2010-12-17 13:21:55 +00:00
verse_text = unicode(chapter) + verse_separator + unicode(verse)
2010-08-29 12:49:45 +00:00
else:
verse_text = unicode(verse)
2011-02-18 03:15:09 +00:00
if self.settings.display_style == DisplayStyle.Round:
2011-04-16 11:36:20 +00:00
return u'{su}(%s){/su}' % verse_text
2011-03-22 16:21:10 +00:00
if self.settings.display_style == DisplayStyle.Curly:
2011-04-16 11:36:20 +00:00
return u'{su}{%s}{/su}' % verse_text
2011-03-22 16:21:10 +00:00
if self.settings.display_style == DisplayStyle.Square:
2011-04-16 11:36:20 +00:00
return u'{su}[%s]{/su}' % verse_text
return u'{su}%s{/su}' % verse_text
def onLayoutStyleComboBoxChanged(self):
self.settings.layout_style = self.quickLayoutComboBox.currentIndex()
self.settings.layoutStyleComboBox.setCurrentIndex(
self.settings.layout_style)
QtCore.QSettings().setValue(
self.settingsSection + u'/verse layout style',
QtCore.QVariant(self.settings.layout_style))