From 7a05a944ef72a2cd006e5dda2dda05961350939c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 10 Jun 2009 16:54:46 +0100 Subject: [PATCH] Changes to improve performance. --- openlp/core/lib/renderer.py | 62 +++++++++++++++---------------- openlp/core/lib/rendermanager.py | 19 ++-------- openlp/core/lib/serviceitem.py | 1 + openlp/core/ui/servicemanager.py | 5 +++ openlp/core/ui/slidecontroller.py | 4 +- 5 files changed, 42 insertions(+), 49 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index f223991f6..594ad98d2 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -46,6 +46,7 @@ class Renderer: self._frame = None self._bg_frame = None self.bg_image = None + self._bg_frame_small = None def set_debug(self, debug): self._debug=debug @@ -57,7 +58,9 @@ class Renderer: log.debug(u'set theme') self._theme = theme self._bg_frame = None + self.bg_image = None self.theme_name = theme.theme_name + self._set_theme_font() if theme.background_type == u'image': if theme.background_filename is not None: self.set_bg_image(theme.background_filename) @@ -92,7 +95,7 @@ class Renderer: self._bg_frame = None log.debug(u'set frame dest (frame) w %d h %d', frame_width, frame_height) self._frame = QtGui.QPixmap(frame_width, frame_height) - if self._bg_image_filename is not None: + if self._bg_image_filename is not None and self.bg_image is None: self.scale_bg_image() if self._bg_frame is None: self._generate_background_frame() @@ -101,8 +104,7 @@ class Renderer: """ External API to sort out the text to pe placed on the frame """ - #print "########## Format Slide ##################" - log.debug(u'format_slide %s', words) + log.debug(u'format_slide - Start') verses = [] words = words.replace(u'\r\n', u'\n') verses_text = words.split(u'\n\n') @@ -112,8 +114,7 @@ class Renderer: for line in lines: text.append(line) split_text = self._split_set_of_lines(text, False) - #print "split text ", split_text - #print "text ", text + log.debug(u'format_slide - End') return split_text def set_text_rectangle(self, rect_main, rect_footer): @@ -133,12 +134,14 @@ class Renderer: bbox = self._render_lines_unaligned(lines, False) if footer_lines is not None: bbox1 = self._render_lines_unaligned(footer_lines, True) - # reset the frame. first time do not worrk about what you paint on. - self._frame = QtGui.QPixmap(self._bg_frame) + # reset the frame. first time do not worry about what you paint on. + self._frame = QtGui.QPixmap(self._frame.width(), self._frame.height()) #(self._bg_frame) + self._frame.fill(QtCore.Qt.transparent) x, y = self._correctAlignment(self._rect, bbox) bbox = self._render_lines_unaligned(lines, False, (x, y)) if footer_lines is not None: bbox = self._render_lines_unaligned(footer_lines, True, (self._rect_footer.left(), self._rect_footer.top()) ) + log.debug(u'generate_frame_from_lines - Finish') return self._frame def _generate_background_frame(self): @@ -148,7 +151,7 @@ class Renderer: """ assert(self._theme) self._bg_frame = QtGui.QPixmap(self._frame.width(), self._frame.height()) - log.debug(u'render background %s ', self._theme.background_type) + log.debug(u'render background %s start', self._theme.background_type) painter = QtGui.QPainter() painter.begin(self._bg_frame) if self._theme.background_type == u'solid': @@ -177,12 +180,15 @@ class Renderer: rectPath.lineTo(max_x, 0) rectPath.closeSubpath() painter.drawPath(rectPath) - elif self._theme.background_type== u'image': # image + elif self._theme.background_type== u'image': if self.bg_image is not None: painter.drawPixmap(0 ,0 , self.bg_image) else: painter.fillRect(self._frame.rect(), QtGui.QColor(u'#000000')) painter.end() + self._bg_frame_small = self._bg_frame.scaled(QtCore.QSize(280, 210), QtCore.Qt.KeepAspectRatio, + QtCore.Qt.SmoothTransformation) + log.debug(u'render background End') def _split_set_of_lines(self, lines, footer): """ @@ -193,10 +199,8 @@ class Renderer: Returns a list of [lists of lines], one set for each screenful """ bboxes = [] - #print "lines ", lines for line in lines: bboxes.append(self._render_and_wrap_single_line(line, footer)) - #print "bboxes ", bboxes numlines = len(lines) bottom = self._rect.bottom() for ratio in (numlines, numlines/2, numlines/3, numlines/4): @@ -206,9 +210,7 @@ class Renderer: while (endline <= numlines and endline != 0): by = 0 for (x,y) in bboxes[startline:endline]: - #print by, startline, endline, x, y, bottom by += y - #print "by ", by , bottom, startline, endline, numlines, ratio if by > bottom: good = 0 break @@ -218,20 +220,17 @@ class Renderer: break retval = [] numlines_per_page = ratio - #print "good ", good, ratio if good: c = 0 thislines = [] while c < numlines: thislines.append(lines[c]) c += 1 - #print "c ", c, len(thislines), numlines_per_page, thislines if len(thislines) == numlines_per_page: retval.append(thislines) thislines = [] if len(thislines) > 0: retval.append(thislines) - #print "extra ", thislines else: # print "Just split where you can" retval = [] @@ -248,7 +247,6 @@ class Renderer: endline = startline by = 0 endline += 1 - #print "retval ", retval return retval def _correctAlignment(self, rect, bbox): @@ -271,7 +269,6 @@ class Renderer: than a screenful (eg. by using split_set_of_lines) Returns the bounding box of the text as QRect """ - log.debug(u'render lines unaligned Start') x, y = tlcorner brx = x bry = y @@ -298,7 +295,6 @@ class Renderer: right-aligns the surplus words in the manner of song lyrics Returns the bottom-right corner (of what was rendered) as a tuple(x, y). """ - #log.debug(u'Render single line %s @ %s '%( line, tlcorner)) x, y = tlcorner # We draw the text to see how big it is and then iterate to make it fit # when we line wrap we do in in the "lyrics" style, so the second line is @@ -392,7 +388,18 @@ class Renderer: brcorner = (rightextent , y) return brcorner - # xxx this is what to override for an SDL version + def _set_theme_font(self): + self.footerFont = QtGui.QFont(self._theme.font_footer_name, + int(self._theme.font_footer_proportion), # size + QtGui.QFont.Normal, # weight + 0)# italic + self.footerFont.setPixelSize(int(self._theme.font_footer_proportion)) + self.mainFont = QtGui.QFont(self._theme.font_main_name, + int(self._theme.font_main_proportion), # size + QtGui.QFont.Normal, # weight + 0)# italic + self.mainFont.setPixelSize(int(self._theme.font_main_proportion)) + def _get_extent_and_render(self, line, footer, tlcorner=(0,0), draw=False, color=None): """ Find bounding box of text - as render_single_line. @@ -400,23 +407,14 @@ class Renderer: return width and height of text as a tuple (w,h) """ # setup defaults - #log.debug(u'_get_extent_and_render %s %s %s ', [line], tlcorner, draw) painter = QtGui.QPainter() painter.begin(self._frame) # 'twould be more efficient to set this once when theme changes # or p changes if footer : - font = QtGui.QFont(self._theme.font_footer_name, - int(self._theme.font_footer_proportion), # size - QtGui.QFont.Normal, # weight - 0)# italic - font.setPixelSize(int(self._theme.font_footer_proportion)) + font = self.footerFont else: - font = QtGui.QFont(self._theme.font_main_name, - int(self._theme.font_main_proportion), # size - QtGui.QFont.Normal, # weight - 0)# italic - font.setPixelSize(int(self._theme.font_main_proportion)) + font = self.mainFont painter.setFont(font) if color == None: if footer: @@ -426,7 +424,7 @@ class Renderer: else: painter.setPen(QtGui.QColor(color)) x, y = tlcorner - metrics=QtGui.QFontMetrics(font) + metrics = QtGui.QFontMetrics(font) # xxx some fudges to make it exactly like wx! Take 'em out later w = metrics.width(line) h = metrics.height() - 2 diff --git a/openlp/core/lib/rendermanager.py b/openlp/core/lib/rendermanager.py index acc483be3..8d822440d 100644 --- a/openlp/core/lib/rendermanager.py +++ b/openlp/core/lib/rendermanager.py @@ -70,6 +70,7 @@ class RenderManager: """ Updates the render manager's information about the current screen. """ + log.debug(u'Update Display') if self.current_display != screen_number: self.current_display = screen_number self.calculate_default(self.screen_list[self.current_display]['size']) @@ -100,7 +101,6 @@ class RenderManager: self.theme = self.service_theme else: self.theme = self.global_theme - if self.theme is not self.renderer.theme_name: log.debug(u'theme is now %s', self.theme) self.themedata = self.theme_manager.getThemeData(self.theme) @@ -112,19 +112,16 @@ class RenderManager: log.debug(u'build_text_rectangle ') main_rect = None footer_rect = None - if theme.font_main_override == False: main_rect = QtCore.QRect(10,0, self.width-1, self.height-1) else: main_rect = QtCore.QRect(int(theme.font_main_x) , int(theme.font_main_y), int(theme.font_main_width)-1, int(theme.font_main_height)-1) - if theme.font_footer_override == False: footer_rect = QtCore.QRect(10,self.footer_start, self.width-1, self.height-self.footer_start) else: footer_rect = QtCore.QRect(int(theme.font_footer_x),int(theme.font_footer_y), int(theme.font_footer_width)-1, int(theme.font_footer_height)-1) - self.renderer.set_text_rectangle(main_rect,footer_rect) def generate_preview(self, themedata): @@ -132,9 +129,7 @@ class RenderManager: self.calculate_default(QtCore.QSize(1024, 768)) self.renderer.set_theme(themedata) self.build_text_rectangle(themedata) - self.renderer.set_frame_dest(self.width, self.height, True) - lines = [] lines.append(u'Amazing Grace!') lines.append(u'How sweet the sound') @@ -165,15 +160,7 @@ class RenderManager: log.debug(u'calculate default %s' , screen) self.width = screen.width() self.height = screen.height() + self.width = 1024 + self.height = 768 log.debug(u'calculate default %d,%d' , self.width, self.height) self.footer_start = int(self.height*0.90) # 90% is start of footer - - def snoop_Image(self, image, image2=None): - """ - Debugging method to allow images to be viewed - """ - im = image.toImage() - im.save("renderer.png", "png") - if image2 is not None: - im = image2.toImage() - im.save("renderer2.png", "png") diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index b885e7382..922a09fe1 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -66,6 +66,7 @@ class ServiceItem(): else: self.RenderManager.set_override_theme(self.theme) log.debug(u'Formatting slides') + self.frames = [] if self.service_item_type == u'text': for slide in self.service_frames: formated = self.RenderManager.format_slide(slide[u'raw_slide']) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index f7f8da55b..618409e62 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -184,6 +184,11 @@ class ServiceManager(QtGui.QWidget): self.service_theme = self.ThemeComboBox.currentText() self.parent.RenderManager.set_service_theme(self.service_theme) self.config.set_config(u'theme service theme', self.service_theme) + if len(self.serviceItems) > 0: + tempServiceItems = self.serviceItems + self.onNewService() + for item in tempServiceItems: + self.addServiceItem(item[u'data']) def addServiceItem(self, item, expand=True): """ diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 3f872a9c4..f4abfd746 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -56,7 +56,7 @@ class SlideData(QtCore.QAbstractListModel): frame1 = frame.scaled(QtCore.QSize(280, 210), QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) self.items.insert(row, (frame1, framenumber)) - log.info(u'Items: %s' % self.items) + log.info(u'Item loaded') self.endInsertRows() def removeRow(self, row): @@ -133,6 +133,8 @@ class SlideController(QtGui.QWidget): self.ControllerLayout.setMargin(0) # Controller list view self.PreviewListView = QtGui.QListView(self.Controller) + self.PreviewListView.setUniformItemSizes(True) + self.PreviewListView.setIconSize(QtCore.QSize(250, 190)) self.PreviewListData = SlideData() self.PreviewListView.isLive = self.isLive #self.PreviewListView.setFlow(1)