Merge lp:~trb143/openlp/bugfixes into lp:openlp

Proposed by Tim Bentley
Status: Merged
Merged at revision: not available
Proposed branch: lp:~trb143/openlp/bugfixes
Merge into: lp:openlp
Diff against target: None lines
To merge this branch: bzr merge lp:~trb143/openlp/bugfixes
Reviewer Review Type Date Requested Status
Raoul Snyman Approve
Review via email: mp+11821@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Tim Bentley (trb143) wrote :

Revamped the rendering to do it when required.
No caching so memory usable will be reduced.
Handles different themes on preview and live at same time.

Revision history for this message
Raoul Snyman (raoul-snyman) wrote :

Needs some ui tweaking, but that's fine, we can work on it.

review: Approve
lp:~trb143/openlp/bugfixes updated
543. By Tim Bentley

Renderer handling changes

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'openlp/core/lib/renderer.py'
--- openlp/core/lib/renderer.py 2009-09-13 07:39:48 +0000
+++ openlp/core/lib/renderer.py 2009-09-15 19:06:40 +0000
@@ -51,9 +51,9 @@
51 self._theme = None51 self._theme = None
52 self._bg_image_filename = None52 self._bg_image_filename = None
53 self._frame = None53 self._frame = None
54 self._bg_frame = None54 self.bg_frame = None
55 self.bg_image = None55 self.bg_image = None
56 self._bg_frame_small = None56 #self.bg_frame_small = None
5757
58 def set_debug(self, debug):58 def set_debug(self, debug):
59 """59 """
@@ -73,7 +73,7 @@
73 """73 """
74 log.debug(u'set theme')74 log.debug(u'set theme')
75 self._theme = theme75 self._theme = theme
76 self._bg_frame = None76 self.bg_frame = None
77 self.bg_image = None77 self.bg_image = None
78 self.theme_name = theme.theme_name78 self.theme_name = theme.theme_name
79 self._set_theme_font()79 self._set_theme_font()
@@ -131,14 +131,14 @@
131 Defaults to *False*. Whether or not to generate a preview.131 Defaults to *False*. Whether or not to generate a preview.
132 """132 """
133 if preview == True:133 if preview == True:
134 self._bg_frame = None134 self.bg_frame = None
135 log.debug(u'set frame dest (frame) w %d h %d', frame_width,135 log.debug(u'set frame dest (frame) w %d h %d', frame_width,
136 frame_height)136 frame_height)
137 self._frame = QtGui.QImage(frame_width, frame_height,137 self._frame = QtGui.QImage(frame_width, frame_height,
138 QtGui.QImage.Format_ARGB32_Premultiplied)138 QtGui.QImage.Format_ARGB32_Premultiplied)
139 if self._bg_image_filename is not None and self.bg_image is None:139 if self._bg_image_filename is not None and self.bg_image is None:
140 self.scale_bg_image()140 self.scale_bg_image()
141 if self._bg_frame is None:141 if self.bg_frame is None:
142 self._generate_background_frame()142 self._generate_background_frame()
143143
144 def format_slide(self, words, footer):144 def format_slide(self, words, footer):
@@ -257,7 +257,7 @@
257 if footer_lines is not None:257 if footer_lines is not None:
258 bbox1 = self._render_lines_unaligned(footer_lines, True)258 bbox1 = self._render_lines_unaligned(footer_lines, True)
259 # reset the frame. first time do not worry about what you paint on.259 # reset the frame. first time do not worry about what you paint on.
260 self._frame = QtGui.QImage(self._bg_frame)260 self._frame = QtGui.QImage(self.bg_frame)
261 x, y = self._correctAlignment(self._rect, bbox)261 x, y = self._correctAlignment(self._rect, bbox)
262 bbox = self._render_lines_unaligned(lines, False, (x, y), True)262 bbox = self._render_lines_unaligned(lines, False, (x, y), True)
263 if footer_lines is not None:263 if footer_lines is not None:
@@ -272,11 +272,11 @@
272 Results are cached for performance reasons.272 Results are cached for performance reasons.
273 """273 """
274 assert(self._theme)274 assert(self._theme)
275 self._bg_frame = QtGui.QImage(self._frame.width(), self._frame.height(),275 self.bg_frame = QtGui.QImage(self._frame.width(), self._frame.height(),
276 QtGui.QImage.Format_ARGB32_Premultiplied)276 QtGui.QImage.Format_ARGB32_Premultiplied)
277 log.debug(u'render background %s start', self._theme.background_type)277 log.debug(u'render background %s start', self._theme.background_type)
278 painter = QtGui.QPainter()278 painter = QtGui.QPainter()
279 painter.begin(self._bg_frame)279 painter.begin(self.bg_frame)
280 if self._theme.background_mode == u'transparent':280 if self._theme.background_mode == u'transparent':
281 painter.fillRect(self._frame.rect(), QtCore.Qt.transparent)281 painter.fillRect(self._frame.rect(), QtCore.Qt.transparent)
282 else:282 else:
@@ -321,8 +321,8 @@
321 if self.bg_image is not None:321 if self.bg_image is not None:
322 painter.drawImage(0, 0, self.bg_image)322 painter.drawImage(0, 0, self.bg_image)
323 painter.end()323 painter.end()
324 self._bg_frame_small = self._bg_frame.scaled(QtCore.QSize(280, 210),324# self.bg_frame_small = self.bg_frame.scaled(QtCore.QSize(280, 210),
325 QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)325# QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
326 log.debug(u'render background End')326 log.debug(u'render background End')
327327
328 def _correctAlignment(self, rect, bbox):328 def _correctAlignment(self, rect, bbox):
329329
=== modified file 'openlp/core/lib/serviceitem.py'
--- openlp/core/lib/serviceitem.py 2009-09-13 07:39:48 +0000
+++ openlp/core/lib/serviceitem.py 2009-09-15 19:06:40 +0000
@@ -61,14 +61,11 @@
61 self.items = []61 self.items = []
62 self.iconic_representation = None62 self.iconic_representation = None
63 self.raw_slides = None63 self.raw_slides = None
64 self.frame_titles = []
65 self.command_files = []
66 self.frames = []64 self.frames = []
67 self.raw_footer = None65 self.raw_footer = None
68 self.theme = None66 self.theme = None
69 self.service_item_path = None67 self.service_item_path = None
70 self.service_item_type = None68 self.service_item_type = None
71 #log.debug(u'Service item created for %s ', self.shortname)
72 self.service_frames = []69 self.service_frames = []
7370
74 def addIcon(self, icon):71 def addIcon(self, icon):
@@ -95,12 +92,19 @@
95 self.RenderManager.set_override_theme(None)92 self.RenderManager.set_override_theme(None)
96 else:93 else:
97 self.RenderManager.set_override_theme(self.theme)94 self.RenderManager.set_override_theme(self.theme)
95 firstTime = True
98 for slide in self.service_frames:96 for slide in self.service_frames:
99 formated = self.RenderManager.format_slide(slide[u'raw_slide'])97 formated = self.RenderManager.format_slide(slide[u'raw_slide'])
100 for format in formated:98 for format in formated:
101 frame = self.RenderManager.generate_slide(format,99 frame = None
102 self.raw_footer)100 if firstTime:
103 self.frames.append({u'title': slide[u'title'],101 frame = self.RenderManager.generate_slide(format,
102 self.raw_footer)
103 firstTime = False
104 lines = u''
105 for line in format:
106 lines += line + u'\n'
107 self.frames.append({u'title': slide[u'title'],u'text':lines,
104 u'image': frame})108 u'image': frame})
105 elif self.service_item_type == ServiceType.Command:109 elif self.service_item_type == ServiceType.Command:
106 self.frames = self.service_frames110 self.frames = self.service_frames
@@ -112,6 +116,17 @@
112 else:116 else:
113 log.error(u'Invalid value renderer :%s' % self.service_item_type)117 log.error(u'Invalid value renderer :%s' % self.service_item_type)
114118
119 def render_individual(self, row):
120 log.debug(u'render individual')
121 if self.theme == None:
122 self.RenderManager.set_override_theme(None)
123 else:
124 self.RenderManager.set_override_theme(self.theme)
125 format = self.frames[row][u'text'].split(u'\n')
126 frame = self.RenderManager.generate_slide(format,
127 self.raw_footer)
128 return frame
129
115 def add_from_image(self, path, frame_title, image):130 def add_from_image(self, path, frame_title, image):
116 """131 """
117 Add an image slide to the service item.132 Add an image slide to the service item.
@@ -127,7 +142,7 @@
127 """142 """
128 self.service_item_type = ServiceType.Image143 self.service_item_type = ServiceType.Image
129 self.service_item_path = path144 self.service_item_path = path
130 self.service_frames.append({u'title': frame_title, u'image': image})145 self.service_frames.append({u'title': frame_title, u'text':None, u'image': image})
131146
132 def add_from_text(self, frame_title, raw_slide):147 def add_from_text(self, frame_title, raw_slide):
133 """148 """
134149
=== modified file 'openlp/core/ui/slidecontroller.py'
--- openlp/core/ui/slidecontroller.py 2009-09-14 19:36:50 +0000
+++ openlp/core/ui/slidecontroller.py 2009-09-15 19:06:40 +0000
@@ -166,7 +166,7 @@
166 self.Toolbar.setSizePolicy(sizeToolbarPolicy)166 self.Toolbar.setSizePolicy(sizeToolbarPolicy)
167 # Screen preview area167 # Screen preview area
168 self.PreviewFrame = QtGui.QFrame(self.Splitter)168 self.PreviewFrame = QtGui.QFrame(self.Splitter)
169 self.PreviewFrame.setGeometry(QtCore.QRect(0, 0, self.settingsmanager.slidecontroller_image, 225))169 self.PreviewFrame.setGeometry(QtCore.QRect(0, 0, 300, 225))
170 self.PreviewFrame.setSizePolicy(QtGui.QSizePolicy(170 self.PreviewFrame.setSizePolicy(QtGui.QSizePolicy(
171 QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum))171 QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum))
172 self.PreviewFrame.setFrameShape(QtGui.QFrame.StyledPanel)172 self.PreviewFrame.setFrameShape(QtGui.QFrame.StyledPanel)
@@ -293,12 +293,15 @@
293 self.PreviewListWidget.setColumnWidth(0, slide_width)293 self.PreviewListWidget.setColumnWidth(0, slide_width)
294 for framenumber, frame in enumerate(self.serviceitem.frames):294 for framenumber, frame in enumerate(self.serviceitem.frames):
295 self.PreviewListWidget.setRowCount(self.PreviewListWidget.rowCount() + 1)295 self.PreviewListWidget.setRowCount(self.PreviewListWidget.rowCount() + 1)
296 pixmap = self.parent.RenderManager.resize_image(frame[u'image'], slide_width, slide_height)
297 item = QtGui.QTableWidgetItem()296 item = QtGui.QTableWidgetItem()
298 label = QtGui.QLabel()297 label = QtGui.QLabel()
299 label.setMargin(8)298 label.setMargin(8)
300 label.setScaledContents(True)299 if frame[u'text'] == None:
301 label.setPixmap(QtGui.QPixmap.fromImage(pixmap))300 pixmap = self.parent.RenderManager.resize_image(frame[u'image'], slide_width, slide_height)
301 label.setScaledContents(True)
302 label.setPixmap(QtGui.QPixmap.fromImage(pixmap))
303 else:
304 label.setText(frame[u'text'])
302 self.PreviewListWidget.setCellWidget(framenumber, 0, label)305 self.PreviewListWidget.setCellWidget(framenumber, 0, label)
303 self.PreviewListWidget.setItem(framenumber, 0, item)306 self.PreviewListWidget.setItem(framenumber, 0, item)
304 self.PreviewListWidget.setRowHeight(framenumber, slide_height)307 self.PreviewListWidget.setRowHeight(framenumber, slide_height)
@@ -335,9 +338,12 @@
335 row = self.PreviewListWidget.currentRow()338 row = self.PreviewListWidget.currentRow()
336 if row > -1 and row < self.PreviewListWidget.rowCount():339 if row > -1 and row < self.PreviewListWidget.rowCount():
337 label = self.PreviewListWidget.cellWidget(row, 0)340 label = self.PreviewListWidget.cellWidget(row, 0)
338 smallframe = label.pixmap()
339 frame = self.serviceitem.frames[row][u'image']341 frame = self.serviceitem.frames[row][u'image']
340 self.SlidePreview.setPixmap(smallframe)342 before = time.time()
343 if frame == None:
344 frame = self.serviceitem.render_individual(row)
345 self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame))
346 log.info(u'Slide Rendering took %4s' % (time.time() - before))
341 if self.isLive:347 if self.isLive:
342 self.parent.mainDisplay.frameView(frame)348 self.parent.mainDisplay.frameView(frame)
343349
@@ -390,7 +396,7 @@
390 def timerEvent(self, event):396 def timerEvent(self, event):
391 if event.timerId() == self.timer_id:397 if event.timerId() == self.timer_id:
392 self.onSlideSelectedNext()398 self.onSlideSelectedNext()
393 399
394 def onGoLive(self):400 def onGoLive(self):
395 row = self.PreviewListWidget.currentRow()401 row = self.PreviewListWidget.currentRow()
396 if row > -1 and row < self.PreviewListWidget.rowCount():402 if row > -1 and row < self.PreviewListWidget.rowCount():