From 2be33e6c66f9cab5e318d60d0d5c4f852726f715 Mon Sep 17 00:00:00 2001 From: Martin Thompson Date: Wed, 4 Mar 2009 21:53:09 +0000 Subject: [PATCH] Pre merge from SVN bzr-revno: 367 --- openlp/core/lib/__init__.py | 6 +- openlp/core/ui/servicemanager.py | 59 ++++++++++++++-- openlp/plugins/images/imageplugin.py | 15 ++-- .../images}/imageserviceitem.py | 47 ++++++------- openlp/plugins/images/listwithpreviews.py | 70 +++++++++++++++++++ 5 files changed, 159 insertions(+), 38 deletions(-) rename openlp/{core/lib => plugins/images}/imageserviceitem.py (67%) create mode 100644 openlp/plugins/images/listwithpreviews.py diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 563b6d387..8cb3a46e7 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -26,8 +26,8 @@ from event import Event from xmlrootclass import XmlRootClass from serviceitem import ServiceItem from eventreceiver import Receiver -from imageserviceitem import ImageServiceItem +from serviceitem import ServiceItem from toolbar import OpenLPToolbar -__all__ = ['PluginConfig', 'Plugin', 'PluginUtils', 'SettingsTabItem', 'MediaManagerItem', 'Event', - 'XmlRootClass', 'ServiceItem', 'Receiver', 'ImageServiceItem', 'OpenLPToolbar'] +__all__ = ['PluginConfig', 'Plugin', 'PluginUtils', 'SettingsTab', 'MediaManagerItem', 'Event', + 'XmlRootClass', 'ServiceItem', 'Receiver', 'OpenLPToolbar'] diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 2522605b5..21652d55d 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -32,12 +32,57 @@ from openlp.core.lib import ServiceItem # from openlp.core import PluginManager import logging -class ServiceData(QAbstractListModel): +class ServiceData(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("ServiceData") + def __init__(self): + self.items=[] + log.info("Starting") + 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,filename)) + self.items.insert(row, service_item) + self.endInsertRows() + def removeRow(self, row): + self.beginRemoveRows(QModelIndex(), row,row) + self.items.pop(row) + self.endRemoveRows() + def addRow(self, filename): + self.insertRow(len(self.items), filename) + + + def data(self, index, role): + """ + Called by the service manager to draw us in the service window + """ + 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 + elif role == Qt.DecorationRole: + retval = item.iconic_representation + elif role == Qt.ToolTipRole: + retval= None + else: + retval= None + if retval == None: + retval=QVariant() +# log.info("Returning"+ str(retval)) + if type(retval) is not type(QVariant): + return QVariant(retval) + else: + return retval + + class ServiceManager(QWidget): @@ -69,14 +114,18 @@ class ServiceManager(QWidget): self.ThemeWidget = QtGui.QWidgetAction(self.Toolbar) self.ThemeWidget.setDefaultWidget(self.ThemeComboBox) self.Toolbar.addAction(self.ThemeWidget) + self.Layout.addWidget(self.Toolbar) - self.ListView = QtGui.QListView(self) - self.Layout.addWidget(self.ListView) - + self.TreeView = QtGui.QTreeView(self) + self.service_data=ServiceData() +# self.TreeView.setModel(self.service_data) + self.Layout.addWidget(self.TreeView) + def addServiceItem(self, item): """Adds service item""" + pass def removeServiceItem(self): """Remove currently selected item""" - + pass diff --git a/openlp/plugins/images/imageplugin.py b/openlp/plugins/images/imageplugin.py index 6f31c3731..f65ea2f02 100644 --- a/openlp/plugins/images/imageplugin.py +++ b/openlp/plugins/images/imageplugin.py @@ -22,10 +22,12 @@ import os.path from PyQt4 import QtCore, QtGui from openlp.core.resources import * -from openlp.core.lib import Plugin, PluginUtils, MediaManagerItem, ImageServiceItem +from openlp.core.lib import Plugin, PluginUtils, MediaManagerItem import logging from PyQt4.QtCore import * from PyQt4.QtGui import * +from listwithpreviews import ListWithPreviews +from imageserviceitem import ImageServiceItem class ListWithPreviews(QtCore.QAbstractListModel): """ @@ -185,10 +187,12 @@ class ImagePlugin(Plugin, PluginUtils): self._save_display_list(self.ImageListData.get_file_list()) def onImageClick(self, where): - cr = self.ImageListView.currentRow() - filename = self.ImageListView.item(cr, 0).text() - log.info("Click %s:%s"%(str(where), filename)) - where.add(filename) + indexes=self.ImageListView.selectedIndexes() + for i in indexes: + filename = self.ImageListData.get_filename(i) + log.info("Click %s:%s"%(str(where), filename)) + where.add(filename) + where.render() def onImagePreviewClick(self): @@ -198,5 +202,6 @@ class ImagePlugin(Plugin, PluginUtils): self.onImageClick(self.live_service_item) def onImageAddClick(self): + """Add this item to the OOS""" pass diff --git a/openlp/core/lib/imageserviceitem.py b/openlp/plugins/images/imageserviceitem.py similarity index 67% rename from openlp/core/lib/imageserviceitem.py rename to openlp/plugins/images/imageserviceitem.py index 1c6c6dc37..0aed22047 100644 --- a/openlp/core/lib/imageserviceitem.py +++ b/openlp/plugins/images/imageserviceitem.py @@ -19,8 +19,10 @@ Place, Suite 330, Boston, MA 02111-1307 USA """ from PyQt4 import QtCore, QtGui import logging +from openlp.core.lib import ServiceItem +from listwithpreviews import ListWithPreviews -class ImageServiceItem(): +class ImageServiceItem(ServiceItem): """ The service item is a base class for the plugins to use to interact with the service manager, the slide controller, and the renderer. @@ -32,20 +34,13 @@ class ImageServiceItem(): """ Init Method """ - self.imgs=[] + self.imgs=ListWithPreviews() self.slide_controller=controller - self.slide_controller.ControllerContents=QtGui.QTableWidget() + self.slide_controller.ControllerContents=QtGui.QListView() c=self.slide_controller.ControllerContents - c.setColumnCount(2) - c.setColumnHidden(0, True) - c.setColumnWidth(1, 275) - c.setShowGrid(False) - c.setSortingEnabled(False) - c.setAlternatingRowColors(True) - c.setHorizontalHeaderLabels(QtCore.QStringList(["","Name"])) - c.setAlternatingRowColors(True) - c.setGeometry(QtCore.QRect(10, 100, 256, 591)) - pass + c.uniformItemSizes=True + c.setModel(self.imgs) + c.setGeometry(0,0,200,200) def render(self): """ @@ -53,15 +48,15 @@ class ImageServiceItem(): screen. """ # render the "image chooser first" - for f in self.imgs: - fl , nm = os.path.split(str(f)) - c = self.slide_controller.rowCount() - self.slide_controller.setRowCount(c+1) - twi = QtGui.QTableWidgetItem(str(f)) - self.slide_controller.setItem(c , 0, twi) - twi = QtGui.QTableWidgetItem(str(nm)) - self.slide_controller.setItem(c , 1, twi) - self.slide_controller.setRowHeight(c, 80) +# for f in self.imgs: +# fl , nm = os.path.split(str(f)) +# c = self.slide_controller.rowCount() +# self.slide_controller.setRowCount(c+1) +# twi = QtGui.QTableWidgetItem(str(f)) +# self.slide_controller.setItem(c , 0, twi) +# twi = QtGui.QTableWidgetItem(str(nm)) +# self.slide_controller.setItem(c , 1, twi) +# self.slide_controller.setRowHeight(c, 80) # render the preview screen here @@ -76,18 +71,20 @@ class ImageServiceItem(): append an image to the list """ log.info("add:"+filename) - self.imgs.append(filename) + self.imgs.addRow(filename) def get_oos_text(self): """ Turn the image list into a set of filenames for storage in the oos file """ - return str(self.imgs) + return '\n'.join(self.imgs.get_file_list()) def set_from_oos(self, text): """ get text from the OOS file and setup the internal structure """ log.info("Set from OOS:"+text) - self.imgs=eval(text) + files=text.split('\n') + for f in files: + self.imgs.addRow(f) diff --git a/openlp/plugins/images/listwithpreviews.py b/openlp/plugins/images/listwithpreviews.py new file mode 100644 index 000000000..0d831f04d --- /dev/null +++ b/openlp/plugins/images/listwithpreviews.py @@ -0,0 +1,70 @@ +import os +import logging +from PyQt4.QtCore import * +from PyQt4.QtGui import * +class ListWithPreviews(QAbstractListModel): + """ + An abstract list of strings and the preview icon to go with them + """ + global log + log=logging.getLogger("ListWithPreviews") + log.info("started") + def __init__(self): + QAbstractListModel.__init__(self) + self.items=[] # will be a list of (full filename, QPixmap, shortname) tuples + self.rowheight=50 + self.maximagewidth=self.rowheight*16/9.0; + def rowCount(self, parent): + return len(self.items) + def insertRow(self, row, filename): + self.beginInsertRows(QModelIndex(),row,row) + log.info("insert row %d:%s"%(row,filename)) + # get short filename to display next to image + (prefix, shortfilename) = os.path.split(str(filename)) + log.info("shortfilename=%s"%(shortfilename)) + # create a preview image + preview = QPixmap(str(filename)) + w=self.maximagewidth;h=self.rowheight + preview = preview.scaled(w,h, Qt.KeepAspectRatio) + realw=preview.width(); realh=preview.height() + # and move it to the centre of the preview space + p=QPixmap(w,h) + p.fill(Qt.transparent) + painter=QPainter(p) + painter.drawPixmap((w-realw)/2,(h-realh)/2,preview) + # finally create the row + self.items.insert(row, (filename, p, shortfilename)) + self.endInsertRows() + def removeRow(self, row): + self.beginRemoveRows(QModelIndex(), row,row) + self.items.pop(row) + self.endRemoveRows() + def addRow(self, filename): + self.insertRow(len(self.items), filename) + + def data(self, 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() + + if role==Qt.DisplayRole: + retval= self.items[row][2] + elif role == Qt.DecorationRole: + retval= self.items[row][1] + elif role == Qt.ToolTipRole: + retval= self.items[row][0] + else: + retval= QVariant() + +# log.info("Returning"+ str(retval)) + if type(retval) is not type(QVariant): + return QVariant(retval) + else: + return retval + def get_file_list(self): + filelist=[i[0] for i in self.items]; + return filelist + + def get_filename(self, index): + row=index.row() + return self.items[row][0]