← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~trb143/openlp/servicing into lp:openlp

 

Tim Bentley has proposed merging lp:~trb143/openlp/servicing into lp:openlp.

Requested reviews:
    openlp.org Core (openlp-core)

ServiceManager now works with drag and drop from Custom, Bible and Images
ServiceManager now posts serviceitems to Live and Preview Controllers selecting start point.
Custom, Bible and Images plugins are now Drag aware
Some refactoring to confuse people.
-- 
https://code.launchpad.net/~trb143/openlp/servicing/+merge/6589
Your team openlp.org Core is subscribed to branch lp:openlp.
=== modified file 'openlp/__init__.py'
--- openlp/__init__.py	2009-04-28 19:20:03 +0000
+++ openlp/__init__.py	2009-05-13 19:47:25 +0000
@@ -15,7 +15,24 @@
 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 Place, Suite 330, Boston, MA 02111-1307 USA
 """
-__all__ = ['convertStringToBoolean']
+import types
+from PyQt4 import QtCore, QtGui
+
+__all__ = ['convertStringToBoolean','buildIcon',]
 
 def convertStringToBoolean(stringvalue):
     return stringvalue.strip().lower() in (u'true', u'yes', u'y')
+
+def buildIcon(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(QImage(icon)),
+                QtGui.QIcon.Normal, QtGui.QIcon.Off)
+    return ButtonIcon

=== modified file 'openlp/core/lib/event.py'
--- openlp/core/lib/event.py	2009-05-09 07:01:33 +0000
+++ openlp/core/lib/event.py	2009-05-12 21:06:35 +0000
@@ -37,10 +37,12 @@
     AfterSaveService   = 4
     LoadServiceItem   = 5
     # Preview events
-    PreviewBeforeLoad  = 11
-    PreviewAfterLoad   = 12
-    PreviewBeforeShow  = 13
-    PreviewAfterShow   = 14
+    PreviewShow  = 10
+    LiveShow  = 11
+    #PreviewBeforeLoad  = 11
+    #PreviewAfterLoad   = 12
+    #PreviewBeforeShow  = 13
+    #PreviewAfterShow   = 14
 
     ThemeListChanged = 15
 

=== modified file 'openlp/core/lib/mediamanageritem.py'
--- openlp/core/lib/mediamanageritem.py	2009-03-02 22:12:14 +0000
+++ openlp/core/lib/mediamanageritem.py	2009-05-13 19:47:25 +0000
@@ -20,7 +20,6 @@
 import types
 
 from PyQt4 import QtCore, QtGui
-from openlp.core.resources import *
 from openlp.core.lib.toolbar import *
 
 class MediaManagerItem(QtGui.QWidget):

=== modified file 'openlp/core/lib/serviceitem.py'
--- openlp/core/lib/serviceitem.py	2009-05-11 05:09:43 +0000
+++ openlp/core/lib/serviceitem.py	2009-05-13 19:47:25 +0000
@@ -18,12 +18,12 @@
 Place, Suite 330, Boston, MA 02111-1307 USA
 """
 import logging
-import types
 import time
-
+from openlp import buildIcon
 from PyQt4.QtCore import *
 from PyQt4.QtGui import *
 
+
 class ServiceItem():
     """
     The service item is a base class for the plugins to use to interact with
@@ -50,18 +50,7 @@
         log.debug(u'Service item created for %s', self.shortname)
 
     def addIcon(self, icon):
-        ButtonIcon = None
-        if type(icon) is QIcon:
-            ButtonIcon = icon
-        elif type(icon) is types.StringType or type(icon) is types.UnicodeType:
-            ButtonIcon = QIcon()
-            if icon.startswith(u':/'):
-                ButtonIcon.addPixmap(QPixmap(icon), QIcon.Normal,
-                    QIcon.Off)
-            else:
-                ButtonIcon.addPixmap(QPixmap.fromImage(QImage(icon)),
-                    QIcon.Normal, QIcon.Off)
-        self.iconic_representation = ButtonIcon
+        self.iconic_representation = buildIcon(icon)
 
     def render(self):
         """

=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py	2009-05-09 07:01:33 +0000
+++ openlp/core/ui/mainwindow.py	2009-05-14 18:00:36 +0000
@@ -88,11 +88,17 @@
         self.plugin_manager.initialise_plugins()
 
         # Once all components are initialised load the Themes
-        log.info(u'Load Themes')
+        log.info(u'Load Themes and Managers')
+        self.PreviewController.eventManager = self.EventManager
+        self.PreviewController.serviceManager = self.ServiceManagerContents
+        self.LiveController.eventManager = self.EventManager
+        self.LiveController.serviceManager = self.ServiceManagerContents
         self.ThemeManagerContents.eventManager = self.EventManager
         self.ThemeManagerContents.renderManager = self.RenderManager
         self.ServiceManagerContents.renderManager = self.RenderManager
         self.ServiceManagerContents.eventManager = self.EventManager
+        self.ServiceManagerContents.liveController = self.LiveController
+        self.ServiceManagerContents.previewController = self.PreviewController
         self.ThemeManagerContents.serviceManager = self.ServiceManagerContents
         self.ThemeManagerContents.loadThemes()
 

=== modified file 'openlp/core/ui/servicemanager.py'
--- openlp/core/ui/servicemanager.py	2009-05-11 05:09:43 +0000
+++ openlp/core/ui/servicemanager.py	2009-05-14 18:00:36 +0000
@@ -20,94 +20,15 @@
 import os
 import logging
 
-from time import sleep
-from copy import deepcopy
-
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import OpenLPToolbar
 from openlp.core.lib import ServiceItem
 from openlp.core.lib import RenderManager
 from openlp.core import translate
+from openlp import buildIcon
 from openlp.core.lib import Event, EventType, EventManager
 
-#class ServiceData(QtCore.QAbstractItemModel):
-#    """
-#    Tree of items for an order of service.
-#    Includes methods for reading and writing the contents to an OOS file
-#    Root contains a list of ServiceItems
-#    """
-#    global log
-#    log=logging.getLogger(u'ServiceData')
-#    def __init__(self):
-#        QtCore.QAbstractItemModel.__init__(self)
-#        self.items=[]
-#        log.info("Starting")
-#
-#    def clearItems(self):
-#        self.items = []
-#
-#    def columnCount(self, parent=None):
-#        return 1; # always only a single column (for now)
-#
-#    def rowCount(self, parent=None):
-#        return len(self.items)
-#
-#    def insertRow(self, row, service_item):
-#        self.beginInsertRows(QtCore.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()
-#
-#    def removeRow(self, row):
-#        self.beginRemoveRows(QtCore.QModelIndex(), row,row)
-#        self.items.pop(row)
-#        self.endRemoveRows()
-#
-#    def addRow(self, service_item):
-#        self.insertRow(len(self.items), service_item)
-#
-#    def index(self, row, col, parent = QtCore.QModelIndex()):
-#        return self.createIndex(row,col)
-#
-#    def parent(self, index=QtCore.QModelIndex()):
-#        return QtCore.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 QtCore.QVariant()
-#        item = self.items[row]
-#        if role == QtCore.Qt.DisplayRole:
-#            retval= item.title + u':' + item.shortname
-#        elif role == QtCore.Qt.DecorationRole:
-#            retval = item.iconic_representation
-#        elif role == QtCore.Qt.ToolTipRole:
-#            retval = None
-#        else:
-#            retval = None
-#        if retval == None:
-#            retval = QtCore.QVariant()
-##         log.info("Returning"+ str(retval))
-#        if type(retval) is not type(QtCore.QVariant):
-#            return QtCore.QVariant(retval)
-#        else:
-#            return retval
-#
-#    def __iter__(self):
-#        for i in self.items:
-#            yield i
-#
-#    def item(self, row):
-#        log.info("Get Item:%d -> %s" %(row, str(self.items)))
-#        return self.items[row]
-
-
 class ServiceManager(QtGui.QWidget):
 
     """Manages the orders of service.  Currently this involves taking
@@ -122,6 +43,7 @@
     def __init__(self, parent):
         QtGui.QWidget.__init__(self)
         self.parent=parent
+        self.serviceItems=[]
         self.Layout = QtGui.QVBoxLayout(self)
         self.Layout.setSpacing(0)
         self.Layout.setMargin(0)
@@ -153,20 +75,48 @@
         self.Toolbar.addAction(self.ThemeWidget)
         self.Layout.addWidget(self.Toolbar)
 
-        self.serviceManagerList = QtGui.QTreeWidget(self)
-        self.serviceManagerList.setEditTriggers(QtGui.QAbstractItemView.CurrentChanged|QtGui.QAbstractItemView.DoubleClicked|QtGui.QAbstractItemView.EditKeyPressed)
-        self.serviceManagerList.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
-        self.serviceManagerList.setAlternatingRowColors(True)
-        self.serviceManagerList.setObjectName("serviceManagerList")
-        self.serviceManagerList .__class__.dragEnterEvent=self.dragEnterEvent
-        self.serviceManagerList .__class__.dragMoveEvent=self.dragEnterEvent
-        self.serviceManagerList .__class__.dropEvent =self.dropEvent
-
-        self.Layout.addWidget(self.serviceManagerList)
+        self.ServiceManagerList = QtGui.QTreeWidget(self)
+        self.ServiceManagerList.setEditTriggers(QtGui.QAbstractItemView.CurrentChanged|QtGui.QAbstractItemView.DoubleClicked|QtGui.QAbstractItemView.EditKeyPressed)
+        self.ServiceManagerList.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
+        self.ServiceManagerList.setAlternatingRowColors(True)
+        self.ServiceManagerList.setObjectName("ServiceManagerList")
+        #endable drop
+        self.ServiceManagerList .__class__.dragEnterEvent=self.dragEnterEvent
+        self.ServiceManagerList .__class__.dragMoveEvent=self.dragEnterEvent
+        self.ServiceManagerList .__class__.dropEvent =self.dropEvent
+
+        self.ServiceManagerList.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
+
+        self.ServiceManagerList.addAction(self.contextMenuAction(
+            self.ServiceManagerList, ':/system/system_preview.png',
+            translate(u'ServiceManager',u'&Preview Verse'), self.makePreview))
+        self.ServiceManagerList.addAction(self.contextMenuAction(
+            self.ServiceManagerList, ':/system/system_live.png',
+            translate(u'ServiceManager',u'&Show Live'), self.makeLive))
+        self.ServiceManagerList.addAction(self.contextMenuSeparator(self.ServiceManagerList))
+        self.ServiceManagerList.addAction(self.contextMenuAction(
+            self.ServiceManagerList, ':/services/service_delete',
+            translate(u'ServiceManager',u'&Remove from Service'), self.onDeleteFromService))
+
+        self.Layout.addWidget(self.ServiceManagerList)
 
         QtCore.QObject.connect(self.ThemeComboBox,
             QtCore.SIGNAL("activated(int)"), self.onThemeComboBoxSelected)
 
+    def contextMenuAction(self, base, icon, text, slot):
+        """
+        Utility method to help build context menus for plugins
+        """
+        action = QtGui.QAction(text, base)
+        action .setIcon(buildIcon(icon))
+        QtCore.QObject.connect(action, QtCore.SIGNAL("triggered()"), slot)
+        return action
+
+    def contextMenuSeparator(self, base):
+        action = QtGui.QAction("", base)
+        action.setSeparator(True)
+        return action
+
     def onServiceTop(self):
         pass
 
@@ -195,16 +145,43 @@
         self.renderManager.default_theme = self.ThemeComboBox.currentText()
 
     def addServiceItem(self, item):
-        treewidgetitem = QtGui.QTreeWidgetItem(self.serviceManagerList)
+        self.serviceItems.append({u'data': item, u'order': len(self.serviceItems)+1})
+        treewidgetitem = QtGui.QTreeWidgetItem(self.ServiceManagerList)
         treewidgetitem.setText(0,item.title + u':' + item.shortname)
         treewidgetitem.setIcon(0,item.iconic_representation)
+        treewidgetitem.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(len(self.serviceItems)))
         treewidgetitem.setExpanded(True)
         item.render()
+        count = 0
         for frame in item.frames:
             treewidgetitem1 = QtGui.QTreeWidgetItem(treewidgetitem)
             text = frame[u'formatted'][0]
-            treewidgetitem1.setText(0,text[:10])
-            #treewidgetitem1.setIcon(0,frame[u'image'])
+            treewidgetitem1.setText(0,text[:30])
+            treewidgetitem1.setData(0, QtCore.Qt.UserRole,QtCore.QVariant(count))
+            count = count + 1
+
+    def makePreview(self):
+        item, count = self.findServiceItem()
+        self.previewController.addServiceManagerItem(self.serviceItems[item][u'data'], count)
+
+    def makeLive(self):
+        item, count = self.findServiceItem()
+        self.liveController.addServiceManagerItem(self.serviceItems[item][u'data'], count)
+
+    def findServiceItem(self):
+        items = self.ServiceManagerList.selectedItems()
+        pos = 0
+        count = 0
+        for item in items:
+            childCount = item.childCount()
+            if childCount >= 1: # is the parent
+                pos = item.data(0, QtCore.Qt.UserRole).toInt()[0]
+            else:
+                parentitem = item.parent()
+                pos = parentitem.data(0, QtCore.Qt.UserRole).toInt()[0]
+                count = item.data(0, QtCore.Qt.UserRole).toInt()[0]
+        pos = pos - 1 #adjust for zeor indexing
+        return pos, count
 
     def dragEnterEvent(self, event):
         """

=== modified file 'openlp/core/ui/slidecontroller.py'
--- openlp/core/ui/slidecontroller.py	2009-05-11 05:09:43 +0000
+++ openlp/core/ui/slidecontroller.py	2009-05-14 18:00:36 +0000
@@ -24,6 +24,7 @@
 
 from openlp.core.lib import OpenLPToolbar
 from openlp.core import translate
+from openlp.core.lib import Event, EventType, EventManager
 
 class SlideData(QtCore.QAbstractListModel):
     """
@@ -41,6 +42,10 @@
         self.maximagewidth=self.rowheight*16/9.0;
         log.info(u'Starting')
 
+    def eventFilter(self, obj, event):
+        print obj, event
+        return false
+
     def clear(self):
         self.items=[]
 
@@ -54,7 +59,7 @@
         self.beginInsertRows(QtCore.QModelIndex(),row,row)
         log.info(u'insert row %d' % row)
         # create a preview image
-        frame1 = frame.scaled(QtCore.QSize(350,260),  QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
+        frame1 = frame.scaled(QtCore.QSize(300,225),  QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
         self.items.insert(row,(frame1, framenumber))
         log.info(u'Items: %s' % self.items)
         self.endInsertRows()
@@ -71,13 +76,10 @@
         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 QtCore.QVariant()
-#        if role==Qt.DisplayRole:
-#            retval= self.items[row][1]
         if role == QtCore.Qt.DecorationRole:
             retval= self.items[row][0]
         else:
             retval= QtCore.QVariant()
-#         log.info("Returning"+ str(retval))
         if type(retval) is not type(QtCore.QVariant):
             return QtCore.QVariant(retval)
         else:
@@ -117,17 +119,26 @@
         self.PanelLayout.setMargin(0)
 
         self.Controller = QtGui.QScrollArea(self.Splitter)
+        self.Controller.setGeometry(QtCore.QRect(0, 0, 700, 536))
         self.Controller.setWidgetResizable(True)
-
-        self.PreviewListView = QtGui.QListView(self.Splitter)
-        self.PreviewListView.setEditTriggers(QtGui.QAbstractItemView.CurrentChanged)
-        self.PreviewListView.setAlternatingRowColors(True)
+        self.Controller.setObjectName("scrollArea")
+
+        self.scrollAreaWidgetContents = QtGui.QWidget(self.Controller)
+        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 700, 536))
+        self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
+        self.gridLayout = QtGui.QGridLayout(self.scrollAreaWidgetContents)
+        self.gridLayout.setObjectName("gridLayout")
+
+        self.PreviewListView = QtGui.QListView(self.scrollAreaWidgetContents)
         self.PreviewListData = SlideData()
+        self.PreviewListView.isLive = self.isLive
         self.PreviewListView.setModel(self.PreviewListData)
         self.PreviewListView.setSelectionRectVisible(True)
+        self.PreviewListView.setSpacing(5)
+        self.PreviewListView.setObjectName("PreviewListView")
 
-        self.Controller.setGeometry(QtCore.QRect(0, 0, 828, 536))
-        self.Controller.setWidget(self.PreviewListView)
+        self.gridLayout.addWidget(self.PreviewListView, 0, 0, 1, 1)
+        self.Controller.setWidget(self.scrollAreaWidgetContents)
 
         self.Toolbar = OpenLPToolbar(self.Splitter)
         sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
@@ -151,7 +162,17 @@
 
         self.Toolbar.setSizePolicy(sizeToolbarPolicy)
 
-        self.SlidePreview = QtGui.QLabel(self.Splitter)
+        self.PreviewFrame = QtGui.QFrame(self.Splitter)
+        self.PreviewFrame.setGeometry(QtCore.QRect(50, 270, 250, 190))
+        self.PreviewFrame.setFrameShape(QtGui.QFrame.StyledPanel)
+        self.PreviewFrame.setFrameShadow(QtGui.QFrame.Sunken)
+        self.PreviewFrame.setObjectName(u'PreviewFrame')
+
+        self.grid = QtGui.QGridLayout(self.PreviewFrame)
+        self.grid.setMargin(10)
+        self.grid.setObjectName(u'grid')
+
+        self.SlidePreview = QtGui.QLabel(self.PreviewFrame)
         sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
@@ -163,16 +184,12 @@
         self.SlidePreview.setLineWidth(1)
         self.SlidePreview.setScaledContents(True)
         self.SlidePreview.setObjectName(u'SlidePreview')
+        self.grid.addWidget(self.SlidePreview, 0, 0, 1, 1)
 
         QtCore.QObject.connect(self.PreviewListView,
             QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected)
         QtCore.QObject.connect(self.PreviewListView,
-            QtCore.SIGNAL(u'clicked(QListViewItem)'), self.onCurrentItemChanged)
-
-
-
-    def onCurrentItemChanged(self, current, previous):
-        print u'Method slideControllerList currentItemChanged called', current, previous
+            QtCore.SIGNAL(u'activated(QModelIndex)'), self.onSlideSelected)
 
     def onSlideSelectedFirst(self):
         row = self.PreviewListData.createIndex(0, 0)
@@ -241,5 +258,9 @@
             self.PreviewListView.selectionModel().setCurrentIndex(row, QtGui.QItemSelectionModel.SelectCurrent)
             self.onSlideSelected(row)
 
-    def render(self):
-        pass
+    def addServiceManagerItem(self, serviceitem, slideno):
+        self.addServiceItem(serviceitem)
+        row = self.PreviewListData.createIndex(slideno, 0)
+        if row.isValid():
+            self.PreviewListView.selectionModel().setCurrentIndex(row, QtGui.QItemSelectionModel.SelectCurrent)
+            self.onSlideSelected(row)

=== modified file 'openlp/plugins/bibles/bibleplugin.py'
--- openlp/plugins/bibles/bibleplugin.py	2009-04-10 06:06:41 +0000
+++ openlp/plugins/bibles/bibleplugin.py	2009-05-12 21:06:35 +0000
@@ -23,7 +23,6 @@
 from PyQt4.QtCore import *
 from PyQt4.QtGui import *
 
-from openlp.core.resources import *
 from openlp.core.lib import Plugin, Event
 from openlp.core.lib import EventType
 
@@ -83,7 +82,16 @@
         """
         Handle the event contained in the event object.
         """
-        log.debug(u'Handle event called with event %s'%event.event_type)
+        log.debug(u'Handle event called with event %s with payload %s'%(event.event_type, event.payload))
         if event.event_type == EventType.ThemeListChanged:
             log.debug(u'New Theme request received')
             #self.edit_custom_form.loadThemes(self.theme_manager.getThemes())
+        if event.event_type == EventType.LoadServiceItem and event.payload == 'Bibles':
+            log.debug(u'Load Service Item received')
+            self.media_item.onBibleAddClick()
+        if event.event_type == EventType.PreviewShow and event.payload == 'Bibles':
+            log.debug(u'Load Service Item received')
+            self.media_item.onBiblePreviewClick()
+        if event.event_type == EventType.LiveShow and event.payload == 'Bibles':
+            log.debug(u'Load Service Item received')
+            self.media_item.onBibleLiveClick()

=== modified file 'openlp/plugins/bibles/lib/mediaitem.py'
--- openlp/plugins/bibles/lib/mediaitem.py	2009-05-04 08:15:48 +0000
+++ openlp/plugins/bibles/lib/mediaitem.py	2009-05-13 19:47:25 +0000
@@ -28,6 +28,30 @@
 from openlp.plugins.bibles.forms import BibleImportForm
 from openlp.plugins.bibles.lib import TextListData
 
+class BibleList(QtGui.QListView):
+
+    def __init__(self,parent=None,name=None):
+        QtGui.QListView.__init__(self,parent)
+
+    def mouseMoveEvent(self, event):
+        """
+        Drag and drop event does not care what data is selected
+        as the recepient will use events to request the data move
+        just tell it what plugin to call
+        """
+        if event.buttons() != QtCore.Qt.LeftButton:
+            return
+        drag = QtGui.QDrag(self)
+        mimeData = QtCore.QMimeData()
+        drag.setMimeData(mimeData)
+        mimeData.setText(u'Bibles')
+
+        dropAction = drag.start(QtCore.Qt.CopyAction)
+
+        if dropAction == QtCore.Qt.CopyAction:
+            self.close()
+
+
 class BibleMediaItem(MediaManagerItem):
     """
     This is the custom media manager item for Bibles.
@@ -179,11 +203,12 @@
         # Add the search tab widget to the page layout
         self.PageLayout.addWidget(self.SearchTabWidget)
 
-        self.BibleListView = QtGui.QListView()
+        self.BibleListView = BibleList()
         self.BibleListView.setAlternatingRowColors(True)
         self.BibleListData = TextListData()
         self.BibleListView.setModel(self.BibleListData)
-        self.BibleListView.setSelectionMode(2)
+        self.BibleListView.setSelectionMode(QtGui.QAbstractItemView.MultiSelection)
+        self.BibleListView.setDragEnabled(True)
 
         self.PageLayout.addWidget(self.BibleListView)
 
@@ -205,6 +230,7 @@
             QtCore.SIGNAL("pressed()"), self.onQuickSearchButton)
         # Context Menus
         self.BibleListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
+
         self.BibleListView.addAction(self.contextMenuAction(
             self.BibleListView, ':/system/system_preview.png',
             translate(u'BibleMediaItem',u'&Preview Verse'), self.onBiblePreviewClick))

=== modified file 'openlp/plugins/custom/customplugin.py'
--- openlp/plugins/custom/customplugin.py	2009-05-09 07:01:33 +0000
+++ openlp/plugins/custom/customplugin.py	2009-05-12 21:06:35 +0000
@@ -56,10 +56,16 @@
         """
         Handle the event contained in the event object.
         """
-        log.debug(u'Handle event called with event %s'%event.event_type)
+        log.debug(u'Handle event called with event %s with payload %s'%(event.event_type, event.payload))
         if event.event_type == EventType.ThemeListChanged:
             log.debug(u'New Theme request received')
             self.edit_custom_form.loadThemes(self.theme_manager.getThemes())
         if event.event_type == EventType.LoadServiceItem and event.payload == 'Custom':
             log.debug(u'Load Service Item received')
             self.media_item.onCustomAddClick()
+        if event.event_type == EventType.PreviewShow and event.payload == 'Custom':
+            log.debug(u'Load Service Item received ')
+            self.media_item.onCustomPreviewClick()
+        if event.event_type == EventType.LiveShow and event.payload == 'Custom':
+            log.debug(u'Load Service Item received')
+            self.media_item.onCustomLiveClick()

=== modified file 'openlp/plugins/custom/lib/mediaitem.py'
--- openlp/plugins/custom/lib/mediaitem.py	2009-05-09 07:01:33 +0000
+++ openlp/plugins/custom/lib/mediaitem.py	2009-05-12 21:06:35 +0000
@@ -28,6 +28,29 @@
 
 from openlp.plugins.custom.lib import TextListData
 
+class CustomList(QtGui.QListView):
+
+    def __init__(self,parent=None,name=None):
+        QtGui.QListView.__init__(self,parent)
+
+    def mouseMoveEvent(self, event):
+        """
+        Drag and drop event does not care what data is selected
+        as the recepient will use events to request the data move
+        just tell it what plugin to call
+        """
+        if event.buttons() != QtCore.Qt.LeftButton:
+            return
+        drag = QtGui.QDrag(self)
+        mimeData = QtCore.QMimeData()
+        drag.setMimeData(mimeData)
+        mimeData.setText(u'Custom')
+
+        dropAction = drag.start(QtCore.Qt.CopyAction)
+
+        if dropAction == QtCore.Qt.CopyAction:
+            self.close()
+
 class CustomMediaItem(MediaManagerItem):
     """
     This is the custom media manager item for Custom Slides.
@@ -105,12 +128,11 @@
         # Add the Custom widget to the page layout
         self.PageLayout.addWidget(self.CustomWidget)
 
-        self.CustomListView = QtGui.QListView()
+        self.CustomListView = CustomList()
         self.CustomListView.setAlternatingRowColors(True)
         self.CustomListData = TextListData()
         self.CustomListView.setModel(self.CustomListData)
         self.CustomListView.setDragEnabled(True)
-        self.CustomListView .__class__.mouseMoveEvent =self.onMouseMoveEvent
 
         self.PageLayout.addWidget(self.CustomListView)
 
@@ -235,27 +257,3 @@
             service_item.title = title
             service_item.raw_slides = raw_slides
             service_item.raw_footer = raw_footer
-
-    def onMouseMoveEvent(self, event):
-        """
-        Drag and drop eventDo not care what data is selected
-        as the recepient will use events to request the data move
-        just tell it what plugin to call
-        """
-        if event.buttons() != QtCore.Qt.LeftButton:
-            return
-
-        items = self.CustomListView.selectedIndexes()
-        if items == []:
-            return
-
-        drag = QtGui.QDrag(self)
-        mimeData = QtCore.QMimeData()
-        drag.setMimeData(mimeData)
-        for item in items:
-            mimeData.setText(u'Custom')
-
-        dropAction = drag.start(QtCore.Qt.CopyAction)
-
-        if dropAction == QtCore.Qt.CopyAction:
-            self.close()

=== modified file 'openlp/plugins/images/imageplugin.py'
--- openlp/plugins/images/imageplugin.py	2009-03-22 07:13:34 +0000
+++ openlp/plugins/images/imageplugin.py	2009-05-12 21:06:35 +0000
@@ -21,8 +21,8 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Plugin
-from openlp.core.resources import *
+from openlp.core.lib import Plugin, Event
+from openlp.core.lib import EventType
 
 from openlp.plugins.images.lib import ImageMediaItem, ImageServiceItem
 
@@ -37,7 +37,7 @@
         self.weight = -7
         # Create the plugin icon
         self.icon = QtGui.QIcon()
-        self.icon.addPixmap(QtGui.QPixmap(':/media/media_image.png'),
+        self.icon.addPixmap(QtGui.QPixmap(u':/media/media_image.png'),
             QtGui.QIcon.Normal, QtGui.QIcon.Off)
 
         self.preview_service_item = ImageServiceItem(self.preview_controller)
@@ -45,11 +45,25 @@
 
     def get_media_manager_item(self):
         # Create the MediaManagerItem object
-        self.MediaManagerItem = ImageMediaItem(self, self.icon, u'Images')
-        return self.MediaManagerItem
+        self.media_item = ImageMediaItem(self, self.icon, u'Images')
+        return self.media_item
 
     def initialise(self):
         log.info(u'Plugin Initialising')
-        log.info(u'Done')
+
+    def handle_event(self, event):
+        """
+        Handle the event contained in the event object.
+        """
+        log.debug(u'Handle event called with event %s with payload %s'%(event.event_type, event.payload))
+        if event.event_type == EventType.LoadServiceItem and event.payload == 'Image':
+            log.debug(u'Load Service Item received')
+            self.media_item.onImageAddClick()
+        if event.event_type == EventType.PreviewShow and event.payload == 'Image':
+            log.debug(u'Load Service Item received')
+            self.media_item.onImagePreviewClick()
+        if event.event_type == EventType.LiveShow and event.payload == 'Image':
+            log.debug(u'Load Service Item received')
+            self.media_item.onImageLiveClick()
 
 

=== modified file 'openlp/plugins/images/lib/mediaitem.py'
--- openlp/plugins/images/lib/mediaitem.py	2009-03-17 05:05:04 +0000
+++ openlp/plugins/images/lib/mediaitem.py	2009-05-13 19:47:25 +0000
@@ -24,10 +24,33 @@
 
 from openlp.core import translate
 from openlp.core.lib import MediaManagerItem
-from openlp.core.resources import *
+from openlp.core.lib import ServiceItem
 
 from openlp.plugins.images.lib import ListWithPreviews
 
+class ImageList(QtGui.QListView):
+
+    def __init__(self,parent=None,name=None):
+        QtGui.QListView.__init__(self,parent)
+
+    def mouseMoveEvent(self, event):
+        """
+        Drag and drop event does not care what data is selected
+        as the recepient will use events to request the data move
+        just tell it what plugin to call
+        """
+        if event.buttons() != QtCore.Qt.LeftButton:
+            return
+        drag = QtGui.QDrag(self)
+        mimeData = QtCore.QMimeData()
+        drag.setMimeData(mimeData)
+        mimeData.setText(u'Image')
+
+        dropAction = drag.start(QtCore.Qt.CopyAction)
+
+        if dropAction == QtCore.Qt.CopyAction:
+            self.close()
+
 class ImageMediaItem(MediaManagerItem):
     """
     This is the custom media manager item for images.
@@ -70,14 +93,19 @@
             translate('ImageMediaItem', u'Add Image To Service'),
             translate('ImageMediaItem', u'Add the selected image(s) to the service'),
             ':/system/system_add.png', self.onImageAddClick, 'ImageAddItem')
-        ## Add the songlist widget ##
-        self.ImageListView = QtGui.QListView()
+
+        #Add the Image List widget
+        self.ImageListView = ImageList()
         self.ImageListView.uniformItemSizes = True
         self.ImageListData = ListWithPreviews()
         self.ImageListView.setModel(self.ImageListData)
-
         self.ImageListView.setGeometry(QtCore.QRect(10, 100, 256, 591))
+        self.ImageListView.setSpacing(1)
+        self.ImageListView.setSelectionMode(QtGui.QAbstractItemView.MultiSelection)
+        self.ImageListView.setAlternatingRowColors(True)
+        self.ImageListView.setDragEnabled(True)
         self.ImageListView.setObjectName('ImageListView')
+
         self.PageLayout.addWidget(self.ImageListView)
 
         #define and add the context menu
@@ -96,11 +124,6 @@
             translate('ImageMediaItem', u'&Add to Service'),
             self.onImageAddClick))
 
-        self.ImageListPreview = QtGui.QWidget()
-        self.PageLayout.addWidget(self.ImageListPreview)
-        self.ImageListView.setGeometry(QtCore.QRect(10, 100, 256, 591))
-        self.ImageListView.setSpacing(1)
-        self.ImageListView.setAlternatingRowColors(True)
 
     def initialise(self):
         self.loadImageList(self.parent.config.load_list(u'images'))
@@ -126,22 +149,35 @@
         for index in indexes:
             current_row = int(index.row())
             self.ImageListData.removeRow(current_row)
-        self.parent.config.set_list(u'images', self.ImageListData.getFileList())            
+        self.parent.config.set_list(u'images', self.ImageListData.getFileList())
 
-    def onImageClick(self, where):
+    def generateSlideData(self, service_item):
         indexes = self.ImageListView.selectedIndexes()
         for index in indexes:
             filename = self.ImageListData.getFilename(index)
-            log.info(u"Click %s:%s"%(str(where), filename))
-            where.add(filename)
-        where.render()
+            frame = QtGui.QPixmap(str(filename))
+            service_item.frames.append({u'formatted': u'Image', u'image': frame})
 
     def onImagePreviewClick(self):
-        self.onImageClick(self.parent.preview_service_item)
+        log.debug(u'Image Preview Requested')
+        service_item = ServiceItem(self.parent)
+        service_item.addIcon( ":/media/media_image.png")
+        service_item.render_manager = self.parent.render_manager
+        self.generateSlideData(service_item)
+        self.parent.preview_controller.addServiceItem(service_item)
 
     def onImageLiveClick(self):
-        self.onImageClick(self.parent.live_service_item)
+        log.debug(u'Image Live Requested')
+        service_item = ServiceItem(self.parent)
+        service_item.addIcon( ":/media/media_image.png")
+        service_item.render_manager = self.parent.render_manager
+        self.generateSlideData(service_item)
+        self.parent.live_controller.addServiceItem(service_item)
 
     def onImageAddClick(self):
-        """Add this item to the OOS"""
-        pass
+        log.debug(u'Image Live Requested')
+        service_item = ServiceItem(self.parent)
+        service_item.addIcon( ":/media/media_image.png")
+        service_item.render_manager = self.parent.render_manager
+        self.generateSlideData(service_item)
+        self.parent.service_manager.addServiceItem(service_item)


Follow ups