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()
_______________________________________________ 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