From cb3ef2f7c855cb40cec900a98cbfd8e59e9161d3 Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Thu, 21 Apr 2016 22:09:42 +0200 Subject: [PATCH 01/16] Make it possible for presentations to wrap or go to next item, like native openlp-items. Fixes bug 1165855. Fixes: https://launchpad.net/bugs/1165855 --- openlp/core/common/registry.py | 2 +- openlp/core/ui/slidecontroller.py | 13 +++++++++++-- .../presentations/lib/impresscontroller.py | 3 +++ .../presentations/lib/messagelistener.py | 19 ++++++++++--------- .../presentations/lib/powerpointcontroller.py | 5 ++++- .../presentations/lib/pptviewcontroller.py | 5 ++++- .../lib/pptviewlib/pptviewlib.cpp | 6 ++++-- .../presentations/lib/pptviewlib/pptviewlib.h | 2 +- .../lib/presentationcontroller.py | 2 +- 9 files changed, 39 insertions(+), 18 deletions(-) diff --git a/openlp/core/common/registry.py b/openlp/core/common/registry.py index adf495a36..005f284ad 100644 --- a/openlp/core/common/registry.py +++ b/openlp/core/common/registry.py @@ -135,7 +135,7 @@ class Registry(object): for function in self.functions_list[event]: try: result = function(*args, **kwargs) - if result: + if result is not None: results.append(result) except TypeError: # Who has called me can help in debugging diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 96ce82868..6e198dd30 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -1170,8 +1170,17 @@ class SlideController(DisplayController, RegistryProperties): if not self.service_item: return if self.service_item.is_command(): - Registry().execute('%s_next' % self.service_item.name.lower(), [self.service_item, self.is_live]) - if self.is_live: + past_end = Registry().execute('%s_next' % self.service_item.name.lower(), [self.service_item, self.is_live]) + # Check if we have gone past the end of the last slide + if self.is_live and past_end and past_end[0]: + if wrap is None: + if self.slide_limits == SlideLimits.Wrap: + self.on_slide_selected_index([0]) + elif self.is_live and self.slide_limits == SlideLimits.Next: + self.service_next() + elif wrap: + self.on_slide_selected_index([0]) + else: self.update_preview() else: row = self.preview_widget.current_slide_number() + 1 diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 29af3a375..5442ad6e3 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -416,11 +416,14 @@ class ImpressDocument(PresentationDocument): """ Triggers the next effect of slide on the running presentation. """ + past_end = False is_paused = self.control.isPaused() self.control.gotoNextEffect() time.sleep(0.1) if not is_paused and self.control.isPaused(): self.control.gotoPreviousEffect() + past_end = True + return past_end def previous_step(self): """ diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index cc5a6f05e..ee25c2efc 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -168,24 +168,25 @@ class Controller(object): """ log.debug('Live = %s, next' % self.is_live) if not self.doc: - return + return False if not self.is_live: - return + return False if self.hide_mode: if not self.doc.is_active(): - return + return False if self.doc.slidenumber < self.doc.get_slide_count(): self.doc.slidenumber += 1 self.poll() - return + return False if not self.activate(): - return + return False # The "End of slideshow" screen is after the last slide. Note, we can't just stop on the last slide, since it # may contain animations that need to be stepped through. if self.doc.slidenumber > self.doc.get_slide_count(): - return - self.doc.next_step() + return True + ret = self.doc.next_step() self.poll() + return ret def previous(self): """ @@ -418,9 +419,9 @@ class MessageListener(object): """ is_live = message[1] if is_live: - self.live_handler.next() + return self.live_handler.next() else: - self.preview_handler.next() + return self.preview_handler.next() def previous(self, message): """ diff --git a/openlp/plugins/presentations/lib/powerpointcontroller.py b/openlp/plugins/presentations/lib/powerpointcontroller.py index 6cc6a8450..3b20207a3 100644 --- a/openlp/plugins/presentations/lib/powerpointcontroller.py +++ b/openlp/plugins/presentations/lib/powerpointcontroller.py @@ -433,6 +433,7 @@ class PowerpointDocument(PresentationDocument): Triggers the next effect of slide on the running presentation. """ log.debug('next_step') + past_end = False try: self.presentation.SlideShowWindow.Activate() self.presentation.SlideShowWindow.View.Next() @@ -441,16 +442,18 @@ class PowerpointDocument(PresentationDocument): log.exception(e) trace_error_handler(log) self.show_error_msg() - return + return past_end if self.get_slide_number() > self.get_slide_count(): log.debug('past end, stepping back to previous') self.previous_step() + past_end = True # Stop powerpoint from flashing in the taskbar if self.presentation_hwnd: win32gui.FlashWindowEx(self.presentation_hwnd, win32con.FLASHW_STOP, 0, 0) # Make sure powerpoint doesn't steal focus, unless we're on a single screen setup if len(ScreenList().screen_list) > 1: Registry().get('main_window').activateWindow() + return past_end def previous_step(self): """ diff --git a/openlp/plugins/presentations/lib/pptviewcontroller.py b/openlp/plugins/presentations/lib/pptviewcontroller.py index c5e1b351f..9fbb23cc7 100644 --- a/openlp/plugins/presentations/lib/pptviewcontroller.py +++ b/openlp/plugins/presentations/lib/pptviewcontroller.py @@ -302,7 +302,10 @@ class PptviewDocument(PresentationDocument): """ Triggers the next effect of slide on the running presentation. """ - self.controller.process.NextStep(self.ppt_id) + if self.controller.process.NextStep(self.ppt_id) == 0: + return False + else: + return True def previous_step(self): """ diff --git a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp index 22b46f760..ee1dac08c 100644 --- a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp +++ b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp @@ -518,16 +518,18 @@ DllExport int GetCurrentSlide(int id) } // Take a step forwards through the show -DllExport void NextStep(int id) +DllExport int NextStep(int id) { DEBUG(L"NextStep:%d (%d)\n", id, pptView[id].currentSlide); - if (pptView[id].currentSlide > pptView[id].slideCount) return; + // Return 1 to signal that the slideshow has gone past the end + if (pptView[id].currentSlide > pptView[id].slideCount) return 1; if (pptView[id].currentSlide < pptView[id].slideCount) { pptView[id].guess = pptView[id].currentSlide + 1; } PostMessage(pptView[id].hWnd2, WM_MOUSEWHEEL, MAKEWPARAM(0, -WHEEL_DELTA), 0); + return 0; } // Take a step backwards through the show diff --git a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h index e54c95537..66df0e0b1 100644 --- a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h +++ b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h @@ -30,7 +30,7 @@ DllExport BOOL CheckInstalled(); DllExport void ClosePPT(int id); DllExport int GetCurrentSlide(int id); DllExport int GetSlideCount(int id); -DllExport void NextStep(int id); +DllExport int NextStep(int id); DllExport void PrevStep(int id); DllExport void GotoSlide(int id, int slide_no); DllExport void RestartShow(int id); diff --git a/openlp/plugins/presentations/lib/presentationcontroller.py b/openlp/plugins/presentations/lib/presentationcontroller.py index abc71f867..0b62ee485 100644 --- a/openlp/plugins/presentations/lib/presentationcontroller.py +++ b/openlp/plugins/presentations/lib/presentationcontroller.py @@ -232,7 +232,7 @@ class PresentationDocument(object): Triggers the next effect of slide on the running presentation. This might be the next animation on the current slide, or the next slide """ - pass + return False def previous_step(self): """ From 89a68f9e6bf3808578490c2233d42fec0e1f77b0 Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Tue, 10 Oct 2017 21:29:03 +0200 Subject: [PATCH 02/16] Fixed a typo and added a SlideShowListener for event handling. --- .../presentations/lib/impresscontroller.py | 110 ++++++++++++++++++ .../presentations/lib/messagelistener.py | 2 +- 2 files changed, 111 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index d89c6c8f1..0e57f9577 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -51,8 +51,10 @@ if is_win(): else: try: import uno + import unohelper from com.sun.star.beans import PropertyValue from com.sun.star.task import ErrorCodeIOException + from com.sun.star.presentation import XSlideShowListener uno_available = True except ImportError: @@ -210,6 +212,8 @@ class ImpressDocument(PresentationDocument): self.document = None self.presentation = None self.control = None + self.slide_ended = False + self.slide_ended_reverse = False def load_presentation(self): """ @@ -381,6 +385,8 @@ class ImpressDocument(PresentationDocument): sleep_count += 1 self.control = self.presentation.getController() window.setVisible(False) + listener = SlideShowListener(self) + self.control.getSlideShow().addSlideShowListener(listener) else: self.control.activate() self.goto_slide(1) @@ -412,10 +418,19 @@ class ImpressDocument(PresentationDocument): """ Triggers the next effect of slide on the running presentation. """ + # if we are at the presentations end don't go further, just return True + if self.slide_ended and self.get_slide_count() == self.get_slide_number(): + print('detected presentation end!') + return True + self.slide_ended = False + self.slide_ended_reverse = False past_end = False is_paused = self.control.isPaused() + print('going to next effect') self.control.gotoNextEffect() time.sleep(0.1) + # If for some reason the presentation end was not detected above, this will catch it. + # The presentation is set to paused when going past the end. if not is_paused and self.control.isPaused(): self.control.gotoPreviousEffect() past_end = True @@ -425,6 +440,8 @@ class ImpressDocument(PresentationDocument): """ Triggers the previous slide on the running presentation. """ + self.slide_ended = False + self.slide_ended_reverse = False self.control.gotoPreviousEffect() def get_slide_text(self, slide_no): @@ -482,3 +499,96 @@ class ImpressDocument(PresentationDocument): note = ' ' notes.append(note) self.save_titles_and_notes(titles, notes) + + +class SlideShowListener(unohelper.Base, XSlideShowListener): + """ + Listener interface to receive global slide show events. + """ + + def __init__(self, document): + """ + + :param control: SlideShowController + """ + self.document = document + + def paused(self): + """ + Notify that the slide show is paused + """ + log.debug('LibreOffice SlideShowListener event: paused') + + def resumed(self): + """ + Notify that the slide show is resumed from a paused state + """ + log.debug('LibreOffice SlideShowListener event: resumed') + + def slideTransitionStarted(self): + """ + Notify that a new slide starts to become visible. + """ + log.debug('LibreOffice SlideShowListener event: slideTransitionStarted') + + def slideTransitionEnded(self): + """ + Notify that the slide transtion of the current slide ended. + """ + log.debug('LibreOffice SlideShowListener event: slideTransitionEnded') + + def slideAnimationsEnded(self): + """ + Notify that the last animation from the main sequence of the current slide has ended. + """ + log.debug('LibreOffice SlideShowListener event: slideAnimationsEnded') + #if not Registry().get('main_window').isActiveWindow(): + # log.debug('main window is not in focus - should update slidecontroller') + # Registry().execute('slidecontroller_live_change', self.document.control.getCurrentSlideIndex() + 1) + + def slideEnded(self, reverse): + """ + Notify that the current slide has ended, e.g. the user has clicked on the slide. Calling displaySlide() + twice will not issue this event. + """ + print('LibreOffice SlideShowListener event: slideEnded %d' % reverse) + if reverse: + self.document.slide_ended = False + self.document.slide_ended_reverse = True + else: + self.document.slide_ended = True + self.document.slide_ended_reverse = False + + def hyperLinkClicked(self, hyperLink): + """ + Notifies that a hyperlink has been clicked. + """ + log.debug('LibreOffice SlideShowListener event: hyperLinkClicked %s' % hyperLink) + + def disposing(self, source): + """ + gets called when the broadcaster is about to be disposed. + :param source: + """ + log.debug('LibreOffice SlideShowListener event: disposing') + + def beginEvent(self, node): + """ + This event is raised when the element local timeline begins to play. + :param node: + """ + log.debug('LibreOffice SlideShowListener event: beginEvent') + + def endEvent(self, node): + """ + This event is raised at the active end of the element. + :param node: + """ + log.debug('LibreOffice SlideShowListener event: endEvent') + + def repeat(self, node): + """ + This event is raised when the element local timeline repeats. + :param node: + """ + log.debug('LibreOffice SlideShowListener event: repeat') diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index fe00c65e0..ef4a0bdc0 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -191,7 +191,7 @@ class Controller(object): """ Based on the handler passed at startup triggers the previous slide event. """ - log.debug('Live = {live}, previous'.formta(live=self.is_live)) + log.debug('Live = {live}, previous'.format(live=self.is_live)) if not self.doc: return if not self.is_live: From 9cac014cefc69a495b94ee5f3813b3633a51f5cf Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Tue, 10 Oct 2017 22:12:56 +0200 Subject: [PATCH 03/16] Improving past-end. --- openlp/plugins/presentations/lib/impresscontroller.py | 4 +--- openlp/plugins/presentations/lib/messagelistener.py | 5 ----- openlp/plugins/presentations/lib/powerpointcontroller.py | 5 +++++ 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index cb1d7ec0e..64561fbec 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -421,13 +421,11 @@ class ImpressDocument(PresentationDocument): """ # if we are at the presentations end don't go further, just return True if self.slide_ended and self.get_slide_count() == self.get_slide_number(): - print('detected presentation end!') return True self.slide_ended = False self.slide_ended_reverse = False past_end = False is_paused = self.control.isPaused() - print('going to next effect') self.control.gotoNextEffect() time.sleep(0.1) # If for some reason the presentation end was not detected above, this will catch it. @@ -552,7 +550,7 @@ class SlideShowListener(unohelper.Base, XSlideShowListener): Notify that the current slide has ended, e.g. the user has clicked on the slide. Calling displaySlide() twice will not issue this event. """ - print('LibreOffice SlideShowListener event: slideEnded %d' % reverse) + log.debug('LibreOffice SlideShowListener event: slideEnded %d' % reverse) if reverse: self.document.slide_ended = False self.document.slide_ended_reverse = True diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index 53674f84b..bb09b5592 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -180,10 +180,6 @@ class Controller(object): return False if not self.activate(): return False - # The "End of slideshow" screen is after the last slide. Note, we can't just stop on the last slide, since it - # may contain animations that need to be stepped through. - if self.doc.slidenumber > self.doc.get_slide_count(): - return True ret = self.doc.next_step() self.poll() return ret @@ -424,7 +420,6 @@ class MessageListener(object): is_live = message[1] if is_live: ret = self.live_handler.next() - self.live_handler.next() if Settings().value('core/click live slide to unblank'): Registry().execute('slidecontroller_live_unblank') return ret diff --git a/openlp/plugins/presentations/lib/powerpointcontroller.py b/openlp/plugins/presentations/lib/powerpointcontroller.py index b01c90700..fb3d8b2cb 100644 --- a/openlp/plugins/presentations/lib/powerpointcontroller.py +++ b/openlp/plugins/presentations/lib/powerpointcontroller.py @@ -427,6 +427,10 @@ class PowerpointDocument(PresentationDocument): Triggers the next effect of slide on the running presentation. """ log.debug('next_step') + # if we are at the presentations end don't go further, just return True + if self.presentation.SlideShowWindow.View.GetClickCount() == self.presentation.SlideShowWindow.View.GetClickIndex()\ + and self.get_slide_number() == self.get_slide_count(): + return True past_end = False try: self.presentation.SlideShowWindow.Activate() @@ -436,6 +440,7 @@ class PowerpointDocument(PresentationDocument): trace_error_handler(log) self.show_error_msg() return past_end + # If for some reason the presentation end was not detected above, this will catch it. if self.get_slide_number() > self.get_slide_count(): log.debug('past end, stepping back to previous') self.previous_step() From b819e79a7052ae1f5d3d4244a587fa3aa4ad5d00 Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Sun, 4 Feb 2018 21:47:24 +0100 Subject: [PATCH 04/16] Added extra error check --- openlp/plugins/presentations/lib/impresscontroller.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index ee54d6337..2c78b2b28 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -242,6 +242,9 @@ class ImpressDocument(PresentationDocument): except: log.warning('Failed to load presentation {url}'.format(url=url)) return False + if self.document is None: + log.warning('Presentation {url} could not be loaded'.format(url=url)) + return False self.presentation = self.document.getPresentation() self.presentation.Display = ScreenList().current['number'] + 1 self.control = None From aa982492e45ab72da279e43fb7589e319968fcae Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Fri, 15 Feb 2019 20:33:43 +0100 Subject: [PATCH 05/16] Implement going to the previous serviceitem. --- openlp/core/ui/slidecontroller.py | 17 +++++++++++++---- .../presentations/lib/impresscontroller.py | 19 ++++++++++++++++++- .../presentations/lib/messagelistener.py | 9 ++++++--- .../presentations/lib/powerpointcontroller.py | 4 ++++ .../lib/presentationcontroller.py | 6 ++++-- 5 files changed, 45 insertions(+), 10 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 79a34b33e..2f3ebb6d8 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -1174,7 +1174,8 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): if not self.service_item: return if self.service_item.is_command(): - past_end = Registry().execute('%s_next' % self.service_item.name.lower(), [self.service_item, self.is_live]) + past_end = Registry().execute('{text}_next'.format(text=self.service_item.name.lower()), + [self.service_item, self.is_live]) # Check if we have gone past the end of the last slide if self.is_live and past_end and past_end[0]: if wrap is None: @@ -1211,9 +1212,17 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): if not self.service_item: return if self.service_item.is_command(): - Registry().execute('{text}_previous'.format(text=self.service_item.name.lower()), - [self.service_item, self.is_live]) - if self.is_live: + before_start = Registry().execute('{text}_previous'.format(text=self.service_item.name.lower()), + [self.service_item, self.is_live]) + # Check id we have tried to go before that start slide + if self.is_live and before_start and before_start[0]: + print('detected before start!') + if self.slide_limits == SlideLimits.Wrap: + self.on_slide_selected_index([self.preview_widget.slide_count() - 1]) + elif self.is_live and self.slide_limits == SlideLimits.Next: + self.keypress_queue.append(ServiceItemAction.PreviousLastSlide) + self._process_queue() + elif self.is_live: self.update_preview() else: row = self.preview_widget.current_slide_number() - 1 diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index dac8122d8..b868023c4 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -46,6 +46,18 @@ from openlp.plugins.presentations.lib.presentationcontroller import Presentation if is_win(): from win32com.client import Dispatch import pywintypes + uno_available = False + try: + service_manager = Dispatch('com.sun.star.ServiceManager') + service_manager._FlagAsMethod('Bridge_GetStruct') + XSlideShowListenerObj = service_manager.Bridge_GetStruct('com.sun.star.presentation.XSlideShowListener') + + class SlideShowListenerImport(XSlideShowListenerObj.__class__): + pass + except (AttributeError, pywintypes.com_error): + class SlideShowListenerImport(object): + pass + # Declare an empty exception to match the exception imported from UNO class ErrorCodeIOException(Exception): @@ -58,6 +70,9 @@ else: from com.sun.star.task import ErrorCodeIOException from com.sun.star.presentation import XSlideShowListener + class SlideShowListenerImport(unohelper.Base, XSlideShowListener): + pass + uno_available = True except ImportError: uno_available = False @@ -504,8 +519,10 @@ class ImpressDocument(PresentationDocument): notes.append(note) self.save_titles_and_notes(titles, notes) + if is_win(): + property_object = self.controller.manager.Bridge_GetStruct('com.sun.star.beans.PropertyValue') -class SlideShowListener(unohelper.Base, XSlideShowListener): +class SlideShowListener(SlideShowListenerImport): """ Listener interface to receive global slide show events. """ diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index c816142af..358eeea76 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -203,8 +203,10 @@ class Controller(object): return if not self.activate(): return - self.doc.previous_step() + ret = self.doc.previous_step() self.poll() + print('previous returning: %d' % ret) + return ret def shutdown(self): """ @@ -435,11 +437,12 @@ class MessageListener(object): """ is_live = message[1] if is_live: - self.live_handler.previous() + ret = self.live_handler.previous() if Settings().value('core/click live slide to unblank'): Registry().execute('slidecontroller_live_unblank') + return ret else: - self.preview_handler.previous() + return self.preview_handler.previous() def shutdown(self, message): """ diff --git a/openlp/plugins/presentations/lib/powerpointcontroller.py b/openlp/plugins/presentations/lib/powerpointcontroller.py index a3a0360b8..034991b33 100644 --- a/openlp/plugins/presentations/lib/powerpointcontroller.py +++ b/openlp/plugins/presentations/lib/powerpointcontroller.py @@ -468,12 +468,16 @@ class PowerpointDocument(PresentationDocument): Triggers the previous slide on the running presentation. """ log.debug('previous_step') + # if we are at the presentations start we can't go further back, just return True + if self.presentation.SlideShowWindow.View.GetClickIndex() == 0 and self.get_slide_number() == 1: + return True try: self.presentation.SlideShowWindow.View.Previous() except (AttributeError, pywintypes.com_error): log.exception('Caught exception while in previous_step') trace_error_handler(log) self.show_error_msg() + return False def get_slide_text(self, slide_no): """ diff --git a/openlp/plugins/presentations/lib/presentationcontroller.py b/openlp/plugins/presentations/lib/presentationcontroller.py index 196813631..a52c1c2e7 100644 --- a/openlp/plugins/presentations/lib/presentationcontroller.py +++ b/openlp/plugins/presentations/lib/presentationcontroller.py @@ -246,15 +246,17 @@ class PresentationDocument(object): def next_step(self): """ Triggers the next effect of slide on the running presentation. This might be the next animation on the current - slide, or the next slide + slide, or the next slide. + Returns True if we stepped beyond the slides of the presentation """ return False def previous_step(self): """ Triggers the previous slide on the running presentation + Returns True if we stepped beyond the slides of the presentation """ - pass + return False def convert_thumbnail(self, image_path, index): """ From 4e739a3ed9b5c409cbc2790b874319bc68ff1988 Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Wed, 27 Mar 2019 21:29:19 +0100 Subject: [PATCH 06/16] Disable the presentation console --- openlp/plugins/presentations/lib/powerpointcontroller.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openlp/plugins/presentations/lib/powerpointcontroller.py b/openlp/plugins/presentations/lib/powerpointcontroller.py index 034991b33..6d610c2b9 100644 --- a/openlp/plugins/presentations/lib/powerpointcontroller.py +++ b/openlp/plugins/presentations/lib/powerpointcontroller.py @@ -318,6 +318,9 @@ class PowerpointDocument(PresentationDocument): size = ScreenList().current.display_geometry ppt_window = None try: + # Disable the presentation console + self.presentation.SlideShowSettings.ShowPresenterView = 0 + # Start the presentation ppt_window = self.presentation.SlideShowSettings.Run() except (AttributeError, pywintypes.com_error): log.exception('Caught exception while in start_presentation') From 52bdb8db02a3641fb4af5b537d9b4e0e2df89ad1 Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Tue, 2 Apr 2019 22:22:05 +0200 Subject: [PATCH 07/16] Added support for disabling Impress Presentation Screen. Fixes bug 1798651 Fixes: https://launchpad.net/bugs/1798651 --- .../presentations/lib/impresscontroller.py | 80 ++++++++++++++----- 1 file changed, 58 insertions(+), 22 deletions(-) diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index c1ea3d407..458643bcb 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -36,7 +36,7 @@ import time from PyQt5 import QtCore -from openlp.core.common import delete_file, get_uno_command, get_uno_instance, is_win +from openlp.core.common import delete_file, get_uno_command, get_uno_instance, is_win, trace_error_handler from openlp.core.common.registry import Registry from openlp.core.display.screens import ScreenList from openlp.plugins.presentations.lib.presentationcontroller import PresentationController, PresentationDocument, \ @@ -55,7 +55,7 @@ if is_win(): class SlideShowListenerImport(XSlideShowListenerObj.__class__): pass except (AttributeError, pywintypes.com_error): - class SlideShowListenerImport(object): + class SlideShowListenerImport(): pass # Declare an empty exception to match the exception imported from UNO @@ -97,6 +97,8 @@ class ImpressController(PresentationController): self.process = None self.desktop = None self.manager = None + self.conf_provider = None + self.presenter_screen_disabled_by_openlp = False def check_available(self): """ @@ -105,8 +107,7 @@ class ImpressController(PresentationController): log.debug('check_available') if is_win(): return self.get_com_servicemanager() is not None - else: - return uno_available + return uno_available def start_process(self): """ @@ -146,6 +147,7 @@ class ImpressController(PresentationController): self.manager = uno_instance.ServiceManager log.debug('get UNO Desktop Openoffice - createInstanceWithContext - Desktop') desktop = self.manager.createInstanceWithContext("com.sun.star.frame.Desktop", uno_instance) + self.toggle_presentation_screen(False) return desktop except Exception: log.warning('Failed to get UNO desktop') @@ -163,6 +165,7 @@ class ImpressController(PresentationController): desktop = self.manager.createInstance('com.sun.star.frame.Desktop') except (AttributeError, pywintypes.com_error): log.warning('Failure to find desktop - Impress may have closed') + self.toggle_presentation_screen(False) return desktop if desktop else None def get_com_servicemanager(self): @@ -181,6 +184,8 @@ class ImpressController(PresentationController): Called at system exit to clean up any running presentations. """ log.debug('Kill OpenOffice') + if self.presenter_screen_disabled_by_openlp: + self._toggle_presentation_screen(True) while self.docs: self.docs[0].close_presentation() desktop = None @@ -210,6 +215,51 @@ class ImpressController(PresentationController): except Exception: log.warning('Failed to terminate OpenOffice') + def toggle_presentation_screen(self, target_value): + """ + Enable or disable the Presentation Screen/Console + """ + # Create Instance of ConfigurationProvider + if not self.conf_provider: + if is_win(): + self.conf_provider = self.manager.createInstance("com.sun.star.configuration.ConfigurationProvider") + else: + self.conf_provider = self.manager.createInstanceWithContext("com.sun.star.configuration.ConfigurationProvider", uno.getComponentContext()) + # Setup lookup properties to get Impress settings + properties = [] + properties.append(self.create_property('nodepath', 'org.openoffice.Office.Impress')) + properties = tuple(properties) + try: + # Get an updateable configuration view + impress_conf_props = self.conf_provider.createInstanceWithArguments('com.sun.star.configuration.ConfigurationUpdateAccess', properties) + # Get the specific setting for presentation screen + presenter_screen_enabled = impress_conf_props.getHierarchicalPropertyValue('Misc/Start/EnablePresenterScreen') + # If the presentation screen is enabled we disable it + if presenter_screen_enabled != target_value: + impress_conf_props.setHierarchicalPropertyValue('Misc/Start/EnablePresenterScreen', target_value) + impress_conf_props.commitChanges() + # if target_value is False this is an attempt to disable the Presenter Screen + # so we make a note that it has been disabled, so it can be enabled again on close. + if target_value == False: + self.presenter_screen_disabled_by_openlp = True + except Exception as e: + log.exception(e) + trace_error_handler(log) + return + + def create_property(self, name, value): + """ + Create an OOo style property object which are passed into some Uno methods. + """ + log.debug('create property OpenOffice') + if is_win(): + property_object = self.manager.Bridge_GetStruct('com.sun.star.beans.PropertyValue') + else: + property_object = PropertyValue() + property_object.Name = name + property_object.Value = value + return property_object + class ImpressDocument(PresentationDocument): """ @@ -250,7 +300,7 @@ class ImpressDocument(PresentationDocument): return False self.desktop = desktop properties = [] - properties.append(self.create_property('Hidden', True)) + properties.append(self.controller.create_property('Hidden', True)) properties = tuple(properties) try: self.document = desktop.loadComponentFromURL(url, '_blank', 0, properties) @@ -277,7 +327,7 @@ class ImpressDocument(PresentationDocument): temp_folder_path = self.get_temp_folder() thumb_dir_url = temp_folder_path.as_uri() properties = [] - properties.append(self.create_property('FilterName', 'impress_png_Export')) + properties.append(self.controller.create_property('FilterName', 'impress_png_Export')) properties = tuple(properties) doc = self.document pages = doc.getDrawPages() @@ -299,19 +349,6 @@ class ImpressDocument(PresentationDocument): except Exception: log.exception('{path} - Unable to store openoffice preview'.format(path=path)) - def create_property(self, name, value): - """ - Create an OOo style property object which are passed into some Uno methods. - """ - log.debug('create property OpenOffice') - if is_win(): - property_object = self.controller.manager.Bridge_GetStruct('com.sun.star.beans.PropertyValue') - else: - property_object = PropertyValue() - property_object.Name = name - property_object.Value = value - return property_object - def close_presentation(self): """ Close presentation and clean up objects. Triggered by new object being added to SlideController or OpenLP being @@ -376,8 +413,7 @@ class ImpressDocument(PresentationDocument): log.debug('is blank OpenOffice') if self.control and self.control.isRunning(): return self.control.isPaused() - else: - return False + return False def stop_presentation(self): """ @@ -513,7 +549,7 @@ class ImpressDocument(PresentationDocument): titles.append(self.__get_text_from_page(slide_no, TextType.Title).replace('\r\n', ' ') .replace('\n', ' ').strip()) note = self.__get_text_from_page(slide_no, TextType.Notes) - if len(note) == 0: + if not note: note = ' ' notes.append(note) self.save_titles_and_notes(titles, notes) From 89ecdf2a965ec29a3cce5729465cfae9b9c27cc8 Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Mon, 20 May 2019 22:35:48 +0200 Subject: [PATCH 08/16] try to make impress support going before start --- openlp/plugins/presentations/lib/impresscontroller.py | 4 ++++ openlp/plugins/presentations/lib/messagelistener.py | 10 +++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 03a69493d..081a06478 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -493,9 +493,13 @@ class ImpressDocument(PresentationDocument): """ Triggers the previous slide on the running presentation. """ + # if we are at the presentations start don't go further back, just return True + if self.slide_ended_reverse and self.get_slide_number() == 1: + return True self.slide_ended = False self.slide_ended_reverse = False self.control.gotoPreviousEffect() + return False def get_slide_text(self, slide_no): """ diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index 82f7559e5..0cea6949b 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -191,18 +191,18 @@ class Controller(object): """ log.debug('Live = {live}, previous'.format(live=self.is_live)) if not self.doc: - return + return False if not self.is_live: - return + return False if self.hide_mode: if not self.doc.is_active(): - return + return False if self.doc.slidenumber > 1: self.doc.slidenumber -= 1 self.poll() - return + return False if not self.activate(): - return + return False ret = self.doc.previous_step() self.poll() print('previous returning: %d' % ret) From 3d8d573389af510d17f67202edb008ef71836edf Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Tue, 21 May 2019 22:07:25 +0200 Subject: [PATCH 09/16] Always make sure the powerpoint slide index map is created --- openlp/core/ui/servicemanager.py | 6 ++++++ openlp/plugins/presentations/lib/powerpointcontroller.py | 9 ++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index b18f2f9d8..18b5b6f04 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -975,8 +975,10 @@ class ServiceManager(QtWidgets.QWidget, RegistryBase, Ui_ServiceManager, LogMixi prev_item_last_slide = None service_iterator = QtWidgets.QTreeWidgetItemIterator(self.service_manager_list) while service_iterator.value(): + # Found the selected/current service item if service_iterator.value() == selected: if last_slide and prev_item_last_slide: + # Go to the last slide of the previous service item pos = prev_item.data(0, QtCore.Qt.UserRole) check_expanded = self.service_items[pos - 1]['expanded'] self.service_manager_list.setCurrentItem(prev_item_last_slide) @@ -985,13 +987,17 @@ class ServiceManager(QtWidgets.QWidget, RegistryBase, Ui_ServiceManager, LogMixi self.make_live() self.service_manager_list.setCurrentItem(prev_item) elif prev_item: + # Go to the first slide of the previous service item self.service_manager_list.setCurrentItem(prev_item) self.make_live() return + # Found the previous service item root if service_iterator.value().parent() is None: prev_item = service_iterator.value() + # Found the last slide of the previous item if service_iterator.value().parent() is prev_item: prev_item_last_slide = service_iterator.value() + # Go to next item in the tree service_iterator += 1 def on_set_item(self, message): diff --git a/openlp/plugins/presentations/lib/powerpointcontroller.py b/openlp/plugins/presentations/lib/powerpointcontroller.py index 7645a277a..fd5772e88 100644 --- a/openlp/plugins/presentations/lib/powerpointcontroller.py +++ b/openlp/plugins/presentations/lib/powerpointcontroller.py @@ -170,14 +170,17 @@ class PowerpointDocument(PresentationDocument): However, for the moment, we want a physical file since it makes life easier elsewhere. """ log.debug('create_thumbnails') + generate_thumbs = True if self.check_thumbnails(): - return + # No need for thumbnails but we still need the index + generate_thumbs = False key = 1 for num in range(self.presentation.Slides.Count): if not self.presentation.Slides(num + 1).SlideShowTransition.Hidden: self.index_map[key] = num + 1 - self.presentation.Slides(num + 1).Export( - str(self.get_thumbnail_folder() / 'slide{key:d}.png'.format(key=key)), 'png', 320, 240) + if generate_thumbs: + self.presentation.Slides(num + 1).Export( + str(self.get_thumbnail_folder() / 'slide{key:d}.png'.format(key=key)), 'png', 320, 240) key += 1 self.slide_count = key - 1 From a3fdaff2c4c622197f27d622971784d812f8af27 Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Thu, 23 May 2019 21:41:00 +0200 Subject: [PATCH 10/16] Fix test and remove debug prints --- openlp/core/ui/slidecontroller.py | 1 - openlp/plugins/presentations/lib/impresscontroller.py | 2 +- openlp/plugins/presentations/lib/messagelistener.py | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 5caf33b7a..2d419d6f2 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -1303,7 +1303,6 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): [self.service_item, self.is_live]) # Check id we have tried to go before that start slide if self.is_live and before_start and before_start[0]: - print('detected before start!') if self.slide_limits == SlideLimits.Wrap: self.on_slide_selected_index([self.preview_widget.slide_count() - 1]) elif self.is_live and self.slide_limits == SlideLimits.Next: diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 081a06478..0f773b98a 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -553,7 +553,7 @@ class ImpressDocument(PresentationDocument): titles.append(self.__get_text_from_page(slide_no, TextType.Title).replace('\r\n', ' ') .replace('\n', ' ').strip()) note = self.__get_text_from_page(slide_no, TextType.Notes) - if not note: + if len(note) == 0: note = ' ' notes.append(note) self.save_titles_and_notes(titles, notes) diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index 0cea6949b..9237f6a40 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -205,7 +205,6 @@ class Controller(object): return False ret = self.doc.previous_step() self.poll() - print('previous returning: %d' % ret) return ret def shutdown(self): From e6baed110561468c2e135dcf7760ff66fa8cf32b Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Thu, 23 May 2019 22:30:46 +0200 Subject: [PATCH 11/16] pep8 fixes --- openlp/core/ui/servicemanager.py | 2 +- .../presentations/lib/impresscontroller.py | 19 ++++++++++++------- .../presentations/lib/powerpointcontroller.py | 3 ++- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 18b5b6f04..33dd5c845 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -987,7 +987,7 @@ class ServiceManager(QtWidgets.QWidget, RegistryBase, Ui_ServiceManager, LogMixi self.make_live() self.service_manager_list.setCurrentItem(prev_item) elif prev_item: - # Go to the first slide of the previous service item + # Go to the first slide of the previous service item self.service_manager_list.setCurrentItem(prev_item) self.make_live() return diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 0f773b98a..fb5254a05 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -222,25 +222,28 @@ class ImpressController(PresentationController): # Create Instance of ConfigurationProvider if not self.conf_provider: if is_win(): - self.conf_provider = self.manager.createInstance("com.sun.star.configuration.ConfigurationProvider") + self.conf_provider = self.manager.createInstance('com.sun.star.configuration.ConfigurationProvider') else: - self.conf_provider = self.manager.createInstanceWithContext("com.sun.star.configuration.ConfigurationProvider", uno.getComponentContext()) + self.conf_provider = self.manager.createInstanceWithContext( + 'com.sun.star.configuration.ConfigurationProvider', uno.getComponentContext()) # Setup lookup properties to get Impress settings properties = [] properties.append(self.create_property('nodepath', 'org.openoffice.Office.Impress')) properties = tuple(properties) try: # Get an updateable configuration view - impress_conf_props = self.conf_provider.createInstanceWithArguments('com.sun.star.configuration.ConfigurationUpdateAccess', properties) + impress_conf_props = self.conf_provider.createInstanceWithArguments( + 'com.sun.star.configuration.ConfigurationUpdateAccess', properties) # Get the specific setting for presentation screen - presenter_screen_enabled = impress_conf_props.getHierarchicalPropertyValue('Misc/Start/EnablePresenterScreen') + presenter_screen_enabled = impress_conf_props.getHierarchicalPropertyValue( + 'Misc/Start/EnablePresenterScreen') # If the presentation screen is enabled we disable it if presenter_screen_enabled != target_value: impress_conf_props.setHierarchicalPropertyValue('Misc/Start/EnablePresenterScreen', target_value) impress_conf_props.commitChanges() # if target_value is False this is an attempt to disable the Presenter Screen # so we make a note that it has been disabled, so it can be enabled again on close. - if target_value == False: + if target_value is False: self.presenter_screen_disabled_by_openlp = True except Exception as e: log.exception(e) @@ -561,6 +564,7 @@ class ImpressDocument(PresentationDocument): if is_win(): property_object = self.controller.manager.Bridge_GetStruct('com.sun.star.beans.PropertyValue') + class SlideShowListener(SlideShowListenerImport): """ Listener interface to receive global slide show events. @@ -568,8 +572,9 @@ class SlideShowListener(SlideShowListenerImport): def __init__(self, document): """ + Constructor - :param control: SlideShowController + :param document: The ImpressDocument being presented """ self.document = document @@ -602,7 +607,7 @@ class SlideShowListener(SlideShowListenerImport): Notify that the last animation from the main sequence of the current slide has ended. """ log.debug('LibreOffice SlideShowListener event: slideAnimationsEnded') - #if not Registry().get('main_window').isActiveWindow(): + # if not Registry().get('main_window').isActiveWindow(): # log.debug('main window is not in focus - should update slidecontroller') # Registry().execute('slidecontroller_live_change', self.document.control.getCurrentSlideIndex() + 1) diff --git a/openlp/plugins/presentations/lib/powerpointcontroller.py b/openlp/plugins/presentations/lib/powerpointcontroller.py index fd5772e88..a01470855 100644 --- a/openlp/plugins/presentations/lib/powerpointcontroller.py +++ b/openlp/plugins/presentations/lib/powerpointcontroller.py @@ -444,7 +444,8 @@ class PowerpointDocument(PresentationDocument): """ log.debug('next_step') # if we are at the presentations end don't go further, just return True - if self.presentation.SlideShowWindow.View.GetClickCount() == self.presentation.SlideShowWindow.View.GetClickIndex()\ + if self.presentation.SlideShowWindow.View.GetClickCount() == \ + self.presentation.SlideShowWindow.View.GetClickIndex() \ and self.get_slide_number() == self.get_slide_count(): return True past_end = False From 6e03382f1ff02ac8da3d3ed3b131e0008da75b8d Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Fri, 24 May 2019 21:21:19 +0200 Subject: [PATCH 12/16] Reenable setting slidecontroller index when openlp is not in focus. --- openlp/plugins/presentations/lib/impresscontroller.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index fb5254a05..426e8f2fc 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -607,9 +607,9 @@ class SlideShowListener(SlideShowListenerImport): Notify that the last animation from the main sequence of the current slide has ended. """ log.debug('LibreOffice SlideShowListener event: slideAnimationsEnded') - # if not Registry().get('main_window').isActiveWindow(): - # log.debug('main window is not in focus - should update slidecontroller') - # Registry().execute('slidecontroller_live_change', self.document.control.getCurrentSlideIndex() + 1) + if not Registry().get('main_window').isActiveWindow(): + log.debug('main window is not in focus - should update slidecontroller') + Registry().execute('slidecontroller_live_change', self.document.control.getCurrentSlideIndex() + 1) def slideEnded(self, reverse): """ From 38a310a1aa0e27468a4c42157238e1b2d03e09ce Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Sat, 25 May 2019 21:21:19 +0200 Subject: [PATCH 13/16] Remove unused code --- openlp/plugins/presentations/lib/impresscontroller.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 426e8f2fc..9dd1a776a 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -561,9 +561,6 @@ class ImpressDocument(PresentationDocument): notes.append(note) self.save_titles_and_notes(titles, notes) - if is_win(): - property_object = self.controller.manager.Bridge_GetStruct('com.sun.star.beans.PropertyValue') - class SlideShowListener(SlideShowListenerImport): """ From 949231a35f7352adbc09991d04168cca5c0dc63e Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Wed, 29 May 2019 21:18:25 +0200 Subject: [PATCH 14/16] Fix traceback on Mac tests --- openlp/plugins/presentations/lib/impresscontroller.py | 4 +++- openlp/plugins/presentations/lib/powerpointcontroller.py | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 9dd1a776a..b64973c33 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -42,7 +42,7 @@ from openlp.core.display.screens import ScreenList from openlp.plugins.presentations.lib.presentationcontroller import PresentationController, PresentationDocument, \ TextType - +# Load the XSlideShowListener class so we can inherit from it if is_win(): from win32com.client import Dispatch import pywintypes @@ -75,6 +75,8 @@ else: uno_available = True except ImportError: uno_available = False + class SlideShowListenerImport(): + pass log = logging.getLogger(__name__) diff --git a/openlp/plugins/presentations/lib/powerpointcontroller.py b/openlp/plugins/presentations/lib/powerpointcontroller.py index a01470855..763be4560 100644 --- a/openlp/plugins/presentations/lib/powerpointcontroller.py +++ b/openlp/plugins/presentations/lib/powerpointcontroller.py @@ -145,8 +145,8 @@ class PowerpointDocument(PresentationDocument): try: if not self.controller.process: self.controller.start_process() - self.controller.process.Presentations.Open(str(self.file_path), False, False, False) - self.presentation = self.controller.process.Presentations(self.controller.process.Presentations.Count) + self.presentation = self.controller.process.Presentations.Open(str(self.file_path), False, False, False) + log.debug('Loaded presentation %s' % self.presentation.FullName) self.create_thumbnails() self.create_titles_and_notes() # Make sure powerpoint doesn't steal focus, unless we're on a single screen setup From 2efaffec7ad5921ff32d6164c177078c57e37d89 Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Wed, 29 May 2019 21:22:12 +0200 Subject: [PATCH 15/16] pep8 --- openlp/plugins/presentations/lib/impresscontroller.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index b64973c33..5a5e81cd3 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -75,6 +75,7 @@ else: uno_available = True except ImportError: uno_available = False + class SlideShowListenerImport(): pass From 3963923e2d9ede2ff0057038401e160feeff6d30 Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Tue, 4 Jun 2019 22:03:19 +0200 Subject: [PATCH 16/16] Fix as suggested --- .../presentations/lib/impresscontroller.py | 23 +++++++++++++------ .../lib/presentationcontroller.py | 4 ++-- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index ffbb79d04..873e91b86 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -188,7 +188,7 @@ class ImpressController(PresentationController): """ log.debug('Kill OpenOffice') if self.presenter_screen_disabled_by_openlp: - self._toggle_presentation_screen(True) + self.toggle_presentation_screen(True) while self.docs: self.docs[0].close_presentation() desktop = None @@ -218,9 +218,12 @@ class ImpressController(PresentationController): except Exception: log.warning('Failed to terminate OpenOffice') - def toggle_presentation_screen(self, target_value): + def toggle_presentation_screen(self, set_visible): """ Enable or disable the Presentation Screen/Console + + :param bool set_visible: Should the presentation screen/console be set to be visible. + :rtype: None """ # Create Instance of ConfigurationProvider if not self.conf_provider: @@ -241,21 +244,24 @@ class ImpressController(PresentationController): presenter_screen_enabled = impress_conf_props.getHierarchicalPropertyValue( 'Misc/Start/EnablePresenterScreen') # If the presentation screen is enabled we disable it - if presenter_screen_enabled != target_value: - impress_conf_props.setHierarchicalPropertyValue('Misc/Start/EnablePresenterScreen', target_value) + if presenter_screen_enabled != set_visible: + impress_conf_props.setHierarchicalPropertyValue('Misc/Start/EnablePresenterScreen', set_visible) impress_conf_props.commitChanges() - # if target_value is False this is an attempt to disable the Presenter Screen + # if set_visible is False this is an attempt to disable the Presenter Screen # so we make a note that it has been disabled, so it can be enabled again on close. - if target_value is False: + if set_visible is False: self.presenter_screen_disabled_by_openlp = True except Exception as e: log.exception(e) trace_error_handler(log) - return def create_property(self, name, value): """ Create an OOo style property object which are passed into some Uno methods. + + :param str name: The name of the property + :param str value: The value of the property + :rtype: com.sun.star.beans.PropertyValue """ log.debug('create property OpenOffice') if is_win(): @@ -615,6 +621,9 @@ class SlideShowListener(SlideShowListenerImport): """ Notify that the current slide has ended, e.g. the user has clicked on the slide. Calling displaySlide() twice will not issue this event. + + :param bool reverse: Whether or not the direction of the "slide movement" is reversed/backwards. + :rtype: None """ log.debug('LibreOffice SlideShowListener event: slideEnded %d' % reverse) if reverse: diff --git a/openlp/plugins/presentations/lib/presentationcontroller.py b/openlp/plugins/presentations/lib/presentationcontroller.py index cb827cc5c..ac25fa9a4 100644 --- a/openlp/plugins/presentations/lib/presentationcontroller.py +++ b/openlp/plugins/presentations/lib/presentationcontroller.py @@ -249,14 +249,14 @@ class PresentationDocument(object): """ Triggers the next effect of slide on the running presentation. This might be the next animation on the current slide, or the next slide. - Returns True if we stepped beyond the slides of the presentation + :rtype bool: True if we stepped beyond the slides of the presentation """ return False def previous_step(self): """ Triggers the previous slide on the running presentation - Returns True if we stepped beyond the slides of the presentation + :rtype bool: True if we stepped beyond the slides of the presentation """ return False