openlp/openlp/plugins/presentations/lib/mediaitem.py

273 lines
12 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
###############################################################################
# OpenLP - Open Source Lyrics Projection #
# --------------------------------------------------------------------------- #
2009-12-31 12:52:01 +00:00
# Copyright (c) 2008-2010 Raoul Snyman #
# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael #
2010-03-21 23:58:01 +00:00
# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin #
# Thompson, Jon Tibble, Carsten Tinggaard #
# --------------------------------------------------------------------------- #
# 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 logging
import os
from PyQt4 import QtCore, QtGui
2009-09-25 00:43:42 +00:00
2010-04-27 16:27:57 +00:00
from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon, \
2010-06-24 15:50:40 +00:00
SettingsManager, translate, check_item_selected
2009-09-05 13:30:09 +00:00
from openlp.plugins.presentations.lib import MessageListener
2009-06-26 16:39:16 +00:00
2010-02-27 15:31:23 +00:00
log = logging.getLogger(__name__)
2009-06-26 16:39:16 +00:00
class PresentationListView(BaseListWithDnD):
2010-07-10 22:21:14 +00:00
"""
Class for the list of Presentations
We have to explicitly create separate classes for each plugin
in order for DnD to the Service manager to work correctly.
"""
2009-06-26 16:39:16 +00:00
def __init__(self, parent=None):
2009-08-11 19:21:52 +00:00
self.PluginName = u'Presentations'
2009-06-26 16:39:16 +00:00
BaseListWithDnD.__init__(self, parent)
class PresentationMediaItem(MediaManagerItem):
"""
2009-08-11 19:21:52 +00:00
This is the Presentation media manager item for Presentation Items.
2010-07-10 22:21:14 +00:00
It can present files using Openoffice and Powerpoint
"""
log.info(u'Presentations Media Item loaded')
2009-08-11 19:21:52 +00:00
def __init__(self, parent, icon, title, controllers):
2010-07-10 22:21:14 +00:00
"""
Constructor. Setup defaults
"""
2009-08-11 19:21:52 +00:00
self.controllers = controllers
2009-10-28 01:36:24 +00:00
self.PluginNameShort = u'Presentation'
2010-07-08 09:14:00 +00:00
self.pluginNameVisible = translate('PresentationPlugin.MediaItem',
'Presentation')
2009-06-27 05:46:05 +00:00
self.IconPath = u'presentations/presentation'
self.Automatic = u''
2009-06-26 16:39:16 +00:00
# this next is a class, not an instance of a class - it will
# be instanced by the base MediaManagerItem
self.ListViewWithDnD_class = PresentationListView
MediaManagerItem.__init__(self, parent, icon, title)
self.message_listener = MessageListener(self)
2010-03-21 23:58:01 +00:00
2009-10-31 16:17:26 +00:00
def retranslateUi(self):
2010-07-10 22:21:14 +00:00
"""
The name of the plugin media displayed in UI
"""
2010-06-21 18:28:36 +00:00
self.OnNewPrompt = translate('PresentationPlugin.MediaItem',
'Select Presentation(s)')
self.Automatic = translate('PresentationPlugin.MediaItem',
'Automatic')
2010-01-29 11:59:13 +00:00
fileType = u''
for controller in self.controllers:
if self.controllers[controller].enabled:
2010-04-27 16:27:57 +00:00
types = self.controllers[controller].supports + \
self.controllers[controller].alsosupports
for type in types:
2010-01-29 11:59:13 +00:00
if fileType.find(type) == -1:
2010-02-09 11:20:19 +00:00
fileType += u'*%s ' % type
self.parent.serviceManager.supportedSuffixes(type)
2010-06-21 18:28:36 +00:00
self.OnNewFileMasks = translate('PresentationPlugin.MediaItem',
'Presentations (%s)' % fileType)
2009-09-26 09:11:39 +00:00
def requiredIcons(self):
2010-07-10 22:21:14 +00:00
"""
Set which icons the media manager tab should show
"""
2009-09-26 09:11:39 +00:00
MediaManagerItem.requiredIcons(self)
self.hasFileIcon = True
self.hasNewIcon = False
self.hasEditIcon = False
def addEndHeaderBar(self):
2010-07-10 22:21:14 +00:00
"""
Display custom media manager items for presentations
"""
2009-06-27 05:46:05 +00:00
self.PresentationWidget = QtGui.QWidget(self)
2009-09-21 17:56:36 +00:00
sizePolicy = QtGui.QSizePolicy(
QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
2009-06-27 05:46:05 +00:00
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
2009-09-21 17:56:36 +00:00
sizePolicy.setHeightForWidth(
self.PresentationWidget.sizePolicy().hasHeightForWidth())
2009-06-27 05:46:05 +00:00
self.PresentationWidget.setSizePolicy(sizePolicy)
self.PresentationWidget.setObjectName(u'PresentationWidget')
self.DisplayLayout = QtGui.QGridLayout(self.PresentationWidget)
self.DisplayLayout.setObjectName(u'DisplayLayout')
self.DisplayTypeComboBox = QtGui.QComboBox(self.PresentationWidget)
self.DisplayTypeComboBox.setObjectName(u'DisplayTypeComboBox')
self.DisplayLayout.addWidget(self.DisplayTypeComboBox, 0, 1, 1, 2)
self.DisplayTypeLabel = QtGui.QLabel(self.PresentationWidget)
self.DisplayTypeLabel.setObjectName(u'SearchTypeLabel')
self.DisplayLayout.addWidget(self.DisplayTypeLabel, 0, 0, 1, 1)
self.DisplayTypeLabel.setText(
translate('PresentationPlugin.MediaItem', 'Present using:'))
2009-06-27 05:46:05 +00:00
# Add the Presentation widget to the page layout
2010-07-07 16:03:30 +00:00
self.pageLayout.addWidget(self.PresentationWidget)
def initialise(self):
2010-07-10 22:21:14 +00:00
"""
Populate the media manager tab
"""
2010-07-07 16:03:30 +00:00
self.listView.setIconSize(QtCore.QSize(88, 50))
2010-04-30 01:31:41 +00:00
list = SettingsManager.load_list(
self.settingsSection, u'presentations')
self.loadList(list, True)
2009-08-11 19:21:52 +00:00
for item in self.controllers:
#load the drop down selection
if self.controllers[item].enabled:
self.DisplayTypeComboBox.addItem(item)
2010-03-05 19:50:51 +00:00
if self.DisplayTypeComboBox.count() > 1:
self.DisplayTypeComboBox.insertItem(0, self.Automatic)
self.DisplayTypeComboBox.setCurrentIndex(0)
def loadList(self, list, initialLoad=False):
2010-07-10 22:21:14 +00:00
"""
Add presentations into the media manager
This is called both on initial load of the plugin to populate with
existing files, and when the user adds new files via the media manager
"""
currlist = self.getFileList()
titles = []
for file in currlist:
titles.append(os.path.split(file)[1])
2009-06-27 15:33:03 +00:00
for file in list:
if currlist.count(file) > 0:
continue
2010-05-27 14:41:47 +00:00
filename = os.path.split(unicode(file))[1]
if titles.count(filename) > 0:
if not initialLoad:
QtGui.QMessageBox.critical(
self, translate('PresentationPlugin.MediaItem',
'File exists'),
translate('PresentationPlugin.MediaItem',
'A presentation with that filename already exists.'),
QtGui.QMessageBox.Ok)
2010-07-10 22:21:14 +00:00
continue
controller_name = self.findControllerByType(filename)
if controller_name:
controller = self.controllers[controller_name]
doc = controller.add_doc(unicode(file))
thumb = os.path.join(doc.get_thumbnail_folder(), u'icon.png')
2010-07-10 22:21:14 +00:00
preview = doc.get_thumbnail_path(1, True)
if not preview and not initialLoad:
doc.load_presentation()
preview = doc.get_thumbnail_path(1, True)
doc.close_presentation()
if preview and self.validate(preview, thumb):
icon = build_icon(thumb)
else:
icon = build_icon(u':/general/general_delete.png')
else:
if initialLoad:
icon = build_icon(u':/general/general_delete.png')
else:
QtGui.QMessageBox.critical(
self, translate('PresentationPlugin.MediaItem',
'Unsupported file'),
translate('PresentationPlugin.MediaItem',
'This type of presentation is not supported'),
QtGui.QMessageBox.Ok)
continue
2010-07-10 22:21:14 +00:00
item_name = QtGui.QListWidgetItem(filename)
item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file))
item_name.setIcon(icon)
2010-07-10 22:33:09 +00:00
self.listView.addItem(item_name)
2009-06-27 15:33:03 +00:00
2009-08-11 19:21:52 +00:00
def onDeleteClick(self):
"""
Remove a presentation item from the list
"""
2010-07-07 16:03:30 +00:00
if check_item_selected(self.listView,
2010-06-24 15:50:40 +00:00
translate('PresentationPlugin.MediaItem',
2010-06-21 18:28:36 +00:00
'You must select an item to delete.')):
2010-07-07 16:03:30 +00:00
items = self.listView.selectedIndexes()
row_list = [item.row() for item in items]
row_list.sort(reverse=True)
for item in items:
filepath = unicode(item.data(
QtCore.Qt.UserRole).toString())
for cidx in self.controllers:
doc = self.controllers[cidx].add_doc(filepath)
doc.presentation_deleted()
doc.close_presentation()
for row in row_list:
2010-07-07 16:03:30 +00:00
self.listView.takeItem(row)
2010-06-28 20:00:35 +00:00
SettingsManager.set_list(self.settingsSection,
self.settingsSection, self.getFileList())
def generateSlideData(self, service_item, item=None):
2010-07-10 22:21:14 +00:00
"""
Load the relevant information for displaying the presentation
in the slidecontroller. In the case of powerpoints, an image
for each slide
"""
2010-07-07 16:03:30 +00:00
items = self.listView.selectedIndexes()
if len(items) > 1:
return False
2009-08-31 18:27:36 +00:00
service_item.title = unicode(self.DisplayTypeComboBox.currentText())
2009-08-11 19:21:52 +00:00
service_item.shortname = unicode(self.DisplayTypeComboBox.currentText())
shortname = service_item.shortname
2010-05-01 13:05:17 +00:00
if shortname:
for item in items:
2010-07-07 16:03:30 +00:00
bitem = self.listView.item(item.row())
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
2010-05-01 13:05:17 +00:00
if shortname == self.Automatic:
service_item.shortname = self.findControllerByType(filename)
if not service_item.shortname:
return False
controller = self.controllers[service_item.shortname]
(path, name) = os.path.split(filename)
doc = controller.add_doc(filename)
2010-07-10 22:21:14 +00:00
if doc.get_thumbnail_path(1, True) is None:
2010-05-01 13:05:17 +00:00
doc.load_presentation()
i = 1
2010-07-10 22:21:14 +00:00
img = doc.get_thumbnail_path(i, True)
2010-05-01 13:05:17 +00:00
while img:
service_item.add_from_command(path, name, img)
i = i + 1
2010-07-10 22:21:14 +00:00
img = doc.get_thumbnail_path(i, True)
2010-05-01 13:05:17 +00:00
doc.close_presentation()
return True
else:
return False
def findControllerByType(self, filename):
2010-07-10 22:21:14 +00:00
"""
Determine the default application controller to use for the selected
file type. This is used if "Automatic" is set as the preferred
controller. Find the first (alphabetic) enabled controller which
"supports" the extension. If none found, then look for a controller
which "alsosupports" it instead.
"""
filetype = os.path.splitext(filename)[1]
if not filetype:
return None
for controller in self.controllers:
if self.controllers[controller].enabled:
if filetype in self.controllers[controller].supports:
return controller
for controller in self.controllers:
if self.controllers[controller].enabled:
if filetype in self.controllers[controller].alsosupports:
return controller
2010-06-21 18:28:36 +00:00
return None