Jonathan Corwin has proposed merging lp:~j-corwin/openlp/bug-927585 into 
lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)

For more details, see:
https://code.launchpad.net/~j-corwin/openlp/bug-927585/+merge/129527

Fix various halts and issues with Presentation plugins

#927585
#936596
#859098
#967061
-- 
https://code.launchpad.net/~j-corwin/openlp/bug-927585/+merge/129527
Your team OpenLP Core is requested to review the proposed merge of 
lp:~j-corwin/openlp/bug-927585 into lp:openlp.
=== modified file 'openlp/plugins/presentations/lib/impresscontroller.py'
--- openlp/plugins/presentations/lib/impresscontroller.py	2012-07-07 14:54:14 +0000
+++ openlp/plugins/presentations/lib/impresscontroller.py	2012-10-12 22:18:20 +0000
@@ -155,6 +155,8 @@
             desktop = self.manager.createInstance(u'com.sun.star.frame.Desktop')
         except AttributeError:
             log.warn(u'Failure to find desktop - Impress may have closed')
+        except pywintypes.com_error:
+            log.warn(u'Failure to find desktop - Impress may have closed')
         return desktop if desktop else None
 
     def get_com_servicemanager(self):
@@ -284,6 +286,8 @@
         props = tuple(props)
         doc = self.document
         pages = doc.getDrawPages()
+        if not pages:
+            return
         if not os.path.isdir(self.get_temp_folder()):
             os.makedirs(self.get_temp_folder())
         for idx in range(pages.getCount()):
@@ -359,7 +363,9 @@
         log.debug(u'is active OpenOffice')
         if not self.is_loaded():
             return False
-        return self.control is not None
+        if not self.control:
+            return False
+        return self.control.isRunning()
 
     def unblank_screen(self):
         """
@@ -380,7 +386,7 @@
         Returns true if screen is blank
         """
         log.debug(u'is blank OpenOffice')
-        if self.control:
+        if self.control and self.control.isRunning():
             return self.control.isPaused()
         else:
             return False
@@ -436,7 +442,11 @@
         """
         Triggers the next effect of slide on the running presentation
         """
+        is_paused = self.control.isPaused()
         self.control.gotoNextEffect()
+        time.sleep(0.1)
+        if not is_paused and self.control.isPaused():
+            self.control.gotoPreviousEffect()
 
     def previous_step(self):
         """

=== modified file 'openlp/plugins/presentations/lib/messagelistener.py'
--- openlp/plugins/presentations/lib/messagelistener.py	2012-06-30 15:19:33 +0000
+++ openlp/plugins/presentations/lib/messagelistener.py	2012-10-12 22:18:20 +0000
@@ -49,6 +49,7 @@
         """
         self.is_live = live
         self.doc = None
+        self.hide_mode = None
         log.info(u'%s controller loaded' % live)
 
     def add_handler(self, controller, file, hide_mode, slide_no):
@@ -67,6 +68,7 @@
             # Inform slidecontroller that the action failed?
             return
         self.doc.slidenumber = slide_no
+        self.hide_mode = hide_mode
         if self.is_live:
             if hide_mode == HideMode.Screen:
                 Receiver.send_message(u'live_display_hide', HideMode.Screen)
@@ -88,29 +90,40 @@
         Use the last slide number.
         """
         log.debug(u'Live = %s, activate' % self.is_live)
+        if not self.doc:
+            return False
         if self.doc.is_active():
-            return
+            return True
         if not self.doc.is_loaded():
             if not self.doc.load_presentation():
-                return
+                log.warn(u'Failed to activate %s' % self.doc.filepath)
+                return False
         if self.is_live:
             self.doc.start_presentation()
             if self.doc.slidenumber > 1:
                 if self.doc.slidenumber > self.doc.get_slide_count():
                     self.doc.slidenumber = self.doc.get_slide_count()
                 self.doc.goto_slide(self.doc.slidenumber)
+        if self.doc.is_active():
+            return True
+        else:
+            log.warn(u'Failed to activate %s' % self.doc.filepath)
+            return False
 
     def slide(self, slide):
         """
         Go to a specific slide
         """
         log.debug(u'Live = %s, slide' % self.is_live)
+        if not self.doc:
+            return
         if not self.is_live:
             return
-        if self.doc.is_blank():
+        if self.hide_mode:
             self.doc.slidenumber = int(slide) + 1
             return
-        self.activate()
+        if not self.activate():
+            return
         self.doc.goto_slide(int(slide) + 1)
         self.doc.poll_slidenumber(self.is_live)
 
@@ -119,12 +132,15 @@
         Based on the handler passed at startup triggers the first slide
         """
         log.debug(u'Live = %s, first' % self.is_live)
+        if not self.doc:
+            return
         if not self.is_live:
             return
-        if self.doc.is_blank():
+        if self.hide_mode:
             self.doc.slidenumber = 1
             return
-        self.activate()
+        if not self.activate():
+            return
         self.doc.start_presentation()
         self.doc.poll_slidenumber(self.is_live)
 
@@ -133,12 +149,15 @@
         Based on the handler passed at startup triggers the last slide
         """
         log.debug(u'Live = %s, last' % self.is_live)
+        if not self.doc:
+            return
         if not self.is_live:
             return
-        if self.doc.is_blank():
+        if self.hide_mode:
             self.doc.slidenumber = self.doc.get_slide_count()
             return
-        self.activate()
+        if not self.activate():
+            return
         self.doc.goto_slide(self.doc.get_slide_count())
         self.doc.poll_slidenumber(self.is_live)
 
@@ -147,9 +166,11 @@
         Based on the handler passed at startup triggers the next slide event
         """
         log.debug(u'Live = %s, next' % self.is_live)
+        if not self.doc:
+            return
         if not self.is_live:
             return
-        if self.doc.is_blank():
+        if self.hide_mode:
             if self.doc.slidenumber < self.doc.get_slide_count():
                 self.doc.slidenumber = self.doc.slidenumber + 1
             return
@@ -158,7 +179,8 @@
         # contain animations that need to be stepped through.
         if self.doc.slidenumber > self.doc.get_slide_count():
             return
-        self.activate()
+        if not self.activate():
+            return
         self.doc.next_step()
         self.doc.poll_slidenumber(self.is_live)
 
@@ -167,13 +189,16 @@
         Based on the handler passed at startup triggers the previous slide event
         """
         log.debug(u'Live = %s, previous' % self.is_live)
+        if not self.doc:
+            return
         if not self.is_live:
             return
-        if self.doc.is_blank():
+        if self.hide_mode:
             if self.doc.slidenumber > 1:
                 self.doc.slidenumber = self.doc.slidenumber - 1
             return
-        self.activate()
+        if not self.activate():
+            return
         self.doc.previous_step()
         self.doc.poll_slidenumber(self.is_live)
 
@@ -182,6 +207,8 @@
         Based on the handler passed at startup triggers slide show to shut down
         """
         log.debug(u'Live = %s, shutdown' % self.is_live)
+        if not self.doc:
+            return
         self.doc.close_presentation()
         self.doc = None
 
@@ -190,21 +217,30 @@
         Instruct the controller to blank the presentation
         """
         log.debug(u'Live = %s, blank' % self.is_live)
+        self.hide_mode = hide_mode
+        if not self.doc:
+            return
         if not self.is_live:
             return
-        if not self.doc.is_loaded():
-            return
-        if not self.doc.is_active():
-            return
         if hide_mode == HideMode.Theme:
+            if not self.doc.is_loaded():
+                return
+            if not self.doc.is_active():
+                return
             Receiver.send_message(u'live_display_hide', HideMode.Theme)
-        self.doc.blank_screen()
+        elif hide_mode == HideMode.Blank:
+            if not self.activate():
+                return
+            self.doc.blank_screen()
 
     def stop(self):
         """
         Instruct the controller to stop and hide the presentation
         """
         log.debug(u'Live = %s, stop' % self.is_live)
+        self.hide_mode = HideMode.Screen
+        if not self.doc:
+            return
         if not self.is_live:
             return
         if not self.doc.is_loaded():
@@ -218,9 +254,13 @@
         Instruct the controller to unblank the presentation
         """
         log.debug(u'Live = %s, unblank' % self.is_live)
+        self.hide_mode = None
+        if not self.doc:
+            return
         if not self.is_live:
             return
-        self.activate()
+        if not self.activate():
+            return
         if self.doc.slidenumber and \
             self.doc.slidenumber != self.doc.get_slide_number():
             self.doc.goto_slide(self.doc.slidenumber)
@@ -228,6 +268,8 @@
         Receiver.send_message(u'live_display_hide', HideMode.Screen)
 
     def poll(self):
+        if not self.doc:
+            return
         self.doc.poll_slidenumber(self.is_live)
 
 

=== modified file 'openlp/plugins/presentations/lib/powerpointcontroller.py'
--- openlp/plugins/presentations/lib/powerpointcontroller.py	2012-07-07 14:54:14 +0000
+++ openlp/plugins/presentations/lib/powerpointcontroller.py	2012-10-12 22:18:20 +0000
@@ -94,9 +94,9 @@
                 self.docs[0].close_presentation()
             if self.process is None:
                 return
-            if self.process.Presentations.Count > 0:
-                return
             try:
+                if self.process.Presentations.Count > 0:
+                    return
                 self.process.Quit()
             except pywintypes.com_error:
                 pass
@@ -210,6 +210,13 @@
         self.presentation.SlideShowSettings.Run()
         self.presentation.SlideShowWindow.View.State = 1
         self.presentation.SlideShowWindow.Activate()
+        if self.presentation.Application.Version == u'14.0':
+            # Unblanking is broken in PowerPoint 2010, need to redisplay
+            slide = self.presentation.SlideShowWindow.View.CurrentShowPosition
+            click = self.presentation.SlideShowWindow.View.GetClickIndex()
+            self.presentation.SlideShowWindow.View.GotoSlide(slide)
+            if click:
+                self.presentation.SlideShowWindow.View.GotoClick(click)
 
     def blank_screen(self):
         """
@@ -253,6 +260,8 @@
             renderer = self.controller.plugin.renderer
             rect = renderer.screens.current[u'size']
             ppt_window = self.presentation.SlideShowSettings.Run()
+            if not ppt_window:
+                return
             ppt_window.Top = rect.y() * 72 / dpi
             ppt_window.Height = rect.height() * 72 / dpi
             ppt_window.Left = rect.x() * 72 / dpi
@@ -286,6 +295,8 @@
         """
         log.debug(u'next_step')
         self.presentation.SlideShowWindow.View.Next()
+        if self.get_slide_number() > self.get_slide_count():
+            self.previous_step()
 
     def previous_step(self):
         """

_______________________________________________
Mailing list: https://launchpad.net/~openlp-core
Post to     : openlp-core@lists.launchpad.net
Unsubscribe : https://launchpad.net/~openlp-core
More help   : https://help.launchpad.net/ListHelp

Reply via email to