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): """