diff --git a/openlp/core/display/html/display.js b/openlp/core/display/html/display.js index 8a204168b..2c5f36a86 100644 --- a/openlp/core/display/html/display.js +++ b/openlp/core/display/html/display.js @@ -226,15 +226,24 @@ AudioPlayer.prototype.play = function () { console.warn("No track currently paused and no track specified, doing nothing."); } }; + +/** + * Pause + */ AudioPlayer.prototype.pause = function () { this._audioElement.pause(); this._state = AudioState.Paused; }; + +/** + * Stop playing + */ AudioPlayer.prototype.stop = function () { this._audioElement.pause(); this._audioElement.src = ""; this._state = AudioState.Stopped; }; + /** * The Display object is what we use from OpenLP */ @@ -250,8 +259,8 @@ var Display = { overview: false, center: false, help: false, - transition: "slide", - backgroundTransition: "fade", + transition: "none", + backgroundTransition: "none", viewDistance: 9999, width: "100%", height: "100%" @@ -321,15 +330,15 @@ var Display = { slides.forEach(function (slide) { Display.addTextSlide(slide.verse, slide.text, false); }); - this.reinit(); + Display.reinit(); + Display.goToSlide(0); }, /** * Set image slides * @param {Object[]} slides - A list of images to add as JS objects [{"file": "url/to/file"}] */ setImageSlides: function (slides) { - var $this = this; - $this.clearSlides(); + Display.clearSlides(); var slidesDiv = $(".slides")[0]; slides.forEach(function (slide, index) { var section = document.createElement("section"); @@ -340,9 +349,9 @@ var Display = { img.setAttribute("style", "height: 100%; width: 100%;"); section.appendChild(img); slidesDiv.appendChild(section); - $this._slides[index.toString()] = index; + Display._slides[index.toString()] = index; }); - this.reinit(); + Display.reinit(); }, /** * Set a video @@ -461,7 +470,12 @@ var Display = { * @param slide The slide number or name, e.g. "v1", 0 */ goToSlide: function (slide) { - Reveal.slide(this._slides[slide]); + if (this._slides.hasOwnProperty(slide)) { + Reveal.slide(this._slides[slide]); + } + else { + Reveal.slide(slide); + } }, /** * Go to the next slide in the list diff --git a/openlp/core/display/html/reveal.js b/openlp/core/display/html/reveal.js index 69aeb391b..099505e2c 100644 --- a/openlp/core/display/html/reveal.js +++ b/openlp/core/display/html/reveal.js @@ -337,10 +337,10 @@ /** * Restarts up the presentation if the client is capable. */ - function reinitialize() { - initialized = false; - initialize(config); - } + function reinitialize() { + initialized = false; + initialize(config); + } /** * Inspect the client to see what it's capable of, this diff --git a/openlp/core/display/window.py b/openlp/core/display/window.py index b33b1ba9c..315e00850 100644 --- a/openlp/core/display/window.py +++ b/openlp/core/display/window.py @@ -182,6 +182,14 @@ class DisplayWindow(QtWidgets.QWidget): QtWidgets.QApplication.instance().processEvents() return self.__script_result + def go_to_slide(self, verse): + """ + Go to a particular slide. + + :param str verse: The verse to go to, e.g. "V1" for songs, or just "0" for other types + """ + self.run_javascript('Display.goToSlide("{verse}");'.format(verse=verse)) + def load_verses(self, verses): """ Set verses in the display diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 7209cdb36..53a476d40 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -24,7 +24,6 @@ The :mod:`serviceitem` provides the service item functionality including the type and capability of an item. """ import datetime -import html import logging import ntpath import os @@ -36,9 +35,9 @@ from openlp.core.common import md5_hash from openlp.core.common.applocation import AppLocation from openlp.core.common.i18n import translate from openlp.core.common.mixins import RegistryProperties -from openlp.core.common.path import Path +from openlp.core.common.path import Path, path_to_str from openlp.core.common.settings import Settings -from openlp.core.display.render import remove_tags, render_tags, render_chords +# from openlp.core.display.render import remove_tags, render_tags, render_chords from openlp.core.lib import ImageSource, build_icon log = logging.getLogger(__name__) @@ -163,6 +162,7 @@ class ServiceItem(RegistryProperties): if plugin: self.name = plugin.name self.title = '' + self.slides = [] self.processor = None self.audit = '' self.items = [] @@ -171,8 +171,8 @@ class ServiceItem(RegistryProperties): self.foot_text = '' self.theme = None self.service_item_type = None - self._raw_frames = [] - self._display_frames = [] + # self._raw_frames = [] + # self._display_frames = [] self.unique_identifier = 0 self.notes = '' self.from_plugin = False @@ -234,91 +234,91 @@ class ServiceItem(RegistryProperties): self.icon = icon self.iconic_representation = build_icon(icon) - def render(self, provides_own_theme_data=False): - """ - The render method is what generates the frames for the screen and obtains the display information from the - renderer. At this point all slides are built for the given display size. + # def render(self, provides_own_theme_data=False): + # """ + # The render method is what generates the frames for the screen and obtains the display information from the + # renderer. At this point all slides are built for the given display size. + # + # :param provides_own_theme_data: This switch disables the usage of the item's theme. However, this is + # disabled by default. If this is used, it has to be taken care, that + # the renderer knows the correct theme data. However, this is needed + # for the theme manager. + # """ + # log.debug('Render called') + # self._display_frames = [] + # self.bg_image_bytes = None + # # if not provides_own_theme_data: + # # self.renderer.set_item_theme(self.theme) + # # self.theme_data, self.main, self.footer = self.renderer.pre_render() + # if self.service_item_type == ServiceItemType.Text: + # can_render_chords = hasattr(self, 'name') and self.name == 'songs' and Settings().value( + # 'songs/enable chords') + # log.debug('Formatting slides: {title}'.format(title=self.title)) + # # Save rendered pages to this dict. In the case that a slide is used twice we can use the pages saved to + # # the dict instead of rendering them again. + # previous_pages = {} + # for slide in self._raw_frames: + # verse_tag = slide['verseTag'] + # if verse_tag in previous_pages and previous_pages[verse_tag][0] == slide['raw_slide']: + # pages = previous_pages[verse_tag][1] + # else: + # # pages = self.renderer.format_slide(slide['raw_slide'], self) + # previous_pages[verse_tag] = (slide['raw_slide'], pages) + # for page in pages: + # page = page.replace('
', '{br}') + # html_data = render_tags(page.rstrip(), can_render_chords) + # new_frame = { + # 'title': remove_tags(page), + # 'text': remove_tags(page.rstrip(), can_render_chords), + # 'chords_text': render_chords(remove_tags(page.rstrip(), False)), + # 'html': html_data.replace(' ', ' '), + # 'printing_html': render_tags(html.escape(page.rstrip()), can_render_chords, is_printing=True), + # 'verseTag': verse_tag, + # } + # self._display_frames.append(new_frame) + # elif self.service_item_type == ServiceItemType.Image or self.service_item_type == ServiceItemType.Command: + # pass + # else: + # log.error('Invalid value renderer: {item}'.format(item=self.service_item_type)) + # self.title = remove_tags(self.title) + # # The footer should never be None, but to be compatible with a few + # # nightly builds between 1.9.4 and 1.9.5, we have to correct this to + # # avoid tracebacks. + # if self.raw_footer is None: + # self.raw_footer = [] + # self.foot_text = '
'.join([_f for _f in self.raw_footer if _f]) - :param provides_own_theme_data: This switch disables the usage of the item's theme. However, this is - disabled by default. If this is used, it has to be taken care, that - the renderer knows the correct theme data. However, this is needed - for the theme manager. - """ - log.debug('Render called') - self._display_frames = [] - self.bg_image_bytes = None - # if not provides_own_theme_data: - # self.renderer.set_item_theme(self.theme) - # self.theme_data, self.main, self.footer = self.renderer.pre_render() - if self.service_item_type == ServiceItemType.Text: - can_render_chords = hasattr(self, 'name') and self.name == 'songs' and Settings().value( - 'songs/enable chords') - log.debug('Formatting slides: {title}'.format(title=self.title)) - # Save rendered pages to this dict. In the case that a slide is used twice we can use the pages saved to - # the dict instead of rendering them again. - previous_pages = {} - for slide in self._raw_frames: - verse_tag = slide['verseTag'] - if verse_tag in previous_pages and previous_pages[verse_tag][0] == slide['raw_slide']: - pages = previous_pages[verse_tag][1] - else: - # pages = self.renderer.format_slide(slide['raw_slide'], self) - previous_pages[verse_tag] = (slide['raw_slide'], pages) - for page in pages: - page = page.replace('
', '{br}') - html_data = render_tags(page.rstrip(), can_render_chords) - new_frame = { - 'title': remove_tags(page), - 'text': remove_tags(page.rstrip(), can_render_chords), - 'chords_text': render_chords(remove_tags(page.rstrip(), False)), - 'html': html_data.replace(' ', ' '), - 'printing_html': render_tags(html.escape(page.rstrip()), can_render_chords, is_printing=True), - 'verseTag': verse_tag, - } - self._display_frames.append(new_frame) - elif self.service_item_type == ServiceItemType.Image or self.service_item_type == ServiceItemType.Command: - pass - else: - log.error('Invalid value renderer: {item}'.format(item=self.service_item_type)) - self.title = remove_tags(self.title) - # The footer should never be None, but to be compatible with a few - # nightly builds between 1.9.4 and 1.9.5, we have to correct this to - # avoid tracebacks. - if self.raw_footer is None: - self.raw_footer = [] - self.foot_text = '
'.join([_f for _f in self.raw_footer if _f]) - - def add_from_image(self, path, title, background=None, thumbnail=None): + def add_from_image(self, filename, title, background=None, thumbnail=None): """ Add an image slide to the service item. - :param path: The directory in which the image file is located. + :param filename: The directory in which the image file is located. :param title: A title for the slide in the service item. - :param background: + :param background: The background colour :param thumbnail: Optional alternative thumbnail, used for remote thumbnails. """ if background: self.image_border = background self.service_item_type = ServiceItemType.Image - if not thumbnail: - self._raw_frames.append({'title': title, 'path': path}) - else: - self._raw_frames.append({'title': title, 'path': path, 'image': thumbnail}) - self.image_manager.add_image(path, ImageSource.ImagePlugin, self.image_border) + slide = {'title': title, 'filename': filename} + if thumbnail: + slide['thumbnail'] = thumbnail + self.slides.append(slide) + # self.image_manager.add_image(path, ImageSource.ImagePlugin, self.image_border) self._new_item() - def add_from_text(self, raw_slide, verse_tag=None): + def add_from_text(self, text, verse_tag=None): """ Add a text slide to the service item. - :param raw_slide: The raw text of the slide. + :param text: The raw text of the slide. :param verse_tag: """ if verse_tag: verse_tag = verse_tag.upper() self.service_item_type = ServiceItemType.Text - title = raw_slide[:30].split('\n')[0] - self._raw_frames.append({'title': title, 'raw_slide': raw_slide, 'verseTag': verse_tag}) + title = text[:30].split('\n')[0] + self.slides.append({'title': title, 'text': text, 'verse': verse_tag}) self._new_item() def add_from_command(self, path, file_name, image, display_title=None, notes=None): @@ -342,8 +342,8 @@ class ServiceItem(RegistryProperties): file_location_hash = md5_hash(file_location.encode('utf-8')) image = os.path.join(str(AppLocation.get_section_data_path(self.name)), 'thumbnails', file_location_hash, ntpath.basename(image)) - self._raw_frames.append({'title': file_name, 'image': image, 'path': path, - 'display_title': display_title, 'notes': notes}) + self.slides.append({'title': file_name, 'image': image, 'path': path, + 'display_title': display_title, 'notes': notes}) if self.is_capable(ItemCapabilities.HasThumbnails): self.image_manager.add_image(image, ImageSource.CommandPlugins, '#000000') self._new_item() @@ -474,10 +474,10 @@ class ServiceItem(RegistryProperties): or self.is_capable(ItemCapabilities.CanEditTitle): return self.title else: - if len(self._raw_frames) > 1: + if len(self.slides) > 1: return self.title else: - return self._raw_frames[0]['title'] + return self.slides[0]['title'] def merge(self, other): """ @@ -665,22 +665,22 @@ class ServiceItem(RegistryProperties): Validates a service item to make sure it is valid """ self.is_valid = True - for frame in self._raw_frames: - if self.is_image() and not os.path.exists(frame['path']): + for slide in self.slides: + if self.is_image() and not os.path.exists(slide['filename']): self.is_valid = False break elif self.is_command(): if self.is_capable(ItemCapabilities.IsOptical): - if not os.path.exists(frame['title']): + if not os.path.exists(slide['title']): self.is_valid = False break else: - file_name = os.path.join(frame['path'], frame['title']) + file_name = os.path.join(slide['path'], slide['title']) if not os.path.exists(file_name): self.is_valid = False break if suffix_list and not self.is_text(): - file_suffix = frame['title'].split('.')[-1] + file_suffix = slide['title'].split('.')[-1] if file_suffix.lower() not in suffix_list: self.is_valid = False break diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 720a33f52..3d88fa071 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -1165,7 +1165,7 @@ class ServiceManager(QtWidgets.QWidget, RegistryBase, Ui_ServiceManager, LogMixi # Repaint the screen self.service_manager_list.clear() self.service_manager_list.clearSelection() - for item_count, item in enumerate(self.service_items): + for item_index, item in enumerate(self.service_items): service_item_from_item = item['service_item'] tree_widget_item = QtWidgets.QTreeWidgetItem(self.service_manager_list) if service_item_from_item.is_valid: @@ -1211,17 +1211,17 @@ class ServiceManager(QtWidgets.QWidget, RegistryBase, Ui_ServiceManager, LogMixi tree_widget_item.setData(0, QtCore.Qt.UserRole, item['order']) tree_widget_item.setSelected(item['selected']) # Add the children to their parent tree_widget_item. - for count, frame in enumerate(service_item_from_item.get_frames()): + for slide_index, slide in enumerate(service_item_from_item.slides): child = QtWidgets.QTreeWidgetItem(tree_widget_item) # prefer to use a display_title if service_item_from_item.is_capable(ItemCapabilities.HasDisplayTitle): - text = frame['display_title'].replace('\n', ' ') + text = slide['display_title'].replace('\n', ' ') else: - text = frame['title'].replace('\n', ' ') + text = slide['title'].replace('\n', ' ') child.setText(0, text[:40]) - child.setData(0, QtCore.Qt.UserRole, count) - if service_item == item_count: - if item['expanded'] and service_item_child == count: + child.setData(0, QtCore.Qt.UserRole, slide_index) + if service_item == item_index: + if item['expanded'] and service_item_child == slide_index: self.service_manager_list.setCurrentItem(child) elif service_item_child == -1: self.service_manager_list.setCurrentItem(tree_widget_item) @@ -1339,7 +1339,7 @@ class ServiceManager(QtWidgets.QWidget, RegistryBase, Ui_ServiceManager, LogMixi self.repaint_service_list(s_item, child) self.live_controller.replace_service_manager_item(item) else: - item.render() + # item.render() # nothing selected for dnd if self.drop_position == -1: if isinstance(item, list): diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index b475a4dff..c0c2bd876 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -23,7 +23,6 @@ The :mod:`slidecontroller` module contains the most important part of OpenLP - the slide controller """ import copy -import os from collections import deque from threading import Lock @@ -135,12 +134,15 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): """ Set up the display """ + if not self.is_live: + return if self.displays: # Delete any existing displays del self.displays[:] - # for screen in self.screens: - # display = DisplayWindow(self, self.screens.current) - # self.displays.append(display) + for screen in self.screens: + if screen.is_display: + display = DisplayWindow(self, screen) + self.displays.append(display) # display.media_watcher.progress.connect(self.on_audio_time_remaining) @property @@ -574,8 +576,7 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): """ Settings dialog has changed the screen size of adjust output and screen previews. """ - # rebuild display as screen size changed - if self.displays: + if self.is_live and self.displays: for display in self.displays: display.resize(self.screens.current.display_geometry.size()) # if self.is_live: @@ -683,7 +684,7 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): if (Settings().value(self.main_window.songs_settings_section + '/display songbar') and not self.song_menu.menu().isEmpty()): self.toolbar.set_widget_visible(['song_menu'], True) - if item.is_capable(ItemCapabilities.CanLoop) and len(item.get_frames()) > 1: + if item.is_capable(ItemCapabilities.CanLoop) and len(item.slides) > 1: self.toolbar.set_widget_visible(LOOP_LIST) if item.is_media(): self.mediabar.show() @@ -737,14 +738,14 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): theme_name = item.theme if item.theme else Registry().get('theme_manager').global_theme self.preview_display.set_theme(Registry().get('theme_manager').get_theme_data(theme_name)) if item.is_text(): - self.preview_display.load_verses([{'verse': f['verseTag'], 'text': f['raw_slide']} - for f in item._raw_frames]) - self.preview_display.show_display() - # slide_no = 0 + self.preview_display.load_verses(item.slides) + elif item.is_image(): + self.preview_display.load_images(item.slides) + slide_no = 0 # if self.song_edit: # slide_no = self.selected_row # self.song_edit = False - # self._process_item(item, slide_no) + self._process_item(item, slide_no) def replace_service_manager_item(self, item): """ @@ -797,6 +798,7 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): old_item = self.service_item # rest to allow the remote pick up verse 1 if large imaged self.selected_row = 0 + self.preview_display.go_to_slide(0) # take a copy not a link to the servicemanager copy. self.service_item = copy.copy(service_item) if self.service_item.is_command(): @@ -811,40 +813,40 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): self.slide_list = {} if self.is_live: self.song_menu.menu().clear() - if self.display.audio_player: - self.display.audio_player.reset() - self.set_audio_items_visibility(False) - self.audio_pause_item.setChecked(False) - # If the current item has background audio - if self.service_item.is_capable(ItemCapabilities.HasBackgroundAudio): - self.log_debug('Starting to play...') - self.display.audio_player.add_to_playlist(self.service_item.background_audio) - self.track_menu.clear() - for counter in range(len(self.service_item.background_audio)): - action = self.track_menu.addAction( - os.path.basename(str(self.service_item.background_audio[counter]))) - action.setData(counter) - action.triggered.connect(self.on_track_triggered) - self.display.audio_player.repeat = \ - Settings().value(self.main_window.general_settings_section + '/audio repeat list') - if Settings().value(self.main_window.general_settings_section + '/audio start paused'): - self.audio_pause_item.setChecked(True) - self.display.audio_player.pause() - else: - self.display.audio_player.play() - self.set_audio_items_visibility(True) + # if self.display.audio_player: + # self.display.audio_player.reset() + # self.set_audio_items_visibility(False) + # self.audio_pause_item.setChecked(False) + # # If the current item has background audio + # if self.service_item.is_capable(ItemCapabilities.HasBackgroundAudio): + # self.log_debug('Starting to play...') + # self.display.audio_player.add_to_playlist(self.service_item.background_audio) + # self.track_menu.clear() + # for counter in range(len(self.service_item.background_audio)): + # action = self.track_menu.addAction( + # os.path.basename(str(self.service_item.background_audio[counter]))) + # action.setData(counter) + # action.triggered.connect(self.on_track_triggered) + # self.display.audio_player.repeat = \ + # Settings().value(self.main_window.general_settings_section + '/audio repeat list') + # if Settings().value(self.main_window.general_settings_section + '/audio start paused'): + # self.audio_pause_item.setChecked(True) + # self.display.audio_player.pause() + # else: + # self.display.audio_player.play() + # self.set_audio_items_visibility(True) row = 0 width = self.main_window.control_splitter.sizes()[self.split] - for frame_number, frame in enumerate(self.service_item.get_frames()): + for slide_index, slide in enumerate(self.service_item.slides): if self.service_item.is_text(): - if frame['verseTag']: + if slide['verse']: # These tags are already translated. - verse_def = frame['verseTag'] + verse_def = slide['verse'] verse_def = '{def1}{def2}'.format(def1=verse_def[0], def2=verse_def[1:]) two_line_def = '{def1}\n{def2}'.format(def1=verse_def[0], def2=verse_def[1:]) row = two_line_def if verse_def not in self.slide_list: - self.slide_list[verse_def] = frame_number + self.slide_list[verse_def] = slide_index if self.is_live: self.song_menu.menu().addAction(verse_def, self.on_song_bar_handler) else: @@ -854,16 +856,16 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): row += 1 self.slide_list[str(row)] = row - 1 # If current slide set background to image - if not self.service_item.is_command() and frame_number == slide_no: + if not self.service_item.is_command() and slide_index == slide_no: self.service_item.bg_image_bytes = \ - self.image_manager.get_image_bytes(frame['path'], ImageSource.ImagePlugin) + self.image_manager.get_image_bytes(slide['filename'], ImageSource.ImagePlugin) self.preview_widget.replace_service_item(self.service_item, width, slide_no) self.enable_tool_bar(self.service_item) # Pass to display for viewing. # Postpone image build, we need to do this later to avoid the theme # flashing on the screen - if not self.service_item.is_image(): - self.display.build_html(self.service_item) + # if not self.service_item.is_image(): + # self.display.build_html(self.service_item) if self.service_item.is_media(): self.on_media_start(self.service_item) self.slide_selected(True) @@ -1098,7 +1100,7 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): if not start: Registry().execute('slidecontroller_live_unblank') row = self.preview_widget.current_slide_number() - old_selected_row = self.selected_row + # old_selected_row = self.selected_row self.selected_row = 0 if -1 < row < self.preview_widget.slide_count(): if self.service_item.is_command(): @@ -1106,20 +1108,26 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): Registry().execute('{text}_slide'.format(text=self.service_item.name.lower()), [self.service_item, self.is_live, row]) else: - to_display = self.service_item.get_rendered_frame(row) + # to_display = self.service_item.get_rendered_frame(row) if self.service_item.is_text(): - self.display.text(to_display, row != old_selected_row) + for display in self.displays: + display.go_to_slide(row) + # self.display.text(to_display, row != old_selected_row) else: if start: - self.display.build_html(self.service_item, to_display) + for display in self.displays: + display.load_images([]) + # self.display.build_html(self.service_item, to_display) else: - self.display.image(to_display) + for display in self.displays: + display.go_to_slide(row) + # self.display.image(to_display) # reset the store used to display first image self.service_item.bg_image_bytes = None self.selected_row = row self.update_preview() self.preview_widget.change_slide(row) - self.display.setFocus() + # TODO: self.display.setFocus() # Release lock self.slide_selected_lock.release() @@ -1137,7 +1145,7 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): """ This updates the preview frame, for example after changing a slide or using *Blank to Theme*. """ - self.log_debug('update_preview {text} '.format(text=self.screens.current['primary'])) + self.log_debug('update_preview {text} '.format(text=self.screens.current)) if self.service_item and self.service_item.is_capable(ItemCapabilities.ProvidesOwnDisplay): if self.is_live: # If live, grab screen-cap of main display now @@ -1155,9 +1163,11 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): self.slide_image.setDevicePixelRatio(self.main_window.devicePixelRatio()) self.slide_preview.setPixmap(self.slide_image) else: - self.slide_image = self.display.preview() - self.slide_image.setDevicePixelRatio(self.main_window.devicePixelRatio()) - self.slide_preview.setPixmap(self.slide_image) + print('Updating preview ... need to figure out what is supposed to happen here') + self.preview_display.go_to_slide(self.selected_row) + # self.slide_image = self.display.preview() + # self.slide_image.setDevicePixelRatio(self.main_window.devicePixelRatio()) + # self.slide_preview.setPixmap(self.slide_image) self.slide_count += 1 def grab_maindisplay(self): diff --git a/openlp/core/widgets/views.py b/openlp/core/widgets/views.py index 5adec3e27..58008aba7 100644 --- a/openlp/core/widgets/views.py +++ b/openlp/core/widgets/views.py @@ -120,8 +120,8 @@ class ListPreviewWidget(QtWidgets.QTableWidget, RegistryProperties): self.auto_row_height = max(self.viewport().height() / (-1 * max_img_row_height), 100) height = min(height, self.auto_row_height) # Apply new height to slides - for frame_number in range(len(self.service_item.get_frames())): - self.setRowHeight(frame_number, height) + for slide_index in range(len(self.service_item.slides)): + self.setRowHeight(slide_index, height) def row_resized(self, row, old_height, new_height): """ @@ -134,7 +134,8 @@ class ListPreviewWidget(QtWidgets.QTableWidget, RegistryProperties): # Get and validate label widget containing slide & adjust max width try: self.cellWidget(row, 0).children()[1].setMaximumWidth(new_height * self.screen_ratio) - except: + except Exception: + # TODO: Figure out what sort of exceptions are thrown return def screen_size_changed(self, screen_ratio): @@ -160,20 +161,20 @@ class ListPreviewWidget(QtWidgets.QTableWidget, RegistryProperties): self.setColumnWidth(0, width) row = 0 text = [] - for frame_number, frame in enumerate(self.service_item.get_frames()): + for slide_index, slide in enumerate(self.service_item.slides): self.setRowCount(self.slide_count() + 1) item = QtWidgets.QTableWidgetItem() slide_height = 0 if self.service_item.is_text(): - if frame['verseTag']: + if slide['verse']: # These tags are already translated. - verse_def = frame['verseTag'] + verse_def = slide['verse'] verse_def = '%s%s' % (verse_def[0], verse_def[1:]) two_line_def = '%s\n%s' % (verse_def[0], verse_def[1:]) row = two_line_def else: row += 1 - item.setText(frame['text']) + item.setText(slide['text']) else: label = QtWidgets.QLabel() label.setContentsMargins(4, 4, 4, 4) @@ -183,12 +184,12 @@ class ListPreviewWidget(QtWidgets.QTableWidget, RegistryProperties): label.setScaledContents(True) if self.service_item.is_command(): if self.service_item.is_capable(ItemCapabilities.HasThumbnails): - image = self.image_manager.get_image(frame['image'], ImageSource.CommandPlugins) + image = self.image_manager.get_image(slide['image'], ImageSource.CommandPlugins) pixmap = QtGui.QPixmap.fromImage(image) else: - pixmap = QtGui.QPixmap(frame['image']) + pixmap = QtGui.QPixmap(slide['image']) else: - image = self.image_manager.get_image(frame['path'], ImageSource.ImagePlugin) + image = self.image_manager.get_image(slide['filename'], ImageSource.ImagePlugin) pixmap = QtGui.QPixmap.fromImage(image) pixmap.setDevicePixelRatio(label.devicePixelRatio()) label.setPixmap(pixmap) @@ -212,15 +213,15 @@ class ListPreviewWidget(QtWidgets.QTableWidget, RegistryProperties): hbox.addStretch(0) container.setLayout(hbox) # Add to table - self.setCellWidget(frame_number, 0, container) + self.setCellWidget(slide_index, 0, container) else: # Add to table - self.setCellWidget(frame_number, 0, label) + self.setCellWidget(slide_index, 0, label) row += 1 text.append(str(row)) - self.setItem(frame_number, 0, item) + self.setItem(slide_index, 0, item) if slide_height: - self.setRowHeight(frame_number, slide_height) + self.setRowHeight(slide_index, slide_height) self.setVerticalHeaderLabels(text) if self.service_item.is_text(): self.resizeRowsToContents()