diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index b4edc06fd..272ee47f3 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -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): """ diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index ef9d54fd7..1e438ff1c 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -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): """ diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index f0650dda2..e87a23838 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -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 diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 15ea0c2a5..9905a91ed 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -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) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 51ffcc1e1..57cbbb15a 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -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') diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 090fd50ea..7de4d32bf 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -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 diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 42a99beee..b4c24459a 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -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 diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 2e035cb63..3f24ac285 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -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