From d84c99122f16c8af085f43b11fb6b0a4b306b1e2 Mon Sep 17 00:00:00 2001 From: Martin Thompson Date: Mon, 22 Jun 2009 21:44:35 +0100 Subject: [PATCH 1/5] Displayed video+audio+slider Tweaked some unicode strings --- openlp/core/test/test_render.py | 6 +- openlp/plugins/media/video_render.py | 70 +++++++++++++++++++++ openlp/plugins/songs/test/test_song_text.py | 24 +++---- 3 files changed, 85 insertions(+), 15 deletions(-) create mode 100644 openlp/plugins/media/video_render.py diff --git a/openlp/core/test/test_render.py b/openlp/core/test/test_render.py index a2d7249d6..fd94188c5 100644 --- a/openlp/core/test/test_render.py +++ b/openlp/core/test/test_render.py @@ -50,10 +50,10 @@ class TestRender_base: self.app=None def write_to_file(self, pixmap, name): im=pixmap.toImage() - testpathname=os.path.join(u'test_results", name+".bmp') + testpathname=os.path.join(u'test_results', name+'.bmp') if os.path.exists(testpathname): os.unlink(testpathname) - im.save(testpathname, "bmp') + im.save(testpathname, 'bmp') return im # xxx quitting the app still leaves it hanging aroudn so we die # when trying to start another one. Not quitting doesn't help @@ -218,4 +218,4 @@ if __name__=="__main__": t.setup_method(None) t.test_easy() t.test_splits() - t.teardown_method(None) \ No newline at end of file + t.teardown_method(None) diff --git a/openlp/plugins/media/video_render.py b/openlp/plugins/media/video_render.py new file mode 100644 index 000000000..fa3807d5d --- /dev/null +++ b/openlp/plugins/media/video_render.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 +""" +OpenLP - Open Source Lyrics Projection +Copyright (c) 2008 Raoul Snyman +Portions copyright (c) 2008 Martin Thompson, Tim Bentley, + +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 os +from PyQt4 import QtCore, QtGui + +# xxx this needs a try, except once we've decided what to do if it fails +from PyQt4.phonon import Phonon + +# from openlp.core.lib import Plugin, MediaManagerItem, SettingsTab +# from openlp.plugins.media.lib import MediaTab,MediaMediaItem + +"""Renders a video to some surface or other """ + +class w(QtGui.QMainWindow): + def __init__(self, parent=None): + super(QtGui.QMainWindow, self).__init__(parent) + self.resize(640,480) + self.setWindowTitle(u'simple media player') + self.show() + +if __name__==u'__main__': + app = QtGui.QApplication([]) +# widget = QtGui.QWidget() +# widget.resize(320, 240) +# widget.setWindowTitle(u'simple') +# widget.show() +# QCore.QCoreApplication.setApplicationName(u'OpenLP') + mainwindow=w() + widget=QtGui.QWidget(mainwindow) + mainwindow.setCentralWidget(widget) + widget.setLayout(QtGui.QVBoxLayout(widget)) +# videofile=u'r-128.rm' + videofile=u'/extra_space/Download/coa360download56Kbps240x160.mpg' + source=Phonon.MediaSource(videofile) + + media=Phonon.MediaObject(widget) + media.setCurrentSource(source) + + video=Phonon.VideoWidget(widget) + audio=Phonon.AudioOutput(Phonon.MusicCategory) +# controller=Phonon.MediaController(media) + Phonon.createPath(media, video); + Phonon.createPath(media, audio); +# player=Phonon.VideoPlayer(Phonon.VideoCategory, widget) + slider=Phonon.SeekSlider(media, mainwindow) + widget.layout().addWidget(slider) + widget.layout().addWidget(video) + slider.show() + + video.show() + media.play() + app.exec_() + diff --git a/openlp/plugins/songs/test/test_song_text.py b/openlp/plugins/songs/test/test_song_text.py index d52dc0a08..852626592 100644 --- a/openlp/plugins/songs/test/test_song_text.py +++ b/openlp/plugins/songs/test/test_song_text.py @@ -24,7 +24,7 @@ __ThisDir__ = os.path.dirname(__file__) if "" == __ThisDir__ : __ThisDir__ = os.path.abspath(u'.') -sys.path.append(os.path.abspath(u'%s/../../../.."%__ThisDir__)) +sys.path.append(os.path.abspath(u'%s/../../../..'%__ThisDir__)) from openlp.plugins.songs.lib.songxml import * @@ -35,26 +35,26 @@ class Test_Text(object): """OpenSong: parse CCLI example""" global __ThisDir__ s = Song() - s.from_ccli_text_file(u'%s/data_text/CCLI example.txt"%(__ThisDir__)) - assert(s.get_title() == "Song Title Here') - assert(s.get_author_list(True) == "Author, artist name') - assert(s.get_copyright() == "1996 Publisher Info') - assert(s.get_song_cclino() == "1234567') + s.from_ccli_text_file(u'%s/data_text/CCLI example.txt'%(__ThisDir__)) + assert(s.get_title() == 'Song Title Here') + assert(s.get_author_list(True) == 'Author, artist name') + assert(s.get_copyright() == '1996 Publisher Info') + assert(s.get_song_cclino() == '1234567') assert(s.get_number_of_slides() == 4) def test_file2(self): """OpenSong: parse PåEnFjern (danish)""" global __ThisDir__ s = Song() - s.from_ccli_text_file(u'%s/data_text/PåEnFjern.txt"%(__ThisDir__)) - assert(s.get_title() == "På en fjern ensom høj') - assert(s.get_author_list(True) == "Georg Bennard') - assert(s.get_copyright() == "') - assert(s.get_song_cclino() == "') + s.from_ccli_text_file(u'%s/data_text/PåEnFjern.txt'%(__ThisDir__)) + assert(s.get_title() == 'På en fjern ensom høj') + assert(s.get_author_list(True) == 'Georg Bennard') + assert(s.get_copyright() == '') + assert(s.get_song_cclino() == '') assert(s.get_number_of_slides() == 8) if '__main__' == __name__: # for local debugging r = Test_Text() r.test_file1() - r.test_file2() \ No newline at end of file + r.test_file2() From d2a0b296eef3b5f88140c4e4acc4eb792a1f554a Mon Sep 17 00:00:00 2001 From: Martin Thompson Date: Tue, 23 Jun 2009 21:53:06 +0100 Subject: [PATCH 2/5] Refactored media manager --- openlp/core/lib/__init__.py | 5 +- openlp/core/lib/mediamanageritem.py | 160 +++++++++++++++++- openlp/plugins/images/lib/__init__.py | 1 + openlp/plugins/images/lib/listwithpreviews.py | 34 ++-- openlp/plugins/images/lib/mediaitem.py | 136 +-------------- 5 files changed, 188 insertions(+), 148 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index d08dd56d5..42771249a 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -74,5 +74,8 @@ from songxmlhandler import SongXMLParser from themexmlhandler import ThemeXML from renderer import Renderer from rendermanager import RenderManager +from mediamanageritem import MediaManagerItem, ImageList -__all__ = [ 'translate', 'file_to_xml', 'str_to_bool', 'contextMenuAction', 'contextMenuSeparator'] +__all__ = [ 'translate', 'file_to_xml', 'str_to_bool', + 'contextMenuAction', 'contextMenuSeparator', + 'MediaManagerItem', 'ServiceItem'] diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index b8217e899..b496b1c9e 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -21,6 +21,31 @@ import types from PyQt4 import QtCore, QtGui from openlp.core.lib.toolbar import * +from openlp.core.lib import translate + +# xxx this should be in core.lib probably +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 MediaManagerItem(QtGui.QWidget): """ @@ -49,15 +74,9 @@ class MediaManagerItem(QtGui.QWidget): self.retranslateUi() self.initialise() - def setupUi(self): - pass - def retranslateUi(self): pass - def initialise(self): - pass - def addToolbar(self): """ A method to help developers easily add a toolbar to the media manager @@ -106,3 +125,132 @@ class MediaManagerItem(QtGui.QWidget): QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), slot) return action +#################################################################################################### + ### None of the following *need* to be used, feel free to override + ### them cmopletely in your plugin's implementation. Alternatively, call them from your + ### plugin before or after you've done etra things that you need to. + ### in order for them to work, you need to have setup + # self.translation_context + # self.plugin_text_short # eg "Image" for the image plugin + # self.config_section - where the items in the media manager are stored + # this could potentially be self.plugin_text_short.lower() + + # The assumption is that given that at least two plugins are of the form + # "text with an icon" then all this will help + # even for plugins of another sort, the setup of the right-click menu, common toolbar + # will help to keep things consistent and ease the creation of new plugins + + # also a set of completely consistent action anesm then exist + # (onPreviewClick() is always called that, rather than having the + # name of the plugin added in as well... I regard that as a + # feature, I guess others might differ!) + + def setupUi(self): + # Add a toolbar + self.addToolbar() + # Create buttons for the toolbar + ## New Song Button ## + self.addToolbarButton( + translate(self.translation_context, u'Load '+self.plugin_text_short), + translate(self.translation_context, u'Load item into openlp.org'), + u':/images/image_load.png', self.onNewClick, u'ImageNewItem') + ## Delete Song Button ## + self.addToolbarButton( + translate(self.translation_context, u'Delete '+self.plugin_text_short), + translate(self.translation_context, u'Delete the selected item'), + u':/images/image_delete.png', self.onDeleteClick, u'DeleteItem') + ## Separator Line ## + self.addToolbarSeparator() + ## Preview Button ## + self.addToolbarButton( + translate(self.translation_context, u'Preview '+self.plugin_text_short), + translate(self.translation_context, u'Preview the selected item'), + u':/system/system_preview.png', self.onPreviewClick, u'PreviewItem') + ## Live Button ## + self.addToolbarButton( + translate(self.translation_context, u'Go Live'), + translate(self.translation_context, u'Send the selected item live'), + u':/system/system_live.png', self.onLiveClick, u'LiveItem') + ## Add Button ## + self.addToolbarButton( + translate(self.translation_context, u'Add '+self.plugin_text_short+u' To Service'), + translate(self.translation_context, u'Add the selected item(s) to the service'), + u':/system/system_add.png', self.onAddClick, self.plugin_text_short+u'AddItem') + #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.ExtendedSelection) + self.ImageListView.setAlternatingRowColors(True) + self.ImageListView.setDragEnabled(True) + self.ImageListView.setObjectName(self.plugin_text_short+u'ListView') + self.PageLayout.addWidget(self.ImageListView) + #define and add the context menu + self.ImageListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) + self.ImageListView.addAction(self.contextMenuAction( + self.ImageListView, ':/system/system_preview.png', + translate(self.translation_context, u'&Preview '+self.plugin_text_short), + self.onPreviewClick)) + self.ImageListView.addAction(self.contextMenuAction( + self.ImageListView, ':/system/system_live.png', + translate(self.translation_context, u'&Show Live'), + self.onLiveClick)) + self.ImageListView.addAction(self.contextMenuAction( + self.ImageListView, ':/system/system_add.png', + translate(self.translation_context, u'&Add to Service'), + self.onAddClick)) + QtCore.QObject.connect(self.ImageListView, + QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onPreviewClick) + + def initialise(self): + self.loadList(self.parent.config.load_list(self.config_section)) + + def onNewClick(self): + files = QtGui.QFileDialog.getOpenFileNames(None, + translate(self.translation_context, self.on_new_prompt), + self.parent.config.get_last_dir(), + self.on_new_file_masks) + log.info(u'New files(s)', unicode(files)) + if len(files) > 0: + self.loadList(files) + dir, filename = os.path.split(unicode(files[0])) + self.parent.config.set_last_dir(dir) + self.parent.config.set_list(self.config_section, self.ImageListData.getFileList()) + + def loadList(self, list): + for file in list: + self.ImageListData.addRow(file) + + def onDeleteClick(self): + indexes = self.ImageListView.selectedIndexes() + for index in indexes: + current_row = int(index.row()) + self.ImageListData.removeRow(current_row) + self.parent.config.set_list(self.config_section, self.ImageListData.getFileList()) + + def generateSlideData(self): + assert (0, 'This fn needs to be defined by the plugin'); + + def onPreviewClick(self): + log.debug(self.plugin_text_short+u'Preview Requested') + service_item = ServiceItem(self.parent) + service_item.addIcon(u':/media/media_image.png') + self.generateSlideData(service_item) + self.parent.preview_controller.addServiceItem(service_item) + + def onLiveClick(self): + log.debug(self.plugin_text_short+u' Live Requested') + service_item = ServiceItem(self.parent) + service_item.addIcon(u':/media/media_image.png') + self.generateSlideData(service_item) + self.parent.live_controller.addServiceItem(service_item) + + def onAddClick(self): + log.debug(self.plugin_text_short+u' Add Requested') + service_item = ServiceItem(self.parent) + service_item.addIcon(u':/media/media_image.png') + self.generateSlideData(service_item) + self.parent.service_manager.addServiceItem(service_item) diff --git a/openlp/plugins/images/lib/__init__.py b/openlp/plugins/images/lib/__init__.py index 8c128d7ef..01919ca34 100644 --- a/openlp/plugins/images/lib/__init__.py +++ b/openlp/plugins/images/lib/__init__.py @@ -17,5 +17,6 @@ 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 """ + from listwithpreviews import ListWithPreviews from mediaitem import ImageMediaItem diff --git a/openlp/plugins/images/lib/listwithpreviews.py b/openlp/plugins/images/lib/listwithpreviews.py index 248903c53..dce892c31 100644 --- a/openlp/plugins/images/lib/listwithpreviews.py +++ b/openlp/plugins/images/lib/listwithpreviews.py @@ -29,24 +29,18 @@ class ListWithPreviews(QtCore.QAbstractListModel): log = logging.getLogger(u'ListWithPreviews') log.info(u'started') - def __init__(self): + def __init__(self, new_preview_function=None): QtCore.QAbstractListModel.__init__(self) # will be a list of (full filename, QPixmap, shortname) tuples self.items = [] 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(QtCore.QModelIndex(), row, row) - #log.info(u'insert row %d:%s' % (row,filename)) - # get short filename to display next to image - filename = unicode(filename) - (prefix, shortfilename) = os.path.split(filename) - #log.info(u'shortfilename=%s' % (shortfilename)) - # create a preview image + if new_preview_function is not None: + self.make_preview=new_preview_function + else: + self.make_preview=self.preview_function + + def preview_function(self, filename): if os.path.exists(filename): preview = QtGui.QImage(filename) w = self.maximagewidth; @@ -64,6 +58,20 @@ class ListWithPreviews(QtCore.QAbstractListModel): h = self.rowheight p = QtGui.QImage(w, h, QtGui.QImage.Format_ARGB32_Premultiplied) p.fill(QtCore.Qt.transparent) + return p + + def rowCount(self, parent): + return len(self.items) + + def insertRow(self, row, filename): + self.beginInsertRows(QtCore.QModelIndex(), row, row) + #log.info(u'insert row %d:%s' % (row,filename)) + # get short filename to display next to image + filename = unicode(filename) + (prefix, shortfilename) = os.path.split(filename) + #log.info(u'shortfilename=%s' % (shortfilename)) + # create a preview image + p=self.make_preview(filename) # finally create the row self.items.insert(row, (filename, p, shortfilename)) self.endInsertRows() diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 9d6507b80..90524575f 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -22,29 +22,9 @@ import os from PyQt4 import QtCore, QtGui -from openlp.core.lib import MediaManagerItem, ServiceItem, translate -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() +# from openlp.plugins.images.lib import ListWithPreviews +from listwithpreviews import ListWithPreviews +from openlp.core.lib import MediaManagerItem, ServiceItem, translate class ImageMediaItem(MediaManagerItem): """ @@ -55,93 +35,13 @@ class ImageMediaItem(MediaManagerItem): log.info(u'Image Media Item loaded') def __init__(self, parent, icon, title): + self.translation_context = u'ImagePlugin' + self.plugin_text_short =u'Image' + self.config_section=u'images' + self.on_new_prompt=u'Select Image(s)' + self.on_new_file_masks=u'Images (*.jpg *jpeg *.gif *.png *.bmp)' MediaManagerItem.__init__(self, parent, icon, title) - def setupUi(self): - # Add a toolbar - self.addToolbar() - # Create buttons for the toolbar - ## New Song Button ## - self.addToolbarButton( - translate(u'ImageMediaItem', u'Load Image'), - translate(u'ImageMediaItem', u'Load images into openlp.org'), - u':/images/image_load.png', self.onImagesNewClick, u'ImageNewItem') - ## Delete Song Button ## - self.addToolbarButton( - translate(u'ImageMediaItem', u'Delete Image'), - translate(u'ImageMediaItem', u'Delete the selected image'), - u':/images/image_delete.png', self.onImageDeleteClick, u'ImageDeleteItem') - ## Separator Line ## - self.addToolbarSeparator() - ## Preview Song Button ## - self.addToolbarButton( - translate(u'ImageMediaItem', u'Preview Song'), - translate(u'ImageMediaItem', u'Preview the selected image'), - u':/system/system_preview.png', self.onImagePreviewClick, u'ImagePreviewItem') - ## Live Song Button ## - self.addToolbarButton( - translate(u'ImageMediaItem', u'Go Live'), - translate(u'ImageMediaItem', u'Send the selected image live'), - u':/system/system_live.png', self.onImageLiveClick, u'ImageLiveItem') - ## Add Song Button ## - self.addToolbarButton( - translate(u'ImageMediaItem', u'Add Image To Service'), - translate(u'ImageMediaItem', u'Add the selected image(s) to the service'), - u':/system/system_add.png', self.onImageAddClick, u'ImageAddItem') - #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.ExtendedSelection) - self.ImageListView.setAlternatingRowColors(True) - self.ImageListView.setDragEnabled(True) - self.ImageListView.setObjectName(u'ImageListView') - self.PageLayout.addWidget(self.ImageListView) - #define and add the context menu - self.ImageListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) - self.ImageListView.addAction(self.contextMenuAction( - self.ImageListView, ':/system/system_preview.png', - translate(u'ImageMediaItem', u'&Preview Image'), - self.onImagePreviewClick)) - self.ImageListView.addAction(self.contextMenuAction( - self.ImageListView, ':/system/system_live.png', - translate(u'ImageMediaItem', u'&Show Live'), - self.onImageLiveClick)) - self.ImageListView.addAction(self.contextMenuAction( - self.ImageListView, ':/system/system_add.png', - translate(u'ImageMediaItem', u'&Add to Service'), - self.onImageAddClick)) - QtCore.QObject.connect(self.ImageListView, - QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onImagePreviewClick) - - def initialise(self): - self.loadImageList(self.parent.config.load_list(u'images')) - - def onImagesNewClick(self): - files = QtGui.QFileDialog.getOpenFileNames(None, - translate(u'ImageMediaItem', u'Select Image(s)'), - self.parent.config.get_last_dir(), - u'Images (*.jpg *jpeg *.gif *.png *.bmp)') - log.info(u'New image(s)', unicode(files)) - if len(files) > 0: - self.loadImageList(files) - dir, filename = os.path.split(unicode(files[0])) - self.parent.config.set_last_dir(dir) - self.parent.config.set_list(u'images', self.ImageListData.getFileList()) - - def loadImageList(self, list): - for image in list: - self.ImageListData.addRow(image) - - def onImageDeleteClick(self): - indexes = self.ImageListView.selectedIndexes() - for index in indexes: - current_row = int(index.row()) - self.ImageListData.removeRow(current_row) - self.parent.config.set_list(u'images', self.ImageListData.getFileList()) def generateSlideData(self, service_item): indexes = self.ImageListView.selectedIndexes() @@ -152,23 +52,3 @@ class ImageMediaItem(MediaManagerItem): (path, name) = os.path.split(filename) service_item.add_from_image(path, name, frame) - def onImagePreviewClick(self): - log.debug(u'Image Preview Requested') - service_item = ServiceItem(self.parent) - service_item.addIcon(u':/media/media_image.png') - self.generateSlideData(service_item) - self.parent.preview_controller.addServiceItem(service_item) - - def onImageLiveClick(self): - log.debug(u'Image Live Requested') - service_item = ServiceItem(self.parent) - service_item.addIcon(u':/media/media_image.png') - self.generateSlideData(service_item) - self.parent.live_controller.addServiceItem(service_item) - - def onImageAddClick(self): - log.debug(u'Image Add Requested') - service_item = ServiceItem(self.parent) - service_item.addIcon(u':/media/media_image.png') - self.generateSlideData(service_item) - self.parent.service_manager.addServiceItem(service_item) From b700d143a573632e817a9a34e0e4835cdf66a5ef Mon Sep 17 00:00:00 2001 From: Martin Thompson Date: Tue, 23 Jun 2009 21:59:38 +0100 Subject: [PATCH 3/5] Seems to be working as before --- openlp/core/lib/__init__.py | 8 ++-- openlp/core/lib/imagelist.py | 47 +++++++++++++++++++ .../images => core}/lib/listwithpreviews.py | 0 openlp/core/lib/mediamanageritem.py | 32 +++---------- 4 files changed, 59 insertions(+), 28 deletions(-) create mode 100644 openlp/core/lib/imagelist.py rename openlp/{plugins/images => core}/lib/listwithpreviews.py (100%) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 42771249a..96991a40e 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -74,8 +74,10 @@ from songxmlhandler import SongXMLParser from themexmlhandler import ThemeXML from renderer import Renderer from rendermanager import RenderManager -from mediamanageritem import MediaManagerItem, ImageList +from mediamanageritem import MediaManagerItem +from imagelist import ImageList +from listwithpreviews import ListWithPreviews __all__ = [ 'translate', 'file_to_xml', 'str_to_bool', - 'contextMenuAction', 'contextMenuSeparator', - 'MediaManagerItem', 'ServiceItem'] + 'contextMenuAction', 'contextMenuSeparator','ServiceItem' +] diff --git a/openlp/core/lib/imagelist.py b/openlp/core/lib/imagelist.py new file mode 100644 index 000000000..5ddd98d55 --- /dev/null +++ b/openlp/core/lib/imagelist.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 +""" +OpenLP - Open Source Lyrics Projection +Copyright (c) 2008-2009 Raoul Snyman +Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley + +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 types + +from PyQt4 import QtCore, QtGui +from openlp.core.lib.toolbar import * +from openlp.core.lib import translate + +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() + + diff --git a/openlp/plugins/images/lib/listwithpreviews.py b/openlp/core/lib/listwithpreviews.py similarity index 100% rename from openlp/plugins/images/lib/listwithpreviews.py rename to openlp/core/lib/listwithpreviews.py diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index b496b1c9e..31a73b740 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -22,35 +22,17 @@ import types from PyQt4 import QtCore, QtGui from openlp.core.lib.toolbar import * from openlp.core.lib import translate - -# xxx this should be in core.lib probably -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() - - +from imagelist import ImageList +from listwithpreviews import ListWithPreviews +from serviceitem import ServiceItem class MediaManagerItem(QtGui.QWidget): """ MediaManagerItem is a helper widget for plugins. """ + global log + log = logging.getLogger(u'MediaManagerItem') + log.info(u'Media Item loaded') + def __init__(self, parent=None, icon=None, title=None): """ Constructor to create the media manager item. From 830da7a1bfdbeb968233c1638a69badfee6e5aab Mon Sep 17 00:00:00 2001 From: Martin Thompson Date: Wed, 24 Jun 2009 20:36:33 +0100 Subject: [PATCH 4/5] Added some more comments --- openlp/core/lib/mediamanageritem.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 31a73b740..7dfb10b4f 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -116,6 +116,10 @@ class MediaManagerItem(QtGui.QWidget): # self.plugin_text_short # eg "Image" for the image plugin # self.config_section - where the items in the media manager are stored # this could potentially be self.plugin_text_short.lower() + # + # self.on_new_prompt=u'Select Image(s)' + # self.on_new_file_masks=u'Images (*.jpg *jpeg *.gif *.png *.bmp)' + # assumes that the new action is to load a file. If not, override onnew # The assumption is that given that at least two plugins are of the form # "text with an icon" then all this will help From 322d19265a441a35469494fa0f48eff18ffd1c09 Mon Sep 17 00:00:00 2001 From: Martin Thompson Date: Thu, 25 Jun 2009 21:01:02 +0100 Subject: [PATCH 5/5] Tweaked a couple of = signs --- openlp/core/lib/baselistwithdnd.py | 2 +- openlp/plugins/images/lib/mediaitem.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/openlp/core/lib/baselistwithdnd.py b/openlp/core/lib/baselistwithdnd.py index 533e17bfc..21312dbdb 100644 --- a/openlp/core/lib/baselistwithdnd.py +++ b/openlp/core/lib/baselistwithdnd.py @@ -25,7 +25,7 @@ from openlp.core.lib import translate class BaseListWithDnD(QtGui.QListView): - def __init__(self,parent=None): + def __init__(self,parent = None): QtGui.QListView.__init__(self,parent) assert (self.PluginName) # this must be set by the class which is inheriting def mouseMoveEvent(self, event): diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index ed6f3bd1a..a8898526b 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -43,13 +43,13 @@ class ImageMediaItem(MediaManagerItem): def __init__(self, parent, icon, title): self.TranslationContext = u'ImagePlugin' - self.PluginTextShort =u'Image' - self.ConfigSection=u'images' - self.OnNewPrompt=u'Select Image(s)' - self.OnNewFileMasks=u'Images (*.jpg *jpeg *.gif *.png *.bmp)' + self.PluginTextShort = u'Image' + self.ConfigSection = u'images' + self.OnNewPrompt = u'Select Image(s)' + self.OnNewFileMasks = u'Images (*.jpg *jpeg *.gif *.png *.bmp)' # this next is a class, not an instance of a class - it will # be instanced by the base MediaManagerItem - self.ListViewWithDnD_class=ImageListView + self.ListViewWithDnD_class = ImageListView MediaManagerItem.__init__(self, parent, icon, title)