← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~raoul-snyman/openlp/bug-845692 into lp:openlp

 

Raoul Snyman has proposed merging lp:~raoul-snyman/openlp/bug-845692 into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)
Related bugs:
  Bug #845692 in OpenLP: "Missing Features in Song Audio"
  https://bugs.launchpad.net/openlp/+bug/845692

For more details, see:
https://code.launchpad.net/~raoul-snyman/openlp/bug-845692/+merge/94632

Added in the missing features in the background audio for songs.

- option to start the song paused
- option to repeat list
- button to go to the next track
- time remaining counter
- list of tracks for easy access
-- 
https://code.launchpad.net/~raoul-snyman/openlp/bug-845692/+merge/94632
Your team OpenLP Core is requested to review the proposed merge of lp:~raoul-snyman/openlp/bug-845692 into lp:openlp.
=== modified file 'openlp/core/lib/ui.py'
--- openlp/core/lib/ui.py	2011-12-27 10:33:55 +0000
+++ openlp/core/lib/ui.py	2012-02-25 00:07:21 +0000
@@ -93,6 +93,7 @@
         self.New = translate('OpenLP.Ui', 'New')
         self.NewService = translate('OpenLP.Ui', 'New Service')
         self.NewTheme = translate('OpenLP.Ui', 'New Theme')
+        self.NextTrack = translate('OpenLP.Ui', 'Next Track')
         self.NFSs = translate('OpenLP.Ui', 'No File Selected', 'Singular')
         self.NFSp = translate('OpenLP.Ui', 'No Files Selected', 'Plural')
         self.NISs = translate('OpenLP.Ui', 'No Item Selected', 'Singular')

=== modified file 'openlp/core/resources.py'
--- openlp/core/resources.py	2012-01-29 21:22:20 +0000
+++ openlp/core/resources.py	2012-02-25 00:07:21 +0000
@@ -4,12 +4,12 @@
 ###############################################################################
 # OpenLP - Open Source Lyrics Projection                                      #
 # --------------------------------------------------------------------------- #
-# Copyright (c) 2008-2012 Raoul Snyman                                        #
-# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan      #
-# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan,      #
-# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias     #
-# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith,    #
-# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund             #
+# Copyright (c) 2008-2011 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael      #
+# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler,        #
+# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout,      #
+# Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode       #
+# Woldsund                                                                    #
 # --------------------------------------------------------------------------- #
 # This program is free software; you can redistribute it and/or modify it     #
 # under the terms of the GNU General Public License as published by the Free  #
@@ -73947,6 +73947,40 @@
 \x23\xab\xe7\xf3\xa3\xf9\x51\x3d\x6f\x64\xcd\x9a\x10\x42\xfc\x07\
 \x7b\x2d\x6e\x9f\x2f\x2d\x37\x8c\x00\x00\x00\x00\x49\x45\x4e\x44\
 \xae\x42\x60\x82\
+\x00\x00\x01\xfa\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\
+\x00\x00\x00\x02\x73\x42\x49\x54\x08\x08\x55\xec\x46\x04\x00\x00\
+\x00\x09\x70\x48\x59\x73\x00\x00\x01\xbb\x00\x00\x01\xbb\x01\x3a\
+\xec\xe3\xe2\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\
+\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x01\x79\x49\x44\x41\x54\
+\x18\x19\x05\xc1\x41\x4b\x53\x01\x1c\x00\xf0\xff\x3b\xf5\x11\x0a\
+\x3c\x75\x68\x1f\xc1\x4b\x5f\x20\x82\x52\xd7\x36\x19\xc3\x52\x48\
+\x13\x95\xe4\x6d\x62\x4d\x93\xf9\x10\xbb\x55\x74\x0a\x22\xfa\x16\
+\x1b\x65\xd0\x17\x08\x62\x50\x1e\x42\xbc\x78\x79\x19\xd5\x7a\x09\
+\x3b\xac\x8d\x5f\xbf\x5f\x08\x21\xc4\x61\xe9\x20\xcb\xba\x9d\xbc\
+\x93\x67\xdd\x83\xec\xb0\x24\x84\x10\x21\x44\x27\xd9\x4b\xdb\xc3\
+\xa6\x2d\x1d\x1d\x5b\x9a\xda\xc3\xbd\xb4\x93\x08\x11\x62\x27\x69\
+\xf7\x36\x3d\x72\xa4\xef\x9b\x13\x5f\x1d\xd9\xb6\xa9\xdd\xdb\x49\
+\x44\x88\x56\xba\xee\xb9\x2f\xbe\x1b\xf8\xeb\x42\xe1\x87\x53\xcf\
+\xac\x6b\xa5\x22\xd2\xd2\xc6\xb0\xe5\xd8\x7b\xbf\xfc\x33\x31\x31\
+\x36\x52\x38\xb3\x65\x63\x98\x96\x62\x2d\x5b\xf2\xd1\x4f\x6f\xbd\
+\x72\x0c\xd8\x54\x57\xe8\x5b\xb2\xb6\x1f\xcb\xdd\x15\x9f\x15\x5e\
+\xda\xf5\xd0\x1b\x17\x58\x31\x6d\xe4\xdc\xaa\xe5\x6e\x2c\xe6\x2d\
+\x7d\x03\x75\x15\xb7\xd5\x35\xf5\xcd\x9b\x32\x36\xb0\x6b\x31\x8f\
+\x85\xbc\xe9\x58\x61\xda\x65\x97\x5c\x73\xc7\x27\xb7\x84\x89\xc2\
+\x13\x0b\x79\x34\xba\x8b\xfa\x06\xae\xbb\xea\x8a\xa6\x3f\x28\x9b\
+\x32\x36\x70\x5f\xa3\x1b\x8d\xac\xe2\x9d\x73\x37\xdd\xf0\x01\x70\
+\xd7\xb4\x91\x13\x15\x8d\xfd\xa8\x97\xaa\xc3\x07\x4e\xbd\xf0\x1b\
+\x00\x63\x85\x96\xea\xb0\x5e\x0a\x51\x4b\x67\x3d\x75\xa6\x30\x32\
+\x36\x31\x36\x52\x78\x6d\x56\x2d\x15\x21\xe6\x93\x5a\x6f\xc6\xaa\
+\xbe\x73\x03\x85\x81\x13\x4d\x33\x6a\xbd\xf9\x44\x84\x10\xb5\xa4\
+\x92\x96\x87\x33\x16\x6c\x7b\xec\x9e\x19\xe5\x61\x25\xad\x25\x42\
+\x84\x10\x42\x54\x4b\x95\xac\xdc\x9d\xcb\xe7\xf2\x72\xb7\x92\x55\
+\x4b\x42\x08\xf1\x1f\x89\xdc\x66\xb7\x16\x84\x77\xf6\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
 \x00\x00\x02\x0f\
 \x89\
 \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
@@ -82318,6 +82352,11 @@
 \x00\x6d\
 \x00\x65\x00\x64\x00\x69\x00\x61\x00\x5f\x00\x70\x00\x6c\x00\x61\x00\x79\x00\x62\x00\x61\x00\x63\x00\x6b\x00\x5f\x00\x73\x00\x74\
 \x00\x61\x00\x72\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x17\
+\x02\x02\x37\x87\
+\x00\x6d\
+\x00\x65\x00\x64\x00\x69\x00\x61\x00\x5f\x00\x70\x00\x6c\x00\x61\x00\x79\x00\x62\x00\x61\x00\x63\x00\x6b\x00\x5f\x00\x6e\x00\x65\
+\x00\x78\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
 \x00\x0e\
 \x09\x02\x2d\x47\
 \x00\x73\
@@ -82559,15 +82598,15 @@
 
 qt_resource_struct = "\
 \x00\x00\x00\x00\x00\x02\x00\x00\x00\x12\x00\x00\x00\x01\
-\x00\x00\x00\xe6\x00\x02\x00\x00\x00\x06\x00\x00\x00\x82\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x7e\
-\x00\x00\x00\xb4\x00\x02\x00\x00\x00\x03\x00\x00\x00\x7b\
-\x00\x00\x00\xd6\x00\x02\x00\x00\x00\x14\x00\x00\x00\x67\
-\x00\x00\x00\x2c\x00\x02\x00\x00\x00\x02\x00\x00\x00\x65\
-\x00\x00\x00\x14\x00\x02\x00\x00\x00\x02\x00\x00\x00\x63\
-\x00\x00\x00\xf4\x00\x02\x00\x00\x00\x05\x00\x00\x00\x5e\
-\x00\x00\x01\x2e\x00\x02\x00\x00\x00\x09\x00\x00\x00\x55\
-\x00\x00\x00\x8c\x00\x02\x00\x00\x00\x09\x00\x00\x00\x4c\
+\x00\x00\x00\xe6\x00\x02\x00\x00\x00\x06\x00\x00\x00\x83\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x7f\
+\x00\x00\x00\xb4\x00\x02\x00\x00\x00\x03\x00\x00\x00\x7c\
+\x00\x00\x00\xd6\x00\x02\x00\x00\x00\x14\x00\x00\x00\x68\
+\x00\x00\x00\x2c\x00\x02\x00\x00\x00\x02\x00\x00\x00\x66\
+\x00\x00\x00\x14\x00\x02\x00\x00\x00\x02\x00\x00\x00\x64\
+\x00\x00\x00\xf4\x00\x02\x00\x00\x00\x05\x00\x00\x00\x5f\
+\x00\x00\x01\x2e\x00\x02\x00\x00\x00\x09\x00\x00\x00\x56\
+\x00\x00\x00\x8c\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x4c\
 \x00\x00\x00\xc4\x00\x02\x00\x00\x00\x03\x00\x00\x00\x49\
 \x00\x00\x00\x3c\x00\x02\x00\x00\x00\x10\x00\x00\x00\x39\
 \x00\x00\x00\x62\x00\x02\x00\x00\x00\x03\x00\x00\x00\x36\
@@ -82582,23 +82621,23 @@
 \x00\x00\x03\xec\x00\x00\x00\x00\x00\x01\x00\x05\x65\x6d\
 \x00\x00\x04\x1a\x00\x00\x00\x00\x00\x01\x00\x08\x06\x4f\
 \x00\x00\x03\xbc\x00\x00\x00\x00\x00\x01\x00\x02\xc4\x8b\
-\x00\x00\x0e\xf8\x00\x00\x00\x00\x00\x01\x00\x13\x7d\x14\
-\x00\x00\x0f\x68\x00\x00\x00\x00\x00\x01\x00\x13\x84\x5f\
-\x00\x00\x0e\xa8\x00\x00\x00\x00\x00\x01\x00\x13\x77\xb8\
-\x00\x00\x10\x46\x00\x00\x00\x00\x00\x01\x00\x13\x96\xdd\
-\x00\x00\x0f\xc8\x00\x00\x00\x00\x00\x01\x00\x13\x8c\x75\
-\x00\x00\x0e\x50\x00\x00\x00\x00\x00\x01\x00\x13\x70\x81\
-\x00\x00\x10\x98\x00\x00\x00\x00\x00\x01\x00\x13\x9c\xe4\
-\x00\x00\x0f\x90\x00\x00\x00\x00\x00\x01\x00\x13\x87\xd3\
-\x00\x00\x10\xe6\x00\x00\x00\x00\x00\x01\x00\x13\xa2\x10\
-\x00\x00\x0e\x7a\x00\x00\x00\x00\x00\x01\x00\x13\x73\x1f\
-\x00\x00\x10\x72\x00\x00\x00\x00\x00\x01\x00\x13\x9a\x10\
-\x00\x00\x10\x1c\x00\x00\x00\x00\x00\x01\x00\x13\x94\x65\
-\x00\x00\x0e\xce\x00\x00\x00\x00\x00\x01\x00\x13\x7a\x92\
-\x00\x00\x10\xc2\x00\x00\x00\x00\x00\x01\x00\x13\x9f\xc9\
-\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x01\x00\x13\x8f\xba\
-\x00\x00\x0f\x44\x00\x00\x00\x00\x00\x01\x00\x13\x81\x62\
-\x00\x00\x0f\x1e\x00\x00\x00\x00\x00\x01\x00\x13\x7f\x4b\
+\x00\x00\x0f\x2c\x00\x00\x00\x00\x00\x01\x00\x13\x7f\x12\
+\x00\x00\x0f\x9c\x00\x00\x00\x00\x00\x01\x00\x13\x86\x5d\
+\x00\x00\x0e\xdc\x00\x00\x00\x00\x00\x01\x00\x13\x79\xb6\
+\x00\x00\x10\x7a\x00\x00\x00\x00\x00\x01\x00\x13\x98\xdb\
+\x00\x00\x0f\xfc\x00\x00\x00\x00\x00\x01\x00\x13\x8e\x73\
+\x00\x00\x0e\x84\x00\x00\x00\x00\x00\x01\x00\x13\x72\x7f\
+\x00\x00\x10\xcc\x00\x00\x00\x00\x00\x01\x00\x13\x9e\xe2\
+\x00\x00\x0f\xc4\x00\x00\x00\x00\x00\x01\x00\x13\x89\xd1\
+\x00\x00\x11\x1a\x00\x00\x00\x00\x00\x01\x00\x13\xa4\x0e\
+\x00\x00\x0e\xae\x00\x00\x00\x00\x00\x01\x00\x13\x75\x1d\
+\x00\x00\x10\xa6\x00\x00\x00\x00\x00\x01\x00\x13\x9c\x0e\
+\x00\x00\x10\x50\x00\x00\x00\x00\x00\x01\x00\x13\x96\x63\
+\x00\x00\x0f\x02\x00\x00\x00\x00\x00\x01\x00\x13\x7c\x90\
+\x00\x00\x10\xf6\x00\x00\x00\x00\x00\x01\x00\x13\xa1\xc7\
+\x00\x00\x10\x24\x00\x00\x00\x00\x00\x01\x00\x13\x91\xb8\
+\x00\x00\x0f\x78\x00\x00\x00\x00\x00\x01\x00\x13\x83\x60\
+\x00\x00\x0f\x52\x00\x00\x00\x00\x00\x01\x00\x13\x81\x49\
 \x00\x00\x03\x66\x00\x00\x00\x00\x00\x01\x00\x00\x21\x92\
 \x00\x00\x0b\x44\x00\x00\x00\x00\x00\x01\x00\x11\xef\x19\
 \x00\x00\x0b\xc4\x00\x00\x00\x00\x00\x01\x00\x11\xf5\xdf\
@@ -82611,37 +82650,38 @@
 \x00\x00\x01\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
 \x00\x00\x01\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x05\xe6\
 \x00\x00\x01\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x02\xfe\
-\x00\x00\x0d\xa0\x00\x00\x00\x00\x00\x01\x00\x12\x11\xfa\
-\x00\x00\x0d\xca\x00\x00\x00\x00\x00\x01\x00\x12\x1b\x86\
-\x00\x00\x0d\xfa\x00\x00\x00\x00\x00\x01\x00\x12\x8a\xcb\
-\x00\x00\x0e\x1a\x00\x00\x00\x00\x00\x01\x00\x12\x91\x7c\
-\x00\x00\x11\x68\x00\x00\x00\x00\x00\x01\x00\x13\xa9\x24\
-\x00\x00\x11\x0e\x00\x00\x00\x00\x00\x01\x00\x13\xa4\x23\
-\x00\x00\x13\x86\x00\x00\x00\x00\x00\x01\x00\x13\xce\x33\
-\x00\x00\x11\xda\x00\x00\x00\x00\x00\x01\x00\x13\xaf\xb1\
-\x00\x00\x11\x34\x00\x00\x00\x00\x00\x01\x00\x13\xa7\x54\
-\x00\x00\x12\xd8\x00\x00\x00\x00\x00\x01\x00\x13\xbf\x0e\
-\x00\x00\x12\x76\x00\x00\x00\x00\x00\x01\x00\x13\xb6\xde\
-\x00\x00\x13\xac\x00\x00\x00\x00\x00\x01\x00\x13\xd1\x15\
-\x00\x00\x13\x52\x00\x00\x00\x00\x00\x01\x00\x13\xca\x56\
-\x00\x00\x12\xa2\x00\x00\x00\x00\x00\x01\x00\x13\xbb\xea\
-\x00\x00\x13\xde\x00\x00\x00\x00\x00\x01\x00\x13\xd4\xd2\
-\x00\x00\x11\xaa\x00\x00\x00\x00\x00\x01\x00\x13\xac\x77\
-\x00\x00\x12\xfa\x00\x00\x00\x00\x00\x01\x00\x13\xc3\x7d\
-\x00\x00\x12\x3e\x00\x00\x00\x00\x00\x01\x00\x13\xb4\x68\
-\x00\x00\x13\x28\x00\x00\x00\x00\x00\x01\x00\x13\xc7\xce\
-\x00\x00\x12\x08\x00\x00\x00\x00\x00\x01\x00\x13\xb1\xb8\
+\x00\x00\x0d\xd4\x00\x00\x00\x00\x00\x01\x00\x12\x13\xf8\
+\x00\x00\x0d\xfe\x00\x00\x00\x00\x00\x01\x00\x12\x1d\x84\
+\x00\x00\x0e\x2e\x00\x00\x00\x00\x00\x01\x00\x12\x8c\xc9\
+\x00\x00\x0e\x4e\x00\x00\x00\x00\x00\x01\x00\x12\x93\x7a\
+\x00\x00\x11\x9c\x00\x00\x00\x00\x00\x01\x00\x13\xab\x22\
+\x00\x00\x11\x42\x00\x00\x00\x00\x00\x01\x00\x13\xa6\x21\
+\x00\x00\x13\xba\x00\x00\x00\x00\x00\x01\x00\x13\xd0\x31\
+\x00\x00\x12\x0e\x00\x00\x00\x00\x00\x01\x00\x13\xb1\xaf\
+\x00\x00\x11\x68\x00\x00\x00\x00\x00\x01\x00\x13\xa9\x52\
+\x00\x00\x13\x0c\x00\x00\x00\x00\x00\x01\x00\x13\xc1\x0c\
+\x00\x00\x12\xaa\x00\x00\x00\x00\x00\x01\x00\x13\xb8\xdc\
+\x00\x00\x13\xe0\x00\x00\x00\x00\x00\x01\x00\x13\xd3\x13\
+\x00\x00\x13\x86\x00\x00\x00\x00\x00\x01\x00\x13\xcc\x54\
+\x00\x00\x12\xd6\x00\x00\x00\x00\x00\x01\x00\x13\xbd\xe8\
+\x00\x00\x14\x12\x00\x00\x00\x00\x00\x01\x00\x13\xd6\xd0\
+\x00\x00\x11\xde\x00\x00\x00\x00\x00\x01\x00\x13\xae\x75\
+\x00\x00\x13\x2e\x00\x00\x00\x00\x00\x01\x00\x13\xc5\x7b\
+\x00\x00\x12\x72\x00\x00\x00\x00\x00\x01\x00\x13\xb6\x66\
+\x00\x00\x13\x5c\x00\x00\x00\x00\x00\x01\x00\x13\xc9\xcc\
+\x00\x00\x12\x3c\x00\x00\x00\x00\x00\x01\x00\x13\xb3\xb6\
 \x00\x00\x0a\x10\x00\x00\x00\x00\x00\x01\x00\x0e\xec\xf7\
 \x00\x00\x0a\x30\x00\x00\x00\x00\x00\x01\x00\x0e\xf0\xd4\
 \x00\x00\x09\xea\x00\x00\x00\x00\x00\x01\x00\x0e\xea\x59\
-\x00\x00\x0d\x1c\x00\x00\x00\x00\x00\x01\x00\x12\x0b\x3d\
-\x00\x00\x0d\x76\x00\x00\x00\x00\x00\x01\x00\x12\x0f\xf6\
+\x00\x00\x0c\xb2\x00\x00\x00\x00\x00\x01\x00\x12\x02\xc6\
+\x00\x00\x0d\x50\x00\x00\x00\x00\x00\x01\x00\x12\x0d\x3b\
+\x00\x00\x0d\xaa\x00\x00\x00\x00\x00\x01\x00\x12\x11\xf4\
 \x00\x00\x0c\x48\x00\x00\x00\x00\x00\x01\x00\x11\xfe\xd6\
-\x00\x00\x0c\xf8\x00\x00\x00\x00\x00\x01\x00\x12\x08\x0a\
+\x00\x00\x0d\x2c\x00\x00\x00\x00\x00\x01\x00\x12\x0a\x08\
 \x00\x00\x0c\x7c\x00\x00\x00\x00\x00\x01\x00\x12\x00\xcd\
-\x00\x00\x0c\xb2\x00\x00\x00\x00\x00\x01\x00\x12\x02\xc6\
-\x00\x00\x0c\xd4\x00\x00\x00\x00\x00\x01\x00\x12\x04\xd9\
-\x00\x00\x0d\x52\x00\x00\x00\x00\x00\x01\x00\x12\x0d\x25\
+\x00\x00\x0c\xe6\x00\x00\x00\x00\x00\x01\x00\x12\x04\xc4\
+\x00\x00\x0d\x08\x00\x00\x00\x00\x00\x01\x00\x12\x06\xd7\
+\x00\x00\x0d\x86\x00\x00\x00\x00\x00\x01\x00\x12\x0f\x23\
 \x00\x00\x0c\x20\x00\x00\x00\x00\x00\x01\x00\x11\xfc\x1a\
 \x00\x00\x02\xee\x00\x00\x00\x00\x00\x01\x00\x00\x1b\x20\
 \x00\x00\x02\x72\x00\x00\x00\x00\x00\x01\x00\x00\x11\xc5\
@@ -82657,10 +82697,10 @@
 \x00\x00\x04\xb8\x00\x00\x00\x00\x00\x01\x00\x0d\x50\x06\
 \x00\x00\x05\x52\x00\x00\x00\x00\x00\x01\x00\x0d\x56\x1f\
 \x00\x00\x05\x20\x00\x00\x00\x00\x00\x01\x00\x0d\x54\x57\
-\x00\x00\x14\x46\x00\x00\x00\x00\x00\x01\x00\x13\xde\x06\
-\x00\x00\x14\x7a\x00\x00\x00\x00\x00\x01\x00\x13\xe0\xd6\
-\x00\x00\x14\x02\x00\x00\x00\x00\x00\x01\x00\x13\xd8\x85\
-\x00\x00\x14\x26\x00\x00\x00\x00\x00\x01\x00\x13\xdb\x83\
+\x00\x00\x14\x7a\x00\x00\x00\x00\x00\x01\x00\x13\xe0\x04\
+\x00\x00\x14\xae\x00\x00\x00\x00\x00\x01\x00\x13\xe2\xd4\
+\x00\x00\x14\x36\x00\x00\x00\x00\x00\x01\x00\x13\xda\x83\
+\x00\x00\x14\x5a\x00\x00\x00\x00\x00\x01\x00\x13\xdd\x81\
 \x00\x00\x06\xde\x00\x00\x00\x00\x00\x01\x00\x0e\xaa\x8e\
 \x00\x00\x07\xc4\x00\x00\x00\x00\x00\x01\x00\x0e\xbb\x82\
 \x00\x00\x09\xca\x00\x00\x00\x00\x00\x01\x00\x0e\xe6\x66\
@@ -82684,10 +82724,10 @@
 \x00\x00\x0a\x74\x00\x00\x00\x00\x00\x01\x00\x0e\xf7\xe1\
 \x00\x00\x0a\x52\x00\x00\x00\x00\x00\x01\x00\x0e\xf4\x0e\
 \x00\x00\x0a\xa6\x00\x00\x00\x00\x00\x01\x00\x11\xe5\x3f\
-\x00\x00\x14\xaa\x00\x00\x00\x00\x00\x01\x00\x13\xe3\xcf\
-\x00\x00\x15\x0c\x00\x00\x00\x00\x00\x01\x00\x13\xea\x45\
-\x00\x00\x14\xde\x00\x00\x00\x00\x00\x01\x00\x13\xe7\x31\
-\x00\x00\x15\x34\x00\x00\x00\x00\x00\x01\x00\x13\xec\xe3\
+\x00\x00\x14\xde\x00\x00\x00\x00\x00\x01\x00\x13\xe5\xcd\
+\x00\x00\x15\x40\x00\x00\x00\x00\x00\x01\x00\x13\xec\x43\
+\x00\x00\x15\x12\x00\x00\x00\x00\x00\x01\x00\x13\xe9\x2f\
+\x00\x00\x15\x68\x00\x00\x00\x00\x00\x01\x00\x13\xee\xe1\
 \x00\x00\x06\x18\x00\x00\x00\x00\x00\x01\x00\x0d\x91\xaf\
 \x00\x00\x05\xb8\x00\x00\x00\x00\x00\x01\x00\x0d\x62\x6f\
 \x00\x00\x05\x88\x00\x00\x00\x00\x00\x01\x00\x0d\x57\xdb\

=== modified file 'openlp/core/ui/generaltab.py'
--- openlp/core/ui/generaltab.py	2012-02-06 13:28:16 +0000
+++ openlp/core/ui/generaltab.py	2012-02-25 00:07:21 +0000
@@ -175,6 +175,9 @@
         self.startPausedCheckBox = QtGui.QCheckBox(self.audioGroupBox)
         self.startPausedCheckBox.setObjectName(u'startPausedCheckBox')
         self.audioLayout.addWidget(self.startPausedCheckBox)
+        self.repeatListCheckBox = QtGui.QCheckBox(self.audioGroupBox)
+        self.repeatListCheckBox.setObjectName(u'repeatListCheckBox')
+        self.audioLayout.addWidget(self.repeatListCheckBox)
         self.rightLayout.addWidget(self.audioGroupBox)
         self.rightLayout.addStretch()
         # Signals and slots
@@ -251,6 +254,8 @@
             translate('OpenLP.GeneralTab', 'Background Audio'))
         self.startPausedCheckBox.setText(
             translate('OpenLP.GeneralTab', 'Start background audio paused'))
+        self.repeatListCheckBox.setText(
+            translate('OpenLP.GeneralTab', 'Repeat track list'))
 
     def load(self):
         """
@@ -298,6 +303,8 @@
             QtCore.QVariant(self.screens.current[u'size'].width())).toInt()[0])
         self.startPausedCheckBox.setChecked(settings.value(
             u'audio start paused', QtCore.QVariant(True)).toBool())
+        self.repeatListCheckBox.setChecked(settings.value(
+            u'audio repeat list', QtCore.QVariant(False)).toBool())
         settings.endGroup()
         self.customXValueEdit.setEnabled(self.overrideCheckBox.isChecked())
         self.customYValueEdit.setEnabled(self.overrideCheckBox.isChecked())
@@ -350,7 +357,9 @@
             QtCore.QVariant(self.overrideCheckBox.isChecked()))
         settings.setValue(u'audio start paused',
             QtCore.QVariant(self.startPausedCheckBox.isChecked()))
-        settings.endGroup()        
+        settings.setValue(u'audio repeat list',
+            QtCore.QVariant(self.repeatListCheckBox.isChecked()))
+        settings.endGroup()
         # On save update the screens as well
         self.postSetUp(True)
 

=== modified file 'openlp/core/ui/maindisplay.py'
--- openlp/core/ui/maindisplay.py	2012-01-19 19:13:19 +0000
+++ openlp/core/ui/maindisplay.py	2012-02-25 00:07:21 +0000
@@ -30,7 +30,6 @@
 """
 import cgi
 import logging
-import os
 import sys
 
 from PyQt4 import QtCore, QtGui, QtWebKit, QtOpenGL
@@ -136,12 +135,12 @@
                 QtCore.Qt.WindowStaysOnTopHint
         if QtCore.QSettings().value(u'advanced/x11 bypass wm',
             QtCore.QVariant(True)).toBool():
-            windowFlags = windowFlags | QtCore.Qt.X11BypassWindowManagerHint
+            windowFlags |= QtCore.Qt.X11BypassWindowManagerHint
         # FIXME: QtCore.Qt.SplashScreen is workaround to make display screen
         # stay always on top on Mac OS X. For details see bug 906926.
         # It needs more investigation to fix it properly.
         if sys.platform == 'darwin':
-            windowFlags = windowFlags | QtCore.Qt.SplashScreen
+            windowFlags |= QtCore.Qt.SplashScreen
         self.setWindowFlags(windowFlags)
         self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
         self.setTransparency(True)
@@ -493,11 +492,15 @@
         QtCore.QObject.__init__(self, parent)
         self.currentIndex = -1
         self.playlist = []
+        self.repeat = False
         self.mediaObject = Phonon.MediaObject()
+        self.mediaObject.setTickInterval(100)
         self.audioObject = Phonon.AudioOutput(Phonon.VideoCategory)
         Phonon.createPath(self.mediaObject, self.audioObject)
         QtCore.QObject.connect(self.mediaObject,
             QtCore.SIGNAL(u'aboutToFinish()'), self.onAboutToFinish)
+        QtCore.QObject.connect(self.mediaObject,
+            QtCore.SIGNAL(u'finished()'), self.onFinished)
 
     def __del__(self):
         """
@@ -516,6 +519,14 @@
         if len(self.playlist) > self.currentIndex:
             self.mediaObject.enqueue(self.playlist[self.currentIndex])
 
+    def onFinished(self):
+        if self.repeat:
+            log.debug(u'Repeat is enabled... here we go again!')
+            self.mediaObject.clearQueue()
+            self.mediaObject.clear()
+            self.currentIndex = -1
+            self.play()
+
     def connectVolumeSlider(self, slider):
         slider.setAudioOutput(self.audioObject)
 
@@ -563,3 +574,35 @@
         for filename in filenames:
             self.playlist.append(Phonon.MediaSource(filename))
 
+    def next(self):
+        isPlaying = self.mediaObject.state() == Phonon.PlayingState
+        self.mediaObject.clearQueue()
+        self.mediaObject.clear()
+        self.currentIndex += 1
+        if len(self.playlist) <= self.currentIndex:
+            if self.repeat:
+                self.currentIndex = 0
+            else:
+                self.currentIndex = -1
+        if self.currentIndex >= 0:
+            self.mediaObject.enqueue(self.playlist[self.currentIndex])
+            if isPlaying:
+                self.mediaObject.play()
+
+    def goTo(self, index):
+        isPlaying = self.mediaObject.state() == Phonon.PlayingState
+        self.mediaObject.clearQueue()
+        self.mediaObject.clear()
+        self.currentIndex = index
+        if len(self.playlist) <= self.currentIndex:
+            if self.repeat:
+                self.currentIndex = 0
+            else:
+                self.currentIndex = -1
+        if self.currentIndex >= 0:
+            self.mediaObject.enqueue(self.playlist[self.currentIndex])
+            if isPlaying:
+                self.mediaObject.play()
+
+    def connectSlot(self, signal, slot):
+        QtCore.QObject.connect(self.mediaObject, signal, slot)

=== modified file 'openlp/core/ui/slidecontroller.py'
--- openlp/core/ui/slidecontroller.py	2012-02-15 10:37:42 +0000
+++ openlp/core/ui/slidecontroller.py	2012-02-25 00:07:21 +0000
@@ -33,7 +33,7 @@
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import OpenLPToolbar, Receiver, ItemCapabilities, \
-    translate, build_icon, ServiceItem, build_html, PluginManager, ServiceItem
+    translate, build_icon, build_html, PluginManager, ServiceItem
 from openlp.core.lib.ui import UiStrings, shortcut_action
 from openlp.core.lib import SlideLimits, ServiceItemAction
 from openlp.core.ui import HideMode, MainDisplay, Display, ScreenList
@@ -46,9 +46,10 @@
     Customised version of QTableWidget which can respond to keyboard
     events.
     """
-    def __init__(self, parent=None, name=None):
+    def __init__(self, parent=None):
         QtGui.QTableWidget.__init__(self, parent.controller)
 
+
 class Controller(QtGui.QWidget):
     """
     Controller is a general controller widget.
@@ -277,13 +278,49 @@
             self.toolbar.addToolbarWidget(u'Song Menu', self.songMenu)
             self.songMenu.setMenu(QtGui.QMenu(
                 translate('OpenLP.SlideController', 'Go To'), self.toolbar))
-            self.toolbar.makeWidgetsInvisible([u'Song Menu'])
             # Stuff for items with background audio.
-            self.audioPauseItem = self.toolbar.addToolbarButton(
-                u'Pause Audio', u':/slides/media_playback_pause.png',
-                translate('OpenLP.SlideController', 'Pause audio.'),
-                self.onAudioPauseClicked, True)
+            self.audioPauseItem = QtGui.QToolButton(self.toolbar)
+            self.audioPauseItem.setIcon(
+                QtGui.QIcon(u':/slides/media_playback_pause.png'))
+            #u'Pause Audio', ,
+            self.audioPauseItem.setText(translate('OpenLP.SlideController',
+                'Pause audio.'))
+            self.audioPauseItem.setCheckable(True)
+            self.toolbar.addToolbarWidget(u'Pause Audio', self.audioPauseItem)
+            QtCore.QObject.connect(self.audioPauseItem,
+                QtCore.SIGNAL(u'clicked(bool)'),  self.onAudioPauseClicked)
             self.audioPauseItem.setVisible(False)
+            self.audioMenu = QtGui.QMenu(
+                translate('OpenLP.SlideController', 'Background Audio'),
+                self.toolbar)
+            self.nextTrackItem = shortcut_action(self.audioMenu,
+                u'nextTrackItem', [], self.onNextTrackClicked,
+                u':/slides/media_playback_next.png',
+                category=unicode(UiStrings().LiveToolbar))
+            self.nextTrackItem.setText(
+                translate('OpenLP.SlideController', 'Next Track'))
+            self.audioMenu.addAction(self.nextTrackItem)
+            self.trackMenu = self.audioMenu.addMenu(
+                translate('OpenLP.SlideController', 'Tracks'))
+            self.audioPauseItem.setPopupMode(QtGui.QToolButton.MenuButtonPopup)
+            self.audioPauseItem.setMenu(self.audioMenu)
+            self.audioTimeLabel = QtGui.QLabel(u' 00:00 ', self.toolbar)
+            self.audioTimeLabel.setAlignment(
+                QtCore.Qt.AlignCenter|QtCore.Qt.AlignHCenter)
+            self.audioTimeLabel.setStyleSheet(
+                u'background-color: palette(background); '
+                u'border-top-color: palette(shadow); '
+                u'border-left-color: palette(shadow); '
+                u'border-bottom-color: palette(light); '
+                u'border-right-color: palette(light); '
+                u'border-radius: 3px; border-style: inset; '
+                u'border-width: 1; font-family: monospace; margin: 2px;'
+            )
+            self.audioTimeLabel.setObjectName(u'audioTimeLabel')
+            self.toolbar.addToolbarWidget(
+                u'Time Remaining', self.audioTimeLabel)
+            self.toolbar.makeWidgetsInvisible([u'Song Menu', u'Pause Audio',
+                u'Time Remaining'])
         # Screen preview area
         self.previewFrame = QtGui.QFrame(self.splitter)
         self.previewFrame.setGeometry(QtCore.QRect(0, 0, 300, 300 * self.ratio))
@@ -544,7 +581,7 @@
            # Reset the shortcut.
             self.current_shortcut = u''
 
-    def setPreviewHotkeys(self, parent=None):
+    def setPreviewHotkeys(self):
         self.previousItem.setObjectName(u'previousItemPreview')
         self.nextItem.setObjectName(u'nextItemPreview')
         action_list = ActionList.get_instance()
@@ -621,7 +658,7 @@
                 self.keypress_loop = True
                 keypressCommand = self.keypress_queue.popleft()
                 if keypressCommand == ServiceItemAction.Previous:
-                    Receiver.send_message('servicemanager_previous_item', None)
+                    Receiver.send_message('servicemanager_previous_item')
                 elif keypressCommand == ServiceItemAction.PreviousLastSlide:
                     # Go to the last slide of the previous item
                     Receiver.send_message('servicemanager_previous_item', u'last slide')
@@ -642,6 +679,7 @@
         self.display.setup()
         if self.isLive:
             self.__addActionsToWidget(self.display)
+            self.display.audioPlayer.connectSlot(QtCore.SIGNAL(u'tick(qint64)'), self.onAudioTimeRemaining)
         # The SlidePreview's ratio.
         try:
             self.ratio = float(self.screens.current[u'size'].width()) / \
@@ -653,7 +691,7 @@
         self.previewDisplay.setup()
         serviceItem = ServiceItem()
         self.previewDisplay.webView.setHtml(build_html(serviceItem,
-            self.previewDisplay.screen, None, self.isLive, None,
+            self.previewDisplay.screen, None, self.isLive,
             plugins=PluginManager.get_instance().plugins))
         self.mediaController.setup_display(self.previewDisplay)
         if self.serviceItem:
@@ -715,7 +753,7 @@
         Adjusts the value of the ``delaySpinBox`` to the given one.
         """
         self.delaySpinBox.setValue(int(value))
-    
+
     def updateSlideLimits(self):
         """
         Updates the Slide Limits variable from the settings.
@@ -860,10 +898,23 @@
             self.display.audioPlayer.reset()
             self.setAudioItemsVisibility(False)
             self.audioPauseItem.setChecked(False)
+            # If the current item has background audio
             if self.serviceItem.is_capable(ItemCapabilities.HasBackgroundAudio):
                 log.debug(u'Starting to play...')
                 self.display.audioPlayer.addToPlaylist(
                     self.serviceItem.background_audio)
+                self.trackMenu.clear()
+                for counter in range(len(self.serviceItem.background_audio)):
+                    action = self.trackMenu.addAction(os.path.basename(
+                        self.serviceItem.background_audio[counter]))
+                    action.setData(counter)
+                    QtCore.QObject.connect(action,
+                        QtCore.SIGNAL(u'triggered(bool)'),
+                        self.onTrackTriggered)
+                self.display.audioPlayer.repeat = QtCore.QSettings().value(
+                    self.parent().generalSettingsSection + \
+                        u'/audio repeat list',
+                    QtCore.QVariant(False)).toBool()
                 if QtCore.QSettings().value(
                     self.parent().generalSettingsSection + \
                         u'/audio start paused',
@@ -915,7 +966,7 @@
                 self.slideList[unicode(row)] = row - 1
             text.append(unicode(row))
             self.previewListWidget.setItem(framenumber, 0, item)
-            if slideHeight != 0:
+            if not slideHeight:
                 self.previewListWidget.setRowHeight(framenumber, slideHeight)
         self.previewListWidget.setVerticalHeaderLabels(text)
         if self.serviceItem.is_text():
@@ -1117,7 +1168,7 @@
             else:
                 Receiver.send_message(u'live_display_show')
 
-    def onSlideSelected(self, start=False):
+    def onSlideSelected(self):
         """
         Slide selected in controller
         """
@@ -1313,7 +1364,10 @@
         self.onToggleLoop()
 
     def setAudioItemsVisibility(self, visible):
-        self.audioPauseItem.setVisible(visible)
+        if visible:
+            self.toolbar.makeWidgetsVisible([u'Song Menu', u'Pause Audio', u'Time Remaining'])
+        else:
+            self.toolbar.makeWidgetsInvisible([u'Song Menu', u'Pause Audio', u'Time Remaining'])
 
     def onAudioPauseClicked(self, checked):
         if not self.audioPauseItem.isVisible():
@@ -1424,3 +1478,17 @@
             return HideMode.Screen
         else:
             return None
+
+    def onNextTrackClicked(self):
+        self.display.audioPlayer.next()
+
+    def onAudioTimeRemaining(self, time):
+        seconds = self.display.audioPlayer.mediaObject.remainingTime() // 1000
+        minutes = seconds // 60
+        seconds %= 60
+        self.audioTimeLabel.setText(u' %02d:%02d ' % (minutes, seconds))
+
+    def onTrackTriggered(self):
+        action = self.sender()
+        index = action.data().toInt()[0]
+        self.display.audioPlayer.goTo(index)

=== modified file 'openlp/plugins/songs/lib/songstab.py'
--- openlp/plugins/songs/lib/songstab.py	2011-12-27 10:33:55 +0000
+++ openlp/plugins/songs/lib/songstab.py	2012-02-25 00:07:21 +0000
@@ -33,56 +33,56 @@
     """
     SongsTab is the Songs settings tab in the settings dialog.
     """
-    def __init__(self, parent, title, visible_title, icon_path):
-        SettingsTab.__init__(self, parent, title, visible_title, icon_path)
-
     def setupUi(self):
+        """
+        Set up the configuration tab UI.
+        """
         self.setObjectName(u'SongsTab')
         SettingsTab.setupUi(self)
-        self.SongsModeGroupBox = QtGui.QGroupBox(self.leftColumn)
-        self.SongsModeGroupBox.setObjectName(u'SongsModeGroupBox')
-        self.SongsModeLayout = QtGui.QVBoxLayout(self.SongsModeGroupBox)
-        self.SongsModeLayout.setObjectName(u'SongsModeLayout')
-        self.SearchAsTypeCheckBox = QtGui.QCheckBox(self.SongsModeGroupBox)
-        self.SearchAsTypeCheckBox.setObjectName(u'SearchAsTypeCheckBox')
-        self.SongsModeLayout.addWidget(self.SearchAsTypeCheckBox)
-        self.SongBarActiveCheckBox = QtGui.QCheckBox(self.SongsModeGroupBox)
-        self.SongBarActiveCheckBox.setObjectName(u'SongBarActiveCheckBox')
-        self.SongsModeLayout.addWidget(self.SongBarActiveCheckBox)
-        self.SongUpdateOnEditCheckBox = QtGui.QCheckBox(self.SongsModeGroupBox)
-        self.SongUpdateOnEditCheckBox.setObjectName(u'SongUpdateOnEditCheckBox')
-        self.SongsModeLayout.addWidget(self.SongUpdateOnEditCheckBox)
-        self.SongAddFromServiceCheckBox = QtGui.QCheckBox(
-            self.SongsModeGroupBox)
-        self.SongAddFromServiceCheckBox.setObjectName(
-            u'SongAddFromServiceCheckBox')
-        self.SongsModeLayout.addWidget(self.SongAddFromServiceCheckBox)
-        self.leftLayout.addWidget(self.SongsModeGroupBox)
+        self.modeGroupBox = QtGui.QGroupBox(self.leftColumn)
+        self.modeGroupBox.setObjectName(u'modeGroupBox')
+        self.modeLayout = QtGui.QVBoxLayout(self.modeGroupBox)
+        self.modeLayout.setObjectName(u'modeLayout')
+        self.searchAsTypeCheckBox = QtGui.QCheckBox(self.modeGroupBox)
+        self.searchAsTypeCheckBox.setObjectName(u'SearchAsTypeCheckBox')
+        self.modeLayout.addWidget(self.searchAsTypeCheckBox)
+        self.toolBarActiveCheckBox = QtGui.QCheckBox(self.modeGroupBox)
+        self.toolBarActiveCheckBox.setObjectName(u'toolBarActiveCheckBox')
+        self.modeLayout.addWidget(self.toolBarActiveCheckBox)
+        self.updateOnEditCheckBox = QtGui.QCheckBox(self.modeGroupBox)
+        self.updateOnEditCheckBox.setObjectName(u'updateOnEditCheckBox')
+        self.modeLayout.addWidget(self.updateOnEditCheckBox)
+        self.addFromServiceCheckBox = QtGui.QCheckBox(
+            self.modeGroupBox)
+        self.addFromServiceCheckBox.setObjectName(
+            u'addFromServiceCheckBox')
+        self.modeLayout.addWidget(self.addFromServiceCheckBox)
+        self.leftLayout.addWidget(self.modeGroupBox)
         self.leftLayout.addStretch()
         self.rightLayout.addStretch()
-        QtCore.QObject.connect(self.SearchAsTypeCheckBox,
+        QtCore.QObject.connect(self.searchAsTypeCheckBox,
             QtCore.SIGNAL(u'stateChanged(int)'),
             self.onSearchAsTypeCheckBoxChanged)
-        QtCore.QObject.connect(self.SongBarActiveCheckBox,
-            QtCore.SIGNAL(u'stateChanged(int)'),
-            self.onSongBarActiveCheckBoxChanged)
-        QtCore.QObject.connect(self.SongUpdateOnEditCheckBox,
-            QtCore.SIGNAL(u'stateChanged(int)'),
-            self.onSongUpdateOnEditCheckBoxChanged)
-        QtCore.QObject.connect(self.SongAddFromServiceCheckBox,
-            QtCore.SIGNAL(u'stateChanged(int)'),
-            self.onSongAddFromServiceCheckBoxChanged)
+        QtCore.QObject.connect(self.toolBarActiveCheckBox,
+            QtCore.SIGNAL(u'stateChanged(int)'),
+            self.onToolBarActiveCheckBoxChanged)
+        QtCore.QObject.connect(self.updateOnEditCheckBox,
+            QtCore.SIGNAL(u'stateChanged(int)'),
+            self.onUpdateOnEditCheckBoxChanged)
+        QtCore.QObject.connect(self.addFromServiceCheckBox,
+            QtCore.SIGNAL(u'stateChanged(int)'),
+            self.onAddFromServiceCheckBoxChanged)
 
     def retranslateUi(self):
-        self.SongsModeGroupBox.setTitle(
+        self.modeGroupBox.setTitle(
             translate('SongsPlugin.SongsTab', 'Songs Mode'))
-        self.SearchAsTypeCheckBox.setText(
+        self.searchAsTypeCheckBox.setText(
             translate('SongsPlugin.SongsTab', 'Enable search as you type'))
-        self.SongBarActiveCheckBox.setText(translate('SongsPlugin.SongsTab',
+        self.toolBarActiveCheckBox.setText(translate('SongsPlugin.SongsTab',
             'Display verses on live tool bar'))
-        self.SongUpdateOnEditCheckBox.setText(
+        self.updateOnEditCheckBox.setText(
             translate('SongsPlugin.SongsTab', 'Update service from song edit'))
-        self.SongAddFromServiceCheckBox.setText(
+        self.addFromServiceCheckBox.setText(
             translate('SongsPlugin.SongsTab',
             'Add missing songs when opening service'))
 
@@ -92,19 +92,19 @@
         if check_state == QtCore.Qt.Checked:
             self.song_search = True
 
-    def onSongBarActiveCheckBoxChanged(self, check_state):
-        self.song_bar = False
+    def onToolBarActiveCheckBoxChanged(self, check_state):
+        self.tool_bar = False
         # we have a set value convert to True/False
         if check_state == QtCore.Qt.Checked:
-            self.song_bar = True
+            self.tool_bar = True
 
-    def onSongUpdateOnEditCheckBoxChanged(self, check_state):
+    def onUpdateOnEditCheckBoxChanged(self, check_state):
         self.update_edit = False
         # we have a set value convert to True/False
         if check_state == QtCore.Qt.Checked:
             self.update_edit = True
 
-    def onSongAddFromServiceCheckBoxChanged(self, check_state):
+    def onAddFromServiceCheckBoxChanged(self, check_state):
         self.update_load = False
         # we have a set value convert to True/False
         if check_state == QtCore.Qt.Checked:
@@ -115,23 +115,23 @@
         settings.beginGroup(self.settingsSection)
         self.song_search = settings.value(
             u'search as type', QtCore.QVariant(False)).toBool()
-        self.song_bar = settings.value(
+        self.tool_bar = settings.value(
             u'display songbar', QtCore.QVariant(True)).toBool()
         self.update_edit = settings.value(
             u'update service on edit', QtCore.QVariant(False)).toBool()
         self.update_load = settings.value(
             u'add song from service', QtCore.QVariant(True)).toBool()
-        self.SearchAsTypeCheckBox.setChecked(self.song_search)
-        self.SongBarActiveCheckBox.setChecked(self.song_bar)
-        self.SongUpdateOnEditCheckBox.setChecked(self.update_edit)
-        self.SongAddFromServiceCheckBox.setChecked(self.update_load)
+        self.searchAsTypeCheckBox.setChecked(self.song_search)
+        self.toolBarActiveCheckBox.setChecked(self.tool_bar)
+        self.updateOnEditCheckBox.setChecked(self.update_edit)
+        self.addFromServiceCheckBox.setChecked(self.update_load)
         settings.endGroup()
 
     def save(self):
         settings = QtCore.QSettings()
         settings.beginGroup(self.settingsSection)
         settings.setValue(u'search as type', QtCore.QVariant(self.song_search))
-        settings.setValue(u'display songbar', QtCore.QVariant(self.song_bar))
+        settings.setValue(u'display songbar', QtCore.QVariant(self.tool_bar))
         settings.setValue(u'update service on edit',
             QtCore.QVariant(self.update_edit))
         settings.setValue(u'add song from service',

=== added file 'resources/images/media_playback_next.png'
Binary files resources/images/media_playback_next.png	1970-01-01 00:00:00 +0000 and resources/images/media_playback_next.png	2012-02-25 00:07:21 +0000 differ
=== modified file 'resources/images/openlp-2.qrc'
--- resources/images/openlp-2.qrc	2012-01-29 21:22:20 +0000
+++ resources/images/openlp-2.qrc	2012-02-25 00:07:21 +0000
@@ -68,6 +68,7 @@
     <file>media_playback_start.png</file>
     <file>media_playback_stop.png</file>
     <file>media_playback_pause.png</file>
+    <file>media_playback_next.png</file>
   </qresource>
   <qresource prefix="icon">
     <file>openlp-logo-16x16.png</file>


Follow ups