Add servicemanager access from Plugins

Add bibles to preview , live and servicemanager.py
Add icons to servicemanager lists
Fix thememanager to work with missing theme
This commit is contained in:
Tim Bentley 2009-05-02 19:56:27 +01:00
parent 0d27d61b7f
commit 183a7e54c7
8 changed files with 84 additions and 36 deletions

View File

@ -93,6 +93,7 @@ class Plugin(object):
self.theme_manager=plugin_helpers[u'theme']
self.event_manager=plugin_helpers[u'event']
self.render_manager=plugin_helpers[u'render']
self.service_manager=plugin_helpers[u'service']
def check_pre_conditions(self):
"""

View File

@ -18,11 +18,11 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
"""
import logging
import types
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *
#was Qabstratctitemodel
class ServiceItem():
"""
The service item is a base class for the plugins to use to interact with
@ -37,9 +37,9 @@ class ServiceItem():
"""
Init Method
"""
self.plugin = hostplugin
self.shortname = hostplugin.name
self.title = u''
self.items = []
self.iconic_representation = None
self.raw_slides = None
@ -49,6 +49,20 @@ class ServiceItem():
self.theme = None
log.debug(u'Service item created for %s', self.shortname)
def addIcon(self, icon):
ButtonIcon = None
if type(icon) is QtGui.QIcon:
ButtonIcon = icon
elif type(icon) is types.StringType or type(icon) is types.UnicodeType:
ButtonIcon = QtGui.QIcon()
if icon.startswith(u':/'):
ButtonIcon.addPixmap(QtGui.QPixmap(icon), QtGui.QIcon.Normal,
QtGui.QIcon.Off)
else:
ButtonIcon.addPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(icon)),
QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.iconic_representation = ButtonIcon
def render(self):
"""
The render method is what the plugin uses to render it's meda to the
@ -65,7 +79,6 @@ class ServiceItem():
for slide in self.format_slides:
self.frames.append(self.render_manager.generate_slide(slide, self.raw_footer, False))
print self.frames
def get_parent_node(self):
"""

View File

@ -60,8 +60,9 @@ class MainWindow(object):
self.plugin_helpers[u'preview'] = self.PreviewController
self.plugin_helpers[u'live'] = self.LiveController
self.plugin_helpers[u'event'] = self.EventManager
self.plugin_helpers[u'theme'] = self.ThemeManagerContents # Theme manger
self.plugin_helpers[u'theme'] = self.ThemeManagerContents
self.plugin_helpers[u'render'] = self.RenderManager
self.plugin_helpers[u'service'] = self.ServiceManagerContents
self.plugin_manager.find_plugins(pluginpath, self.plugin_helpers, self.EventManager)
# hook methods have to happen after find_plugins. Find plugins needs the controllers

View File

@ -46,20 +46,25 @@ class ServiceData(QAbstractItemModel):
QAbstractItemModel.__init__(self)
self.items=[]
log.info("Starting")
def columnCount(self, parent):
return 1; # always only a single column (for now)
def rowCount(self, parent):
return len(self.items)
def insertRow(self, row, service_item):
# self.beginInsertRows(QModelIndex(),row,row)
log.info("insert row %d:%s"%(row,service_item))
self.beginInsertRows(QModelIndex(),row,row)
log.info("insert row %s:%s" % (row,service_item))
self.items.insert(row, service_item)
log.info("Items: %s" % self.items)
# self.endInsertRows()
self.endInsertRows()
def removeRow(self, row):
self.beginRemoveRows(QModelIndex(), row,row)
self.items.pop(row)
self.endRemoveRows()
def addRow(self, item):
self.insertRow(len(self.items), item)
@ -68,16 +73,18 @@ class ServiceData(QAbstractItemModel):
def parent(self, index=QModelIndex()):
return QModelIndex() # no children as yet
def data(self, index, role):
"""
Called by the service manager to draw us in the service window
"""
log.debug(u'data %s %d', index, role)
row=index.row()
if row > len(self.items): # if the last row is selected and deleted, we then get called with an empty row!
return QVariant()
item=self.items[row]
if role==Qt.DisplayRole:
retval= item.pluginname + ":" + item.shortname
retval= item.title + u':' + item.shortname
elif role == Qt.DecorationRole:
retval = item.iconic_representation
elif role == Qt.ToolTipRole:
@ -139,6 +146,7 @@ class ServiceManager(QWidget):
self.service_data=ServiceData()
self.TreeView.setModel(self.service_data)
self.Layout.addWidget(self.TreeView)
QtCore.QObject.connect(self.ThemeComboBox,
QtCore.SIGNAL("activated(int)"), self.onThemeComboBoxSelected)
@ -159,6 +167,7 @@ class ServiceManager(QWidget):
# if currently selected is of correct type, add it to it
log.info("row:%d"%row)
selected_item=self.service_data.item(row)
if type(selected_item) == type(item):
log.info("Add to existing item")
selected_item.add(item)

View File

@ -154,7 +154,7 @@ class SlideController(QtGui.QWidget):
def addServiceItem(self, serviceitem):
self.serviceitem = serviceitem
self.serviceitem.render()
print self.serviceitem.frames
self.CustomListData.clearItems()
for frame in self.serviceitem.frames:
self.CustomListData.addRow(frame, u'some text')

View File

@ -230,7 +230,17 @@ class ThemeManager(QWidget):
def getThemeData(self, themename):
log.debug(u'getthemedata for theme %s', themename)
xml_file = os.path.join(self.path, str(themename), str(themename) + u'.xml')
xml = fileToXML(xml_file)
try:
xml = fileToXML(xml_file)
except:
newtheme = ThemeXML()
newtheme.new_document(u'New Theme')
newtheme.add_background_solid(str(u'#000000'))
newtheme.add_font(str(QFont().family()), str(u'#FFFFFF'), str(30), u'False')
newtheme.add_font(str(QFont().family()), str(u'#FFFFFF'), str(12), u'False', u'footer')
newtheme.add_display(u'False', str(u'#FFFFFF'), u'False', str(u'#FFFFFF'),
str(0), str(0), str(0))
xml = newtheme.extract_xml()
theme = ThemeXML()
theme.parse(xml)
return theme

View File

@ -23,7 +23,7 @@ from PyQt4 import QtCore, QtGui
from openlp.core import translate
from openlp.core.lib import MediaManagerItem, Receiver
from openlp.core.resources import *
from openlp.core.lib import ServiceItem
from openlp.plugins.bibles.forms import BibleImportForm
from openlp.plugins.bibles.lib import TextListData
@ -270,12 +270,6 @@ class BibleMediaItem(MediaManagerItem):
self.bibleimportform.exec_()
pass
def onBibleLiveClick(self):
pass
def onBibleAddClick(self):
pass
def onAdvancedFromVerse(self):
frm = self.AdvancedFromVerse.currentText()
self.adjustComboBox(frm, self.verses, self.AdvancedToVerse)
@ -325,12 +319,33 @@ class BibleMediaItem(MediaManagerItem):
if not self.search_results == None:
self.displayResults(bible)
def onBibleLiveClick(self):
service_item = ServiceItem(self.parent)
service_item.addIcon( ":/media/media_verse.png")
service_item.render_manager = self.parent.render_manager
self.generateSlideData(service_item)
self.parent.live_controller.addServiceItem(service_item)
def onBibleAddClick(self):
service_item = ServiceItem(self.parent)
service_item.addIcon( ":/media/media_verse.png")
service_item.render_manager = self.parent.render_manager
self.generateSlideData(service_item)
self.parent.service_manager.addServiceItem(service_item)
def onBiblePreviewClick(self):
service_item = ServiceItem(self.parent)
service_item.addIcon( ":/media/media_verse.png")
service_item.render_manager = self.parent.render_manager
self.generateSlideData(service_item)
self.parent.preview_controller.addServiceItem(service_item)
def generateSlideData(self, service_item):
log.debug(u'Bible Preview Button pressed')
items = self.BibleListView.selectedIndexes()
old_chapter = ''
main_lines=[]
footer_lines = []
raw_slides=[]
raw_footer = []
for item in items:
text = self.BibleListData.getValue(item)
verse = text[:text.find("(")]
@ -351,13 +366,15 @@ class BibleMediaItem(MediaManagerItem):
else:
loc = self.formatVerse(old_chapter, chapter, verse, u'', u'')
old_chapter = chapter
main_lines.append(loc + u' '+text)
if len(footer_lines) <= 1:
footer_lines.append(book)
raw_slides.append(loc + u' '+text)
service_item.title = book + u' ' + loc
if len(raw_footer) <= 1:
raw_footer.append(book)
self.parent.render_manager.set_override_theme(None)
frame=self.parent.render_manager.generate_slide(main_lines, footer_lines)
self.parent.preview_controller.previewFrame(frame)
service_item.theme = None
service_item.raw_slides = raw_slides
service_item.raw_footer = raw_footer
def formatVerse(self, old_chapter, chapter, verse, opening, closing):
loc = opening

View File

@ -136,7 +136,7 @@ class CustomMediaItem(MediaManagerItem):
translate('CustomMediaItem',u'&Show Live'), self.onCustomLiveClick))
self.CustomListView.addAction(self.contextMenuAction(
self.CustomListView, ':/system/system_add.png',
translate('CustomMediaItem',u'&Add to Service'), self.onCustomEditClick))
translate('CustomMediaItem',u'&Add to Service'), self.onCustomAddClick))
# def retranslateUi(self):
# self.ClearTextButton.setText(translate('CustomMediaItem', u'Clear'))
@ -188,20 +188,24 @@ class CustomMediaItem(MediaManagerItem):
def onCustomPreviewClick(self):
service_item = ServiceItem(self.parent)
service_item.addIcon( ":/media/media_song.png")
service_item.render_manager = self.parent.render_manager
self.generateSlideData(service_item)
self.parent.preview_controller.addServiceItem(service_item)
def onCustomLiveClick(self):
service_item = ServiceItem(self.parent)
service_item.addIcon( ":/media/media_song.png")
service_item.render_manager = self.parent.render_manager
self.generateSlideData(service_item)
self.parent.live_controller.addServiceItem(service_item)
def onCustomAddClick(self):
service_item = ServiceItem(self.parent)
service_item.addIcon( ":/media/media_song.png")
service_item.render_manager = self.parent.render_manager
self.generateSlideData(service_item)
self.parent.service_manager.addServiceItem(service_item)
def generateSlideData(self, service_item):
indexes = self.CustomListView.selectedIndexes()
@ -215,20 +219,13 @@ class CustomMediaItem(MediaManagerItem):
title = customSlide.title
credit = customSlide.credits
theme = customSlide.theme_name
if len(theme) == 0 or theme == None:
self.parent.render_manager.set_override_theme(None)
else:
self.parent.render_manager.set_override_theme(theme)
if len(theme) is not 0 :
service_item.theme = theme
songXML=SongXMLParser(customSlide.text)
verseList = songXML.get_verses()
for verse in verseList:
slide = self.parent.render_manager.format_slide(verse[1], False)
raw_slides.append(verse[1])
raw_footer.append(title + u' '+ credit)
if slide is not None:
frame=self.parent.render_manager.generate_slide(slide, raw_footer, False)
self.parent.preview_controller.previewFrame(frame)
service_item.title = title
service_item.raw_slides = raw_slides
service_item.raw_footer = raw_footer