forked from openlp/openlp
Presentation dedupe
This commit is contained in:
parent
9f63c43b5b
commit
b6735065c0
@ -69,7 +69,8 @@ class ImpressController(PresentationController):
|
||||
Initialise the class
|
||||
"""
|
||||
log.debug(u'Initialising')
|
||||
PresentationController.__init__(self, plugin, u'Impress')
|
||||
PresentationController.__init__(self, plugin, u'Impress',
|
||||
ImpressDocument)
|
||||
self.supports = [u'odp']
|
||||
self.alsosupports = [u'ppt', u'pps', u'pptx', u'ppsx']
|
||||
self.process = None
|
||||
@ -183,14 +184,6 @@ class ImpressController(PresentationController):
|
||||
except:
|
||||
log.exception(u'Failed to terminate OpenOffice')
|
||||
|
||||
def add_doc(self, name):
|
||||
"""
|
||||
Called when a new Impress document is opened
|
||||
"""
|
||||
log.debug(u'Add Doc OpenOffice')
|
||||
doc = ImpressDocument(self, name)
|
||||
self.docs.append(doc)
|
||||
return doc
|
||||
|
||||
class ImpressDocument(PresentationDocument):
|
||||
"""
|
||||
|
@ -186,7 +186,7 @@ class PresentationMediaItem(MediaManagerItem):
|
||||
controller_name = self.findControllerByType(filename)
|
||||
if controller_name:
|
||||
controller = self.controllers[controller_name]
|
||||
doc = controller.add_doc(unicode(file))
|
||||
doc = controller.add_document(unicode(file))
|
||||
thumb = os.path.join(doc.get_thumbnail_folder(), u'icon.png')
|
||||
preview = doc.get_thumbnail_path(1, True)
|
||||
if not preview and not initialLoad:
|
||||
@ -226,7 +226,7 @@ class PresentationMediaItem(MediaManagerItem):
|
||||
filepath = unicode(item.data(
|
||||
QtCore.Qt.UserRole).toString())
|
||||
for cidx in self.controllers:
|
||||
doc = self.controllers[cidx].add_doc(filepath)
|
||||
doc = self.controllers[cidx].add_document(filepath)
|
||||
doc.presentation_deleted()
|
||||
doc.close_presentation()
|
||||
for row in row_list:
|
||||
@ -260,7 +260,7 @@ class PresentationMediaItem(MediaManagerItem):
|
||||
return False
|
||||
controller = self.controllers[service_item.shortname]
|
||||
(path, name) = os.path.split(filename)
|
||||
doc = controller.add_doc(filename)
|
||||
doc = controller.add_document(filename)
|
||||
if doc.get_thumbnail_path(1, True) is None:
|
||||
doc.load_presentation()
|
||||
i = 1
|
||||
|
@ -59,7 +59,7 @@ class Controller(object):
|
||||
self.controller = controller
|
||||
if self.doc is not None:
|
||||
self.shutdown()
|
||||
self.doc = self.controller.add_doc(file)
|
||||
self.doc = self.controller.add_document(file)
|
||||
if not self.doc.load_presentation():
|
||||
# Display error message to user
|
||||
# Inform slidecontroller that the action failed?
|
||||
|
@ -53,7 +53,8 @@ class PowerpointController(PresentationController):
|
||||
Initialise the class
|
||||
"""
|
||||
log.debug(u'Initialising')
|
||||
PresentationController.__init__(self, plugin, u'Powerpoint')
|
||||
PresentationController.__init__(self, plugin, u'Powerpoint',
|
||||
PowerpointDocument)
|
||||
self.supports = [u'ppt', u'pps', u'pptx', u'ppsx']
|
||||
self.process = None
|
||||
|
||||
@ -97,14 +98,6 @@ class PowerpointController(PresentationController):
|
||||
pass
|
||||
self.process = None
|
||||
|
||||
def add_doc(self, name):
|
||||
"""
|
||||
Called when a new powerpoint document is opened
|
||||
"""
|
||||
log.debug(u'Add Doc PowerPoint')
|
||||
doc = PowerpointDocument(self, name)
|
||||
self.docs.append(doc)
|
||||
return doc
|
||||
|
||||
class PowerpointDocument(PresentationDocument):
|
||||
"""
|
||||
|
@ -49,7 +49,8 @@ class PptviewController(PresentationController):
|
||||
"""
|
||||
log.debug(u'Initialising')
|
||||
self.process = None
|
||||
PresentationController.__init__(self, plugin, u'Powerpoint Viewer')
|
||||
PresentationController.__init__(self, plugin, u'Powerpoint Viewer',
|
||||
PptviewDocument)
|
||||
self.supports = [u'ppt', u'pps', u'pptx', u'ppsx']
|
||||
|
||||
def check_available(self):
|
||||
@ -93,14 +94,6 @@ class PptviewController(PresentationController):
|
||||
while self.docs:
|
||||
self.docs[0].close_presentation()
|
||||
|
||||
def add_doc(self, name):
|
||||
"""
|
||||
Called when a new powerpoint document is opened
|
||||
"""
|
||||
log.debug(u'Add Doc PPTView')
|
||||
doc = PptviewDocument(self, name)
|
||||
self.docs.append(doc)
|
||||
return doc
|
||||
|
||||
class PptviewDocument(PresentationDocument):
|
||||
"""
|
||||
@ -247,4 +240,4 @@ class PptviewDocument(PresentationDocument):
|
||||
"""
|
||||
Triggers the previous slide on the running presentation
|
||||
"""
|
||||
self.controller.process.PrevStep(self.pptid)
|
||||
self.controller.process.PrevStep(self.pptid)
|
||||
|
@ -35,151 +35,6 @@ from openlp.core.utils import AppLocation
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
class PresentationController(object):
|
||||
"""
|
||||
This class is used to control interactions with presentation applications
|
||||
by creating a runtime environment. This is a base class for presentation
|
||||
controllers to inherit from.
|
||||
|
||||
To create a new controller, take a copy of this file and name it so it ends
|
||||
with ``controller.py``, i.e. ``foobarcontroller.py``. Make sure it inherits
|
||||
:class:`~openlp.plugins.presentations.lib.presentationcontroller.PresentationController`,
|
||||
and then fill in the blanks. If possible try to make sure it loads on all
|
||||
platforms, usually by using :mod:``os.name`` checks, although
|
||||
``__init__``, ``check_available`` and ``presentation_deleted`` should
|
||||
always be implemented.
|
||||
|
||||
See :class:`~openlp.plugins.presentations.lib.impresscontroller.ImpressController`,
|
||||
:class:`~openlp.plugins.presentations.lib.powerpointcontroller.PowerpointController` or
|
||||
:class:`~openlp.plugins.presentations.lib.pptviewcontroller.PptviewController`
|
||||
for examples.
|
||||
|
||||
**Basic Attributes**
|
||||
|
||||
``name``
|
||||
The name that appears in the options and the media manager
|
||||
|
||||
``enabled``
|
||||
The controller is enabled
|
||||
|
||||
``available``
|
||||
The controller is available on this machine. Set by init via
|
||||
call to check_available
|
||||
|
||||
``plugin``
|
||||
The presentationplugin object
|
||||
|
||||
``supports``
|
||||
The primary native file types this application supports
|
||||
|
||||
``alsosupports``
|
||||
Other file types the application can import, although not necessarily
|
||||
the first choice due to potential incompatibilities
|
||||
|
||||
**Hook Functions**
|
||||
|
||||
``kill()``
|
||||
Called at system exit to clean up any running presentations
|
||||
|
||||
``check_available()``
|
||||
Returns True if presentation application is installed/can run on this
|
||||
machine
|
||||
|
||||
``presentation_deleted()``
|
||||
Deletes presentation specific files, e.g. thumbnails
|
||||
|
||||
"""
|
||||
log.info(u'PresentationController loaded')
|
||||
|
||||
def __init__(self, plugin=None, name=u'PresentationController'):
|
||||
"""
|
||||
This is the constructor for the presentationcontroller object. This
|
||||
provides an easy way for descendent plugins to populate common data.
|
||||
This method *must* be overridden, like so::
|
||||
|
||||
class MyPresentationController(PresentationController):
|
||||
def __init__(self, plugin):
|
||||
PresentationController.__init(
|
||||
self, plugin, u'My Presenter App')
|
||||
|
||||
``plugin``
|
||||
Defaults to *None*. The presentationplugin object
|
||||
|
||||
``name``
|
||||
Name of the application, to appear in the application
|
||||
"""
|
||||
self.supports = []
|
||||
self.alsosupports = []
|
||||
self.docs = []
|
||||
self.plugin = plugin
|
||||
self.name = name
|
||||
self.settings_section = self.plugin.settingsSection
|
||||
self.available = self.check_available()
|
||||
self.temp_folder = os.path.join(
|
||||
AppLocation.get_section_data_path(self.settings_section), name)
|
||||
self.thumbnail_folder = os.path.join(
|
||||
AppLocation.get_section_data_path(self.settings_section),
|
||||
u'thumbnails')
|
||||
self.thumbnail_prefix = u'slide'
|
||||
if not os.path.isdir(self.thumbnail_folder):
|
||||
os.makedirs(self.thumbnail_folder)
|
||||
if not os.path.isdir(self.temp_folder):
|
||||
os.makedirs(self.temp_folder)
|
||||
|
||||
def enabled(self):
|
||||
"""
|
||||
Return whether the controller is currently enabled
|
||||
"""
|
||||
if self.available:
|
||||
return QtCore.QSettings().value(
|
||||
self.settings_section + u'/' + self.name,
|
||||
QtCore.QVariant(QtCore.Qt.Checked)).toInt()[0] == \
|
||||
QtCore.Qt.Checked
|
||||
else:
|
||||
return False
|
||||
|
||||
def check_available(self):
|
||||
"""
|
||||
Presentation app is able to run on this machine
|
||||
"""
|
||||
return False
|
||||
|
||||
def start_process(self):
|
||||
"""
|
||||
Loads a running version of the presentation application in the
|
||||
background.
|
||||
"""
|
||||
pass
|
||||
|
||||
def kill(self):
|
||||
"""
|
||||
Called at system exit to clean up any running presentations and
|
||||
close the application
|
||||
"""
|
||||
log.debug(u'Kill')
|
||||
self.close_presentation()
|
||||
|
||||
def add_doc(self, name):
|
||||
"""
|
||||
Called when a new presentation document is opened
|
||||
"""
|
||||
doc = PresentationDocument(self, name)
|
||||
self.docs.append(doc)
|
||||
return doc
|
||||
|
||||
def remove_doc(self, doc=None):
|
||||
"""
|
||||
Called to remove an open document from the collection
|
||||
"""
|
||||
log.debug(u'remove_doc Presentation')
|
||||
if doc is None:
|
||||
return
|
||||
if doc in self.docs:
|
||||
self.docs.remove(doc)
|
||||
|
||||
def close_presentation(self):
|
||||
pass
|
||||
|
||||
class PresentationDocument(object):
|
||||
"""
|
||||
Base class for presentation documents to inherit from.
|
||||
@ -440,4 +295,152 @@ class PresentationDocument(object):
|
||||
``slide_no``
|
||||
The slide the notes are required for, starting at 1
|
||||
"""
|
||||
return ''
|
||||
return ''
|
||||
|
||||
|
||||
class PresentationController(object):
|
||||
"""
|
||||
This class is used to control interactions with presentation applications
|
||||
by creating a runtime environment. This is a base class for presentation
|
||||
controllers to inherit from.
|
||||
|
||||
To create a new controller, take a copy of this file and name it so it ends
|
||||
with ``controller.py``, i.e. ``foobarcontroller.py``. Make sure it inherits
|
||||
:class:`~openlp.plugins.presentations.lib.presentationcontroller.PresentationController`,
|
||||
and then fill in the blanks. If possible try to make sure it loads on all
|
||||
platforms, usually by using :mod:``os.name`` checks, although
|
||||
``__init__``, ``check_available`` and ``presentation_deleted`` should
|
||||
always be implemented.
|
||||
|
||||
See :class:`~openlp.plugins.presentations.lib.impresscontroller.ImpressController`,
|
||||
:class:`~openlp.plugins.presentations.lib.powerpointcontroller.PowerpointController` or
|
||||
:class:`~openlp.plugins.presentations.lib.pptviewcontroller.PptviewController`
|
||||
for examples.
|
||||
|
||||
**Basic Attributes**
|
||||
|
||||
``name``
|
||||
The name that appears in the options and the media manager
|
||||
|
||||
``enabled``
|
||||
The controller is enabled
|
||||
|
||||
``available``
|
||||
The controller is available on this machine. Set by init via
|
||||
call to check_available
|
||||
|
||||
``plugin``
|
||||
The presentationplugin object
|
||||
|
||||
``supports``
|
||||
The primary native file types this application supports
|
||||
|
||||
``alsosupports``
|
||||
Other file types the application can import, although not necessarily
|
||||
the first choice due to potential incompatibilities
|
||||
|
||||
**Hook Functions**
|
||||
|
||||
``kill()``
|
||||
Called at system exit to clean up any running presentations
|
||||
|
||||
``check_available()``
|
||||
Returns True if presentation application is installed/can run on this
|
||||
machine
|
||||
|
||||
``presentation_deleted()``
|
||||
Deletes presentation specific files, e.g. thumbnails
|
||||
|
||||
"""
|
||||
log.info(u'PresentationController loaded')
|
||||
|
||||
def __init__(self, plugin=None, name=u'PresentationController',
|
||||
document_class=PresentationDocument):
|
||||
"""
|
||||
This is the constructor for the presentationcontroller object. This
|
||||
provides an easy way for descendent plugins to populate common data.
|
||||
This method *must* be overridden, like so::
|
||||
|
||||
class MyPresentationController(PresentationController):
|
||||
def __init__(self, plugin):
|
||||
PresentationController.__init(
|
||||
self, plugin, u'My Presenter App')
|
||||
|
||||
``plugin``
|
||||
Defaults to *None*. The presentationplugin object
|
||||
|
||||
``name``
|
||||
Name of the application, to appear in the application
|
||||
"""
|
||||
self.supports = []
|
||||
self.alsosupports = []
|
||||
self.docs = []
|
||||
self.plugin = plugin
|
||||
self.name = name
|
||||
self.document_class = document_class
|
||||
self.settings_section = self.plugin.settingsSection
|
||||
self.available = self.check_available()
|
||||
self.temp_folder = os.path.join(
|
||||
AppLocation.get_section_data_path(self.settings_section), name)
|
||||
self.thumbnail_folder = os.path.join(
|
||||
AppLocation.get_section_data_path(self.settings_section),
|
||||
u'thumbnails')
|
||||
self.thumbnail_prefix = u'slide'
|
||||
if not os.path.isdir(self.thumbnail_folder):
|
||||
os.makedirs(self.thumbnail_folder)
|
||||
if not os.path.isdir(self.temp_folder):
|
||||
os.makedirs(self.temp_folder)
|
||||
|
||||
def enabled(self):
|
||||
"""
|
||||
Return whether the controller is currently enabled
|
||||
"""
|
||||
if self.available:
|
||||
return QtCore.QSettings().value(
|
||||
self.settings_section + u'/' + self.name,
|
||||
QtCore.QVariant(QtCore.Qt.Checked)).toInt()[0] == \
|
||||
QtCore.Qt.Checked
|
||||
else:
|
||||
return False
|
||||
|
||||
def check_available(self):
|
||||
"""
|
||||
Presentation app is able to run on this machine
|
||||
"""
|
||||
return False
|
||||
|
||||
def start_process(self):
|
||||
"""
|
||||
Loads a running version of the presentation application in the
|
||||
background.
|
||||
"""
|
||||
pass
|
||||
|
||||
def kill(self):
|
||||
"""
|
||||
Called at system exit to clean up any running presentations and
|
||||
close the application
|
||||
"""
|
||||
log.debug(u'Kill')
|
||||
self.close_presentation()
|
||||
|
||||
def add_document(self, name):
|
||||
"""
|
||||
Called when a new presentation document is opened
|
||||
"""
|
||||
document = self.document_class(self, name)
|
||||
self.docs.append(document)
|
||||
return document
|
||||
|
||||
def remove_doc(self, doc=None):
|
||||
"""
|
||||
Called to remove an open document from the collection
|
||||
"""
|
||||
log.debug(u'remove_doc Presentation')
|
||||
if doc is None:
|
||||
return
|
||||
if doc in self.docs:
|
||||
self.docs.remove(doc)
|
||||
|
||||
def close_presentation(self):
|
||||
pass
|
||||
|
Loading…
Reference in New Issue
Block a user