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+11001@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Tim Bentley (trb143) wrote :

Various fixes all over the shop.
Plugins now work with nothing selected
ServiceManager saves and Loads presentations
Blank lines work in songs.
Logging is more configurable

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

Various changes see loog for details

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'openlp.pyw'
2--- openlp.pyw 2009-08-24 04:30:04 +0000
3+++ openlp.pyw 2009-09-01 05:17:32 +0000
4@@ -20,7 +20,8 @@
5 """
6
7 import sys
8-import logging
9+import logging, logging.handlers
10+from optparse import OptionParser
11
12 from PyQt4 import QtCore, QtGui
13
14@@ -28,9 +29,15 @@
15 from openlp.core.resources import *
16 from openlp.core.ui import MainWindow, SplashScreen
17
18-logging.basicConfig(level=logging.DEBUG,
19- format=u'%(asctime)s:%(msecs)3d %(name)-15s %(levelname)-8s %(message)s',
20- datefmt=u'%m-%d %H:%M:%S', filename=u'openlp.log', filemode=u'w')
21+filename=u'openlp.log'
22+log = logging.getLogger()
23+log.setLevel(logging.INFO)
24+
25+logfile = logging.handlers.RotatingFileHandler(filename ,maxBytes=200000, backupCount=5)
26+logfile.setLevel(logging.DEBUG)
27+logfile.setFormatter(logging.Formatter(u'%(asctime)s %(name)-15s %(levelname)-8s %(message)s'))
28+
29+log.addHandler(logfile)
30
31 class OpenLP(QtGui.QApplication):
32 """
33@@ -38,8 +45,7 @@
34 class in order to provide the core of the application.
35 """
36 global log
37- log = logging.getLogger(u'OpenLP Application')
38- log.info(u'Application Loaded')
39+ log.info(u'OpenLP Application Loaded')
40
41 def run(self):
42 """
43@@ -74,10 +80,19 @@
44 self.splash.finish(self.mainWindow)
45 sys.exit(app.exec_())
46
47+def main():
48+ usage = "usage: %prog [options] arg1 arg2"
49+ parser = OptionParser(usage=usage)
50+ parser.add_option("-d", "--debug",dest="debug",action="store_true",
51+ help="Switch on Debugging ")
52+ (options, args) = parser.parse_args()
53+ if options.debug is not None:
54+ log.setLevel(logging.DEBUG)
55 if __name__ == u'__main__':
56 """
57 Instantiate and run the application.
58 """
59+ main()
60 app = OpenLP(sys.argv)
61 #import cProfile
62 #cProfile.run("app.run()", "profile.out")
63
64=== modified file 'openlp/core/lib/__init__.py'
65--- openlp/core/lib/__init__.py 2009-08-26 05:00:19 +0000
66+++ openlp/core/lib/__init__.py 2009-08-27 05:17:20 +0000
67@@ -66,6 +66,7 @@
68 from xmlrootclass import XmlRootClass
69 from serviceitem import ServiceItem
70 from eventreceiver import Receiver
71+from serviceitem import ServiceType
72 from serviceitem import ServiceItem
73 from toolbar import OpenLPToolbar
74 from songxmlhandler import SongXMLBuilder
75
76=== modified file 'openlp/core/lib/eventreceiver.py'
77--- openlp/core/lib/eventreceiver.py 2009-08-26 05:00:19 +0000
78+++ openlp/core/lib/eventreceiver.py 2009-08-29 07:17:56 +0000
79@@ -29,27 +29,31 @@
80
81 ``stop_import``
82 Stops the Bible Import
83+
84 ``pre_load_bibles``
85 Triggers the plugin to relaod the bible lists
86+
87 ``process_events``
88 Requests the Application to flush the events queue
89- ``{preview|live}_slide_first``
90- display the first slide on the list
91- ``{preview|live}_slide_previous``
92- display the previous slide on the list
93- ``{preview|live}_slide_next``
94- display the next slide on the list
95- ``{preview|live}_slide_last``
96- display the last slide on the list
97+
98 ``{plugin}_add_service_item ``
99 ask the plugin to push the selected items to the service item
100+
101 ``update_themes ``
102 send out message with new themes
103+
104 ``update_global_theme ``
105 Tell the components we have a new global theme
106+
107 ``load_song_list``
108 Tells the the song plugin to reload the song list
109
110+ ``update_spin_delay``
111+ Pushes out the Image loop delay
112+
113+ ``request_spin_delay``
114+ Requests a spin delay
115+
116 """
117 global log
118 log = logging.getLogger(u'EventReceiver')
119
120=== modified file 'openlp/core/lib/mediamanageritem.py'
121--- openlp/core/lib/mediamanageritem.py 2009-07-08 16:40:42 +0000
122+++ openlp/core/lib/mediamanageritem.py 2009-08-31 21:53:35 +0000
123@@ -234,17 +234,20 @@
124 def onPreviewClick(self):
125 log.debug(self.PluginTextShort+u' Preview Requested')
126 service_item = self.buildServiceItem()
127- self.parent.preview_controller.addServiceItem(service_item)
128+ if service_item is not None:
129+ self.parent.preview_controller.addServiceItem(service_item)
130
131 def onLiveClick(self):
132 log.debug(self.PluginTextShort + u' Live Requested')
133 service_item = self.buildServiceItem()
134- self.parent.live_controller.addServiceItem(service_item)
135+ if service_item is not None:
136+ self.parent.live_controller.addServiceItem(service_item)
137
138 def onAddClick(self):
139 log.debug(self.PluginTextShort+u' Add Requested')
140 service_item = self.buildServiceItem()
141- self.parent.service_manager.addServiceItem(service_item)
142+ if service_item is not None:
143+ self.parent.service_manager.addServiceItem(service_item)
144
145 def buildServiceItem(self):
146 """
147@@ -252,6 +255,8 @@
148 """
149 service_item = ServiceItem(self.parent)
150 service_item.addIcon(u':/media/media_'+self.PluginTextShort.lower()+u'.png')
151- self.generateSlideData(service_item)
152- self.ListView.clearSelection()
153- return service_item
154+ if self.generateSlideData(service_item):
155+ self.ListView.clearSelection()
156+ return service_item
157+ else:
158+ return None
159
160=== modified file 'openlp/core/lib/renderer.py'
161--- openlp/core/lib/renderer.py 2009-08-09 18:38:44 +0000
162+++ openlp/core/lib/renderer.py 2009-08-31 06:53:55 +0000
163@@ -147,7 +147,8 @@
164 # print words
165 verses = []
166 words = words.replace(u'\r\n', u'\n')
167- verses_text = words.split(u'\n\n')
168+ verses_text = words.split(u'\n')
169+ #print verses_text
170 text = []
171 for verse in verses_text:
172 lines = verse.split(u'\n')
173@@ -173,7 +174,10 @@
174 split_lines = []
175 count = 0
176 for line in text:
177-# print "C", line , len(line)
178+ #print "C", line , len(line)
179+ #Must be a blank line so keep it.
180+ if len(line) == 0:
181+ line = u' '
182 while len(line) > 0:
183 # print "C1", line , len(line)
184 if len(line) > ave_line_width:
185@@ -391,29 +395,8 @@
186 Defaults to *False*. Whether or not this is a live screen.
187 """
188 x, y = tlcorner
189- # We draw the text to see how big it is and then iterate to make it fit
190- # when we line wrap we do in in the "lyrics" style, so the second line is
191- # right aligned with a "hanging indent"
192- #print "----------------------------"
193- #print line
194-# words = line.split(u' ')
195-# thisline = u' '.join(words)
196-# lastword = len(words)
197-# lines = []
198 maxx = self._rect.width();
199 maxy = self._rect.height();
200-# while (len(words) > 0):
201-# w , h = self._get_extent_and_render(thisline, footer)
202-# print "m", w, h, x, maxx
203-# rhs = w + x
204-# if rhs < maxx - self._right_margin:
205-# lines.append(thisline)
206-# words = words[lastword:]
207-# thisline = ' '.join(words)
208-# lastword = len(words)
209-# else:
210-# lastword -= 1
211-# thisline = ' '.join(words[:lastword])
212 lines = []
213 lines.append(line)
214 startx = x
215
216=== modified file 'openlp/core/lib/rendermanager.py'
217--- openlp/core/lib/rendermanager.py 2009-07-23 20:20:49 +0000
218+++ openlp/core/lib/rendermanager.py 2009-08-31 06:53:55 +0000
219@@ -58,7 +58,7 @@
220 else:
221 self.current_display = screen_number
222 self.renderer = Renderer()
223- self.calculate_default(self.screen_list[self.current_display][u'size'])
224+ #self.calculate_default(self.screen_list[self.current_display][u'size'])
225 self.theme = u''
226 self.service_theme = u''
227 self.global_style = u''
228@@ -133,6 +133,7 @@
229 def build_text_rectangle(self, theme):
230 """
231 Builds a text block using the settings in ``theme``.
232+ One is needed per slide
233
234 ``theme``
235 The theme to build a text block for.
236@@ -149,8 +150,8 @@
237 footer_rect = QtCore.QRect(10,self.footer_start, self.width - 1, self.height-self.footer_start)
238 else:
239 footer_rect = QtCore.QRect(int(theme.font_footer_x),int(theme.font_footer_y),
240- int(theme.font_footer_width)-1, int(theme.font_footer_height)-1)
241- self.renderer.set_text_rectangle(main_rect,footer_rect)
242+ int(theme.font_footer_width)-1, int(theme.font_footer_height) - 1)
243+ self.renderer.set_text_rectangle(main_rect, footer_rect)
244
245 def generate_preview(self, themedata):
246 """
247@@ -178,15 +179,15 @@
248
249 def format_slide(self, words):
250 """
251- Calculate how much text can fid on a slide.
252+ Calculate how much text can fit on a slide.
253
254 ``words``
255 The words to go on the slides.
256 """
257 log.debug(u'format slide')
258- self.calculate_default(self.screen_list[self.current_display][u'size'])
259+ #self.calculate_default(self.screen_list[self.current_display][u'size'])
260 self.build_text_rectangle(self.themedata)
261- self.renderer.set_frame_dest(self.width, self.height)
262+ #self.renderer.set_frame_dest(self.width, self.height)
263 return self.renderer.format_slide(words, False)
264
265 def generate_slide(self, main_text, footer_text):
266@@ -200,7 +201,6 @@
267 The text for the slide footer.
268 """
269 log.debug(u'generate slide')
270- self.calculate_default(self.screen_list[self.current_display][u'size'])
271 self.build_text_rectangle(self.themedata)
272 self.renderer.set_frame_dest(self.width, self.height)
273 return self.renderer.generate_frame_from_lines(main_text, footer_text)
274@@ -233,6 +233,7 @@
275 The QWidget instance of the screen.
276 """
277 log.debug(u'calculate default %s', screen)
278+ #size fixed so reflects the preview size.
279 if self.current_display == 0:
280 self.width = 1024
281 self.height = 768
282
283=== modified file 'openlp/core/lib/serviceitem.py'
284--- openlp/core/lib/serviceitem.py 2009-07-10 13:16:15 +0000
285+++ openlp/core/lib/serviceitem.py 2009-08-31 18:27:36 +0000
286@@ -25,6 +25,11 @@
287
288 from openlp.core.lib import buildIcon
289
290+class ServiceType(object):
291+ Text = 1
292+ Image = 2
293+ Command = 3
294+
295 class ServiceItem(object):
296 """
297 The service item is a base class for the plugins to use to interact with
298@@ -83,22 +88,18 @@
299 self.RenderManager.set_override_theme(self.theme)
300 log.debug(u'Formatting slides')
301 self.frames = []
302- if self.service_item_type == u'text':
303+ if self.service_item_type == ServiceType.Text:
304 for slide in self.service_frames:
305 formated = self.RenderManager.format_slide(slide[u'raw_slide'])
306 for format in formated:
307 frame = self.RenderManager.generate_slide(format, self.raw_footer)
308 self.frames.append({u'title': slide[u'title'], u'image': frame})
309- elif self.service_item_type == u'command':
310+ elif self.service_item_type == ServiceType.Command:
311 self.frames = self.service_frames
312- self.service_frames = []
313- elif self.service_item_type == u'image':
314- #print "image"
315- #print self.service_frames
316+ elif self.service_item_type == ServiceType.Image:
317 for slide in self.service_frames:
318 slide[u'image'] = self.RenderManager.resize_image(slide[u'image'])
319 self.frames = self.service_frames
320- #self.service_frames = []
321 else:
322 log.error(u'Invalid value renderer :%s' % self.service_item_type)
323
324@@ -115,7 +116,7 @@
325 ``image``
326 The actual image file name.
327 """
328- self.service_item_type = u'image'
329+ self.service_item_type = ServiceType.Image
330 self.service_item_path = path
331 self.service_frames.append({u'title': frame_title, u'image': image})
332
333@@ -129,11 +130,11 @@
334 ``raw_slide``
335 The raw text of the slide.
336 """
337- self.service_item_type = u'text'
338+ self.service_item_type = ServiceType.Text
339 frame_title = frame_title.split(u'\n')[0]
340 self.service_frames.append({u'title': frame_title, u'raw_slide': raw_slide})
341
342- def add_from_command(self, frame_title, command):
343+ def add_from_command(self, path , frame_title):
344 """
345 Add a slide from a command.
346
347@@ -143,8 +144,9 @@
348 ``command``
349 The command of/for the slide.
350 """
351- self.service_item_type = u'command'
352- self.service_frames.append({u'title': frame_title, u'command': command})
353+ self.service_item_type = ServiceType.Command
354+ self.service_item_path = path
355+ self.service_frames.append({u'title': frame_title, u'command': None})
356
357 def get_oos_repr(self):
358 """
359@@ -160,15 +162,15 @@
360 u'type':self.service_item_type
361 }
362 oos_data = []
363- if self.service_item_type == u'text':
364+ if self.service_item_type == ServiceType.Text:
365 for slide in self.service_frames:
366 oos_data.append(slide)
367- elif self.service_item_type == u'image':
368- #print "sf", self.service_frames
369- for slide in self.service_frames:
370- #print "s", slide
371- oos_data.append(slide[u'title'])
372- #print "od", oos_data
373+ elif self.service_item_type == ServiceType.Image:
374+ for slide in self.service_frames:
375+ oos_data.append(slide[u'title'])
376+ elif self.service_item_type == ServiceType.Command:
377+ for slide in self.service_frames:
378+ oos_data.append(slide[u'title'])
379 return {u'header': oos_header, u'data': oos_data}
380
381 def set_from_oos(self, serviceitem, path=None):
382@@ -182,7 +184,6 @@
383 ``path``
384 Defaults to *None*. Any path data, usually for images.
385 """
386- #print "sfs", serviceitem
387 header = serviceitem[u'serviceitem'][u'header']
388 self.title = header[u'title']
389 self.service_item_type = header[u'type']
390@@ -190,12 +191,15 @@
391 self.theme = header[u'theme']
392 self.addIcon(header[u'icon'])
393 self.raw_footer = header[u'footer']
394- if self.service_item_type == u'text':
395+ if self.service_item_type == ServiceType.Text:
396 for slide in serviceitem[u'serviceitem'][u'data']:
397 self.service_frames.append(slide)
398- elif self.service_item_type == u'image':
399+ elif self.service_item_type == ServiceType.Image:
400 for text_image in serviceitem[u'serviceitem'][u'data']:
401 filename = os.path.join(path, text_image)
402- #print "fn", filename
403 real_image = QtGui.QImage(unicode(filename))
404 self.add_from_image(path, text_image, real_image)
405+ elif self.service_item_type == ServiceType.Command:
406+ for text_image in serviceitem[u'serviceitem'][u'data']:
407+ filename = os.path.join(path, text_image)
408+ self.add_from_command(path, text_image)
409
410=== modified file 'openlp/core/lib/settingstab.py'
411--- openlp/core/lib/settingstab.py 2009-07-10 13:16:15 +0000
412+++ openlp/core/lib/settingstab.py 2009-08-29 07:17:56 +0000
413@@ -93,3 +93,9 @@
414 Save settings to disk.
415 """
416 pass
417+
418+ def postSetUp(self):
419+ """
420+ Changes which need to be made after setup of application
421+ """
422+ pass
423
424=== modified file 'openlp/core/lib/toolbar.py'
425--- openlp/core/lib/toolbar.py 2009-07-08 06:55:08 +0000
426+++ openlp/core/lib/toolbar.py 2009-08-28 17:40:07 +0000
427@@ -34,8 +34,9 @@
428 QtGui.QToolBar.__init__(self, None)
429 # useful to be able to reuse button icons...
430 self.icons = {}
431+ self.actions = {}
432 self.log = logging.getLogger(u'OpenLPToolbar')
433- self.log.info(u'Init done')
434+ self.log.debug(u'Init done')
435
436 def addToolbarButton(self, title, icon, tooltip=None, slot=None, objectname=None):
437 """
438@@ -70,12 +71,28 @@
439 ButtonIcon.addPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(icon)),
440 QtGui.QIcon.Normal, QtGui.QIcon.Off)
441 if ButtonIcon is not None:
442- ToolbarButton = self.addAction(ButtonIcon, title)
443+ if slot is not None:
444+ ToolbarButton = self.addAction(ButtonIcon, title, slot)
445+ else:
446+ ToolbarButton = self.addAction(ButtonIcon, title)
447 if tooltip is not None:
448 ToolbarButton.setToolTip(tooltip)
449- if slot is not None:
450- QtCore.QObject.connect(ToolbarButton, QtCore.SIGNAL(u'triggered()'), slot)
451 self.icons[title] = ButtonIcon
452+ self.actions[title] = ToolbarButton
453+
454+ def addToolbarSeparator(self, handle):
455+ """
456+ Add a Separator bar to the toolbar and store it's Handle
457+ """
458+ action = self.addSeparator()
459+ self.actions[handle] = action
460+
461+ def addToolbarWidget(self, handle, widget):
462+ """
463+ Add a Widget to the toolbar and store it's Handle
464+ """
465+ action = self.addWidget(widget)
466+ self.actions[handle] = action
467
468 def getIconFromTitle(self, title):
469 """
470@@ -90,3 +107,11 @@
471 else:
472 self.log.error(u'getIconFromTitle - no icon for %s' % title)
473 return QtGui.QIcon()
474+
475+ def makeWidgetsInvisible(self, widgets):
476+ for widget in widgets:
477+ self.actions[widget].setVisible(False)
478+
479+ def makeWidgetsVisible(self, widgets):
480+ for widget in widgets:
481+ self.actions[widget].setVisible(True)
482
483=== modified file 'openlp/core/ui/__init__.py'
484--- openlp/core/ui/__init__.py 2009-08-13 20:02:38 +0000
485+++ openlp/core/ui/__init__.py 2009-08-27 05:17:20 +0000
486@@ -17,7 +17,7 @@
487 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
488 Place, Suite 330, Boston, MA 02111-1307 USA
489 """
490-from slidecontroller import MasterToolbar
491+#from slidecontroller import MasterToolbar
492 from maindisplay import MainDisplay
493 from amendthemeform import AmendThemeForm
494 from slidecontroller import SlideController
495
496=== modified file 'openlp/core/ui/amendthemeform.py'
497--- openlp/core/ui/amendthemeform.py 2009-08-26 05:00:19 +0000
498+++ openlp/core/ui/amendthemeform.py 2009-08-31 07:05:59 +0000
499@@ -135,8 +135,8 @@
500 unicode(self.theme.display_horizontalAlign), unicode(self.theme.display_verticalAlign),
501 unicode(self.theme.display_wrapStyle))
502 theme = new_theme.extract_xml()
503- self.thememanager.saveTheme(theme_name, theme, save_from, save_to)
504- return QtGui.QDialog.accept(self)
505+ if self.thememanager.saveTheme(theme_name, theme, save_from, save_to) is not False:
506+ return QtGui.QDialog.accept(self)
507
508 def loadTheme(self, theme):
509 log.debug(u'LoadTheme %s', theme)
510@@ -510,45 +510,60 @@
511 self.VerticalComboBox.setCurrentIndex(int(self.theme.display_verticalAlign))
512
513 def stateChanging(self, theme):
514- if theme.background_type == u'solid':
515- self.Color1PushButton.setStyleSheet(
516- u'background-color: %s' % unicode(theme.background_color))
517- self.Color1Label.setText(translate(u'ThemeManager', u'Background Color:'))
518- self.Color1Label.setVisible(True)
519- self.Color1PushButton.setVisible(True)
520- self.Color2Label.setVisible(False)
521- self.Color2PushButton.setVisible(False)
522- self.ImageLabel.setVisible(False)
523- self.ImageLineEdit.setVisible(False)
524- self.ImageFilenameWidget.setVisible(False)
525- self.GradientLabel.setVisible(False)
526- self.GradientComboBox.setVisible(False)
527- elif theme.background_type == u'gradient':
528- self.Color1PushButton.setStyleSheet(
529- u'background-color: %s' % unicode(theme.background_startColor))
530- self.Color2PushButton.setStyleSheet(
531- u'background-color: %s' % unicode(theme.background_endColor))
532- self.Color1Label.setText(translate(u'ThemeManager', u'First Color:'))
533- self.Color2Label.setText(translate(u'ThemeManager', u'Second Color:'))
534- self.Color1Label.setVisible(True)
535- self.Color1PushButton.setVisible(True)
536- self.Color2Label.setVisible(True)
537- self.Color2PushButton.setVisible(True)
538- self.ImageLabel.setVisible(False)
539- self.ImageLineEdit.setVisible(False)
540- self.ImageFilenameWidget.setVisible(False)
541- self.GradientLabel.setVisible(True)
542- self.GradientComboBox.setVisible(True)
543- else: # must be image
544- self.Color1Label.setVisible(False)
545- self.Color1PushButton.setVisible(False)
546- self.Color2Label.setVisible(False)
547- self.Color2PushButton.setVisible(False)
548- self.ImageLabel.setVisible(True)
549- self.ImageLineEdit.setVisible(True)
550- self.ImageFilenameWidget.setVisible(True)
551- self.GradientLabel.setVisible(False)
552- self.GradientComboBox.setVisible(False)
553+ if theme.background_mode == u'transparent':
554+ self.Color1Label.setVisible(False)
555+ self.Color1PushButton.setVisible(False)
556+ self.Color2Label.setVisible(False)
557+ self.Color2PushButton.setVisible(False)
558+ self.ImageLabel.setVisible(False)
559+ self.ImageLineEdit.setVisible(False)
560+ self.ImageFilenameWidget.setVisible(False)
561+ self.GradientLabel.setVisible(False)
562+ self.GradientComboBox.setVisible(False)
563+ self.BackgroundTypeComboBox.setVisible(False)
564+ self.BackgroundTypeLabel.setVisible(False)
565+ else:
566+ self.BackgroundTypeComboBox.setVisible(True)
567+ self.BackgroundTypeLabel.setVisible(True)
568+ if theme.background_type == u'solid':
569+ self.Color1PushButton.setStyleSheet(
570+ u'background-color: %s' % unicode(theme.background_color))
571+ self.Color1Label.setText(translate(u'ThemeManager', u'Background Color:'))
572+ self.Color1Label.setVisible(True)
573+ self.Color1PushButton.setVisible(True)
574+ self.Color2Label.setVisible(False)
575+ self.Color2PushButton.setVisible(False)
576+ self.ImageLabel.setVisible(False)
577+ self.ImageLineEdit.setVisible(False)
578+ self.ImageFilenameWidget.setVisible(False)
579+ self.GradientLabel.setVisible(False)
580+ self.GradientComboBox.setVisible(False)
581+ elif theme.background_type == u'gradient':
582+ self.Color1PushButton.setStyleSheet(
583+ u'background-color: %s' % unicode(theme.background_startColor))
584+ self.Color2PushButton.setStyleSheet(
585+ u'background-color: %s' % unicode(theme.background_endColor))
586+ self.Color1Label.setText(translate(u'ThemeManager', u'First Color:'))
587+ self.Color2Label.setText(translate(u'ThemeManager', u'Second Color:'))
588+ self.Color1Label.setVisible(True)
589+ self.Color1PushButton.setVisible(True)
590+ self.Color2Label.setVisible(True)
591+ self.Color2PushButton.setVisible(True)
592+ self.ImageLabel.setVisible(False)
593+ self.ImageLineEdit.setVisible(False)
594+ self.ImageFilenameWidget.setVisible(False)
595+ self.GradientLabel.setVisible(True)
596+ self.GradientComboBox.setVisible(True)
597+ else: # must be image
598+ self.Color1Label.setVisible(False)
599+ self.Color1PushButton.setVisible(False)
600+ self.Color2Label.setVisible(False)
601+ self.Color2PushButton.setVisible(False)
602+ self.ImageLabel.setVisible(True)
603+ self.ImageLineEdit.setVisible(True)
604+ self.ImageFilenameWidget.setVisible(True)
605+ self.GradientLabel.setVisible(False)
606+ self.GradientComboBox.setVisible(False)
607
608 if theme.font_main_override == False:
609 self.FontMainXSpinBox.setEnabled(False)
610
611=== modified file 'openlp/core/ui/mainwindow.py'
612--- openlp/core/ui/mainwindow.py 2009-08-26 05:00:19 +0000
613+++ openlp/core/ui/mainwindow.py 2009-08-29 07:17:56 +0000
614@@ -313,8 +313,6 @@
615 translate(u'mainWindow', u'Service Manager'))
616 self.ThemeManagerDock.setWindowTitle(
617 translate(u'mainWindow', u'Theme Manager'))
618- self.DefaultThemeLabel.setText(MainWindow.defaultThemeText + \
619- self.ThemeManagerContents.getDefault())
620 self.FileNewItem.setText(translate(u'mainWindow', u'&New'))
621 self.FileNewItem.setToolTip(translate(u'mainWindow', u'New Service'))
622 self.FileNewItem.setStatusTip(
623@@ -492,6 +490,8 @@
624 # Once all components are initialised load the Themes
625 log.info(u'Load Themes')
626 self.ThemeManagerContents.loadThemes()
627+ log.info(u'Load data from Settings')
628+ self.settingsForm.postSetUp()
629
630 def getMonitorNumber(self):
631 """
632
633=== modified file 'openlp/core/ui/servicemanager.py'
634--- openlp/core/ui/servicemanager.py 2009-08-25 05:18:09 +0000
635+++ openlp/core/ui/servicemanager.py 2009-08-31 18:27:36 +0000
636@@ -25,7 +25,7 @@
637
638 from PyQt4 import QtCore, QtGui
639 from openlp.core.lib import PluginConfig, OpenLPToolbar, ServiceItem, \
640- RenderManager, translate, buildIcon, \
641+ RenderManager, translate, buildIcon, ServiceType, \
642 contextMenuAction, contextMenuSeparator, Receiver
643 from openlp.core.utils import ConfigHelper
644
645@@ -341,7 +341,8 @@
646 zip = zipfile.ZipFile(unicode(filename) + u'.oos', 'w')
647 for item in self.serviceItems:
648 service.append({u'serviceitem':item[u'data'].get_oos_repr()})
649- if item[u'data'].service_item_type == u'image':
650+ if item[u'data'].service_item_type == ServiceType.Image or \
651+ item[u'data'].service_item_type == ServiceType.Command:
652 for frame in item[u'data'].frames:
653 path_from = unicode(item[u'data'].service_item_path + u'/' + frame[u'title'])
654 zip.write(path_from)
655@@ -354,7 +355,7 @@
656 os.remove(servicefile)
657 except:
658 pass #if not present do not worry
659- self.parent.OosChanged(True, self.serviceName)
660+ self.parent.OosChanged(True, filename + u'.oos')
661
662 def onLoadService(self):
663 """
664@@ -368,31 +369,34 @@
665 name = filename.split(os.path.sep)
666 if filename != u'':
667 self.config.set_last_dir(filename)
668- zip = zipfile.ZipFile(unicode(filename))
669- filexml = None
670- themename = None
671- for file in zip.namelist():
672- names = file.split(os.path.sep)
673- file_to = os.path.join(self.servicePath, names[len(names) - 1])
674- file_data = zip.read(file)
675- f = open(file_to, u'w')
676- f.write(file_data)
677+ try:
678+ zip = zipfile.ZipFile(unicode(filename))
679+ filexml = None
680+ themename = None
681+ for file in zip.namelist():
682+ names = file.split(os.path.sep)
683+ file_to = os.path.join(self.servicePath, names[len(names) - 1])
684+ file_data = zip.read(file)
685+ f = open(file_to, u'w')
686+ f.write(file_data)
687+ f.close()
688+ if file_to.endswith(u'ood'):
689+ p_file = file_to
690+ f = open(p_file, u'r')
691+ items = cPickle.load(f)
692 f.close()
693- if file_to.endswith(u'ood'):
694- p_file = file_to
695- f = open(p_file, u'r')
696- items = cPickle.load(f)
697- f.close()
698- self.onNewService()
699- for item in items:
700- serviceitem = ServiceItem()
701- serviceitem.RenderManager = self.parent.RenderManager
702- serviceitem.set_from_oos(item, self.servicePath )
703- self.addServiceItem(serviceitem)
704- try:
705- os.remove(p_file)
706+ self.onNewService()
707+ for item in items:
708+ serviceitem = ServiceItem()
709+ serviceitem.RenderManager = self.parent.RenderManager
710+ serviceitem.set_from_oos(item, self.servicePath )
711+ self.addServiceItem(serviceitem)
712+ try:
713+ os.remove(p_file)
714+ except:
715+ #if not present do not worry
716+ pass
717 except:
718- #if not present do not worry
719 pass
720 self.serviceName = name[len(name) - 1]
721 self.parent.OosChanged(True, self.serviceName)
722
723=== modified file 'openlp/core/ui/settingsform.py'
724--- openlp/core/ui/settingsform.py 2009-08-06 13:17:36 +0000
725+++ openlp/core/ui/settingsform.py 2009-08-29 07:17:56 +0000
726@@ -51,3 +51,7 @@
727 for tab_index in range(0, self.SettingsTabWidget.count()):
728 self.SettingsTabWidget.widget(tab_index).save()
729 return QtGui.QDialog.accept(self)
730+
731+ def postSetUp(self):
732+ for tab_index in range(0, self.SettingsTabWidget.count()):
733+ self.SettingsTabWidget.widget(tab_index).postSetUp()
734
735=== modified file 'openlp/core/ui/slidecontroller.py'
736--- openlp/core/ui/slidecontroller.py 2009-08-24 05:10:04 +0000
737+++ openlp/core/ui/slidecontroller.py 2009-08-31 14:04:00 +0000
738@@ -21,7 +21,7 @@
739 import os
740
741 from PyQt4 import QtCore, QtGui
742-from openlp.core.lib import OpenLPToolbar, translate, buildIcon, Receiver
743+from openlp.core.lib import OpenLPToolbar, translate, buildIcon, Receiver, ServiceType
744
745 class SlideList(QtGui.QTableWidget):
746 """
747@@ -36,16 +36,16 @@
748 if type(event) == QtGui.QKeyEvent:
749 #here accept the event and do something
750 if event.key() == QtCore.Qt.Key_Up:
751- self.parent.BaseToolbar.onSlideSelectedPrevious()
752+ self.parent.onSlideSelectedPrevious()
753 event.accept()
754 elif event.key() == QtCore.Qt.Key_Down:
755- self.parent.BaseToolbar.onSlideSelectedNext()
756+ self.parent.onSlideSelectedNext()
757 event.accept()
758 elif event.key() == QtCore.Qt.Key_PageUp:
759- self.parent.BaseToolbar.onSlideSelectedFirst()
760+ self.parent.onSlideSelectedFirst()
761 event.accept()
762 elif event.key() == QtCore.Qt.Key_PageDown:
763- self.parent.BaseToolbar.onSlideSelectedLast()
764+ self.parent.onSlideSelectedLast()
765 event.accept()
766 event.ignore()
767 else:
768@@ -63,13 +63,11 @@
769 """
770 Set up the Slide Controller.
771 """
772- self.toolbarList = {}
773 QtGui.QWidget.__init__(self, parent)
774 self.isLive = isLive
775- self.prefix = u'preview_'
776- if isLive:
777- self.prefix = u'live_'
778 self.parent = parent
779+ self.image_list = [u'Start Loop', u'Stop Loop', u'Loop Spearator', u'Image SpinBox']
780+ self.timer_id = 0
781 self.Panel = QtGui.QWidget(parent.ControlSplitter)
782 self.Splitter = QtGui.QSplitter(self.Panel)
783 self.Splitter.setOrientation(QtCore.Qt.Vertical)
784@@ -96,10 +94,53 @@
785 self.PreviewListWidget.isLive = self.isLive
786 self.PreviewListWidget.setObjectName(u'PreviewListWidget')
787 self.ControllerLayout.addWidget(self.PreviewListWidget)
788- # Plugin the Base Toolbar class
789- self.BaseToolbar = MasterToolbar(self.isLive)
790- self.registerToolbar(u'master', self.BaseToolbar)
791- self.Toolbar = self.BaseToolbar.getToolbar()
792+ # Build the full toolbar
793+ self.Toolbar = OpenLPToolbar(self)
794+ sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,
795+ QtGui.QSizePolicy.Fixed)
796+ sizeToolbarPolicy.setHorizontalStretch(0)
797+ sizeToolbarPolicy.setVerticalStretch(0)
798+ sizeToolbarPolicy.setHeightForWidth(
799+ self.Toolbar.sizePolicy().hasHeightForWidth())
800+ self.Toolbar.setSizePolicy(sizeToolbarPolicy)
801+ if self.isLive:
802+ self.Toolbar.addToolbarButton(u'First Slide',
803+ u':/slides/slide_first.png',
804+ translate(u'SlideController', u'Move to first'),
805+ self.onSlideSelectedFirst)
806+ self.Toolbar.addToolbarButton(u'Previous Slide',
807+ u':/slides/slide_previous.png',
808+ translate(u'SlideController', u'Move to previous'),
809+ self.onSlideSelectedPrevious)
810+ self.Toolbar.addToolbarButton(u'Next Slide',
811+ u':/slides/slide_next.png',
812+ translate(u'SlideController', u'Move to next'),
813+ self.onSlideSelectedNext)
814+ if self.isLive:
815+ self.Toolbar.addToolbarButton(u'Last Slide',
816+ u':/slides/slide_last.png',
817+ translate(u'SlideController', u'Move to last'),
818+ self.onSlideSelectedLast)
819+ if self.isLive:
820+ self.Toolbar.addToolbarSeparator(u'Close Separator')
821+ self.Toolbar.addToolbarButton(u'Close Screen',
822+ u':/slides/slide_close.png',
823+ translate(u'SlideController', u'Close Screen'),
824+ self.onBlankScreen)
825+ if isLive:
826+ self.Toolbar.addToolbarSeparator(u'Loop Spearator')
827+ self.Toolbar.addToolbarButton(u'Start Loop',
828+ u':/media/media_time.png',
829+ translate(u'SlideController', u'Start continuous loop'),
830+ self.onStartLoop)
831+ self.Toolbar.addToolbarButton(u'Stop Loop',
832+ u':/media/media_stop.png',
833+ translate(u'SlideController', u'Stop continuous loop'),
834+ self.onStopLoop)
835+ self.DelaySpinBox = QtGui.QSpinBox()
836+ self.Toolbar.addToolbarWidget(u'Image SpinBox', self.DelaySpinBox)
837+ self.DelaySpinBox.setSuffix(translate(u'SlideController', u's'))
838+
839 self.ControllerLayout.addWidget(self.Toolbar)
840 sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,
841 QtGui.QSizePolicy.Fixed)
842@@ -110,7 +151,7 @@
843 self.Toolbar.setSizePolicy(sizeToolbarPolicy)
844 # Screen preview area
845 self.PreviewFrame = QtGui.QFrame(self.Splitter)
846- self.PreviewFrame.setGeometry(QtCore.QRect(0, 0, 280, 190))
847+ self.PreviewFrame.setGeometry(QtCore.QRect(0, 0, 300, 225))
848 self.PreviewFrame.setSizePolicy(QtGui.QSizePolicy(
849 QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum))
850 self.PreviewFrame.setFrameShape(QtGui.QFrame.StyledPanel)
851@@ -128,7 +169,7 @@
852 sizePolicy.setHeightForWidth(
853 self.SlidePreview.sizePolicy().hasHeightForWidth())
854 self.SlidePreview.setSizePolicy(sizePolicy)
855- self.SlidePreview.setFixedSize(QtCore.QSize(250, 210))
856+ self.SlidePreview.setFixedSize(QtCore.QSize(300, 225))
857 self.SlidePreview.setFrameShape(QtGui.QFrame.Box)
858 self.SlidePreview.setFrameShadow(QtGui.QFrame.Plain)
859 self.SlidePreview.setLineWidth(1)
860@@ -140,45 +181,46 @@
861 QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected)
862 QtCore.QObject.connect(self.PreviewListWidget,
863 QtCore.SIGNAL(u'activated(QModelIndex)'), self.onSlideSelected)
864- # Window Event Handlers
865- QtCore.QObject.connect(Receiver.get_receiver(),
866- QtCore.SIGNAL(u'%sslide_first'% self.prefix), self.onSlideSelectedFirst)
867- QtCore.QObject.connect(Receiver.get_receiver(),
868- QtCore.SIGNAL(u'%sslide_previous'% self.prefix), self.onSlideSelectedPrevious)
869- QtCore.QObject.connect(Receiver.get_receiver(),
870- QtCore.SIGNAL(u'%sslide_next'% self.prefix), self.onSlideSelectedNext)
871- QtCore.QObject.connect(Receiver.get_receiver(),
872- QtCore.SIGNAL(u'%sslide_last'% self.prefix), self.onSlideSelectedLast)
873- QtCore.QObject.connect(Receiver.get_receiver(),
874- QtCore.SIGNAL(u'%sslide_start_loop'% self.prefix), self.onStartLoop)
875- QtCore.QObject.connect(Receiver.get_receiver(),
876- QtCore.SIGNAL(u'%sslide_stop_loop'% self.prefix), self.onStopLoop)
877-
878-
879- def registerToolbar(self, handle,controller):
880- """
881- Register a new toolbar with the controller
882- ``handle``
883- Identifier for the toolbar being stored this should equal the
884- plugins name.
885- ``controller``
886- The toolbar class which should extend MasterToolbar
887- """
888- #store the handle name in lower case so no probems later
889- self.toolbarList[handle.lower()] = controller
890-
891- def retrieveToolbar(self, handle):
892- """
893- Find the toolbar and return master if none present
894- Add extra information back into toolbar class
895- ``handle``
896- Identifier for the toolbar being requested
897- """
898- try:
899- toolbar = self.toolbarList[handle.lower()]
900- except:
901- toolbar = self.toolbarList[u'master']
902- return toolbar
903+ if isLive:
904+ QtCore.QObject.connect(Receiver.get_receiver(),
905+ QtCore.SIGNAL(u'update_spin_delay'), self.receiveSpinDelay)
906+ Receiver().send_message(u'request_spin_delay')
907+ if isLive:
908+ self.Toolbar.makeWidgetsInvisible(self.image_list)
909+ else:
910+ pass
911+
912+ def receiveSpinDelay(self, value):
913+ self.DelaySpinBox.setValue(int(value))
914+
915+ def enableToolBar(self, item):
916+ """
917+ Allows the toolbars to be reconfigured based on Controller Type
918+ and ServiceItem Type
919+ """
920+ if self.isLive:
921+ self.enableLiveToolBar(item)
922+ else:
923+ self.enablePreviewToolBar(item)
924+
925+ def enableLiveToolBar(self, item):
926+ """
927+ Allows the live toolbar to be customised
928+ """
929+ if item.service_item_type == ServiceType.Text:
930+ self.Toolbar.makeWidgetsInvisible(self.image_list)
931+ elif item.service_item_type == ServiceType.Image:
932+ #Not sensible to allow loops with 1 frame
933+ if len(item.frames) > 1:
934+ self.Toolbar.makeWidgetsVisible(self.image_list)
935+ else:
936+ self.Toolbar.makeWidgetsInvisible(self.image_list)
937+
938+ def enablePreviewToolBar(self, item):
939+ """
940+ Allows the Preview toolbar to be customised
941+ """
942+ pass
943
944 def addServiceItem(self, item):
945 """
946@@ -186,13 +228,9 @@
947 request the correct the toolbar of the plugin
948 Called by plugins
949 """
950- self.BaseToolbar = self.retrieveToolbar(item.shortname)
951- self.ControllerLayout.removeWidget(self.Toolbar)
952- #remove the old toolbar
953- self.Toolbar.clear()
954- self.Toolbar = self.BaseToolbar.getToolbar()
955- self.ControllerLayout.addWidget(self.Toolbar)
956+ log.debug(u'addServiceItem')
957 item.render()
958+ self.enableToolBar(item)
959 self.displayServiceManagerItems(item, 0)
960
961 def addServiceManagerItem(self, item, slideno):
962@@ -201,12 +239,8 @@
963 request the correct the toolbar of the plugin
964 Called by ServiceManager
965 """
966- self.BaseToolbar = self.retrieveToolbar(item.shortname)
967- self.ControllerLayout.removeWidget(self.Toolbar)
968- #remove the old toolbar
969- self.Toolbar.clear()
970- self.Toolbar = self.BaseToolbar.getToolbar()
971- self.ControllerLayout.addWidget(self.Toolbar)
972+ log.debug(u'addServiceItem')
973+ self.enableToolBar(item)
974 self.displayServiceManagerItems(item, slideno)
975
976 def displayServiceManagerItems(self, serviceitem, slideno):
977@@ -214,7 +248,7 @@
978 Loads a ServiceItem into the system from ServiceManager
979 Display the slide number passed
980 """
981- log.debug(u'add Service Manager Item')
982+ log.debug(u'displayServiceManagerItems Start')
983 self.serviceitem = serviceitem
984 slide_pixmap = QtGui.QPixmap.fromImage(self.serviceitem.frames[0][u'image'])
985 slide_width = 300
986@@ -241,27 +275,13 @@
987 self.PreviewListWidget.selectRow(slideno)
988 self.onSlideSelected()
989 self.PreviewListWidget.setFocus()
990+ log.debug(u'displayServiceManagerItems End')
991
992 #Screen event methods
993- def onSlideSelected(self):
994- """
995- Generate the preview when you click on a slide.
996- if this is the Live Controller also display on the screen
997- """
998- row = self.PreviewListWidget.currentRow()
999- if row > -1 and row < self.PreviewListWidget.rowCount():
1000- label = self.PreviewListWidget.cellWidget(row, 0)
1001- smallframe = label.pixmap()
1002- frame = self.serviceitem.frames[row][u'image']
1003- self.SlidePreview.setPixmap(smallframe)
1004- if self.isLive:
1005- self.parent.mainDisplay.frameView(frame)
1006-
1007 def onSlideSelectedFirst(self):
1008 """
1009 Go to the first slide.
1010 """
1011- print "oSSF"
1012 self.PreviewListWidget.selectRow(0)
1013 self.onSlideSelected()
1014
1015@@ -312,12 +332,12 @@
1016 self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount() - 1)
1017 self.onSlideSelected()
1018
1019- def onStartLoop(self, value):
1020+ def onStartLoop(self):
1021 """
1022 Go to the last slide.
1023 """
1024 if self.PreviewListWidget.rowCount() > 1:
1025- self.timer_id = self.startTimer(int(value) * 1000)
1026+ self.timer_id = self.startTimer(int(self.DelaySpinBox.value()) * 1000)
1027
1028 def onStopLoop(self):
1029 """
1030@@ -329,88 +349,5 @@
1031 if event.timerId() == self.timer_id:
1032 self.onSlideSelectedNext()
1033
1034-class MasterToolbar(QtCore.QObject):
1035- """
1036- Class from which all toolbars should extend
1037- """
1038- def __init__(self, isLive):
1039- self.Toolbar = None
1040- QtCore.QObject.__init__(self)
1041- self.PreviewListWidget = QtGui.QListWidget()
1042- self.isLive = isLive
1043- self.prefix = u'preview_'
1044- if isLive:
1045- self.prefix = u'live_'
1046-
1047- def getToolbar(self):
1048- #define toolbar here as it needs to be redefined each time
1049- #as the clear destroys it.
1050- self.defineToolbar()
1051- self.defineZone1()
1052- self.defineZone2()
1053- self.defineZone3()
1054- self.defineZone4()
1055- self.defineZone5()
1056- return self.Toolbar
1057-
1058- def defineToolbar(self):
1059- # Controller toolbar
1060- self.Toolbar = OpenLPToolbar(self)
1061- sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,
1062- QtGui.QSizePolicy.Fixed)
1063- sizeToolbarPolicy.setHorizontalStretch(0)
1064- sizeToolbarPolicy.setVerticalStretch(0)
1065- sizeToolbarPolicy.setHeightForWidth(
1066- self.Toolbar.sizePolicy().hasHeightForWidth())
1067- self.Toolbar.setSizePolicy(sizeToolbarPolicy)
1068-
1069- def defineZone1(self):
1070- #Dummy Zone
1071- pass
1072-
1073- def defineZone2(self):
1074- if self.isLive:
1075- self.Toolbar.addToolbarButton(u'First Slide',
1076- u':/slides/slide_first.png',
1077- translate(u'SlideController', u'Move to first'),
1078- self.onSlideFirst)
1079- self.Toolbar.addToolbarButton(u'Previous Slide',
1080- u':/slides/slide_previous.png',
1081- translate(u'SlideController', u'Move to previous'),
1082- self.onSlidePrevious)
1083- self.Toolbar.addToolbarButton(u'Next Slide',
1084- u':/slides/slide_next.png',
1085- translate(u'SlideController', u'Move to next'),
1086- self.onSlideNext)
1087- if self.isLive:
1088- self.Toolbar.addToolbarButton(u'Last Slide',
1089- u':/slides/slide_last.png',
1090- translate(u'SlideController', u'Move to last'),
1091- self.onSlideLast)
1092-
1093- def defineZone3(self):
1094- #Dummy Zone
1095- pass
1096-
1097- def defineZone4(self):
1098- if self.isLive:
1099- self.Toolbar.addSeparator()
1100- self.Toolbar.addToolbarButton(u'Close Screen',
1101- u':/slides/slide_close.png',
1102- translate(u'SlideController', u'Close Screen'),
1103- self.onSlideBlank)
1104-
1105- def defineZone5(self):
1106- #Dummy Zone
1107- pass
1108-
1109- def onSlideFirst(self):
1110- Receiver().send_message(u'%sslide_first'% self.prefix)
1111- def onSlidePrevious(self):
1112- Receiver().send_message(u'%sslide_previous'% self.prefix)
1113- def onSlideNext(self):
1114- Receiver().send_message(u'%sslide_next'% self.prefix)
1115- def onSlideLast(self):
1116- Receiver().send_message(u'%sslide_last' % self.prefix)
1117- def onSlideBlank(self):
1118- Receiver().send_message(u'%sslide_blank' % self.prefix)
1119+
1120+
1121
1122=== modified file 'openlp/core/ui/thememanager.py'
1123--- openlp/core/ui/thememanager.py 2009-08-26 05:00:19 +0000
1124+++ openlp/core/ui/thememanager.py 2009-08-29 10:43:44 +0000
1125@@ -85,9 +85,6 @@
1126 self.servicePath = self.config.get_data_path()
1127 self.global_theme = unicode(self.config.get_config(u'theme global theme', u''))
1128
1129- def getDefault(self):
1130- return self.global_theme
1131-
1132 def changeGlobalFromTab(self, themeName):
1133 log.debug(u'changeGlobalFromTab %s', themeName)
1134 for count in range (0, self.ThemeListWidget.count()):
1135@@ -329,13 +326,29 @@
1136 if os.path.exists(theme_dir) == False:
1137 os.mkdir(os.path.join(self.path, name))
1138 theme_file = os.path.join(theme_dir, name + u'.xml')
1139- outfile = open(theme_file, u'w')
1140- outfile.write(theme_xml)
1141- outfile.close()
1142- if image_from is not None and image_from != image_to:
1143- shutil.copyfile(image_from, image_to)
1144- self.generateAndSaveImage(self.path, name, theme_xml)
1145- self.loadThemes()
1146+ log.debug(theme_file)
1147+
1148+ result = QtGui.QMessageBox.Yes
1149+ if os.path.exists(theme_file):
1150+ result = QtGui.QMessageBox.question(
1151+ self,
1152+ translate(u'ThemeManager',u'Theme Exists'),
1153+ translate(u'ThemeManager',u'A theme with this name already exists, would you like to overwrite it?'),
1154+ (QtGui.QMessageBox.Yes | QtGui.QMessageBox.No),
1155+ QtGui.QMessageBox.No)
1156+ if result == QtGui.QMessageBox.Yes:
1157+ # Save the theme, overwriting the existing theme if necessary.
1158+ outfile = open(theme_file, u'w')
1159+ outfile.write(theme_xml)
1160+ outfile.close()
1161+ if image_from is not None and image_from != image_to:
1162+ shutil.copyfile(image_from, image_to)
1163+
1164+ self.generateAndSaveImage(self.path, name, theme_xml)
1165+ self.loadThemes()
1166+ else:
1167+ # Don't close the dialog - allow the user to change the name of the theme or to cancel the theme dialog completely.
1168+ return False
1169
1170 def generateAndSaveImage(self, dir, name, theme_xml):
1171 log.debug(u'generateAndSaveImage %s %s %s', dir, name, theme_xml)
1172
1173=== modified file 'openlp/core/ui/themestab.py'
1174--- openlp/core/ui/themestab.py 2009-08-25 20:04:58 +0000
1175+++ openlp/core/ui/themestab.py 2009-08-29 07:17:56 +0000
1176@@ -124,6 +124,9 @@
1177 self.config.set_config(u'theme global theme',self.global_theme)
1178 Receiver().send_message(u'update_global_theme', self.global_theme )
1179
1180+ def postSetUp(self):
1181+ Receiver().send_message(u'update_global_theme', self.global_theme )
1182+
1183 def onSongLevelButtonPressed(self):
1184 self.global_style= u'Song'
1185 self.parent.RenderManager.set_global_theme(self.global_theme, self.global_style)
1186
1187=== modified file 'openlp/plugins/bibles/lib/mediaitem.py'
1188--- openlp/plugins/bibles/lib/mediaitem.py 2009-08-24 04:30:04 +0000
1189+++ openlp/plugins/bibles/lib/mediaitem.py 2009-09-01 05:17:32 +0000
1190@@ -341,8 +341,10 @@
1191 def generateSlideData(self, service_item):
1192 log.debug(u'generating slide data')
1193 items = self.ListView.selectedIndexes()
1194+ if len(items) ==0:
1195+ return False
1196 old_chapter = u''
1197- raw_slides=[]
1198+ raw_slides = []
1199 raw_footer = []
1200 bible_text = u''
1201 for item in items:
1202@@ -389,6 +391,7 @@
1203 for slide in raw_slides:
1204 service_item.add_from_text(slide[:30], slide)
1205 service_item.raw_footer = raw_footer
1206+ return True
1207
1208 def formatVerse(self, old_chapter, chapter, verse, opening, closing):
1209 loc = opening
1210@@ -432,27 +435,30 @@
1211 combo.addItem(unicode(i))
1212
1213 def displayResults(self, bible):
1214- for verse in self.search_results:
1215+ for count, verse in enumerate(self.search_results):
1216 bible_text = u' %s %d:%d (%s)' % (verse.book.name,
1217 verse.chapter, verse.verse, bible)
1218 bible_verse = QtGui.QListWidgetItem(bible_text)
1219 bible_verse.setData(QtCore.Qt.UserRole,
1220 QtCore.QVariant(bible_text))
1221 self.ListView.addItem(bible_verse)
1222+ cr = self.ListView.setCurrentRow(count)
1223+ if cr is not None:
1224+ cr.setSelected(True)
1225
1226 def searchByReference(self, bible, search):
1227 log.debug(u'searchByReference %s ,%s', bible, search)
1228- book = ''
1229- start_chapter = ''
1230- end_chapter = ''
1231- start_verse = ''
1232- end_verse = ''
1233+ book = u''
1234+ start_chapter = u''
1235+ end_chapter = u''
1236+ start_verse = u''
1237+ end_verse = u''
1238 search = search.replace(u' ', u' ').strip()
1239 original = search
1240 message = None
1241 # Remove book beware 0 index arrays
1242 for i in range (len(search)-1, 0, - 1):
1243- if search[i] == ' ':
1244+ if search[i] == u' ':
1245 book = search[:i]
1246 # remove book from string
1247 search = search[i:]
1248@@ -466,7 +472,7 @@
1249 # number : found
1250 i = search.rfind(u' ')
1251 if i == -1:
1252- chapter = ''
1253+ chapter = u''
1254 else:
1255 chapter = search[i:len(search)]
1256 hyphen = chapter.find(u'-')
1257@@ -493,29 +499,25 @@
1258 end_verse = start_verse
1259 else:
1260 sp1 = sp[1].split(u':')
1261- #print "2nd details", sp1, len(sp1)
1262 if len(sp1) == 1:
1263 end_chapter = start_chapter
1264 end_verse = sp1[0]
1265 else:
1266 end_chapter = sp1[0]
1267 end_verse = sp1[1]
1268- #print 'search = ' + unicode(original)
1269- #print 'results = ' + unicode(book) + ' @ '+ unicode(start_chapter)+' @ '+ unicode(end_chapter)+' @ '+ unicode(start_verse)+ ' @ '+ unicode(end_verse)
1270- if end_chapter == '':
1271+ if end_chapter == u'':
1272 end_chapter = start_chapter.rstrip()
1273- if start_verse == '':
1274- if end_verse == '':
1275+ if start_verse == u'':
1276+ if end_verse == u'':
1277 start_verse = 1
1278 else:
1279 start_verse = end_verse
1280- if end_verse == '':
1281+ if end_verse == u'':
1282 end_verse = 99
1283- if start_chapter == '':
1284+ if start_chapter == u'':
1285 message = u'No chapter found for search criteria'
1286- #print 'message = ' + unicode(message)
1287- #print 'search = ' + unicode(original)
1288- #print 'results = ' + unicode(book) + ' @ '+ unicode(start_chapter)+' @ '+ unicode(end_chapter)+' @ '+ unicode(start_verse)+ ' @ '+ unicode(end_verse)
1289+ log.debug(u'results = %s @ %s : %s @ %s : %s'% \
1290+ (unicode(book), unicode(start_chapter), unicode(end_chapter), unicode(start_verse), unicode(end_verse)))
1291 if message == None:
1292 self.search_results = None
1293 self.search_results = self.parent.biblemanager.get_verse_text(bible, book,
1294
1295=== modified file 'openlp/plugins/custom/lib/mediaitem.py'
1296--- openlp/plugins/custom/lib/mediaitem.py 2009-08-15 11:02:24 +0000
1297+++ openlp/plugins/custom/lib/mediaitem.py 2009-09-01 05:17:32 +0000
1298@@ -68,17 +68,17 @@
1299 self.addToolbarButton(
1300 translate(u'CustomMediaItem',u'Preview Custom Item'),
1301 translate(u'CustomMediaItem',u'Preview the selected Custom Item'),
1302- u':/system/system_preview.png', self.onCustomPreviewClick, u'CustomPreviewItem')
1303+ u':/system/system_preview.png', self.onPreviewClick, u'CustomPreviewItem')
1304 ## Live Custom Button ##
1305 self.addToolbarButton(
1306 translate(u'CustomMediaItem',u'Go Live'),
1307 translate(u'CustomMediaItem', u'Send the selected Custom live'),
1308- u':/system/system_live.png', self.onCustomLiveClick, u'CustomLiveItem')
1309+ u':/system/system_live.png', self.onLiveClick, u'CustomLiveItem')
1310 ## Add Custom Button ##
1311 self.addToolbarButton(
1312 translate(u'CustomMediaItem',u'Add Custom To Service'),
1313 translate(u'CustomMediaItem',u'Add the selected Custom(s) to the service'),
1314- u':/system/system_add.png', self.onCustomAddClick, u'CustomAddItem')
1315+ u':/system/system_add.png', self.onAddClick, u'CustomAddItem')
1316 # Add the CustomListView widget
1317 self.CustomWidget = QtGui.QWidget(self)
1318 sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
1319@@ -95,7 +95,7 @@
1320 self.PageLayout.addWidget(self.ListView)
1321 # Signals
1322 QtCore.QObject.connect(self.ListView,
1323- QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onCustomPreviewClick)
1324+ QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onPreviewClick)
1325 #define and add the context menu
1326 self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
1327 self.ListView.addAction(contextMenuAction(self.ListView,
1328@@ -104,13 +104,13 @@
1329 self.ListView.addAction(contextMenuSeparator(self.ListView))
1330 self.ListView.addAction(contextMenuAction(
1331 self.ListView, ':/system/system_preview.png',
1332- translate(u'CustomMediaItem',u'&Preview Custom'), self.onCustomPreviewClick))
1333+ translate(u'CustomMediaItem',u'&Preview Custom'), self.onPreviewClick))
1334 self.ListView.addAction(contextMenuAction(
1335 self.ListView, ':/system/system_live.png',
1336- translate(u'CustomMediaItem',u'&Show Live'), self.onCustomLiveClick))
1337+ translate(u'CustomMediaItem',u'&Show Live'), self.onLiveClick))
1338 self.ListView.addAction(contextMenuAction(
1339 self.ListView, ':/system/system_add.png',
1340- translate(u'CustomMediaItem',u'&Add to Service'), self.onCustomAddClick))
1341+ translate(u'CustomMediaItem',u'&Add to Service'), self.onAddClick))
1342
1343 def initialise(self):
1344 self.loadCustomListView(self.parent.custommanager.get_all_slides())
1345@@ -143,33 +143,14 @@
1346 row = self.ListView.row(item)
1347 self.ListView.takeItem(row)
1348
1349- def onCustomPreviewClick(self):
1350- log.debug(u'Custom Preview Requested')
1351- service_item = ServiceItem(self.parent)
1352- service_item.addIcon(u':/media/media_song.png')
1353- self.generateSlideData(service_item)
1354- self.parent.preview_controller.addServiceItem(service_item)
1355-
1356- def onCustomLiveClick(self):
1357- log.debug(u'Custom Live Requested')
1358- service_item = ServiceItem(self.parent)
1359- service_item.addIcon(u':/media/media_song.png')
1360- self.generateSlideData(service_item)
1361- self.parent.live_controller.addServiceItem(service_item)
1362-
1363- def onCustomAddClick(self):
1364- log.debug(u'Custom Add Requested')
1365- service_item = ServiceItem(self.parent)
1366- service_item.addIcon(u':/media/media_song.png')
1367- self.generateSlideData(service_item)
1368- self.parent.service_manager.addServiceItem(service_item)
1369-
1370 def generateSlideData(self, service_item):
1371 raw_slides =[]
1372 raw_footer = []
1373 slide = None
1374 theme = None
1375 item = self.ListView.currentItem()
1376+ if item is None:
1377+ return False
1378 item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
1379 customSlide = self.parent.custommanager.get_custom(item_id)
1380 title = customSlide.title
1381@@ -187,3 +168,4 @@
1382 for slide in raw_slides:
1383 service_item.add_from_text(slide[:30], slide)
1384 service_item.raw_footer = raw_footer
1385+ return True
1386
1387=== modified file 'openlp/plugins/images/lib/__init__.py'
1388--- openlp/plugins/images/lib/__init__.py 2009-08-24 05:13:27 +0000
1389+++ openlp/plugins/images/lib/__init__.py 2009-08-27 05:17:20 +0000
1390@@ -18,5 +18,4 @@
1391 Place, Suite 330, Boston, MA 02111-1307 USA
1392 """
1393 from mediaitem import ImageMediaItem
1394-from imagetoolbar import ImageToolbar
1395 from imagetab import ImageTab
1396
1397=== modified file 'openlp/plugins/images/lib/imagetab.py'
1398--- openlp/plugins/images/lib/imagetab.py 2009-07-06 16:34:13 +0000
1399+++ openlp/plugins/images/lib/imagetab.py 2009-08-29 07:17:56 +0000
1400@@ -20,7 +20,7 @@
1401
1402 from PyQt4 import QtCore, QtGui
1403
1404-from openlp.core.lib import SettingsTab, str_to_bool, translate
1405+from openlp.core.lib import SettingsTab, str_to_bool, translate, Receiver
1406
1407 class ImageTab(SettingsTab):
1408 """
1409@@ -67,3 +67,7 @@
1410
1411 def save(self):
1412 self.config.set_config(u'loop delay', self.loop_delay)
1413+ Receiver().send_message(u'update_spin_delay', self.loop_delay )
1414+
1415+ def postSetUp(self):
1416+ Receiver().send_message(u'update_spin_delay', self.loop_delay )
1417
1418=== removed file 'openlp/plugins/images/lib/imagetoolbar.py'
1419--- openlp/plugins/images/lib/imagetoolbar.py 2009-08-24 05:13:27 +0000
1420+++ openlp/plugins/images/lib/imagetoolbar.py 1970-01-01 00:00:00 +0000
1421@@ -1,63 +0,0 @@
1422-# -*- coding: utf-8 -*-
1423-# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
1424-"""
1425-OpenLP - Open Source Lyrics Projection
1426-Copyright (c) 2008 Raoul Snyman
1427-Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley,
1428-
1429-This program is free software; you can redistribute it and/or modify it under
1430-the terms of the GNU General Public License as published by the Free Software
1431-Foundation; version 2 of the License.
1432-
1433-This program is distributed in the hope that it will be useful, but WITHOUT ANY
1434-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
1435-PARTICULAR PURPOSE. See the GNU General Public License for more details.
1436-
1437-You should have received a copy of the GNU General Public License along with
1438-this program; if not, write to the Free Software Foundation, Inc., 59 Temple
1439-Place, Suite 330, Boston, MA 02111-1307 USA
1440-"""
1441-import logging
1442-import os
1443-
1444-from PyQt4 import QtCore, QtGui
1445-from openlp.core.lib import OpenLPToolbar, translate, Receiver
1446-from openlp.core.ui.slidecontroller import MasterToolbar
1447-
1448-class ImageToolbar(MasterToolbar):
1449-
1450- def __init__(self, parent, isLive):
1451- MasterToolbar.__init__(self, isLive)
1452- self.parent = parent
1453- self.Toolbar = None
1454- self.isLive = isLive
1455-
1456- def defineZone5(self):
1457- self.Toolbar.addSeparator()
1458- self.Toolbar.addToolbarButton(u'Start Loop',
1459- u':/media/media_time.png',
1460- translate(u'SlideController', u'Start continuous loop'),
1461- self.onStartLoop)
1462- self.Toolbar.addToolbarButton(u'Stop Loop',
1463- u':/media/media_stop.png',
1464- translate(u'SlideController', u'Stop continuous loop'),
1465- self.onStopLoop)
1466- self.Toolbar.addSeparator()
1467- self.DelaySpinBox = QtGui.QSpinBox(self.Toolbar)
1468- self.SpinWidget = QtGui.QWidgetAction(self.Toolbar)
1469- self.SpinWidget.setDefaultWidget(self.DelaySpinBox)
1470- self.Toolbar.addAction(self.SpinWidget)
1471- self.DelaySpinBox.setValue(self.parent.parent.ImageTab.loop_delay)
1472- self.DelaySpinBox.setSuffix(translate(u'ImageSlideController', u's'))
1473-
1474- def onStartLoop(self):
1475- """
1476- Trigger the slide controller to start to loop passing the delay
1477- """
1478- Receiver().send_message(u'%sslide_start_loop' % self.prefix, self.DelaySpinBox.value())
1479-
1480- def onStopLoop(self):
1481- """
1482- Trigger the slide controller to stop the loop
1483- """
1484- Receiver().send_message(u'%sslide_stop_loop' % self.prefix)
1485
1486=== modified file 'openlp/plugins/images/lib/mediaitem.py'
1487--- openlp/plugins/images/lib/mediaitem.py 2009-08-25 05:18:09 +0000
1488+++ openlp/plugins/images/lib/mediaitem.py 2009-09-01 05:17:32 +0000
1489@@ -22,7 +22,6 @@
1490
1491 from PyQt4 import QtCore, QtGui
1492 from openlp.core.lib import MediaManagerItem, ServiceItem, translate, BaseListWithDnD, buildIcon
1493-from openlp.plugins.images.lib.imagetoolbar import ImageToolbar
1494
1495 # We have to explicitly create separate classes for each plugin
1496 # in order for DnD to the Service manager to work correctly.
1497@@ -56,9 +55,6 @@
1498 self.ServiceItemIconName = u':/media/media_image.png'
1499 self.servicePath = None
1500 MediaManagerItem.__init__(self, parent, icon, title)
1501- #create and install our own slide controller toolbar
1502- imageToolbar = ImageToolbar(self, True)
1503- parent.live_controller.registerToolbar(self.ConfigSection, imageToolbar)
1504
1505 def initialise(self):
1506 self.ListView.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
1507@@ -99,6 +95,8 @@
1508
1509 def generateSlideData(self, service_item):
1510 items = self.ListView.selectedIndexes()
1511+ if len(items) == 0:
1512+ return False
1513 service_item.title = u'Image(s)'
1514 for item in items:
1515 bitem = self.ListView.item(item.row())
1516@@ -106,3 +104,4 @@
1517 frame = QtGui.QImage(unicode(filename))
1518 (path, name) = os.path.split(filename)
1519 service_item.add_from_image(path, name, frame)
1520+ return True
1521
1522=== modified file 'openlp/plugins/media/lib/mediaitem.py'
1523--- openlp/plugins/media/lib/mediaitem.py 2009-08-15 11:02:24 +0000
1524+++ openlp/plugins/media/lib/mediaitem.py 2009-08-31 21:53:35 +0000
1525@@ -100,12 +100,15 @@
1526
1527 def generateSlideData(self, service_item):
1528 indexes = self.ListView.selectedIndexes()
1529+ if len(items) > 1:
1530+ return False
1531 service_item.title = u'Media'
1532 for index in indexes:
1533 filename = self.ListData.getFilename(index)
1534 frame = QtGui.QImage(unicode(filename))
1535 (path, name) = os.path.split(filename)
1536 service_item.add_from_image(path, name, frame)
1537+ return True
1538
1539 def onPreviewClick(self):
1540 log.debug(u'Media Preview Button pressed')
1541
1542=== modified file 'openlp/plugins/presentations/lib/mediaitem.py'
1543--- openlp/plugins/presentations/lib/mediaitem.py 2009-08-11 19:21:52 +0000
1544+++ openlp/plugins/presentations/lib/mediaitem.py 2009-08-31 21:53:35 +0000
1545@@ -43,7 +43,7 @@
1546 self.controllers = controllers
1547 self.TranslationContext = u'PresentationPlugin'
1548 self.PluginTextShort = u'Presentation'
1549- self.ConfigSection = u'presentation'
1550+ self.ConfigSection = u'presentations'
1551 self.hasFileIcon = True
1552 self.hasNewIcon = False
1553 self.hasEditIcon = False
1554@@ -81,9 +81,6 @@
1555 for item in self.controllers:
1556 #load the drop down selection
1557 self.DisplayTypeComboBox.addItem(item)
1558- #load the preview toolbars
1559- #self.parent.preview_controller.registerToolbar(item, self.controllers[item])
1560- #self.parent.live_controller.registerToolbar(item, self.controllers[item])
1561
1562 def loadList(self, list):
1563 for file in list:
1564@@ -102,11 +99,13 @@
1565
1566 def generateSlideData(self, service_item):
1567 items = self.ListView.selectedIndexes()
1568- service_item.title = self.DisplayTypeComboBox.currentText()
1569+ if len(items) > 1:
1570+ return False
1571+ service_item.title = unicode(self.DisplayTypeComboBox.currentText())
1572 service_item.shortname = unicode(self.DisplayTypeComboBox.currentText())
1573 for item in items:
1574 bitem = self.ListView.item(item.row())
1575 filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
1576- frame = QtGui.QImage(unicode(filename))
1577 (path, name) = os.path.split(filename)
1578- service_item.add_using_toolbar(path, name)
1579+ service_item.add_from_command(path, name)
1580+ return True
1581
1582=== modified file 'openlp/plugins/songs/lib/mediaitem.py'
1583--- openlp/plugins/songs/lib/mediaitem.py 2009-08-26 05:00:19 +0000
1584+++ openlp/plugins/songs/lib/mediaitem.py 2009-08-31 21:53:35 +0000
1585@@ -68,15 +68,15 @@
1586 ## Preview Song Button ##
1587 self.addToolbarButton(translate(u'SongMediaItem', u'Preview Song'),
1588 translate(u'SongMediaItem', u'Preview the selected song'),
1589- ':/system/system_preview.png', self.onSongPreviewClick, 'SongPreviewItem')
1590+ ':/system/system_preview.png', self.onPreviewClick, 'SongPreviewItem')
1591 ## Live Song Button ##
1592 self.addToolbarButton(translate(u'SongMediaItem', u'Go Live'),
1593 translate(u'SongMediaItem', u'Send the selected song live'),
1594- ':/system/system_live.png', self.onSongLiveClick, 'SongLiveItem')
1595+ ':/system/system_live.png', self.onLiveClick, 'SongLiveItem')
1596 ## Add Song Button ##
1597 self.addToolbarButton(translate(u'SongMediaItem', u'Add Song To Service'),
1598 translate(u'SongMediaItem', u'Add the selected song(s) to the service'),
1599- ':/system/system_add.png', self.onSongAddClick, 'SongAddItem')
1600+ ':/system/system_add.png', self.onAddClick, 'SongAddItem')
1601 self.addToolbarSeparator()
1602 ## Song Maintenance Button ##
1603 self.addToolbarButton(translate(u'SongMediaItem', u'Song Maintenance'),
1604@@ -127,7 +127,7 @@
1605 QtCore.QObject.connect(self.SearchTextEdit,
1606 QtCore.SIGNAL(u'textChanged(const QString&)'), self.onSearchTextEditChanged)
1607 QtCore.QObject.connect(self.ListView,
1608- QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onSongPreviewClick)
1609+ QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onPreviewClick)
1610 QtCore.QObject.connect(Receiver.get_receiver(),
1611 QtCore.SIGNAL(u'load_song_list'), self.onSearchTextButtonClick)
1612
1613@@ -139,13 +139,13 @@
1614 self.ListView.addAction(contextMenuSeparator(self.ListView))
1615 self.ListView.addAction(contextMenuAction(self.ListView,
1616 ':/system/system_preview.png', translate(u'SongMediaItem', u'&Preview Song'),
1617- self.onSongPreviewClick))
1618+ self.onPreviewClick))
1619 self.ListView.addAction(contextMenuAction(self.ListView,
1620 ':/system/system_live.png', translate(u'SongMediaItem', u'&Show Live'),
1621- self.onSongLiveClick))
1622+ self.onLiveClick))
1623 self.ListView.addAction(contextMenuAction(self.ListView,
1624 ':/system/system_add.png', translate(u'SongMediaItem', u'&Add to Service'),
1625- self.onSongAddClick))
1626+ self.onAddClick))
1627
1628 def retranslateUi(self):
1629 self.SearchTypeLabel.setText(translate(u'SongMediaItem', u'Search Type:'))
1630@@ -246,12 +246,12 @@
1631 self.parent.songmanager.delete_song(item_id)
1632 row = self.ListView.row(item)
1633 self.ListView.takeItem(row)
1634-
1635- def onSongPreviewClick(self):
1636- service_item = ServiceItem(self.parent)
1637- service_item.addIcon(u':/media/media_song.png')
1638- self.generateSlideData(service_item)
1639- self.parent.preview_controller.addServiceItem(service_item)
1640+#
1641+# def onSongPreviewClick(self):
1642+# service_item = ServiceItem(self.parent)
1643+# service_item.addIcon(u':/media/media_song.png')
1644+# self.generateSlideData(service_item)
1645+# self.parent.preview_controller.addServiceItem(service_item)
1646
1647 def generateSlideData(self, service_item):
1648 raw_slides =[]
1649@@ -259,6 +259,8 @@
1650 author_list = u''
1651 ccl = u''
1652 item = self.ListView.currentItem()
1653+ if item is None:
1654+ return False
1655 item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
1656 song = self.parent.songmanager.get_song(item_id)
1657 service_item.theme = song.theme_name
1658@@ -286,15 +288,16 @@
1659 raw_footer.append(song.copyright )
1660 raw_footer.append(unicode(translate(u'SongMediaItem', u'CCL Licence: ') + ccl ))
1661 service_item.raw_footer = raw_footer
1662-
1663- def onSongLiveClick(self):
1664- service_item = ServiceItem(self.parent)
1665- service_item.addIcon(u':/media/media_song.png')
1666- self.generateSlideData(service_item)
1667- self.parent.live_controller.addServiceItem(service_item)
1668-
1669- def onSongAddClick(self):
1670- service_item = ServiceItem(self.parent)
1671- service_item.addIcon( u':/media/media_song.png')
1672- self.generateSlideData(service_item)
1673- self.parent.service_manager.addServiceItem(service_item)
1674+ return True
1675+
1676+# def onSongLiveClick(self):
1677+# service_item = ServiceItem(self.parent)
1678+# service_item.addIcon(u':/media/media_song.png')
1679+# self.generateSlideData(service_item)
1680+# self.parent.live_controller.addServiceItem(service_item)
1681+#
1682+# def onSongAddClick(self):
1683+# service_item = ServiceItem(self.parent)
1684+# service_item.addIcon( u':/media/media_song.png')
1685+# self.generateSlideData(service_item)
1686+# self.parent.service_manager.addServiceItem(service_item)