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

880 lines
43 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 #
# --------------------------------------------------------------------------- #
2009-12-31 12:52:01 +00:00
# Copyright (c) 2008-2010 Raoul Snyman #
# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael #
2010-07-24 22:10:47 +00:00
# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian #
# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, #
# Carsten Tinggaard, 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
import time
from PyQt4 import QtCore, QtGui
2010-04-27 16:27:57 +00:00
from openlp.core.lib import MediaManagerItem, Receiver, BaseListWithDnD, \
2010-06-08 15:38:09 +00:00
ItemCapabilities, translate
from openlp.plugins.bibles.forms import BibleImportForm
2010-02-27 15:31:23 +00:00
log = logging.getLogger(__name__)
class BibleListView(BaseListWithDnD):
2010-01-17 08:56:25 +00:00
"""
Custom list view descendant, required for drag and drop.
"""
def __init__(self, parent=None):
self.PluginName = u'Bibles'
BaseListWithDnD.__init__(self, parent)
def resizeEvent(self, event):
2010-06-24 19:36:33 +00:00
self.parent().onListViewResize(event.size().width(),
event.size().width())
2010-01-17 08:56:25 +00:00
class BibleMediaItem(MediaManagerItem):
"""
This is the custom media manager item for Bibles.
"""
log.info(u'Bible Media Item loaded')
def __init__(self, parent, icon, title):
2009-10-28 01:36:24 +00:00
self.PluginNameShort = u'Bible'
2010-07-08 09:14:00 +00:00
self.pluginNameVisible = translate('BiblesPlugin.MediaItem', 'Bible')
2009-09-26 09:11:39 +00:00
self.IconPath = u'songs/song'
self.ListViewWithDnD_class = BibleListView
MediaManagerItem.__init__(self, parent, icon, title)
# Place to store the search results for both bibles.
2010-09-01 17:27:38 +00:00
self.search_results = {}
self.dual_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
2010-03-26 20:20:09 +00:00
self.addToServiceItem = True
2009-09-26 09:11:39 +00:00
def addEndHeaderBar(self):
self.SearchTabWidget = QtGui.QTabWidget(self)
2009-09-15 18:56:56 +00:00
sizePolicy = QtGui.QSizePolicy(
QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
2009-09-15 18:56:56 +00:00
sizePolicy.setHeightForWidth(
self.SearchTabWidget.sizePolicy().hasHeightForWidth())
self.SearchTabWidget.setSizePolicy(sizePolicy)
self.SearchTabWidget.setObjectName(u'SearchTabWidget')
2010-11-12 21:51:18 +00:00
# Add the Quick Search tab.
self.QuickTab = QtGui.QWidget()
self.QuickTab.setObjectName(u'QuickTab')
self.QuickLayout = QtGui.QGridLayout(self.QuickTab)
self.QuickLayout.setMargin(2)
2009-09-15 18:56:56 +00:00
self.QuickLayout.setSpacing(4)
self.QuickLayout.setVerticalSpacing(4)
self.QuickLayout.setObjectName(u'QuickLayout')
self.QuickVersionLabel = QtGui.QLabel(self.QuickTab)
self.QuickVersionLabel.setObjectName(u'QuickVersionLabel')
self.QuickLayout.addWidget(self.QuickVersionLabel, 0, 0, 1, 1)
self.QuickVersionComboBox = QtGui.QComboBox(self.QuickTab)
2009-10-30 17:44:16 +00:00
self.QuickVersionComboBox.setSizeAdjustPolicy(
QtGui.QComboBox.AdjustToMinimumContentsLength)
self.QuickVersionComboBox.setObjectName(u'VersionComboBox')
self.QuickLayout.addWidget(self.QuickVersionComboBox, 0, 1, 1, 2)
self.QuickDualVersionLabel = QtGui.QLabel(self.QuickTab)
self.QuickDualVersionLabel.setObjectName(u'QuickDualVersionLabel')
self.QuickLayout.addWidget(self.QuickDualVersionLabel, 1, 0, 1, 1)
self.QuickDualBibleComboBox = QtGui.QComboBox(self.QuickTab)
self.QuickDualBibleComboBox.setSizeAdjustPolicy(
2009-10-30 17:44:16 +00:00
QtGui.QComboBox.AdjustToMinimumContentsLength)
self.QuickDualBibleComboBox.setObjectName(u'DualBible')
self.QuickLayout.addWidget(self.QuickDualBibleComboBox, 1, 1, 1, 2)
self.QuickSearchLabel = QtGui.QLabel(self.QuickTab)
self.QuickSearchLabel.setObjectName(u'QuickSearchLabel')
self.QuickLayout.addWidget(self.QuickSearchLabel, 2, 0, 1, 1)
self.QuickSearchComboBox = QtGui.QComboBox(self.QuickTab)
self.QuickSearchComboBox.setObjectName(u'SearchComboBox')
self.QuickLayout.addWidget(self.QuickSearchComboBox, 2, 1, 1, 2)
self.QuickSearchLabel = QtGui.QLabel(self.QuickTab)
self.QuickSearchLabel.setObjectName(u'QuickSearchLabel')
self.QuickLayout.addWidget(self.QuickSearchLabel, 3, 0, 1, 1)
self.QuickSearchEdit = QtGui.QLineEdit(self.QuickTab)
self.QuickSearchEdit.setObjectName(u'QuickSearchEdit')
self.QuickLayout.addWidget(self.QuickSearchEdit, 3, 1, 1, 2)
self.QuickClearLabel = QtGui.QLabel(self.QuickTab)
self.QuickClearLabel.setObjectName(u'QuickSearchLabel')
self.QuickLayout.addWidget(self.QuickClearLabel, 4, 0, 1, 1)
self.ClearQuickSearchComboBox = QtGui.QComboBox(self.QuickTab)
self.ClearQuickSearchComboBox.setObjectName(u'ClearQuickSearchComboBox')
self.QuickLayout.addWidget(self.ClearQuickSearchComboBox, 4, 1, 1, 2)
self.QuickSearchButtonLayout = QtGui.QHBoxLayout()
self.QuickSearchButtonLayout.setMargin(0)
self.QuickSearchButtonLayout.setSpacing(0)
self.QuickSearchButtonLayout.setObjectName(u'QuickSearchButtonLayout')
self.QuickSearchButtonSpacer = QtGui.QSpacerItem(40, 20,
QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
self.QuickSearchButtonLayout.addItem(self.QuickSearchButtonSpacer)
self.QuickSearchButton = QtGui.QPushButton(self.QuickTab)
self.QuickSearchButton.setObjectName(u'QuickSearchButton')
self.QuickSearchButtonLayout.addWidget(self.QuickSearchButton)
self.QuickLayout.addLayout(self.QuickSearchButtonLayout, 5, 0, 1, 3)
self.QuickMessage = QtGui.QLabel(self.QuickTab)
self.QuickMessage.setObjectName(u'QuickMessage')
2009-10-21 16:54:59 +00:00
self.QuickLayout.addWidget(self.QuickMessage, 6, 0, 1, 3)
2010-06-18 05:58:40 +00:00
self.SearchTabWidget.addTab(self.QuickTab,
translate('BiblesPlugin.MediaItem', 'Quick'))
2009-10-09 17:57:15 +00:00
QuickSpacerItem = QtGui.QSpacerItem(20, 35, QtGui.QSizePolicy.Minimum,
QtGui.QSizePolicy.Expanding)
self.QuickLayout.addItem(QuickSpacerItem, 6, 2, 1, 1)
2010-11-12 21:51:18 +00:00
# Add the Advanced Search tab.
self.AdvancedTab = QtGui.QWidget()
self.AdvancedTab.setObjectName(u'AdvancedTab')
self.AdvancedLayout = QtGui.QGridLayout(self.AdvancedTab)
self.AdvancedLayout.setMargin(2)
2009-09-15 18:56:56 +00:00
self.AdvancedLayout.setSpacing(4)
self.AdvancedLayout.setVerticalSpacing(4)
self.AdvancedLayout.setObjectName(u'AdvancedLayout')
self.AdvancedVersionLabel = QtGui.QLabel(self.AdvancedTab)
self.AdvancedVersionLabel.setObjectName(u'AdvancedVersionLabel')
self.AdvancedLayout.addWidget(self.AdvancedVersionLabel, 0, 0, 1, 1)
self.AdvancedVersionComboBox = QtGui.QComboBox(self.AdvancedTab)
2009-10-30 17:44:16 +00:00
self.AdvancedVersionComboBox.setSizeAdjustPolicy(
QtGui.QComboBox.AdjustToMinimumContentsLength)
self.AdvancedVersionComboBox.setObjectName(u'AdvancedVersionComboBox')
self.AdvancedLayout.addWidget(self.AdvancedVersionComboBox, 0, 1, 1, 2)
self.AdvancedDualBibleLabel = QtGui.QLabel(self.AdvancedTab)
self.AdvancedDualBibleLabel.setObjectName(u'AdvancedDualBibleLabel')
self.AdvancedLayout.addWidget(self.AdvancedDualBibleLabel, 1, 0, 1, 1)
self.AdvancedDualBibleComboBox = QtGui.QComboBox(self.AdvancedTab)
self.AdvancedDualBibleComboBox.setSizeAdjustPolicy(
2009-10-30 17:44:16 +00:00
QtGui.QComboBox.AdjustToMinimumContentsLength)
self.AdvancedDualBibleComboBox.setObjectName(
u'AdvancedDualBibleComboBox')
2009-10-30 17:44:16 +00:00
self.AdvancedLayout.addWidget(
self.AdvancedDualBibleComboBox, 1, 1, 1, 2)
self.AdvancedBookLabel = QtGui.QLabel(self.AdvancedTab)
self.AdvancedBookLabel.setObjectName(u'AdvancedBookLabel')
self.AdvancedLayout.addWidget(self.AdvancedBookLabel, 2, 0, 1, 1)
self.AdvancedBookComboBox = QtGui.QComboBox(self.AdvancedTab)
self.AdvancedBookComboBox.setObjectName(u'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, 1)
self.AdvancedVerseLabel = QtGui.QLabel(self.AdvancedTab)
self.AdvancedVerseLabel.setObjectName(u'AdvancedVerseLabel')
self.AdvancedLayout.addWidget(self.AdvancedVerseLabel, 3, 2, 1, 1)
self.AdvancedFromLabel = QtGui.QLabel(self.AdvancedTab)
self.AdvancedFromLabel.setObjectName(u'AdvancedFromLabel')
self.AdvancedLayout.addWidget(self.AdvancedFromLabel, 4, 0, 1, 1)
self.AdvancedFromChapter = QtGui.QComboBox(self.AdvancedTab)
self.AdvancedFromChapter.setObjectName(u'AdvancedFromChapter')
self.AdvancedLayout.addWidget(self.AdvancedFromChapter, 4, 1, 1, 1)
self.AdvancedFromVerse = QtGui.QComboBox(self.AdvancedTab)
self.AdvancedFromVerse.setObjectName(u'AdvancedFromVerse')
self.AdvancedLayout.addWidget(self.AdvancedFromVerse, 4, 2, 1, 1)
self.AdvancedToLabel = QtGui.QLabel(self.AdvancedTab)
self.AdvancedToLabel.setObjectName(u'AdvancedToLabel')
self.AdvancedLayout.addWidget(self.AdvancedToLabel, 5, 0, 1, 1)
self.AdvancedToChapter = QtGui.QComboBox(self.AdvancedTab)
self.AdvancedToChapter.setObjectName(u'AdvancedToChapter')
self.AdvancedLayout.addWidget(self.AdvancedToChapter, 5, 1, 1, 1)
self.AdvancedToVerse = QtGui.QComboBox(self.AdvancedTab)
self.AdvancedToVerse.setObjectName(u'AdvancedToVerse')
self.AdvancedLayout.addWidget(self.AdvancedToVerse, 5, 2, 1, 1)
self.AdvancedClearLabel = QtGui.QLabel(self.QuickTab)
self.AdvancedClearLabel.setObjectName(u'QuickSearchLabel')
self.AdvancedLayout.addWidget(self.AdvancedClearLabel, 6, 0, 1, 1)
self.ClearAdvancedSearchComboBox = QtGui.QComboBox(self.QuickTab)
2009-09-15 18:56:56 +00:00
self.ClearAdvancedSearchComboBox.setObjectName(
u'ClearAdvancedSearchComboBox')
self.AdvancedLayout.addWidget(
self.ClearAdvancedSearchComboBox, 6, 1, 1, 2)
self.AdvancedSearchButtonLayout = QtGui.QHBoxLayout()
self.AdvancedSearchButtonLayout.setMargin(0)
self.AdvancedSearchButtonLayout.setSpacing(0)
2009-10-30 17:44:16 +00:00
self.AdvancedSearchButtonLayout.setObjectName(
u'AdvancedSearchButtonLayout')
self.AdvancedSearchButtonSpacer = QtGui.QSpacerItem(40, 20,
QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
self.AdvancedSearchButtonLayout.addItem(self.AdvancedSearchButtonSpacer)
self.AdvancedSearchButton = QtGui.QPushButton(self.AdvancedTab)
self.AdvancedSearchButton.setObjectName(u'AdvancedSearchButton')
self.AdvancedSearchButtonLayout.addWidget(self.AdvancedSearchButton)
2009-10-30 17:44:16 +00:00
self.AdvancedLayout.addLayout(
self.AdvancedSearchButtonLayout, 7, 0, 1, 3)
2009-10-21 16:54:59 +00:00
self.AdvancedMessage = QtGui.QLabel(self.AdvancedTab)
2009-10-12 06:21:17 +00:00
self.AdvancedMessage.setObjectName(u'AdvancedMessage')
self.AdvancedLayout.addWidget(self.AdvancedMessage, 8, 0, 1, 3)
2010-06-18 05:58:40 +00:00
self.SearchTabWidget.addTab(self.AdvancedTab,
translate('BiblesPlugin.MediaItem', 'Advanced'))
# Add the search tab widget to the page layout.
2010-07-07 16:03:30 +00:00
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)
# 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
2010-03-24 19:15:25 +00:00
QtCore.QObject.connect(self.QuickSearchEdit,
QtCore.SIGNAL(u'returnPressed()'), self.onQuickSearchButton)
QtCore.QObject.connect(Receiver.get_receiver(),
2010-04-16 07:31:01 +00:00
QtCore.SIGNAL(u'bibles_showprogress'), self.onSearchProgressShow)
2010-01-29 21:12:14 +00:00
QtCore.QObject.connect(Receiver.get_receiver(),
2010-04-16 07:31:01 +00:00
QtCore.SIGNAL(u'bibles_hideprogress'), self.onSearchProgressHide)
2010-01-29 21:26:24 +00:00
QtCore.QObject.connect(Receiver.get_receiver(),
2010-04-16 07:31:01 +00:00
QtCore.SIGNAL(u'bibles_nobook'), self.onNoBookFound)
def addListViewToToolBar(self):
MediaManagerItem.addListViewToToolBar(self)
# Progress Bar
self.SearchProgress = QtGui.QProgressBar(self)
self.SearchProgress.setFormat('')
self.SearchProgress.setMinimum(0)
self.SearchProgress.setMaximum(0)
2010-07-07 16:03:30 +00:00
self.SearchProgress.setGeometry(self.listView.geometry().left(),
self.listView.geometry().top(), 81, 23)
self.SearchProgress.setVisible(False)
self.SearchProgress.setObjectName(u'SearchProgress')
def configUpdated(self):
log.debug(u'configUpdated')
if QtCore.QSettings().value(self.settingsSection + u'/dual bibles',
QtCore.QVariant(True)).toBool():
self.AdvancedDualBibleLabel.setVisible(True)
self.AdvancedDualBibleComboBox.setVisible(True)
self.QuickDualVersionLabel.setVisible(True)
self.QuickDualBibleComboBox.setVisible(True)
else:
self.AdvancedDualBibleLabel.setVisible(False)
self.AdvancedDualBibleComboBox.setVisible(False)
self.QuickDualVersionLabel.setVisible(False)
self.QuickDualBibleComboBox.setVisible(False)
def retranslateUi(self):
log.debug(u'retranslateUi')
2010-08-10 16:44:04 +00:00
self.QuickVersionLabel.setText(
translate('BiblesPlugin.MediaItem', 'Version:'))
self.QuickDualVersionLabel.setText(
2010-08-10 16:44:04 +00:00
translate('BiblesPlugin.MediaItem', 'Dual:'))
self.QuickSearchLabel.setText(
translate('BiblesPlugin.MediaItem', 'Search type:'))
self.QuickSearchLabel.setText(
translate('BiblesPlugin.MediaItem', 'Find:'))
self.QuickSearchButton.setText(
translate('BiblesPlugin.MediaItem', 'Search'))
self.QuickClearLabel.setText(
translate('BiblesPlugin.MediaItem', 'Results:'))
self.AdvancedVersionLabel.setText(
translate('BiblesPlugin.MediaItem', 'Version:'))
self.AdvancedDualBibleLabel.setText(
translate('BiblesPlugin.MediaItem', 'Dual:'))
2010-08-10 16:44:04 +00:00
self.AdvancedBookLabel.setText(
translate('BiblesPlugin.MediaItem', 'Book:'))
self.AdvancedChapterLabel.setText(
translate('BiblesPlugin.MediaItem', 'Chapter:'))
self.AdvancedVerseLabel.setText(
translate('BiblesPlugin.MediaItem', 'Verse:'))
self.AdvancedFromLabel.setText(
translate('BiblesPlugin.MediaItem', 'From:'))
self.AdvancedToLabel.setText(
translate('BiblesPlugin.MediaItem', 'To:'))
self.AdvancedClearLabel.setText(
translate('BiblesPlugin.MediaItem', 'Results:'))
self.AdvancedSearchButton.setText(
translate('BiblesPlugin.MediaItem', 'Search'))
self.QuickSearchComboBox.addItem(
translate('BiblesPlugin.MediaItem', 'Verse Search'))
self.QuickSearchComboBox.addItem(
translate('BiblesPlugin.MediaItem', 'Text Search'))
self.ClearQuickSearchComboBox.addItem(
translate('BiblesPlugin.MediaItem', 'Clear'))
self.ClearQuickSearchComboBox.addItem(
translate('BiblesPlugin.MediaItem', 'Keep'))
self.ClearAdvancedSearchComboBox.addItem(
translate('BiblesPlugin.MediaItem', 'Clear'))
self.ClearAdvancedSearchComboBox.addItem(
translate('BiblesPlugin.MediaItem', 'Keep'))
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()
self.configUpdated()
2009-10-08 05:02:39 +00:00
log.debug(u'bible manager initialise complete')
def setQuickMessage(self, text):
2009-10-23 13:17:43 +00:00
self.QuickMessage.setText(text)
self.AdvancedMessage.setText(text)
2010-04-16 07:31:01 +00:00
Receiver.send_message(u'openlp_process_events')
# Minor delay to get the events processed.
time.sleep(0.1)
2010-09-26 13:38:40 +00:00
def onListViewResize(self, width, height):
listViewGeometry = self.listView.geometry()
self.SearchProgress.setGeometry(listViewGeometry.x(),
(listViewGeometry.y() + listViewGeometry.height()) - 23, 81, 23)
def onSearchProgressShow(self):
self.SearchProgress.setVisible(True)
Receiver.send_message(u'openlp_process_events')
def onSearchProgressHide(self):
self.SearchProgress.setVisible(False)
def onNoBookFound(self):
QtGui.QMessageBox.critical(self,
translate('BiblesPlugin.MediaItem', 'No Book Found'),
translate('BiblesPlugin.MediaItem',
'No matching book could be found in this Bible.'))
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)
2010-11-12 17:54:34 +00:00
# If the import was not canceled then reload.
if self.import_wizard.exec_() == 1:
self.reloadBibles()
2010-09-26 13:38:40 +00:00
def loadBibles(self):
log.debug(u'Loading Bibles')
self.QuickVersionComboBox.clear()
self.QuickDualBibleComboBox.clear()
self.AdvancedVersionComboBox.clear()
self.AdvancedDualBibleComboBox.clear()
self.QuickDualBibleComboBox.addItem(u'')
self.AdvancedDualBibleComboBox.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.
first = True
for bible in bibles:
2010-05-09 20:02:38 +00:00
if bible:
self.QuickVersionComboBox.addItem(bible)
self.QuickDualBibleComboBox.addItem(bible)
self.AdvancedVersionComboBox.addItem(bible)
self.AdvancedDualBibleComboBox.addItem(bible)
if first:
first = False
self.initialiseBible(bible)
2010-09-26 13:38:40 +00:00
def reloadBibles(self):
log.debug(u'Reloading Bibles')
self.parent.manager.reload_bibles()
self.loadBibles()
2010-09-26 13:38:40 +00:00
def initialiseBible(self, bible):
log.debug(u'initialiseBible %s', bible)
book_data = self.parent.manager.get_books(bible)
self.AdvancedBookComboBox.clear()
first = True
for book in book_data:
row = self.AdvancedBookComboBox.count()
self.AdvancedBookComboBox.addItem(book[u'name'])
self.AdvancedBookComboBox.setItemData(
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:
2010-09-26 13:38:40 +00:00
self.AdvancedSearchButton.setEnabled(False)
self.AdvancedMessage.setText(
translate('BiblesPlugin.MediaItem', 'Bible not fully loaded.'))
else:
self.AdvancedSearchButton.setEnabled(True)
self.AdvancedMessage.setText(u'')
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 onAdvancedVersionComboBox(self):
2009-09-15 18:56:56 +00:00
self.initialiseBible(
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())
2010-09-22 18:46:02 +00:00
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()
for i in range(range_from, range_to + 1):
2010-09-26 13:38:40 +00:00
combo.addItem(unicode(i))
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)
bible = unicode(self.AdvancedVersionComboBox.currentText())
dual_bible = unicode(self.AdvancedDualBibleComboBox.currentText())
book = unicode(self.AdvancedBookComboBox.currentText())
2009-09-21 17:56:36 +00:00
chapter_from = int(self.AdvancedFromChapter.currentText())
chapter_to = int(self.AdvancedToChapter.currentText())
verse_from = int(self.AdvancedFromVerse.currentText())
verse_to = int(self.AdvancedToVerse.currentText())
2010-07-29 15:04:09 +00:00
versetext = u'%s %s:%s-%s:%s' % (book, chapter_from, verse_from,
chapter_to, verse_to)
self.search_results = self.parent.manager.get_verses(bible, versetext)
2010-08-08 18:05:33 +00:00
if dual_bible:
self.dual_search_results = self.parent.manager.get_verses(
dual_bible, versetext)
if self.ClearAdvancedSearchComboBox.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:
2010-11-13 20:13:24 +00:00
# Check if the first item is a dual bible item or not.
2010-09-20 18:38:18 +00:00
bitem = self.listView.item(0)
item_dual_bible = self._decodeQtObject(bitem, 'dual_bible')
if item_dual_bible and dual_bible or not item_dual_bible and \
not dual_bible:
self.displayResults(bible, dual_bible)
elif QtGui.QMessageBox.critical(self,
translate('BiblePlugin.MediaItem', 'Error'),
translate('BiblePlugin.MediaItem', 'You cannot combine single '
'and dual bible verses. Do you want to delete your search '
'results and start a new search?'),
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.No |
QtGui.QMessageBox.Yes)) == QtGui.QMessageBox.Yes:
self.listView.clear()
self.displayResults(bible, dual_bible)
else:
2010-09-20 18:38:18 +00:00
self.displayResults(bible, dual_bible)
self.AdvancedSearchButton.setEnabled(True)
def onQuickSearchButton(self):
log.debug(u'Quick Search Button pressed')
self.QuickSearchButton.setEnabled(False)
bible = unicode(self.QuickVersionComboBox.currentText())
dual_bible = unicode(self.QuickDualBibleComboBox.currentText())
text = unicode(self.QuickSearchEdit.text())
2010-10-08 17:37:34 +00:00
if self.QuickSearchComboBox.currentIndex() == 0:
# We are doing a 'Verse Search'.
2010-09-30 18:40:10 +00:00
self.search_results = self.parent.manager.get_verses(bible, text)
2010-10-01 14:37:51 +00:00
if dual_bible and self.search_results:
2010-09-30 18:40:10 +00:00
self.dual_search_results = self.parent.manager.get_verses(
dual_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'.
bibles = self.parent.manager.get_bibles()
self.search_results = self.parent.manager.verse_search(bible,
dual_bible, text)
2010-10-01 14:37:51 +00:00
if dual_bible and self.search_results:
text = []
for verse in self.search_results:
text.append((verse.book.name, verse.chapter, verse.verse,
verse.verse))
self.dual_search_results = bibles[dual_bible].get_verses(text)
if self.ClearQuickSearchComboBox.currentIndex() == 0:
self.listView.clear()
2010-09-20 18:55:14 +00:00
if self.listView.count() != 0 and self.search_results:
2010-09-20 18:38:18 +00:00
bitem = self.listView.item(0)
item_dual_bible = self._decodeQtObject(bitem, 'dual_bible')
if item_dual_bible and dual_bible or not item_dual_bible and \
not dual_bible:
self.displayResults(bible, dual_bible)
elif QtGui.QMessageBox.critical(self,
translate('BiblePlugin.MediaItem', 'Error'),
translate('BiblePlugin.MediaItem', 'You cannot combine single '
'and dual bible verses. Do you want to delete your search '
2010-09-21 05:57:23 +00:00
'results and start a new search?'),
2010-09-20 18:38:18 +00:00
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.No |
QtGui.QMessageBox.Yes)) == QtGui.QMessageBox.Yes:
self.listView.clear()
self.displayResults(bible, dual_bible)
2010-09-20 18:55:14 +00:00
elif self.search_results:
2010-08-08 18:05:33 +00:00
self.displayResults(bible, dual_bible)
self.QuickSearchButton.setEnabled(True)
2010-09-26 13:38:40 +00:00
def displayResults(self, bible, dual_bible=u''):
"""
Displays the search results in the media manager. All data needed for
further action is saved for/in each row.
"""
version = self.parent.manager.get_meta_data(bible, u'Version')
copyright = self.parent.manager.get_meta_data(bible, u'Copyright')
2010-10-05 18:44:54 +00:00
permissions = self.parent.manager.get_meta_data(bible, u'Permissions')
2010-09-26 13:38:40 +00:00
if dual_bible:
dual_version = self.parent.manager.get_meta_data(dual_bible,
u'Version')
dual_copyright = self.parent.manager.get_meta_data(dual_bible,
u'Copyright')
2010-10-05 18:44:54 +00:00
dual_permissions = self.parent.manager.get_meta_data(dual_bible,
2010-09-26 13:38:40 +00:00
u'Permissions')
2010-10-05 18:44:54 +00:00
if not dual_permissions:
dual_permissions = u''
2010-09-26 13:38:40 +00:00
for count, verse in enumerate(self.search_results):
if dual_bible:
vdict = {
'book': QtCore.QVariant(verse.book.name),
'chapter': QtCore.QVariant(verse.chapter),
'verse': QtCore.QVariant(verse.verse),
'bible': QtCore.QVariant(bible),
'version': QtCore.QVariant(version.value),
'copyright': QtCore.QVariant(copyright.value),
2010-10-05 18:44:54 +00:00
'permissions': QtCore.QVariant(permissions.value),
2010-09-26 13:38:40 +00:00
'text': QtCore.QVariant(verse.text),
'dual_bible': QtCore.QVariant(dual_bible),
'dual_version': QtCore.QVariant(dual_version.value),
'dual_copyright': QtCore.QVariant(dual_copyright.value),
2010-10-05 18:44:54 +00:00
'dual_permissions': QtCore.QVariant(dual_permissions.value),
2010-09-26 13:38:40 +00:00
'dual_text': QtCore.QVariant(
self.dual_search_results[count].text)
}
bible_text = u' %s %d:%d (%s, %s)' % (verse.book.name,
verse.chapter, verse.verse, version.value,
dual_version.value)
else:
vdict = {
'book': QtCore.QVariant(verse.book.name),
'chapter': QtCore.QVariant(verse.chapter),
'verse': QtCore.QVariant(verse.verse),
'bible': QtCore.QVariant(bible),
'version': QtCore.QVariant(version.value),
'copyright': QtCore.QVariant(copyright.value),
2010-10-05 18:44:54 +00:00
'permissions': QtCore.QVariant(permissions.value),
2010-09-26 13:38:40 +00:00
'text': QtCore.QVariant(verse.text),
'dual_bible': QtCore.QVariant(u''),
'dual_version': QtCore.QVariant(u''),
'dual_copyright': QtCore.QVariant(u''),
2010-10-05 18:44:54 +00:00
'dual_permissions': QtCore.QVariant(u''),
2010-09-26 13:38:40 +00:00
'dual_text': QtCore.QVariant(u'')
}
bible_text = u'%s %d:%d (%s)' % (verse.book.name,
2010-09-26 13:38:40 +00:00
verse.chapter, verse.verse, version.value)
bible_verse = QtGui.QListWidgetItem(bible_text)
bible_verse.setData(QtCore.Qt.UserRole, QtCore.QVariant(vdict))
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 = {}
self.dual_search_results = {}
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()
return unicode(obj)
def generateSlideData(self, service_item, item=None):
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''
old_chapter = -1
2010-09-01 17:27:38 +00:00
raw_footer = []
raw_slides = []
raw_title = []
2010-09-20 18:38:18 +00:00
first_item = True
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')
dual_bible = self._decodeQtObject(bitem, 'dual_bible')
dual_version = self._decodeQtObject(bitem, 'dual_version')
dual_copyright = self._decodeQtObject(bitem, 'dual_copyright')
2010-10-05 18:44:54 +00:00
dual_permissions = self._decodeQtObject(bitem, 'dual_permissions')
2010-09-18 21:29:41 +00:00
dual_text = self._decodeQtObject(bitem, 'dual_text')
verse_text = self.formatVerse(old_chapter, chapter, verse)
2010-10-05 18:44:54 +00:00
footer = u'%s (%s %s %s)' % (book, version, copyright, permissions)
if footer not in raw_footer:
raw_footer.append(footer)
if dual_bible:
footer = u'%s (%s %s %s)' % (book, dual_version, dual_copyright,
2010-10-05 18:44:54 +00:00
dual_permissions)
if footer not in raw_footer:
raw_footer.append(footer)
bible_text = u'%s %s\n\n%s %s' % (verse_text, text, verse_text,
dual_text)
raw_slides.append(bible_text)
bible_text = u''
# If we are 'Verse Per Slide' then create a new slide.
elif self.parent.settings_tab.layout_style == 0:
bible_text = u'%s %s' % (verse_text, text)
raw_slides.append(bible_text)
bible_text = u''
# If we are 'Verse Per Line' then force a new line.
elif self.parent.settings_tab.layout_style == 1:
2010-08-28 19:28:50 +00:00
bible_text = u'%s %s %s\n' % (bible_text, verse_text, text)
# We have to be 'Continuous'.
else:
bible_text = u'%s %s %s\n' % (bible_text, verse_text, text)
2010-09-20 18:38:18 +00:00
if first_item:
2010-09-16 16:22:23 +00:00
start_item = item
2010-09-20 18:38:18 +00:00
first_item = False
2010-09-16 16:22:23 +00:00
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
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:
raw_slides.append(bible_text)
bible_text = u''
2010-10-08 17:37:34 +00:00
# Service Item: Capabilities
if self.parent.settings_tab.layout_style == 2 and not dual_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)
2010-10-08 17:37:34 +00:00
# Service Item: Title
for title in raw_title:
2010-09-20 18:38:18 +00:00
if not service_item.title:
service_item.title = title
2010-08-03 17:04:08 +00:00
else:
service_item.title += u', ' + title
2010-10-08 17:37:34 +00:00
# Service Item: Theme
2010-06-08 15:38:09 +00:00
if len(self.parent.settings_tab.bible_theme) == 0:
service_item.theme = None
else:
2009-10-09 12:48:22 +00:00
service_item.theme = self.parent.settings_tab.bible_theme
for slide in raw_slides:
service_item.add_from_text(slide[:30], slide)
2010-06-18 05:58:40 +00:00
if service_item.raw_footer:
2010-08-04 08:02:52 +00:00
for footer in raw_footer:
service_item.raw_footer.append(footer)
2010-06-18 05:58:40 +00:00
else:
service_item.raw_footer = raw_footer
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-09-18 21:29:41 +00:00
old_bitem = self.listView.item(old_item.row())
old_chapter = int(self._decodeQtObject(old_bitem, 'chapter'))
old_verse = int(self._decodeQtObject(old_bitem, 'verse'))
start_bitem = self.listView.item(start_item.row())
start_book = self._decodeQtObject(start_bitem, 'book')
start_chapter = int(self._decodeQtObject(start_bitem, 'chapter'))
start_verse = int(self._decodeQtObject(start_bitem, 'verse'))
start_bible = self._decodeQtObject(start_bitem, 'bible')
start_dual_bible = self._decodeQtObject(start_bitem, 'dual_bible')
2010-09-16 16:57:21 +00:00
if start_dual_bible:
2010-09-16 16:22:23 +00:00
if start_verse == old_verse and start_chapter == old_chapter:
title = u'%s %s:%s (%s, %s)' % (start_book, start_chapter,
start_verse, start_bible, start_dual_bible)
2010-09-16 16:22:23 +00:00
elif start_chapter == old_chapter:
title = u'%s %s:%s-%s (%s, %s)' % (start_book, start_chapter,
start_verse, old_verse, start_bible, start_dual_bible)
2010-09-16 16:22:23 +00:00
else:
title = u'%s %s:%s-%s:%s (%s, %s)' % (start_book, start_chapter,
start_verse, old_chapter, old_verse, start_bible,
2010-09-16 16:22:23 +00:00
start_dual_bible)
else:
if start_verse == old_verse and start_chapter == old_chapter:
title = u'%s %s:%s (%s)' % (start_book, start_chapter,
start_verse, start_bible)
2010-09-16 16:22:23 +00:00
elif start_chapter == old_chapter:
title = u'%s %s:%s-%s (%s)' % (start_book, start_chapter,
start_verse, old_verse, start_bible)
2010-09-16 16:22:23 +00:00
else:
title = u'%s %s:%s-%s:%s (%s)' % (start_book, start_chapter,
start_verse, old_chapter, old_verse, start_bible)
2010-09-16 16:22:23 +00:00
return title
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
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')
dual_bible = self._decodeQtObject(bitem, 'dual_bible')
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')
old_dual_bible = self._decodeQtObject(old_bitem, 'dual_bible')
2010-09-16 16:22:23 +00:00
if old_bible != bible or old_dual_bible != dual_bible or \
old_book != book:
# The bible, dual 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).
"""
if not self.parent.settings_tab.show_new_chapters or \
old_chapter != chapter:
verse_text = u'%s:%s' % (chapter, verse)
2010-08-29 12:49:45 +00:00
else:
verse_text = u'%s' % verse
if self.parent.settings_tab.display_style == 1:
2010-08-28 17:05:45 +00:00
verse_text = u'{su}(' + verse_text + u'){/su}'
elif self.parent.settings_tab.display_style == 2:
2010-08-28 17:05:45 +00:00
verse_text = u'{su}{' + verse_text + u'}{/su}'
elif self.parent.settings_tab.display_style == 3:
2010-08-28 17:05:45 +00:00
verse_text = u'{su}[' + verse_text + u']{/su}'
else:
verse_text = u'{su}' + verse_text + u'{/su}'
return verse_text