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

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

More Renderer cleanups
Fix bugs in custom where it is possible to have no slides
RenderManager not handles theme decisions correctly and allows the overrides to work.

Fix up themes so most functions work correctly. (You can even have footers at the top of the page)

Revision history for this message
Michael Gorven (mgorven) wrote :

+ if self.VerseListView.count() == 0: # must have 1 slide
+ invalid += 1
+
         if invalid == 1:
             self.valid = False

Any reason that you don't set self.valid directly instead of using invalid? If
there is a reason, please change the check to be "invalid != 0".

+ if override == u'True':

Maybe use the convertStringToBoolean() function instead.

 review approve

review: Approve
Revision history for this message
Raoul Snyman (raoul-snyman) :
review: Approve
lp:~trb143/openlp/ThemeManager2 updated
434. By Tim Bentley

Fix rendering problems and issues with CustomSlides

435. By Tim Bentley

rename bibles for gushie

436. By Tim Bentley

Missed

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'openlp/core/lib/renderer.py'
2--- openlp/core/lib/renderer.py 2009-04-28 19:20:03 +0000
3+++ openlp/core/lib/renderer.py 2009-05-01 05:02:53 +0000
4@@ -33,7 +33,7 @@
5 """All the functions for rendering a set of words onto a Device Context
6
7 How to use:
8- set the words to be displayed with a call to set_words_openlp() - this returns an array of screenfuls of data
9+ set the words to be displayed with a call to format_slide() - this returns an array of screenfuls of data
10 set a theme (if you need) with set_theme
11 tell it which DC to render to with set_DC()
12 set the borders of where you want the text (if not the whole DC) with set_text_rectangle()
13@@ -102,8 +102,7 @@
14 def format_slide(self, words, footer):
15 log.debug(u'format_slide %s', words)
16 verses=[]
17- words=words.replace(u'\r\n', u'\n')
18- verses_text = words.split(u'\n')
19+ verses_text = words.splitlines()
20 for v in verses_text:
21 lines=v.split(u'\n')
22 verses.append(self.split_set_of_lines(lines, footer)[0])
23
24=== modified file 'openlp/core/lib/rendermanager.py'
25--- openlp/core/lib/rendermanager.py 2009-04-25 06:38:21 +0000
26+++ openlp/core/lib/rendermanager.py 2009-05-01 05:02:53 +0000
27@@ -43,32 +43,41 @@
28 self.calculate_default(self.screen_list[self.current_display-1][1])
29 self.frame = None
30
31- def set_default_theme(self, theme):
32- log.debug("default theme set to %s", theme)
33- self.default_theme = self.theme_manager.getThemeData(theme)
34- self.renderer.set_theme(self.default_theme)
35-
36- self.renderer.set_text_rectangle(QtCore.QRect(10,0, self.width-1, self.height-1),
37- QtCore.QRect(10,self.footer_start, self.width-1, self.height-self.footer_start))
38-
39-
40- def set_theme(self, theme):
41- log.debug("theme set to %s", theme)
42- self.theme = theme
43- self.renderer.set_theme(self.theme)
44-
45- self.renderer.set_text_rectangle(QtCore.QRect(10,0, self.width-1, self.height-1),
46- QtCore.QRect(10,self.footer_start, self.width-1, self.height-self.footer_start))
47+ def set_override_theme(self, theme):
48+ log.debug("set override theme to %s", theme)
49+ if theme is not None:
50+ self.theme = theme
51+ else:
52+ self.theme = self.default_theme
53+ log.debug("theme is now %s", self.theme)
54+ self.themedata = self.theme_manager.getThemeData(self.theme)
55+ self.renderer.set_theme(self.themedata)
56+ self.build_text_rectangle(self.themedata)
57+
58+ def build_text_rectangle(self, theme):
59+
60+ main_rect = None
61+ footer_rect = None
62+
63 if theme.font_main_override == False:
64- pass
65+ main_rect = QtCore.QRect(10,0, self.width-1, self.height-1)
66+ else:
67+ main_rect = QtCore.QRect(int(theme.font_main_x) , int(theme.font_main_y),
68+ int(theme.font_main_width)-1, int(theme.font_main_height)-1)
69+
70 if theme.font_footer_override == False:
71- pass
72-
73- def generate_preview(self):
74+ footer_rect = QtCore.QRect(10,self.footer_start, self.width-1, self.height-self.footer_start)
75+ else:
76+ footer_rect = QtCore.QRect(int(theme.font_footer_x),int(theme.font_footer_y),
77+ int(theme.font_footer_width)-1, int(theme.font_footer_height)-1)
78+
79+ self.renderer.set_text_rectangle(main_rect,footer_rect)
80+
81+ def generate_preview(self, themedata):
82 self.calculate_default(QtCore.QSize(800,600))
83+ self.renderer.set_theme(themedata)
84
85- self.renderer.set_text_rectangle(QtCore.QRect(10,0, self.width-1, self.height-1),
86- QtCore.QRect(10,self.footer_start, self.width-1, self.height-self.footer_start))
87+ self.build_text_rectangle(themedata)
88
89 frame = QtGui.QPixmap(self.width, self.height)
90 self.renderer.set_paint_dest(frame)
91@@ -87,22 +96,12 @@
92
93 def format_slide(self, words, footer):
94 self.calculate_default(QtCore.QSize(800,600))
95-
96- self.renderer.set_text_rectangle(QtCore.QRect(10,0, self.width-1, self.height-1),
97- QtCore.QRect(10,self.footer_start, self.width-1, self.height-self.footer_start))
98-
99 return self.renderer.format_slide(words, footer)
100
101 def generate_slide(self,main_text, footer_text, preview=True):
102 if preview == True:
103 self.calculate_default(QtCore.QSize(800,600))
104
105- self.renderer.set_text_rectangle(QtCore.QRect(10,0, self.width-1, self.height-1),
106- QtCore.QRect(10,self.footer_start, self.width-1, self.height-self.footer_start))
107-
108- #frame = QtGui.QPixmap(self.width, self.height)
109- #self.renderer.set_paint_dest(frame)
110- #print main_text
111 answer=self.renderer.render_lines(main_text, footer_text)
112 return self.frame
113
114
115=== modified file 'openlp/core/lib/songxmlhandler.py'
116--- openlp/core/lib/songxmlhandler.py 2009-04-06 18:45:45 +0000
117+++ openlp/core/lib/songxmlhandler.py 2009-04-30 21:02:28 +0000
118@@ -81,6 +81,7 @@
119 iter=self.song_xml.getiterator()
120 verse_list = []
121 for element in iter:
122+ #print element.tag, element.attrib, element.text
123 if element.tag == u'verse':
124 verse_list.append([element.attrib, element.text])
125 return verse_list
126
127=== modified file 'openlp/core/lib/themexmlhandler.py'
128--- openlp/core/lib/themexmlhandler.py 2009-04-21 19:45:50 +0000
129+++ openlp/core/lib/themexmlhandler.py 2009-04-30 21:02:28 +0000
130@@ -151,11 +151,12 @@
131
132 element = self.theme_xml.createElement(u'location')
133 element.setAttribute(u'override',override)
134- if override == True:
135- element.setAttribute(u'x',str(xpos))
136- element.setAttribute(u'y',str(ypos))
137- element.setAttribute(u'width',str(width))
138- element.setAttribute(u'height',str(height))
139+
140+ if override == u'True':
141+ element.setAttribute(u'x',xpos)
142+ element.setAttribute(u'y',ypos)
143+ element.setAttribute(u'width',width)
144+ element.setAttribute(u'height',height)
145 background.appendChild(element)
146
147 def add_display(self, shadow, shadowColor, outline, outlineColor, horizontal, vertical, wrap):
148
149=== modified file 'openlp/core/ui/amendthemeform.py'
150--- openlp/core/ui/amendthemeform.py 2009-04-28 19:20:03 +0000
151+++ openlp/core/ui/amendthemeform.py 2009-04-30 21:02:28 +0000
152@@ -111,12 +111,21 @@
153 #else:
154 #newtheme.add_background_image(str(self.theme.))
155
156- new_theme.add_font(str(self.theme.font_main_name), str(self.theme.font_main_color), str(self.theme.font_main_proportion), u'False')
157- new_theme.add_font(str(self.theme.font_footer_name), str(self.theme.font_footer_color), str(self.theme.font_footer_proportion), u'False', u'footer')
158- new_theme.add_display(str(self.theme.display_shadow), str(self.theme.display_shadow_color), str(self.theme.display_outline), str(self.theme.display_outline_color),
159- str(self.theme.display_horizontalAlign), str(self.theme.display_verticalAlign), str(self.theme.display_wrapStyle))
160+ new_theme.add_font(str(self.theme.font_main_name), str(self.theme.font_main_color),
161+ str(self.theme.font_main_proportion), str(self.theme.font_main_override),u'main',
162+ str(self.theme.font_main_x), str(self.theme.font_main_y), str(self.theme.font_main_width),
163+ str(self.theme.font_main_height))
164+ new_theme.add_font(str(self.theme.font_footer_name), str(self.theme.font_footer_color),
165+ str(self.theme.font_footer_proportion), str(self.theme.font_footer_override),u'footer',
166+ str(self.theme.font_footer_x), str(self.theme.font_footer_y), str(self.theme.font_footer_width),
167+ str(self.theme.font_footer_height) )
168+ new_theme.add_display(str(self.theme.display_shadow), str(self.theme.display_shadow_color),
169+ str(self.theme.display_outline), str(self.theme.display_outline_color),
170+ str(self.theme.display_horizontalAlign), str(self.theme.display_verticalAlign),
171+ str(self.theme.display_wrapStyle))
172
173 theme = new_theme.extract_xml()
174+
175 self.thememanager.saveTheme(theme_name, theme)
176 return QtGui.QDialog.accept(self)
177
178@@ -124,6 +133,7 @@
179 self.path = path
180
181 def loadTheme(self, theme):
182+ log.debug(u'LoadTheme %s ', theme)
183 if theme == None:
184 self.theme.parse(self.baseTheme())
185 else:
186@@ -207,27 +217,24 @@
187 self.theme.font_footer_proportion = value
188 self.previewTheme(self.theme)
189
190- def onFontFooterDefaultCheckBoxChanged(self):
191- self.stateChanging(self.theme)
192- self.previewTheme(self.theme)
193
194 def onFontFooterDefaultCheckBoxChanged(self, value):
195 if value == 2: # checked
196 self.theme.font_footer_override = False
197 else:
198 self.theme.font_footer_override = True
199- if int(self.theme.font_footer_x) == 0 and int(self.theme.font_footer_y) == 0 and \
200- int(self.theme.font_footer_width) == 0 and int(self.theme.font_footer_height) == 0:
201- self.theme.font_footer_x = u'10'
202- self.theme.font_footer_y = u'730'
203- self.theme.font_footer_width = u'1024'
204- self.theme.font_footer_height = u'38'
205-
206- self.FontFooterXSpinBox.setValue(int(self.theme.font_footer_x))
207- self.FontFooterYSpinBox.setValue(int(self.theme.font_footer_y))
208- self.FontFooterWidthSpinBox.setValue(int(self.theme.font_footer_width))
209- self.FontFooterHeightSpinBox.setValue(int(self.theme.font_footer_height))
210-
211+
212+ if int(self.theme.font_footer_x) == 0 and int(self.theme.font_footer_y) == 0 and \
213+ int(self.theme.font_footer_width) == 0 and int(self.theme.font_footer_height) == 0:
214+ self.theme.font_footer_x = u'10'
215+ self.theme.font_footer_y = u'730'
216+ self.theme.font_footer_width = u'1024'
217+ self.theme.font_footer_height = u'38'
218+
219+ self.FontFooterXSpinBox.setValue(int(self.theme.font_footer_x))
220+ self.FontFooterYSpinBox.setValue(int(self.theme.font_footer_y))
221+ self.FontFooterWidthSpinBox.setValue(int(self.theme.font_footer_width))
222+ self.FontFooterHeightSpinBox.setValue(int(self.theme.font_footer_height))
223
224 self.stateChanging(self.theme)
225 self.previewTheme(self.theme)
226@@ -354,19 +361,18 @@
227 #Local Methods
228 #
229 def baseTheme(self):
230- log.debug(u'base Theme')
231+ log.debug(u'base theme created')
232 newtheme = ThemeXML()
233 newtheme.new_document(u'New Theme')
234 newtheme.add_background_solid(str(u'#000000'))
235- newtheme.add_font(str(QFont().family()), str(u'#FFFFFF'), str(30), False)
236- newtheme.add_font(str(QFont().family()), str(u'#FFFFFF'), str(12), False, u'footer')
237- newtheme.add_display(str(False), str(u'#FFFFFF'), str(False), str(u'#FFFFFF'),
238+ newtheme.add_font(str(QFont().family()), str(u'#FFFFFF'), str(30), u'False')
239+ newtheme.add_font(str(QFont().family()), str(u'#FFFFFF'), str(12), u'False', u'footer')
240+ newtheme.add_display(u'False', str(u'#FFFFFF'), u'False', str(u'#FFFFFF'),
241 str(0), str(0), str(0))
242
243 return newtheme.extract_xml()
244
245 def paintUi(self, theme):
246- print theme # leave as helpful for initial development
247 self.stateChanging(theme)
248 self.ThemeNameEdit.setText(self.theme.theme_name)
249 if self.theme.background_mode == u'opaque':
250
251=== modified file 'openlp/core/ui/servicemanager.py'
252--- openlp/core/ui/servicemanager.py 2009-04-28 19:20:03 +0000
253+++ openlp/core/ui/servicemanager.py 2009-04-30 21:02:28 +0000
254@@ -143,7 +143,7 @@
255 QtCore.SIGNAL("activated(int)"), self.onThemeComboBoxSelected)
256
257 def onThemeComboBoxSelected(self, currentIndex):
258- self.renderManager.set_default_theme(self.ThemeComboBox.currentText())
259+ self.renderManager.default_theme = self.ThemeComboBox.currentText()
260
261 def addServiceItem(self, item):
262 """Adds service item"""
263@@ -197,5 +197,5 @@
264 self.ThemeComboBox.clear()
265 for theme in theme_list:
266 self.ThemeComboBox.addItem(theme)
267- self.renderManager.set_default_theme(self.ThemeComboBox.currentText())
268+ self.renderManager.default_theme = self.ThemeComboBox.currentText()
269
270
271=== modified file 'openlp/core/ui/slidecontroller.py'
272--- openlp/core/ui/slidecontroller.py 2009-04-25 06:11:15 +0000
273+++ openlp/core/ui/slidecontroller.py 2009-04-30 21:02:28 +0000
274@@ -33,31 +33,35 @@
275 self.PaneLayout.setSpacing(50)
276 self.PaneLayout.setMargin(0)
277
278-# self.Controller = QtGui.QGraphicsView(self.Splitter)
279+ #self.VerseListView = QtGui.QListWidget(customEditDialog)
280+ #self.VerseListView.setObjectName("VerseListView")
281+ #self.horizontalLayout_4.addWidget(self.VerseListView)
282+
283 self.Controller = QtGui.QScrollArea(self.Splitter)
284 self.Controller.setWidgetResizable(True)
285+
286 self.ControllerContents = QtGui.QWidget(self.Controller)
287 self.ControllerContents.setGeometry(QtCore.QRect(0, 0, 228, 536))
288 self.Controller.setGeometry(QtCore.QRect(0, 0, 828, 536))
289+
290 self.Controller.setWidget(self.ControllerContents)
291
292- #self.Screen = QtGui.QGraphicsView(self.Splitter)
293- #self.Screen.setMaximumSize(QtCore.QSize(16777215, 250))
294-
295-
296- self.ThemePreview = QtGui.QLabel(self.Splitter)
297+ self.SlidePreview = QtGui.QLabel(self.Splitter)
298 sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
299 sizePolicy.setHorizontalStretch(0)
300 sizePolicy.setVerticalStretch(0)
301- sizePolicy.setHeightForWidth(self.ThemePreview.sizePolicy().hasHeightForWidth())
302- self.ThemePreview.setSizePolicy(sizePolicy)
303- self.ThemePreview.setMinimumSize(QtCore.QSize(250, 190))
304- self.ThemePreview.setFrameShape(QtGui.QFrame.WinPanel)
305- self.ThemePreview.setFrameShadow(QtGui.QFrame.Sunken)
306- self.ThemePreview.setLineWidth(1)
307- self.ThemePreview.setScaledContents(True)
308- self.ThemePreview.setObjectName("ThemePreview")
309-
310+ sizePolicy.setHeightForWidth(self.SlidePreview.sizePolicy().hasHeightForWidth())
311+ self.SlidePreview.setSizePolicy(sizePolicy)
312+ self.SlidePreview.setMinimumSize(QtCore.QSize(250, 190))
313+ self.SlidePreview.setFrameShape(QtGui.QFrame.WinPanel)
314+ self.SlidePreview.setFrameShadow(QtGui.QFrame.Sunken)
315+ self.SlidePreview.setLineWidth(1)
316+ self.SlidePreview.setScaledContents(True)
317+ self.SlidePreview.setObjectName("SlidePreview")
318
319 def previewFrame(self, frame):
320- self.ThemePreview.setPixmap(frame)
321+ self.SlidePreview.setPixmap(frame)
322+
323+ imageLabel = QtGui.QLabel()
324+ imageLabel.setPixmap(frame)
325+ self.Controller.setWidget(imageLabel)
326
327=== modified file 'openlp/core/ui/thememanager.py'
328--- openlp/core/ui/thememanager.py 2009-04-28 19:20:03 +0000
329+++ openlp/core/ui/thememanager.py 2009-04-29 19:07:13 +0000
330@@ -219,7 +219,6 @@
331
332 def loadThemes(self):
333 log.debug(u'Load themes from dir')
334-# self.themelist = [u'African Sunset', u'Snowy Mountains', u'Wilderness', u'Wet and Windy London']
335 for root, dirs, files in os.walk(self.path):
336 for name in files:
337 if name.endswith(u'.png'):
338@@ -232,6 +231,7 @@
339 return self.Theme_data.getList()
340
341 def getThemeData(self, themename):
342+ log.debug(u'getthemedata for theme %s', themename)
343 xml_file = os.path.join(self.path, str(themename), str(themename)+u'.xml')
344 xml = fileToXML(xml_file)
345 theme = ThemeXML()
346@@ -344,9 +344,8 @@
347 im.save(samplepathname, u'png')
348 log.debug(u'Theme image written to %s',samplepathname)
349
350- def generateImage(self, theme):
351- log.debug(u'generateImage %s ', theme)
352- self.renderManager.set_theme(theme)
353- frame = self.renderManager.generate_preview()
354+ def generateImage(self, themedata):
355+ log.debug(u'generateImage %s ', themedata)
356+ frame = self.renderManager.generate_preview(themedata)
357 return frame
358
359
360=== modified file 'openlp/plugins/bibles/lib/mediaitem.py'
361--- openlp/plugins/bibles/lib/mediaitem.py 2009-04-25 06:11:15 +0000
362+++ openlp/plugins/bibles/lib/mediaitem.py 2009-04-29 19:07:13 +0000
363@@ -355,6 +355,7 @@
364 if len(footer_lines) <= 1:
365 footer_lines.append(book)
366
367+ self.parent.render_manager.set_override_theme(None)
368 frame=self.parent.render_manager.generate_slide(main_lines, footer_lines)
369 self.parent.preview_controller.previewFrame(frame)
370
371
372=== modified file 'openlp/plugins/custom/forms/editcustomform.py'
373--- openlp/plugins/custom/forms/editcustomform.py 2009-04-07 19:03:36 +0000
374+++ openlp/plugins/custom/forms/editcustomform.py 2009-05-01 05:02:53 +0000
375@@ -80,7 +80,7 @@
376 if id != 0:
377 self.customSlide = self.custommanager.get_custom(id)
378 self.TitleEdit.setText(self.customSlide.title)
379- self.CreditEdit.setText(self.customSlide.title)
380+ self.CreditEdit.setText(self.customSlide.credits)
381
382 songXML=SongXMLParser(self.customSlide.text)
383 verseList = songXML.get_verses()
384@@ -170,5 +170,9 @@
385 self.TitleLabel.setStyleSheet('color: red')
386 else:
387 self.TitleLabel.setStyleSheet('color: black')
388+
389+ if self.VerseListView.count() == 0: # must have 1 slide
390+ invalid += 1
391+
392 if invalid == 1:
393 self.valid = False
394
395=== modified file 'openlp/plugins/custom/lib/mediaitem.py'
396--- openlp/plugins/custom/lib/mediaitem.py 2009-04-25 06:11:15 +0000
397+++ openlp/plugins/custom/lib/mediaitem.py 2009-04-30 21:02:28 +0000
398@@ -189,21 +189,29 @@
399 main_lines=[]
400 footer_lines = []
401 slide = None
402+ theme = None
403 for index in indexes:
404 id = self.CustomListData.getId(index)
405 customSlide = self.parent.custommanager.get_custom(id)
406 title = customSlide.title
407- credit = customSlide.title
408+ credit = customSlide.credits
409+ theme = customSlide.theme_name
410+ if len(theme) == 0 or theme == None:
411+ self.parent.render_manager.set_override_theme(None)
412+ else:
413+ self.parent.render_manager.set_override_theme(theme)
414
415 songXML=SongXMLParser(customSlide.text)
416 verseList = songXML.get_verses()
417 for verse in verseList:
418 slide = self.parent.render_manager.format_slide(verse[1], False)
419+ print verse
420+ print slide
421
422 footer_lines.append(title + u' '+ credit)
423-
424- frame=self.parent.render_manager.generate_slide(slide, footer_lines)
425- self.parent.preview_controller.previewFrame(frame)
426+ if slide is not None:
427+ frame=self.parent.render_manager.generate_slide(slide, footer_lines, False)
428+ self.parent.preview_controller.previewFrame(frame)
429
430 def onCustomLiveClick(self):
431 pass