← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~trb143/openlp/cleanups into lp:openlp

 

Tim Bentley has proposed merging lp:~trb143/openlp/cleanups into lp:openlp.

    Requested reviews:
    OpenLP Core (openlp-core)


Twas the day after the day after Christmas and the elves were hard at work.
Bugs were squashed 
and Alerts now worked (?)  (Enough rhymes for now!!!)

Videos play on the correct screen
and images show up once (instead of twice)
Transparent backgrounds are complete.
-- 
https://code.launchpad.net/~trb143/openlp/cleanups/+merge/16607
Your team OpenLP Core is subscribed to branch lp:openlp.
=== modified file 'openlp/core/lib/renderer.py'
--- openlp/core/lib/renderer.py	2009-12-15 20:36:15 +0000
+++ openlp/core/lib/renderer.py	2009-12-27 08:15:23 +0000
@@ -276,8 +276,12 @@
         Results are cached for performance reasons.
         """
         assert(self._theme)
-        self.bg_frame = QtGui.QImage(self._frame.width(), self._frame.height(),
-            QtGui.QImage.Format_ARGB32_Premultiplied)
+        if self._theme.background_mode == u'transparent':
+            self.bg_frame = QtGui.QPixmap(self._frame.width(), self._frame.height())
+            self.bg_frame.fill(QtCore.Qt.transparent)
+        else:
+            self.bg_frame = QtGui.QImage(self._frame.width(), self._frame.height(),
+                QtGui.QImage.Format_ARGB32_Premultiplied)
         log.debug(u'render background %s start', self._theme.background_type)
         painter = QtGui.QPainter()
         painter.begin(self.bg_frame)
@@ -422,6 +426,13 @@
         startx = x
         starty = y
         rightextent = None
+        self.painter = QtGui.QPainter()
+        self.painter.begin(self._frame)
+        self.painter.setRenderHint(QtGui.QPainter.Antialiasing)
+        self.painter2 = QtGui.QPainter()
+        self.painter2.begin(self._frameOp)
+        self.painter2.setRenderHint(QtGui.QPainter.Antialiasing)
+        self.painter2.setOpacity(0.7)
         # dont allow alignment messing with footers
         if footer:
             align = 0
@@ -504,12 +515,12 @@
                 self._first_line_right_extent = rightextent
         # draw a box around the text - debug only
         if self._debug:
-            painter = QtGui.QPainter()
-            painter.begin(self._frame)
-            painter.setPen(QtGui.QPen(QtGui.QColor(0,255,0)))
-            painter.drawRect(startx, starty, rightextent-startx, y-starty)
-            painter.end()
+            self.painter = QtGui.QPainter()
+            self.painter.setPen(QtGui.QPen(QtGui.QColor(0,255,0)))
+            self.painter.drawRect(startx, starty, rightextent-startx, y-starty)
         brcorner = (rightextent, y)
+        self.painter.end()
+        self.painter2.end()
         return brcorner
 
     def _set_theme_font(self):
@@ -556,45 +567,36 @@
             Defaults to *None*. The colour to draw with.
         """
         # setup defaults
-        painter = QtGui.QPainter()
-        painter.begin(self._frame)
-        painter.setRenderHint(QtGui.QPainter.Antialiasing);
         if footer :
             font = self.footerFont
         else:
             font = self.mainFont
-        painter.setFont(font)
+        self.painter.setFont(font)
         if color is None:
             if footer:
-                painter.setPen(QtGui.QColor(self._theme.font_footer_color))
+                self.painter.setPen(QtGui.QColor(self._theme.font_footer_color))
             else:
-                painter.setPen(QtGui.QColor(self._theme.font_main_color))
+                self.painter.setPen(QtGui.QColor(self._theme.font_main_color))
         else:
-            painter.setPen(QtGui.QColor(color))
+            self.painter.setPen(QtGui.QColor(color))
         x, y = tlcorner
         metrics = QtGui.QFontMetrics(font)
         w = metrics.width(line)
         h = metrics.height() - 2
         if draw:
-            painter.drawText(x, y + metrics.ascent(), line)
-        painter.end()
+            self.painter.drawText(x, y + metrics.ascent(), line)
         if self._theme.display_slideTransition:
             # Print 2nd image with 70% weight
-            painter = QtGui.QPainter()
-            painter.begin(self._frameOp)
-            painter.setRenderHint(QtGui.QPainter.Antialiasing);
-            painter.setOpacity(0.7)
-            painter.setFont(font)
+            self.painter2.setFont(font)
             if color is None:
                 if footer:
-                    painter.setPen(QtGui.QColor(self._theme.font_footer_color))
+                    self.painter2.setPen(QtGui.QColor(self._theme.font_footer_color))
                 else:
-                    painter.setPen(QtGui.QColor(self._theme.font_main_color))
+                    self.painter2.setPen(QtGui.QColor(self._theme.font_main_color))
             else:
-                painter.setPen(QtGui.QColor(color))
+                self.painter2.setPen(QtGui.QColor(color))
             if draw:
-                painter.drawText(x, y + metrics.ascent(), line)
-            painter.end()
+                self.painter2.drawText(x, y + metrics.ascent(), line)
         return (w, h)
 
     def snoop_Image(self, image, image2=None):

=== modified file 'openlp/core/lib/serviceitem.py'
--- openlp/core/lib/serviceitem.py	2009-12-13 22:08:10 +0000
+++ openlp/core/lib/serviceitem.py	2009-12-27 08:15:23 +0000
@@ -119,7 +119,7 @@
 
     def render_individual(self, row):
         """
-        Takes an array of text and geneates an Image from the
+        Takes an array of text and generates an Image from the
         theme.  It assumes the text will fit on the screen as it
         has generated by the render method above.
         """

=== modified file 'openlp/core/ui/maindisplay.py'
--- openlp/core/ui/maindisplay.py	2009-12-13 22:08:10 +0000
+++ openlp/core/ui/maindisplay.py	2009-12-27 08:15:23 +0000
@@ -90,22 +90,25 @@
         self.parent = parent
         self.setWindowTitle(u'OpenLP Display')
         self.screens = screens
-        self.layout = QtGui.QVBoxLayout(self)
-        self.layout.setSpacing(0)
-        self.layout.setMargin(0)
-        self.layout.setObjectName(u'layout')
+        #build the media widget and its display stacks
         self.mediaObject = Phonon.MediaObject(self)
-        self.video = Phonon.VideoWidget()
+        self.video = Phonon.VideoWidget(self)
         self.video.setVisible(False)
         self.audio = Phonon.AudioOutput(Phonon.VideoCategory, self.mediaObject)
         Phonon.createPath(self.mediaObject, self.video)
         Phonon.createPath(self.mediaObject, self.audio)
-        self.layout.insertWidget(0, self.video)
-        self.display = QtGui.QLabel(self)
-        self.display.setScaledContents(True)
-        self.layout.insertWidget(0, self.display)
+        #The video is a separate widget so needs it's own alert display
+        self.alertVideoDisplay = QtGui.QLabel(self.video)
+        self.alertVideoDisplay.setScaledContents(True)
+        #build the text wisget and it's display stack
+        self.background = QtGui.QLabel(self)
+        self.background.setScaledContents(True)
+        #display alerts for text
+        self.alertDisplay = QtGui.QLabel(self)
+        self.alertDisplay.setScaledContents(True)
+        #Other varables start here
         self.primary = True
-        self.displayBlank = False
+        self.backgroundBlank = False
         self.blankFrame = None
         self.frame = None
         self.alertactive = False
@@ -113,8 +116,9 @@
         self.firstTime = True
         self.mediaLoaded = False
         self.hasTransition = False
+        self.alertList = []
         QtCore.QObject.connect(Receiver.get_receiver(),
-            QtCore.SIGNAL(u'alert_text'), self.displayAlert)
+            QtCore.SIGNAL(u'alert_text'),self.displayAlert)
         QtCore.QObject.connect(Receiver.get_receiver(),
             QtCore.SIGNAL(u'live_slide_hide'), self.hideDisplay)
         QtCore.QObject.connect(Receiver.get_receiver(),
@@ -130,7 +134,6 @@
         QtCore.QObject.connect(Receiver.get_receiver(),
             QtCore.SIGNAL(u'media_stop'), self.onMediaStop)
 
-
     def setup(self, screenNumber):
         """
         Sets up the screen on a particular screen.
@@ -138,44 +141,67 @@
         """
         log.debug(u'Setup %s for %s ' %(self.screens, screenNumber))
         self.setVisible(False)
-        screen = self.screens[screenNumber]
-        if screen[u'number'] != screenNumber:
+        self.screen = self.screens[screenNumber]
+        if self.screen[u'number'] != screenNumber:
             # We will most probably never actually hit this bit, but just in
             # case the index in the list doesn't match the screen number, we
             # search for it.
             for scrn in self.screens:
                 if scrn[u'number'] == screenNumber:
-                    screen = scrn
+                    self.screen = scrn
                     break
-        self.setGeometry(screen[u'size'])
+        #Define the display sizes and poistions
+        self.setScreenGeometry()
         #Build a custom splash screen
         self.InitialFrame = QtGui.QImage(
-            screen[u'size'].width(), screen[u'size'].height(),
+            self.screen[u'size'].width(), self.screen[u'size'].height(),
             QtGui.QImage.Format_ARGB32_Premultiplied)
         splash_image = QtGui.QImage(u':/graphics/openlp-splash-screen.png')
         painter_image = QtGui.QPainter()
         painter_image.begin(self.InitialFrame)
         painter_image.fillRect(self.InitialFrame.rect(), QtCore.Qt.white)
         painter_image.drawImage(
-            (screen[u'size'].width() - splash_image.width()) / 2,
-            (screen[u'size'].height() - splash_image.height()) / 2,
+            (self.screen[u'size'].width() - splash_image.width()) / 2,
+            (self.screen[u'size'].height() - splash_image.height()) / 2,
             splash_image)
         self.frameView(self.InitialFrame)
         #Build a Black screen
+        self.blankFrame = QtGui.QImage(
+            self.screen[u'size'].width(), self.screen[u'size'].height(),
+            QtGui.QImage.Format_ARGB32_Premultiplied)
         painter = QtGui.QPainter()
-        self.blankFrame = QtGui.QImage(
-            screen[u'size'].width(), screen[u'size'].height(),
-            QtGui.QImage.Format_ARGB32_Premultiplied)
         painter.begin(self.blankFrame)
         painter.fillRect(self.blankFrame.rect(), QtCore.Qt.black)
+        painter.end()
+        #buid a blank transparent image
+        self.transparent = QtGui.QPixmap(self.screen[u'size'].width(),
+                                         self.screen[u'size'].height())
+        self.transparent.fill(QtCore.Qt.transparent)
         # To display or not to display?
-        if not screen[u'primary']:
+        if not self.screen[u'primary']:
             self.showFullScreen()
             self.primary = False
         else:
             self.setVisible(False)
             self.primary = True
 
+    def setScreenGeometry(self):
+        """
+        Define and set up the display sizes.
+        The alert displays are set to 10% of the screen as the video display
+        is unable to handle transparent pixmaps.  This is a problem with QT.
+        """
+        self.setGeometry(self.screen[u'size'])
+        self.video.setGeometry(self.screen[u'size'])
+        self.alertScreenPosition = self.screen[u'size'].height() * 0.9
+        self.alertHeight = self.screen[u'size'].height() - self.alertScreenPosition
+        self.alertDisplay.setGeometry(
+            QtCore.QRect(0, self.alertScreenPosition,
+                        self.screen[u'size'].width(),self.alertHeight))
+        self.alertVideoDisplay.setGeometry(
+            QtCore.QRect(0, self.alertScreenPosition,
+                        self.screen[u'size'].width(), self.alertHeight))
+
     def resetDisplay(self):
         if self.primary:
             self.setVisible(False)
@@ -194,22 +220,20 @@
         ``frame``
             Image frame to be rendered
         """
-        if self.timer_id != 0 :
-            self.displayAlert()
-        elif not self.displayBlank:
+        if not self.backgroundBlank:
             if transition:
                 if self.hasTransition:
                     if self.frame[u'trans'] is not None:
-                        self.display.setPixmap(QtGui.QPixmap.fromImage(self.frame[u'trans']))
+                        self.background.setPixmap(QtGui.QPixmap.fromImage(self.frame[u'trans']))
                         self.repaint()
                     if frame[u'trans'] is not None:
-                        self.display.setPixmap(QtGui.QPixmap.fromImage(frame[u'trans']))
+                        self.background.setPixmap(QtGui.QPixmap.fromImage(frame[u'trans']))
                         self.repaint()
                 self.hasTransition = True
-                self.display.setPixmap(QtGui.QPixmap.fromImage(frame[u'main']))
+                self.background.setPixmap(QtGui.QPixmap.fromImage(frame[u'main']))
                 self.repaint()
             else:
-                self.display.setPixmap(QtGui.QPixmap.fromImage(frame))
+               self.background.setPixmap(QtGui.QPixmap.fromImage(frame))
             if not self.isVisible():
                 self.setVisible(True)
                 self.showFullScreen()
@@ -217,35 +241,49 @@
 
     def blankDisplay(self, blanked=True):
         if blanked:
-            self.displayBlank = True
-            self.display.setPixmap(QtGui.QPixmap.fromImage(self.blankFrame))
+            self.backgroundBlank = True
+            self.background.setPixmap(QtGui.QPixmap.fromImage(self.blankFrame))
         else:
-            self.displayBlank = False
+            self.backgroundBlank = False
             if self.frame:
                 self.frameView(self.frame)
         if blanked != self.parent.LiveController.blankButton.isChecked():
             self.parent.LiveController.blankButton.setChecked(self.displayBlank)
-        self.parent.generalConfig.set_config(u'screen blank', self.displayBlank)
+        self.parent.generalConfig.set_config(u'screen blank',self.backgroundBlank)
 
     def displayAlert(self, text=u''):
         """
-        Called from the Alert Tab to display an alert
+        Called from the Alert Tab or Remote plugin to display an alert
+        The alert display is a transparent image with the alert text
+        on it. It can be displayed over any image.
 
         ``text``
             display text
         """
         log.debug(u'display alert called %s' % text)
+        self.alertList.append(text)
+        if self.timer_id != 0:
+            return
+        self.generateAlert()
+
+    def generateAlert(self):
+        log.debug(u'Generate alert called ')
+        #if we have no alerts stop
+        if len(self.alertList) == 0:
+            return
+        #Process the first entered alert FIFO
+        text = self.alertList.pop(0)
         alertTab = self.parent.settingsForm.AlertsTab
-        if isinstance(self.frame, QtGui.QImage):
-            alertframe = QtGui.QPixmap.fromImage(self.frame)
-        else:
-            alertframe = QtGui.QPixmap.fromImage(self.frame[u'main'])
+        alertframe = \
+            QtGui.QPixmap(self.screen[u'size'].width(), self.alertHeight)
+        alertframe.fill(QtCore.Qt.transparent)
         painter = QtGui.QPainter(alertframe)
-        top = alertframe.rect().height() * 0.9
+        painter.fillRect(alertframe.rect(), QtCore.Qt.transparent)
+        painter.setRenderHint(QtGui.QPainter.Antialiasing)
         painter.fillRect(
             QtCore.QRect(
-                0, top, alertframe.rect().width(),
-                alertframe.rect().height() - top),
+                0, 0, alertframe.rect().width(),
+                alertframe.rect().height()),
             QtGui.QColor(alertTab.bg_color))
         font = QtGui.QFont()
         font.setFamily(alertTab.font_face)
@@ -253,28 +291,36 @@
         font.setPointSize(40)
         painter.setFont(font)
         painter.setPen(QtGui.QColor(alertTab.font_color))
-        x, y = (0, top)
+        x, y = (0, 0)
         metrics = QtGui.QFontMetrics(font)
         painter.drawText(
             x, y + metrics.height() - metrics.descent() - 1, text)
         painter.end()
-        self.display.setPixmap(alertframe)
-        # check to see if we have a timer running
-        if self.timer_id == 0:
-            self.timer_id = self.startTimer(int(alertTab.timeout) * 1000)
+        if not self.mediaLoaded:
+            self.alertDisplay.setPixmap(alertframe)
+            self.alertDisplay.setVisible(True)
+        else:
+            self.alertVideoDisplay.setPixmap(alertframe)
+            self.alertVideoDisplay.setVisible(True)
+        self.timer_id = self.startTimer(int(alertTab.timeout) * 1000)
 
     def timerEvent(self, event):
         if event.timerId() == self.timer_id:
-            if isinstance(self.frame, QtGui.QImage):
-                self.display.setPixmap(QtGui.QPixmap.fromImage(self.frame))
+            #hide the alert display as not needed
+            if not self.mediaLoaded:
+                #set visible blinks the screen so paint clean instead
+                self.alertDisplay.setPixmap(self.transparent)
             else:
-                self.display.setPixmap(QtGui.QPixmap.fromImage(self.frame[u'main']))
+                #does not seem to bink the screen
+                self.alertVideoDisplay.setVisible(False)
             self.killTimer(self.timer_id)
             self.timer_id = 0
+            #Generate a new alert
+            self.generateAlert()
 
     def onMediaQueue(self, message):
         log.debug(u'Queue new media message %s' % message)
-        self.display.close()
+        self.background.close()
         file = os.path.join(message[1], message[2])
         if self.firstTime:
             self.mediaObject.setCurrentSource(Phonon.MediaSource(file))
@@ -284,12 +330,14 @@
         self.onMediaPlay()
 
     def onMediaPlay(self):
-        log.debug(u'Play the new media, Live ')
-        if not self.mediaLoaded and not self.displayBlank:
-            self.blankDisplay()
+        log.debug(u'Play the new media, Live')
+        #if not self.mediaLoaded and notself.backgroundBlank:
+        #    self.blankDisplay()
         self.firstTime = True
         self.mediaLoaded = True
-        self.display.hide()
+        self.background.setVisible(False)
+        self.alertDisplay.setVisible(False)
+        self.alertVideoDisplay.setVisible(False)
         self.video.setFullScreen(True)
         self.video.setVisible(True)
         self.mediaObject.play()
@@ -312,4 +360,5 @@
         self.mediaObject.clearQueue()
         self.mediaLoaded = False
         self.video.setVisible(False)
-        self.display.show()
+        self.alertVideoDisplay.setVisible(False)
+        self.background.setVisible(True)

=== modified file 'openlp/core/ui/slidecontroller.py'
--- openlp/core/ui/slidecontroller.py	2009-12-13 22:08:10 +0000
+++ openlp/core/ui/slidecontroller.py	2009-12-27 08:15:23 +0000
@@ -256,8 +256,6 @@
         self.grid.addLayout(self.SlideLayout, 0, 0, 1, 1)
         # Signals
         QtCore.QObject.connect(self.PreviewListWidget,
-            QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected)
-        QtCore.QObject.connect(self.PreviewListWidget,
             QtCore.SIGNAL(u'activated(QModelIndex)'), self.onSlideSelected)
         if isLive:
             QtCore.QObject.connect(Receiver.get_receiver(),
@@ -487,11 +485,12 @@
         """
         Blank the screen.
         """
-        if not self.serviceItem and self.serviceItem.is_command():
-            if blanked:
-                Receiver.send_message(u'%s_blank'% self.serviceItem.name.lower())
-            else:
-                Receiver.send_message(u'%s_unblank'% self.serviceItem.name.lower())
+        if self.serviceItem is not None:
+            if self.serviceItem.is_command():
+                if blanked:
+                    Receiver.send_message(u'%s_blank'% self.serviceItem.name.lower())
+                else:
+                    Receiver.send_message(u'%s_unblank'% self.serviceItem.name.lower())
         else:
             self.parent.mainDisplay.blankDisplay(blanked)
 
@@ -635,7 +634,7 @@
         if self.isLive:
             Receiver.send_message(u'%s_start' % item.name.lower(), \
                 [item.title, item.service_item_path,
-                item.get_frame_title(), slideno, self.isLive])
+                item.get_frame_title(), self.isLive])
         else:
             self.mediaObject.stop()
             self.mediaObject.clearQueue()


Follow ups