forked from openlp/openlp
Fix Presentation plugin so it works.
Correct abuse of the service item title field Add migration code and test to prove it bzr-revno: 2247
This commit is contained in:
commit
9f8a0572bc
@ -58,8 +58,7 @@ class ItemCapabilities(object):
|
||||
Provides an enumeration of a service item's capabilities
|
||||
|
||||
``CanPreview``
|
||||
The capability to allow the ServiceManager to add to the preview
|
||||
tab when making the previous item live.
|
||||
The capability to allow the ServiceManager to add to the preview tab when making the previous item live.
|
||||
|
||||
``CanEdit``
|
||||
The capability to allow the ServiceManager to allow the item to be edited
|
||||
@ -71,8 +70,7 @@ class ItemCapabilities(object):
|
||||
Determines is the service_item needs a Media Player
|
||||
|
||||
``CanLoop``
|
||||
The capability to allow the SlideController to allow the loop
|
||||
processing.
|
||||
The capability to allow the SlideController to allow the loop processing.
|
||||
|
||||
``CanAppend``
|
||||
The capability to allow the ServiceManager to add leaves to the
|
||||
@ -82,22 +80,19 @@ class ItemCapabilities(object):
|
||||
The capability to remove lines breaks in the renderer
|
||||
|
||||
``OnLoadUpdate``
|
||||
The capability to update MediaManager when a service Item is
|
||||
loaded.
|
||||
The capability to update MediaManager when a service Item is loaded.
|
||||
|
||||
``AddIfNewItem``
|
||||
Not Used
|
||||
|
||||
``ProvidesOwnDisplay``
|
||||
The capability to tell the SlideController the service Item has a
|
||||
different display.
|
||||
The capability to tell the SlideController the service Item has a different display.
|
||||
|
||||
``HasDetailedTitleDisplay``
|
||||
ServiceItem provides a title
|
||||
Being Removed and decommissioned.
|
||||
|
||||
``HasVariableStartTime``
|
||||
The capability to tell the ServiceManager that a change to start
|
||||
time is possible.
|
||||
The capability to tell the ServiceManager that a change to start time is possible.
|
||||
|
||||
``CanSoftBreak``
|
||||
The capability to tell the renderer that Soft Break is allowed
|
||||
@ -149,7 +144,7 @@ class ServiceItem(object):
|
||||
if plugin:
|
||||
self.name = plugin.name
|
||||
self.title = u''
|
||||
self.shortname = u''
|
||||
self.processor = None
|
||||
self.audit = u''
|
||||
self.items = []
|
||||
self.iconic_representation = None
|
||||
@ -353,7 +348,8 @@ class ServiceItem(object):
|
||||
u'media_length': self.media_length,
|
||||
u'background_audio': self.background_audio,
|
||||
u'theme_overwritten': self.theme_overwritten,
|
||||
u'will_auto_start': self.will_auto_start
|
||||
u'will_auto_start': self.will_auto_start,
|
||||
u'processor': self.processor
|
||||
}
|
||||
service_data = []
|
||||
if self.service_item_type == ServiceItemType.Text:
|
||||
@ -387,7 +383,6 @@ class ServiceItem(object):
|
||||
self.title = header[u'title']
|
||||
self.name = header[u'name']
|
||||
self.service_item_type = header[u'type']
|
||||
self.shortname = header[u'plugin']
|
||||
self.theme = header[u'theme']
|
||||
self.add_icon(header[u'icon'])
|
||||
self.raw_footer = header[u'footer']
|
||||
@ -406,7 +401,13 @@ class ServiceItem(object):
|
||||
self.auto_play_slides_loop = header.get(u'auto_play_slides_loop', False)
|
||||
self.timed_slide_interval = header.get(u'timed_slide_interval', 0)
|
||||
self.will_auto_start = header.get(u'will_auto_start', False)
|
||||
self.processor = header.get(u'processor', None)
|
||||
self.has_original_files = True
|
||||
#TODO Remove me in 2,3 build phase
|
||||
if self.is_capable(ItemCapabilities.HasDetailedTitleDisplay):
|
||||
self.capabilities.remove(ItemCapabilities.HasDetailedTitleDisplay)
|
||||
self.processor = self.title
|
||||
self.title = None
|
||||
if u'background_audio' in header:
|
||||
self.background_audio = []
|
||||
for filename in header[u'background_audio']:
|
||||
@ -429,6 +430,8 @@ class ServiceItem(object):
|
||||
self.add_from_image(text_image[u'path'], text_image[u'title'], background)
|
||||
elif self.service_item_type == ServiceItemType.Command:
|
||||
for text_image in serviceitem[u'serviceitem'][u'data']:
|
||||
if not self.title:
|
||||
self.title = text_image[u'title']
|
||||
if path:
|
||||
self.has_original_files = False
|
||||
self.add_from_command(path, text_image[u'title'], text_image[u'image'])
|
||||
@ -443,9 +446,7 @@ class ServiceItem(object):
|
||||
if self.is_text():
|
||||
return self.title
|
||||
else:
|
||||
if ItemCapabilities.HasDetailedTitleDisplay in self.capabilities:
|
||||
return self._raw_frames[0][u'title']
|
||||
elif len(self._raw_frames) > 1:
|
||||
if len(self._raw_frames) > 1:
|
||||
return self.title
|
||||
else:
|
||||
return self._raw_frames[0][u'title']
|
||||
|
@ -466,8 +466,8 @@ class MediaController(object):
|
||||
The ServiceItem containing the details to be played.
|
||||
"""
|
||||
used_players = get_media_players()[0]
|
||||
if service_item.title != UiStrings().Automatic:
|
||||
used_players = [service_item.title.lower()]
|
||||
if service_item.processor != UiStrings().Automatic:
|
||||
used_players = [service_item.processor.lower()]
|
||||
if controller.media_info.file_info.isFile():
|
||||
suffix = u'*.%s' % controller.media_info.file_info.suffix().lower()
|
||||
for title in used_players:
|
||||
|
@ -155,7 +155,7 @@ class MediaMediaItem(MediaManagerItem):
|
||||
if os.path.exists(filename):
|
||||
service_item = ServiceItem()
|
||||
service_item.title = u'webkit'
|
||||
service_item.shortname = service_item.title
|
||||
service_item.processor = u'webkit'
|
||||
(path, name) = os.path.split(filename)
|
||||
service_item.add_from_command(path, name,CLAPPERBOARD)
|
||||
if self.media_controller.video(DisplayControllerType.Live, service_item, video_behind_text=True):
|
||||
@ -185,9 +185,9 @@ class MediaMediaItem(MediaManagerItem):
|
||||
translate('MediaPlugin.MediaItem', 'Missing Media File'),
|
||||
translate('MediaPlugin.MediaItem', 'The file %s no longer exists.') % filename)
|
||||
return False
|
||||
service_item.title = self.display_type_combo_box.currentText()
|
||||
service_item.shortname = service_item.title
|
||||
(path, name) = os.path.split(filename)
|
||||
service_item.title = name
|
||||
service_item.processor = self.display_type_combo_box.currentText()
|
||||
service_item.add_from_command(path, name, CLAPPERBOARD)
|
||||
# Only get start and end times if going to a service
|
||||
if context == ServiceItemContext.Service:
|
||||
@ -196,7 +196,6 @@ class MediaMediaItem(MediaManagerItem):
|
||||
return False
|
||||
service_item.add_capability(ItemCapabilities.CanAutoStartForLive)
|
||||
service_item.add_capability(ItemCapabilities.RequiresMedia)
|
||||
service_item.add_capability(ItemCapabilities.HasDetailedTitleDisplay)
|
||||
if Settings().value(self.settings_section + u'/media auto start') == QtCore.Qt.Checked:
|
||||
service_item.will_auto_start = True
|
||||
# force a non-existent theme
|
||||
@ -260,8 +259,7 @@ class MediaMediaItem(MediaManagerItem):
|
||||
Settings().setValue(self.settings_section + u'/media files', self.get_file_list())
|
||||
|
||||
def load_list(self, media, target_group=None):
|
||||
# Sort the media by its filename considering language specific
|
||||
# characters.
|
||||
# Sort the media by its filename considering language specific characters.
|
||||
media.sort(key=lambda filename: get_locale_key(os.path.split(unicode(filename))[1]))
|
||||
for track in media:
|
||||
track_info = QtCore.QFileInfo(track)
|
||||
|
@ -244,22 +244,20 @@ class PresentationMediaItem(MediaManagerItem):
|
||||
items = self.list_view.selectedItems()
|
||||
if len(items) > 1:
|
||||
return False
|
||||
service_item.title = self.display_type_combo_box.currentText()
|
||||
service_item.shortname = self.display_type_combo_box.currentText()
|
||||
service_item.processor = self.display_type_combo_box.currentText()
|
||||
service_item.add_capability(ItemCapabilities.ProvidesOwnDisplay)
|
||||
service_item.add_capability(ItemCapabilities.HasDetailedTitleDisplay)
|
||||
shortname = service_item.shortname
|
||||
if not shortname:
|
||||
if not self.display_type_combo_box.currentText():
|
||||
return False
|
||||
for bitem in items:
|
||||
filename = bitem.data(QtCore.Qt.UserRole)
|
||||
(path, name) = os.path.split(filename)
|
||||
service_item.title = name
|
||||
if os.path.exists(filename):
|
||||
if shortname == self.Automatic:
|
||||
service_item.shortname = self.findControllerByType(filename)
|
||||
if not service_item.shortname:
|
||||
if service_item.processor == self.Automatic:
|
||||
service_item.processor = self.findControllerByType(filename)
|
||||
if not service_item.processor:
|
||||
return False
|
||||
controller = self.controllers[service_item.shortname]
|
||||
(path, name) = os.path.split(filename)
|
||||
controller = self.controllers[service_item.processor]
|
||||
doc = controller.add_document(filename)
|
||||
if doc.get_thumbnail_path(1, True) is None:
|
||||
doc.load_presentation()
|
||||
|
@ -36,6 +36,7 @@ from openlp.core.ui import HideMode
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Controller(object):
|
||||
"""
|
||||
This is the Presentation listener who acts on events from the slide controller and passes the messages on the the
|
||||
@ -314,7 +315,7 @@ class MessageListener(object):
|
||||
item = message[0]
|
||||
hide_mode = message[2]
|
||||
file = item.get_frame_path()
|
||||
self.handler = item.title
|
||||
self.handler = item.processor
|
||||
if self.handler == self.media_item.Automatic:
|
||||
self.handler = self.media_item.findControllerByType(file)
|
||||
if not self.handler:
|
||||
|
@ -38,6 +38,7 @@ from openlp.core.utils import AppLocation
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class PresentationDocument(object):
|
||||
"""
|
||||
Base class for presentation documents to inherit from. Loads and closes the presentation as well as triggering the
|
||||
@ -322,7 +323,7 @@ class PresentationController(object):
|
||||
``supports``
|
||||
The primary native file types this application supports.
|
||||
|
||||
``alsosupports``
|
||||
``also_supports``
|
||||
Other file types the application can import, although not necessarily the first choice due to potential
|
||||
incompatibilities.
|
||||
|
||||
@ -358,7 +359,7 @@ class PresentationController(object):
|
||||
Name of the application, to appear in the application
|
||||
"""
|
||||
self.supports = []
|
||||
self.alsosupports = []
|
||||
self.also_supports = []
|
||||
self.docs = []
|
||||
self.plugin = plugin
|
||||
self.name = name
|
||||
|
@ -49,7 +49,7 @@ __default_settings__ = {
|
||||
u'presentations/Powerpoint': QtCore.Qt.Checked,
|
||||
u'presentations/Powerpoint Viewer': QtCore.Qt.Checked,
|
||||
u'presentations/presentations files': []
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class PresentationPlugin(Plugin):
|
||||
|
@ -210,7 +210,6 @@ class TestServiceItem(TestCase):
|
||||
|
||||
# THEN: We should get back a valid service item
|
||||
assert service_item.is_valid is True, u'The new service item should be valid'
|
||||
print service_item.get_rendered_frame(0)
|
||||
assert service_item.get_rendered_frame(0) == test_file, u'The first frame should match the path to the image'
|
||||
assert service_item.get_frames()[0] == frame_array, u'The return should match frame array1'
|
||||
assert service_item.get_frame_path(0) == test_file, u'The frame path should match the full path to the image'
|
||||
@ -268,6 +267,26 @@ class TestServiceItem(TestCase):
|
||||
assert service_item.is_capable(ItemCapabilities.CanAppend) is True, \
|
||||
u'This service item should be able to have new items added to it'
|
||||
|
||||
def serviceitem_migrate_test_20_22(self):
|
||||
"""
|
||||
Test the Service Item - migrating a media only service item from 2.0 to 2.2 format
|
||||
"""
|
||||
# GIVEN: A new service item and a mocked add icon function
|
||||
service_item = ServiceItem(None)
|
||||
service_item.add_icon = MagicMock()
|
||||
|
||||
# WHEN: adding an media from a saved Service and mocked exists
|
||||
line = self.convert_file_service_item(u'migrate_video_20_22.osd')
|
||||
with patch('os.path.exists'):
|
||||
service_item.set_from_service(line, TEST_PATH)
|
||||
|
||||
# THEN: We should get back a converted service item
|
||||
assert service_item.is_valid is True, u'The new service item should be valid'
|
||||
assert service_item.processor is None, u'The Processor should have been set'
|
||||
assert service_item.title is None, u'The title should be set to a value'
|
||||
assert service_item.is_capable(ItemCapabilities.HasDetailedTitleDisplay) is False, \
|
||||
u'The Capability should have been removed'
|
||||
|
||||
def convert_file_service_item(self, name):
|
||||
service_file = os.path.join(TEST_PATH, name)
|
||||
try:
|
||||
|
98
tests/resources/migrate_video_20_22.osd
Normal file
98
tests/resources/migrate_video_20_22.osd
Normal file
@ -0,0 +1,98 @@
|
||||
(lp1
|
||||
(dp2
|
||||
Vserviceitem
|
||||
p3
|
||||
(dp4
|
||||
Vheader
|
||||
p5
|
||||
(dp6
|
||||
Vxml_version
|
||||
p7
|
||||
NsVauto_play_slides_loop
|
||||
p8
|
||||
I00
|
||||
sVauto_play_slides_once
|
||||
p9
|
||||
I00
|
||||
sVwill_auto_start
|
||||
p10
|
||||
I01
|
||||
sVtitle
|
||||
p11
|
||||
VVLC
|
||||
p12
|
||||
sVcapabilities
|
||||
p13
|
||||
(lp14
|
||||
I12
|
||||
aI16
|
||||
aI4
|
||||
aI11
|
||||
asVtheme
|
||||
p15
|
||||
I-1
|
||||
sVbackground_audio
|
||||
p16
|
||||
(lp17
|
||||
sVicon
|
||||
p18
|
||||
V:/plugins/plugin_media.png
|
||||
p19
|
||||
sVtype
|
||||
p20
|
||||
I3
|
||||
sVstart_time
|
||||
p21
|
||||
I0
|
||||
sVfrom_plugin
|
||||
p22
|
||||
I00
|
||||
sVmedia_length
|
||||
p23
|
||||
I144
|
||||
sVdata
|
||||
p24
|
||||
V
|
||||
sVtimed_slide_interval
|
||||
p25
|
||||
I0
|
||||
sVaudit
|
||||
p26
|
||||
V
|
||||
sVsearch
|
||||
p27
|
||||
V
|
||||
sVname
|
||||
p28
|
||||
Vmedia
|
||||
p29
|
||||
sVfooter
|
||||
p30
|
||||
(lp31
|
||||
sVnotes
|
||||
p32
|
||||
V
|
||||
sVplugin
|
||||
p33
|
||||
g29
|
||||
sVtheme_overwritten
|
||||
p34
|
||||
I00
|
||||
sVend_time
|
||||
p35
|
||||
I0
|
||||
ssg24
|
||||
(lp36
|
||||
(dp37
|
||||
Vpath
|
||||
p38
|
||||
V/home/tim/Videos/puppets
|
||||
p39
|
||||
sVimage
|
||||
p40
|
||||
V:/media/slidecontroller_multimedia.png
|
||||
p41
|
||||
sg11
|
||||
VMVI_3405.MOV
|
||||
p42
|
||||
sassa.
|
Loading…
Reference in New Issue
Block a user