← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~googol/openlp/strg-f into lp:openlp

 

Andreas Preikschat has proposed merging lp:~googol/openlp/strg-f into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)
Related bugs:
  Bug #1152509 in OpenLP: "Current active plugin is not saved"
  https://bugs.launchpad.net/openlp/+bug/1152509

For more details, see:
https://code.launchpad.net/~googol/openlp/strg-f/+merge/163424

Hello,

- fixed regression in FTW
- fixed bug #1152509 (Current active plugin is not saved)
- removed dead code
- added shortcut (CTRL+F) which jumps to the search field of the current plugin.

http://ci.openlp.org/view/Specific%20Branch/job/OpenLP-Pull_and_Run_Interface_Tests/30/
http://ci.openlp.org/view/Specific%20Branch/job/OpenLP-Pull_and_Run_Functional_Tests/90/console

NOTES:
- One test needs to call main_window.show() and I don't know how to mock it.
- I added two tests. I could not find the third regression (FTW regression; but I remember, that I started the FTW and cancelled, which cause a traceback (sceenshot thread being None)).
-- 
https://code.launchpad.net/~googol/openlp/strg-f/+merge/163424
Your team OpenLP Core is requested to review the proposed merge of lp:~googol/openlp/strg-f into lp:openlp.
=== modified file 'openlp/core/lib/settings.py'
--- openlp/core/lib/settings.py	2013-04-20 20:25:06 +0000
+++ openlp/core/lib/settings.py	2013-05-12 11:35:32 +0000
@@ -244,6 +244,7 @@
         u'shortcuts/printServiceItem': [QtGui.QKeySequence(u'Ctrl+P')],
         u'shortcuts/songExportItem': [],
         u'shortcuts/songUsageStatus': [QtGui.QKeySequence(QtCore.Qt.Key_F4)],
+        u'shortcuts/searchShortcut': [QtGui.QKeySequence(u'Ctrl+F')],
         u'shortcuts/settingsShortcutsItem': [],
         u'shortcuts/settingsImportItem': [],
         u'shortcuts/settingsPluginListItem': [QtGui.QKeySequence(u'Alt+F7')],

=== modified file 'openlp/core/ui/firsttimeform.py'
--- openlp/core/ui/firsttimeform.py	2013-03-26 11:35:29 +0000
+++ openlp/core/ui/firsttimeform.py	2013-05-12 11:35:32 +0000
@@ -68,7 +68,7 @@
             screenshot = config.get(u'theme_%s' % theme, u'screenshot')
             urllib.urlretrieve(u'%s%s' % (self.parent().web, screenshot),
                 os.path.join(unicode(gettempdir(), get_filesystem_encoding()), u'openlp', screenshot))
-            item = QtGui.QListWidgetItem(title, self.parent().themesListWidget)
+            item = QtGui.QListWidgetItem(title, self.parent().themes_list_widget)
             item.setData(QtCore.Qt.UserRole, filename)
             item.setCheckState(QtCore.Qt.Unchecked)
             item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
@@ -76,8 +76,7 @@
 
 class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard):
     """
-    This is the Theme Import Wizard, which allows easy creation and editing of
-    OpenLP themes.
+    This is the Theme Import Wizard, which allows easy creation and editing of OpenLP themes.
     """
     log.info(u'ThemeWizardForm loaded')
 
@@ -97,10 +96,11 @@
             self.config.readfp(io.BytesIO(files))
         self.update_screen_list_combo()
         self.was_download_cancelled = False
+        self.theme_screenshot_thread = None
         self.downloading = translate('OpenLP.FirstTimeWizard', 'Downloading %s...')
-        self.cancelButton.clicked.connect(self.onCancelButtonClicked)
-        self.noInternetFinishButton.clicked.connect(self.onNoInternetFinishButtonClicked)
-        self.currentIdChanged.connect(self.onCurrentIdChanged)
+        self.cancel_button.clicked.connect(self.on_cancel_button_clicked)
+        self.no_internet_finish_button.clicked.connect(self.on_no_internet_finish_button_clicked)
+        self.currentIdChanged.connect(self.on_current_id_changed)
         Registry().register_function(u'config_screen_changed', self.update_screen_list_combo)
 
     def exec_(self):
@@ -116,9 +116,9 @@
         """
         self.restart()
         check_directory_exists(os.path.join(unicode(gettempdir(), get_filesystem_encoding()), u'openlp'))
-        self.noInternetFinishButton.setVisible(False)
+        self.no_internet_finish_button.setVisible(False)
         # Check if this is a re-run of the wizard.
-        self.hasRunWizard = Settings().value(u'core/has run wizard')
+        self.has_run_wizard = Settings().value(u'core/has run wizard')
         # Sort out internet access for downloads
         if self.web_access:
             songs = self.config.get(u'songs', u'languages')
@@ -126,7 +126,7 @@
             for song in songs:
                 title = unicode(self.config.get(u'songs_%s' % song, u'title'), u'utf8')
                 filename = unicode(self.config.get(u'songs_%s' % song, u'filename'), u'utf8')
-                item = QtGui.QListWidgetItem(title, self.songsListWidget)
+                item = QtGui.QListWidgetItem(title, self.songs_list_widget)
                 item.setData(QtCore.Qt.UserRole, filename)
                 item.setCheckState(QtCore.Qt.Unchecked)
                 item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
@@ -134,7 +134,7 @@
             bible_languages = bible_languages.split(u',')
             for lang in bible_languages:
                 language = unicode(self.config.get(u'bibles_%s' % lang, u'title'), u'utf8')
-                langItem = QtGui.QTreeWidgetItem(self.biblesTreeWidget, [language])
+                langItem = QtGui.QTreeWidgetItem(self.bibles_tree_widget, [language])
                 bibles = self.config.get(u'bibles_%s' % lang, u'translations')
                 bibles = bibles.split(u',')
                 for bible in bibles:
@@ -144,10 +144,10 @@
                     item.setData(0, QtCore.Qt.UserRole, filename)
                     item.setCheckState(0, QtCore.Qt.Unchecked)
                     item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
-            self.biblesTreeWidget.expandAll()
+            self.bibles_tree_widget.expandAll()
             # Download the theme screenshots.
-            self.themeScreenshotThread = ThemeScreenshotThread(self)
-            self.themeScreenshotThread.start()
+            self.theme_screenshot_thread = ThemeScreenshotThread(self)
+            self.theme_screenshot_thread.start()
         self.application.set_normal_cursor()
 
     def nextId(self):
@@ -166,61 +166,60 @@
             return FirstTimePage.Progress
         elif self.currentId() == FirstTimePage.Themes:
             self.application.set_busy_cursor()
-            while not self.themeScreenshotThread.isFinished():
+            while not self.theme_screenshot_thread.isFinished():
                 time.sleep(0.1)
                 self.application.process_events()
             # Build the screenshot icons, as this can not be done in the thread.
-            self._buildThemeScreenshots()
+            self._build_theme_screenshots()
             self.application.set_normal_cursor()
             return FirstTimePage.Defaults
         else:
             return self.currentId() + 1
 
-    def onCurrentIdChanged(self, pageId):
+    def on_current_id_changed(self, page_id):
         """
         Detects Page changes and updates as appropriate.
         """
-        # Keep track of the page we are at.  Triggering "Cancel" causes pageId
-        # to be a -1.
+        # Keep track of the page we are at.  Triggering "Cancel" causes page_id to be a -1.
         self.application.process_events()
-        if pageId != -1:
-            self.lastId = pageId
-        if pageId == FirstTimePage.Plugins:
+        if page_id != -1:
+            self.last_id = page_id
+        if page_id == FirstTimePage.Plugins:
             # Set the no internet page text.
-            if self.hasRunWizard:
-                self.noInternetLabel.setText(self.noInternetText)
+            if self.has_run_wizard:
+                self.no_internet_label.setText(self.no_internet_text)
             else:
-                self.noInternetLabel.setText(self.noInternetText + self.cancelWizardText)
-        elif pageId == FirstTimePage.Defaults:
-            self.themeComboBox.clear()
-            for iter in xrange(self.themesListWidget.count()):
-                item = self.themesListWidget.item(iter)
+                self.no_internet_label.setText(self.no_internet_text + self.cancelWizardText)
+        elif page_id == FirstTimePage.Defaults:
+            self.theme_combo_box.clear()
+            for iter in xrange(self.themes_list_widget.count()):
+                item = self.themes_list_widget.item(iter)
                 if item.checkState() == QtCore.Qt.Checked:
-                    self.themeComboBox.addItem(item.text())
-            if self.hasRunWizard:
+                    self.theme_combo_box.addItem(item.text())
+            if self.has_run_wizard:
                 # Add any existing themes to list.
                 for theme in self.theme_manager.get_themes():
-                    index = self.themeComboBox.findText(theme)
+                    index = self.theme_combo_box.findText(theme)
                     if index == -1:
-                        self.themeComboBox.addItem(theme)
+                        self.theme_combo_box.addItem(theme)
                 default_theme = Settings().value(u'themes/global theme')
                 # Pre-select the current default theme.
-                index = self.themeComboBox.findText(default_theme)
-                self.themeComboBox.setCurrentIndex(index)
-        elif pageId == FirstTimePage.NoInternet:
-            self.backButton.setVisible(False)
-            self.nextButton.setVisible(False)
-            self.noInternetFinishButton.setVisible(True)
-            if self.hasRunWizard:
-                self.cancelButton.setVisible(False)
-        elif pageId == FirstTimePage.Progress:
+                index = self.theme_combo_box.findText(default_theme)
+                self.theme_combo_box.setCurrentIndex(index)
+        elif page_id == FirstTimePage.NoInternet:
+            self.back_button.setVisible(False)
+            self.next_button.setVisible(False)
+            self.no_internet_finish_button.setVisible(True)
+            if self.has_run_wizard:
+                self.cancel_button.setVisible(False)
+        elif page_id == FirstTimePage.Progress:
             self.application.set_busy_cursor()
             self.repaint()
             self.application.process_events()
             # Try to give the wizard a chance to redraw itself
             time.sleep(0.2)
-            self._preWizard()
-            self._performWizard()
+            self._pre_wizard()
+            self._perform_wizard()
             self._post_wizard()
             self.application.set_normal_cursor()
 
@@ -229,70 +228,72 @@
         The user changed screen resolution or enabled/disabled more screens, so
         we need to update the combo box.
         """
-        self.displayComboBox.clear()
-        self.displayComboBox.addItems(self.screens.get_screen_list())
-        self.displayComboBox.setCurrentIndex(self.displayComboBox.count() - 1)
+        self.display_combo_box.clear()
+        self.display_combo_box.addItems(self.screens.get_screen_list())
+        self.display_combo_box.setCurrentIndex(self.display_combo_box.count() - 1)
 
-    def onCancelButtonClicked(self):
+    def on_cancel_button_clicked(self):
         """
         Process the triggering of the cancel button.
         """
-        if self.lastId == FirstTimePage.NoInternet or (self.lastId <= FirstTimePage.Plugins and not self.hasRunWizard):
+        if self.last_id == FirstTimePage.NoInternet or (self.last_id <= FirstTimePage.Plugins and not self.has_run_wizard):
             QtCore.QCoreApplication.exit()
             sys.exit()
         self.was_download_cancelled = True
-        while self.themeScreenshotThread.isRunning():
-            time.sleep(0.1)
+        # Was the thread created.
+        if self.theme_screenshot_thread:
+            while self.theme_screenshot_thread.isRunning():
+                time.sleep(0.1)
         self.application.set_normal_cursor()
 
-    def onNoInternetFinishButtonClicked(self):
+    def on_no_internet_finish_button_clicked(self):
         """
         Process the triggering of the "Finish" button on the No Internet page.
         """
         self.application.set_busy_cursor()
-        self._performWizard()
+        self._perform_wizard()
         self.application.set_normal_cursor()
         Settings().setValue(u'core/has run wizard', True)
         self.close()
 
-    def urlGetFile(self, url, fpath):
+    def url_get_file(self, url, f_path):
         """"
-        Download a file given a URL.  The file is retrieved in chunks, giving
-        the ability to cancel the download at any point.
+        Download a file given a URL.  The file is retrieved in chunks, giving the ability to cancel the download at any
+        point.
         """
         block_count = 0
         block_size = 4096
-        urlfile = urllib2.urlopen(url)
-        filename = open(fpath, "wb")
+        url_file = urllib2.urlopen(url)
+        filename = open(f_path, "wb")
         # Download until finished or canceled.
         while not self.was_download_cancelled:
-            data = urlfile.read(block_size)
+            data = url_file.read(block_size)
             if not data:
                 break
             filename.write(data)
             block_count += 1
-            self._downloadProgress(block_count, block_size)
+            self._download_progress(block_count, block_size)
         filename.close()
         # Delete file if cancelled, it may be a partial file.
         if self.was_download_cancelled:
-            os.remove(fpath)
+            os.remove(f_path)
 
-    def _buildThemeScreenshots(self):
+    def _build_theme_screenshots(self):
         """
         This method builds the theme screenshots' icons for all items in the
-        ``self.themesListWidget``.
+        ``self.themes_list_widget``.
         """
         themes = self.config.get(u'themes', u'files')
         themes = themes.split(u',')
         for theme in themes:
             filename = self.config.get(u'theme_%s' % theme, u'filename')
             screenshot = self.config.get(u'theme_%s' % theme, u'screenshot')
-            for index in xrange(self.themesListWidget.count()):
-                item = self.themesListWidget.item(index)
+            for index in xrange(self.themes_list_widget.count()):
+                item = self.themes_list_widget.item(index)
                 if item.data(QtCore.Qt.UserRole) == filename:
                     break
             item.setIcon(build_icon(os.path.join(unicode(gettempdir(),
-                    get_filesystem_encoding()), u'openlp', screenshot)))
+                get_filesystem_encoding()), u'openlp', screenshot)))
 
     def _getFileSize(self, url):
         """
@@ -305,15 +306,15 @@
         meta = site.info()
         return int(meta.getheaders("Content-Length")[0])
 
-    def _downloadProgress(self, count, block_size):
+    def _download_progress(self, count, block_size):
         """
         Calculate and display the download progress.
         """
         increment = (count * block_size) - self.previous_size
-        self._incrementProgressBar(None, increment)
+        self._increment_progress_bar(None, increment)
         self.previous_size = count * block_size
 
-    def _incrementProgressBar(self, status_text, increment=1):
+    def _increment_progress_bar(self, status_text, increment=1):
         """
         Update the wizard progress page.
 
@@ -324,28 +325,28 @@
             The value to increment the progress bar by.
         """
         if status_text:
-            self.progressLabel.setText(status_text)
+            self.progress_label.setText(status_text)
         if increment > 0:
-            self.progressBar.setValue(self.progressBar.value() + increment)
+            self.progress_bar.setValue(self.progress_bar.value() + increment)
         self.application.process_events()
 
-    def _preWizard(self):
+    def _pre_wizard(self):
         """
         Prepare the UI for the process.
         """
         self.max_progress = 0
-        self.finishButton.setVisible(False)
+        self.finish_button.setVisible(False)
         self.application.process_events()
         # Loop through the songs list and increase for each selected item
-        for i in xrange(self.songsListWidget.count()):
+        for i in xrange(self.songs_list_widget.count()):
             self.application.process_events()
-            item = self.songsListWidget.item(i)
+            item = self.songs_list_widget.item(i)
             if item.checkState() == QtCore.Qt.Checked:
                 filename = item.data(QtCore.Qt.UserRole)
                 size = self._getFileSize(u'%s%s' % (self.web, filename))
                 self.max_progress += size
         # Loop through the Bibles list and increase for each selected item
-        iterator = QtGui.QTreeWidgetItemIterator(self.biblesTreeWidget)
+        iterator = QtGui.QTreeWidgetItemIterator(self.bibles_tree_widget)
         while iterator.value():
             self.application.process_events()
             item = iterator.value()
@@ -355,9 +356,9 @@
                 self.max_progress += size
             iterator += 1
         # Loop through the themes list and increase for each selected item
-        for i in xrange(self.themesListWidget.count()):
+        for i in xrange(self.themes_list_widget.count()):
             self.application.process_events()
-            item = self.themesListWidget.item(i)
+            item = self.themes_list_widget.item(i)
             if item.checkState() == QtCore.Qt.Checked:
                 filename = item.data(QtCore.Qt.UserRole)
                 size = self._getFileSize(u'%s%s' % (self.web, filename))
@@ -365,16 +366,16 @@
         if self.max_progress:
             # Add on 2 for plugins status setting plus a "finished" point.
             self.max_progress += 2
-            self.progressBar.setValue(0)
-            self.progressBar.setMinimum(0)
-            self.progressBar.setMaximum(self.max_progress)
-            self.progressPage.setTitle(translate('OpenLP.FirstTimeWizard', 'Setting Up And Downloading'))
-            self.progressPage.setSubTitle(
+            self.progress_bar.setValue(0)
+            self.progress_bar.setMinimum(0)
+            self.progress_bar.setMaximum(self.max_progress)
+            self.progress_page.setTitle(translate('OpenLP.FirstTimeWizard', 'Setting Up And Downloading'))
+            self.progress_page.setSubTitle(
                 translate('OpenLP.FirstTimeWizard', 'Please wait while OpenLP is set up and your data is downloaded.'))
         else:
-            self.progressBar.setVisible(False)
-            self.progressPage.setTitle(translate('OpenLP.FirstTimeWizard', 'Setting Up'))
-            self.progressPage.setSubTitle(u'Setup complete.')
+            self.progress_bar.setVisible(False)
+            self.progress_page.setTitle(translate('OpenLP.FirstTimeWizard', 'Setting Up'))
+            self.progress_page.setSubTitle(u'Setup complete.')
         self.repaint()
         self.application.process_events()
         # Try to give the wizard a chance to repaint itself
@@ -385,44 +386,44 @@
         Clean up the UI after the process has finished.
         """
         if self.max_progress:
-            self.progressBar.setValue(self.progressBar.maximum())
-            if self.hasRunWizard:
-                self.progressLabel.setText(translate('OpenLP.FirstTimeWizard',
+            self.progress_bar.setValue(self.progress_bar.maximum())
+            if self.has_run_wizard:
+                self.progress_label.setText(translate('OpenLP.FirstTimeWizard',
                     'Download complete. Click the finish button to return to OpenLP.'))
             else:
-                self.progressLabel.setText(translate('OpenLP.FirstTimeWizard',
+                self.progress_label.setText(translate('OpenLP.FirstTimeWizard',
                     'Download complete. Click the finish button to start OpenLP.'))
         else:
-            if self.hasRunWizard:
-                self.progressLabel.setText(translate('OpenLP.FirstTimeWizard',
+            if self.has_run_wizard:
+                self.progress_label.setText(translate('OpenLP.FirstTimeWizard',
                     'Click the finish button to return to OpenLP.'))
             else:
-                self.progressLabel.setText(translate('OpenLP.FirstTimeWizard',
+                self.progress_label.setText(translate('OpenLP.FirstTimeWizard',
                     'Click the finish button to start OpenLP.'))
-        self.finishButton.setVisible(True)
-        self.finishButton.setEnabled(True)
-        self.cancelButton.setVisible(False)
-        self.nextButton.setVisible(False)
+        self.finish_button.setVisible(True)
+        self.finish_button.setEnabled(True)
+        self.cancel_button.setVisible(False)
+        self.next_button.setVisible(False)
         self.application.process_events()
 
-    def _performWizard(self):
+    def _perform_wizard(self):
         """
         Run the tasks in the wizard.
         """
         # Set plugin states
-        self._incrementProgressBar(translate('OpenLP.FirstTimeWizard', 'Enabling selected plugins...'))
-        self._setPluginStatus(self.songsCheckBox, u'songs/status')
-        self._setPluginStatus(self.bibleCheckBox, u'bibles/status')
+        self._increment_progress_bar(translate('OpenLP.FirstTimeWizard', 'Enabling selected plugins...'))
+        self._set_plugin_status(self.songs_check_box, u'songs/status')
+        self._set_plugin_status(self.bible_check_box, u'bibles/status')
         # TODO Presentation plugin is not yet working on Mac OS X.
         # For now just ignore it.
         if sys.platform != 'darwin':
-            self._setPluginStatus(self.presentationCheckBox, u'presentations/status')
-        self._setPluginStatus(self.imageCheckBox, u'images/status')
-        self._setPluginStatus(self.mediaCheckBox, u'media/status')
-        self._setPluginStatus(self.remoteCheckBox, u'remotes/status')
-        self._setPluginStatus(self.customCheckBox, u'custom/status')
-        self._setPluginStatus(self.songUsageCheckBox, u'songusage/status')
-        self._setPluginStatus(self.alertCheckBox, u'alerts/status')
+            self._set_plugin_status(self.presentation_check_box, u'presentations/status')
+        self._set_plugin_status(self.image_check_box, u'images/status')
+        self._set_plugin_status(self.media_check_box, u'media/status')
+        self._set_plugin_status(self.remote_check_box, u'remotes/status')
+        self._set_plugin_status(self.custom_check_box, u'custom/status')
+        self._set_plugin_status(self.song_usage_check_box, u'songusage/status')
+        self._set_plugin_status(self.alert_check_box, u'alerts/status')
         if self.web_access:
             # Build directories for downloads
             songs_destination = os.path.join(
@@ -430,42 +431,42 @@
             bibles_destination = AppLocation.get_section_data_path(u'bibles')
             themes_destination = AppLocation.get_section_data_path(u'themes')
             # Download songs
-            for i in xrange(self.songsListWidget.count()):
-                item = self.songsListWidget.item(i)
+            for i in xrange(self.songs_list_widget.count()):
+                item = self.songs_list_widget.item(i)
                 if item.checkState() == QtCore.Qt.Checked:
                     filename = item.data(QtCore.Qt.UserRole)
-                    self._incrementProgressBar(self.downloading % filename, 0)
+                    self._increment_progress_bar(self.downloading % filename, 0)
                     self.previous_size = 0
                     destination = os.path.join(songs_destination, unicode(filename))
-                    self.urlGetFile(u'%s%s' % (self.web, filename), destination)
+                    self.url_get_file(u'%s%s' % (self.web, filename), destination)
             # Download Bibles
             bibles_iterator = QtGui.QTreeWidgetItemIterator(
-                self.biblesTreeWidget)
+                self.bibles_tree_widget)
             while bibles_iterator.value():
                 item = bibles_iterator.value()
                 if item.parent() and item.checkState(0) == QtCore.Qt.Checked:
                     bible = item.data(0, QtCore.Qt.UserRole)
-                    self._incrementProgressBar(self.downloading % bible, 0)
+                    self._increment_progress_bar(self.downloading % bible, 0)
                     self.previous_size = 0
-                    self.urlGetFile(u'%s%s' % (self.web, bible), os.path.join(bibles_destination, bible))
+                    self.url_get_file(u'%s%s' % (self.web, bible), os.path.join(bibles_destination, bible))
                 bibles_iterator += 1
             # Download themes
-            for i in xrange(self.themesListWidget.count()):
-                item = self.themesListWidget.item(i)
+            for i in xrange(self.themes_list_widget.count()):
+                item = self.themes_list_widget.item(i)
                 if item.checkState() == QtCore.Qt.Checked:
                     theme = item.data(QtCore.Qt.UserRole)
-                    self._incrementProgressBar(self.downloading % theme, 0)
+                    self._increment_progress_bar(self.downloading % theme, 0)
                     self.previous_size = 0
-                    self.urlGetFile(u'%s%s' % (self.web, theme), os.path.join(themes_destination, theme))
+                    self.url_get_file(u'%s%s' % (self.web, theme), os.path.join(themes_destination, theme))
         # Set Default Display
-        if self.displayComboBox.currentIndex() != -1:
-            Settings().setValue(u'core/monitor', self.displayComboBox.currentIndex())
-            self.screens.set_current_display(self.displayComboBox.currentIndex())
+        if self.display_combo_box.currentIndex() != -1:
+            Settings().setValue(u'core/monitor', self.display_combo_box.currentIndex())
+            self.screens.set_current_display(self.display_combo_box.currentIndex())
         # Set Global Theme
-        if self.themeComboBox.currentIndex() != -1:
-            Settings().setValue(u'themes/global theme', self.themeComboBox.currentText())
+        if self.theme_combo_box.currentIndex() != -1:
+            Settings().setValue(u'themes/global theme', self.theme_combo_box.currentText())
 
-    def _setPluginStatus(self, field, tag):
+    def _set_plugin_status(self, field, tag):
         """
         Set the status of a plugin.
         """

=== modified file 'openlp/core/ui/firsttimewizard.py'
--- openlp/core/ui/firsttimewizard.py	2013-03-08 08:14:39 +0000
+++ openlp/core/ui/firsttimewizard.py	2013-05-12 11:35:32 +0000
@@ -55,200 +55,199 @@
     """
     The UI widgets for the first time wizard.
     """
-    def setupUi(self, FirstTimeWizard):
+    def setupUi(self, first_time_wizard):
         """
         Set up the UI.
         """
-        FirstTimeWizard.setObjectName(u'FirstTimeWizard')
-        FirstTimeWizard.resize(550, 386)
-        FirstTimeWizard.setModal(True)
-        FirstTimeWizard.setWizardStyle(QtGui.QWizard.ModernStyle)
-        FirstTimeWizard.setOptions(QtGui.QWizard.IndependentPages | QtGui.QWizard.NoBackButtonOnStartPage |
+        first_time_wizard.setObjectName(u'first_time_wizard')
+        first_time_wizard.resize(550, 386)
+        first_time_wizard.setModal(True)
+        first_time_wizard.setWizardStyle(QtGui.QWizard.ModernStyle)
+        first_time_wizard.setOptions(QtGui.QWizard.IndependentPages | QtGui.QWizard.NoBackButtonOnStartPage |
             QtGui.QWizard.NoBackButtonOnLastPage | QtGui.QWizard.HaveCustomButton1)
-        self.finishButton = self.button(QtGui.QWizard.FinishButton)
-        self.noInternetFinishButton = self.button(QtGui.QWizard.CustomButton1)
-        self.cancelButton = self.button(QtGui.QWizard.CancelButton)
-        self.nextButton = self.button(QtGui.QWizard.NextButton)
-        self.backButton = self.button(QtGui.QWizard.BackButton)
-        add_welcome_page(FirstTimeWizard, u':/wizards/wizard_firsttime.bmp')
+        self.finish_button = self.button(QtGui.QWizard.FinishButton)
+        self.no_internet_finish_button = self.button(QtGui.QWizard.CustomButton1)
+        self.cancel_button = self.button(QtGui.QWizard.CancelButton)
+        self.next_button = self.button(QtGui.QWizard.NextButton)
+        self.back_button = self.button(QtGui.QWizard.BackButton)
+        add_welcome_page(first_time_wizard, u':/wizards/wizard_firsttime.bmp')
         # The plugins page
-        self.pluginPage = QtGui.QWizardPage()
-        self.pluginPage.setObjectName(u'pluginPage')
-        self.pluginLayout = QtGui.QVBoxLayout(self.pluginPage)
-        self.pluginLayout.setContentsMargins(40, 15, 40, 0)
-        self.pluginLayout.setObjectName(u'pluginLayout')
-        self.songsCheckBox = QtGui.QCheckBox(self.pluginPage)
-        self.songsCheckBox.setChecked(True)
-        self.songsCheckBox.setObjectName(u'songsCheckBox')
-        self.pluginLayout.addWidget(self.songsCheckBox)
-        self.customCheckBox = QtGui.QCheckBox(self.pluginPage)
-        self.customCheckBox.setChecked(True)
-        self.customCheckBox.setObjectName(u'customCheckBox')
-        self.pluginLayout.addWidget(self.customCheckBox)
-        self.bibleCheckBox = QtGui.QCheckBox(self.pluginPage)
-        self.bibleCheckBox.setChecked(True)
-        self.bibleCheckBox.setObjectName(u'bibleCheckBox')
-        self.pluginLayout.addWidget(self.bibleCheckBox)
-        self.imageCheckBox = QtGui.QCheckBox(self.pluginPage)
-        self.imageCheckBox.setChecked(True)
-        self.imageCheckBox.setObjectName(u'imageCheckBox')
-        self.pluginLayout.addWidget(self.imageCheckBox)
+        self.plugin_page = QtGui.QWizardPage()
+        self.plugin_page.setObjectName(u'plugin_page')
+        self.plugin_layout = QtGui.QVBoxLayout(self.plugin_page)
+        self.plugin_layout.setContentsMargins(40, 15, 40, 0)
+        self.plugin_layout.setObjectName(u'plugin_layout')
+        self.songs_check_box = QtGui.QCheckBox(self.plugin_page)
+        self.songs_check_box.setChecked(True)
+        self.songs_check_box.setObjectName(u'songs_check_box')
+        self.plugin_layout.addWidget(self.songs_check_box)
+        self.custom_check_box = QtGui.QCheckBox(self.plugin_page)
+        self.custom_check_box.setChecked(True)
+        self.custom_check_box.setObjectName(u'custom_check_box')
+        self.plugin_layout.addWidget(self.custom_check_box)
+        self.bible_check_box = QtGui.QCheckBox(self.plugin_page)
+        self.bible_check_box.setChecked(True)
+        self.bible_check_box.setObjectName(u'bible_check_box')
+        self.plugin_layout.addWidget(self.bible_check_box)
+        self.image_check_box = QtGui.QCheckBox(self.plugin_page)
+        self.image_check_box.setChecked(True)
+        self.image_check_box.setObjectName(u'image_check_box')
+        self.plugin_layout.addWidget(self.image_check_box)
         # TODO Presentation plugin is not yet working on Mac OS X.
         # For now just ignore it.
         if sys.platform != 'darwin':
-            self.presentationCheckBox = QtGui.QCheckBox(self.pluginPage)
-            self.presentationCheckBox.setChecked(True)
-            self.presentationCheckBox.setObjectName(u'presentationCheckBox')
-            self.pluginLayout.addWidget(self.presentationCheckBox)
-        self.mediaCheckBox = QtGui.QCheckBox(self.pluginPage)
-        self.mediaCheckBox.setChecked(True)
-        self.mediaCheckBox.setObjectName(u'mediaCheckBox')
-        self.pluginLayout.addWidget(self.mediaCheckBox)
-        self.remoteCheckBox = QtGui.QCheckBox(self.pluginPage)
-        self.remoteCheckBox.setObjectName(u'remoteCheckBox')
-        self.pluginLayout.addWidget(self.remoteCheckBox)
-        self.songUsageCheckBox = QtGui.QCheckBox(self.pluginPage)
-        self.songUsageCheckBox.setChecked(True)
-        self.songUsageCheckBox.setObjectName(u'songUsageCheckBox')
-        self.pluginLayout.addWidget(self.songUsageCheckBox)
-        self.alertCheckBox = QtGui.QCheckBox(self.pluginPage)
-        self.alertCheckBox.setChecked(True)
-        self.alertCheckBox.setObjectName(u'alertCheckBox')
-        self.pluginLayout.addWidget(self.alertCheckBox)
-        FirstTimeWizard.setPage(FirstTimePage.Plugins, self.pluginPage)
+            self.presentation_check_box = QtGui.QCheckBox(self.plugin_page)
+            self.presentation_check_box.setChecked(True)
+            self.presentation_check_box.setObjectName(u'presentation_check_box')
+            self.plugin_layout.addWidget(self.presentation_check_box)
+        self.media_check_box = QtGui.QCheckBox(self.plugin_page)
+        self.media_check_box.setChecked(True)
+        self.media_check_box.setObjectName(u'media_check_box')
+        self.plugin_layout.addWidget(self.media_check_box)
+        self.remote_check_box = QtGui.QCheckBox(self.plugin_page)
+        self.remote_check_box.setObjectName(u'remote_check_box')
+        self.plugin_layout.addWidget(self.remote_check_box)
+        self.song_usage_check_box = QtGui.QCheckBox(self.plugin_page)
+        self.song_usage_check_box.setChecked(True)
+        self.song_usage_check_box.setObjectName(u'song_usage_check_box')
+        self.plugin_layout.addWidget(self.song_usage_check_box)
+        self.alert_check_box = QtGui.QCheckBox(self.plugin_page)
+        self.alert_check_box.setChecked(True)
+        self.alert_check_box.setObjectName(u'alert_check_box')
+        self.plugin_layout.addWidget(self.alert_check_box)
+        first_time_wizard.setPage(FirstTimePage.Plugins, self.plugin_page)
         # The "you don't have an internet connection" page.
-        self.noInternetPage = QtGui.QWizardPage()
-        self.noInternetPage.setObjectName(u'noInternetPage')
-        self.noInternetLayout = QtGui.QVBoxLayout(self.noInternetPage)
-        self.noInternetLayout.setContentsMargins(50, 30, 50, 40)
-        self.noInternetLayout.setObjectName(u'noInternetLayout')
-        self.noInternetLabel = QtGui.QLabel(self.noInternetPage)
-        self.noInternetLabel.setWordWrap(True)
-        self.noInternetLabel.setObjectName(u'noInternetLabel')
-        self.noInternetLayout.addWidget(self.noInternetLabel)
-        FirstTimeWizard.setPage(FirstTimePage.NoInternet, self.noInternetPage)
+        self.no_internet_page = QtGui.QWizardPage()
+        self.no_internet_page.setObjectName(u'no_internet_page')
+        self.no_internet_layout = QtGui.QVBoxLayout(self.no_internet_page)
+        self.no_internet_layout.setContentsMargins(50, 30, 50, 40)
+        self.no_internet_layout.setObjectName(u'no_internet_layout')
+        self.no_internet_label = QtGui.QLabel(self.no_internet_page)
+        self.no_internet_label.setWordWrap(True)
+        self.no_internet_label.setObjectName(u'no_internet_label')
+        self.no_internet_layout.addWidget(self.no_internet_label)
+        first_time_wizard.setPage(FirstTimePage.NoInternet, self.no_internet_page)
         # The song samples page
-        self.songsPage = QtGui.QWizardPage()
-        self.songsPage.setObjectName(u'songsPage')
-        self.songsLayout = QtGui.QVBoxLayout(self.songsPage)
-        self.songsLayout.setContentsMargins(50, 20, 50, 20)
-        self.songsLayout.setObjectName(u'songsLayout')
-        self.songsListWidget = QtGui.QListWidget(self.songsPage)
-        self.songsListWidget.setAlternatingRowColors(True)
-        self.songsListWidget.setObjectName(u'songsListWidget')
-        self.songsLayout.addWidget(self.songsListWidget)
-        FirstTimeWizard.setPage(FirstTimePage.Songs, self.songsPage)
+        self.songs_page = QtGui.QWizardPage()
+        self.songs_page.setObjectName(u'songs_page')
+        self.songs_layout = QtGui.QVBoxLayout(self.songs_page)
+        self.songs_layout.setContentsMargins(50, 20, 50, 20)
+        self.songs_layout.setObjectName(u'songs_layout')
+        self.songs_list_widget = QtGui.QListWidget(self.songs_page)
+        self.songs_list_widget.setAlternatingRowColors(True)
+        self.songs_list_widget.setObjectName(u'songs_list_widget')
+        self.songs_layout.addWidget(self.songs_list_widget)
+        first_time_wizard.setPage(FirstTimePage.Songs, self.songs_page)
         # The Bible samples page
-        self.biblesPage = QtGui.QWizardPage()
-        self.biblesPage.setObjectName(u'biblesPage')
-        self.biblesLayout = QtGui.QVBoxLayout(self.biblesPage)
-        self.biblesLayout.setContentsMargins(50, 20, 50, 20)
-        self.biblesLayout.setObjectName(u'biblesLayout')
-        self.biblesTreeWidget = QtGui.QTreeWidget(self.biblesPage)
-        self.biblesTreeWidget.setAlternatingRowColors(True)
-        self.biblesTreeWidget.header().setVisible(False)
-        self.biblesTreeWidget.setObjectName(u'biblesTreeWidget')
-        self.biblesLayout.addWidget(self.biblesTreeWidget)
-        FirstTimeWizard.setPage(FirstTimePage.Bibles, self.biblesPage)
+        self.bibles_page = QtGui.QWizardPage()
+        self.bibles_page.setObjectName(u'bibles_page')
+        self.bibles_layout = QtGui.QVBoxLayout(self.bibles_page)
+        self.bibles_layout.setContentsMargins(50, 20, 50, 20)
+        self.bibles_layout.setObjectName(u'bibles_layout')
+        self.bibles_tree_widget = QtGui.QTreeWidget(self.bibles_page)
+        self.bibles_tree_widget.setAlternatingRowColors(True)
+        self.bibles_tree_widget.header().setVisible(False)
+        self.bibles_tree_widget.setObjectName(u'bibles_tree_widget')
+        self.bibles_layout.addWidget(self.bibles_tree_widget)
+        first_time_wizard.setPage(FirstTimePage.Bibles, self.bibles_page)
         # The theme samples page
-        self.themesPage = QtGui.QWizardPage()
-        self.themesPage.setObjectName(u'themesPage')
-        self.themesLayout = QtGui.QVBoxLayout(self.themesPage)
-        self.themesLayout.setContentsMargins(20, 50, 20, 60)
-        self.themesLayout.setObjectName(u'themesLayout')
-        self.themesListWidget = QtGui.QListWidget(self.themesPage)
-        self.themesListWidget.setViewMode(QtGui.QListView.IconMode)
-        self.themesListWidget.setMovement(QtGui.QListView.Static)
-        self.themesListWidget.setFlow(QtGui.QListView.LeftToRight)
-        self.themesListWidget.setSpacing(4)
-        self.themesListWidget.setUniformItemSizes(True)
-        self.themesListWidget.setIconSize(QtCore.QSize(133, 100))
-        self.themesListWidget.setWrapping(False)
-        self.themesListWidget.setObjectName(u'themesListWidget')
-        self.themesLayout.addWidget(self.themesListWidget)
-        FirstTimeWizard.setPage(FirstTimePage.Themes, self.themesPage)
+        self.themes_page = QtGui.QWizardPage()
+        self.themes_page.setObjectName(u'themes_page')
+        self.themes_layout = QtGui.QVBoxLayout(self.themes_page)
+        self.themes_layout.setContentsMargins(20, 50, 20, 60)
+        self.themes_layout.setObjectName(u'themes_layout')
+        self.themes_list_widget = QtGui.QListWidget(self.themes_page)
+        self.themes_list_widget.setViewMode(QtGui.QListView.IconMode)
+        self.themes_list_widget.setMovement(QtGui.QListView.Static)
+        self.themes_list_widget.setFlow(QtGui.QListView.LeftToRight)
+        self.themes_list_widget.setSpacing(4)
+        self.themes_list_widget.setUniformItemSizes(True)
+        self.themes_list_widget.setIconSize(QtCore.QSize(133, 100))
+        self.themes_list_widget.setWrapping(False)
+        self.themes_list_widget.setObjectName(u'themes_list_widget')
+        self.themes_layout.addWidget(self.themes_list_widget)
+        first_time_wizard.setPage(FirstTimePage.Themes, self.themes_page)
         # the default settings page
-        self.defaultsPage = QtGui.QWizardPage()
-        self.defaultsPage.setObjectName(u'defaultsPage')
-        self.defaultsLayout = QtGui.QFormLayout(self.defaultsPage)
-        self.defaultsLayout.setContentsMargins(50, 20, 50, 20)
-        self.defaultsLayout.setObjectName(u'defaultsLayout')
-        self.displayLabel = QtGui.QLabel(self.defaultsPage)
-        self.displayLabel.setObjectName(u'displayLabel')
-        self.displayComboBox = QtGui.QComboBox(self.defaultsPage)
-        self.displayComboBox.setEditable(False)
-        self.displayComboBox.setInsertPolicy(QtGui.QComboBox.NoInsert)
-        self.displayComboBox.setObjectName(u'displayComboBox')
-        self.defaultsLayout.addRow(self.displayLabel, self.displayComboBox)
-        self.themeLabel = QtGui.QLabel(self.defaultsPage)
-        self.themeLabel.setObjectName(u'themeLabel')
-        self.themeComboBox = QtGui.QComboBox(self.defaultsPage)
-        self.themeComboBox.setEditable(False)
-        self.themeComboBox.setInsertPolicy(QtGui.QComboBox.NoInsert)
-        self.themeComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
-        self.themeComboBox.setObjectName(u'themeComboBox')
-        self.defaultsLayout.addRow(self.themeLabel, self.themeComboBox)
-        FirstTimeWizard.setPage(FirstTimePage.Defaults, self.defaultsPage)
+        self.defaults_page = QtGui.QWizardPage()
+        self.defaults_page.setObjectName(u'defaults_page')
+        self.defaults_layout = QtGui.QFormLayout(self.defaults_page)
+        self.defaults_layout.setContentsMargins(50, 20, 50, 20)
+        self.defaults_layout.setObjectName(u'defaults_layout')
+        self.display_label = QtGui.QLabel(self.defaults_page)
+        self.display_label.setObjectName(u'display_label')
+        self.display_combo_box = QtGui.QComboBox(self.defaults_page)
+        self.display_combo_box.setEditable(False)
+        self.display_combo_box.setInsertPolicy(QtGui.QComboBox.NoInsert)
+        self.display_combo_box.setObjectName(u'display_combo_box')
+        self.defaults_layout.addRow(self.display_label, self.display_combo_box)
+        self.theme_label = QtGui.QLabel(self.defaults_page)
+        self.theme_label.setObjectName(u'theme_label')
+        self.theme_combo_box = QtGui.QComboBox(self.defaults_page)
+        self.theme_combo_box.setEditable(False)
+        self.theme_combo_box.setInsertPolicy(QtGui.QComboBox.NoInsert)
+        self.theme_combo_box.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
+        self.theme_combo_box.setObjectName(u'theme_combo_box')
+        self.defaults_layout.addRow(self.theme_label, self.theme_combo_box)
+        first_time_wizard.setPage(FirstTimePage.Defaults, self.defaults_page)
         # Progress page
-        self.progressPage = QtGui.QWizardPage()
-        self.progressPage.setObjectName(u'progressPage')
-        self.progressLayout = QtGui.QVBoxLayout(self.progressPage)
-        self.progressLayout.setMargin(48)
-        self.progressLayout.setObjectName(u'progressLayout')
-        self.progressLabel = QtGui.QLabel(self.progressPage)
-        self.progressLabel.setObjectName(u'progressLabel')
-        self.progressLayout.addWidget(self.progressLabel)
-        self.progressBar = QtGui.QProgressBar(self.progressPage)
-        self.progressBar.setObjectName(u'progressBar')
-        self.progressLayout.addWidget(self.progressBar)
-        FirstTimeWizard.setPage(FirstTimePage.Progress, self.progressPage)
-        self.retranslateUi(FirstTimeWizard)
+        self.progress_page = QtGui.QWizardPage()
+        self.progress_page.setObjectName(u'progress_page')
+        self.progress_layout = QtGui.QVBoxLayout(self.progress_page)
+        self.progress_layout.setMargin(48)
+        self.progress_layout.setObjectName(u'progress_layout')
+        self.progress_label = QtGui.QLabel(self.progress_page)
+        self.progress_label.setObjectName(u'progress_label')
+        self.progress_layout.addWidget(self.progress_label)
+        self.progress_bar = QtGui.QProgressBar(self.progress_page)
+        self.progress_bar.setObjectName(u'progress_bar')
+        self.progress_layout.addWidget(self.progress_bar)
+        first_time_wizard.setPage(FirstTimePage.Progress, self.progress_page)
+        self.retranslateUi(first_time_wizard)
 
-    def retranslateUi(self, FirstTimeWizard):
+    def retranslateUi(self, first_time_wizard):
         """
         Translate the UI on the fly
         """
-        FirstTimeWizard.setWindowTitle(translate('OpenLP.FirstTimeWizard', 'First Time Wizard'))
+        first_time_wizard.setWindowTitle(translate('OpenLP.FirstTimeWizard', 'First Time Wizard'))
         self.title_label.setText(u'<span style="font-size:14pt; font-weight:600;">%s</span>' %
             translate('OpenLP.FirstTimeWizard', 'Welcome to the First Time Wizard'))
         self.information_label.setText(translate('OpenLP.FirstTimeWizard',
             'This wizard will help you to configure OpenLP for initial use. Click the next button below to start.'))
-        self.pluginPage.setTitle(translate('OpenLP.FirstTimeWizard', 'Activate required Plugins'))
-        self.pluginPage.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Select the Plugins you wish to use. '))
-        self.songsCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Songs'))
-        self.customCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Custom Slides'))
-        self.bibleCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Bible'))
-        self.imageCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Images'))
+        self.plugin_page.setTitle(translate('OpenLP.FirstTimeWizard', 'Activate required Plugins'))
+        self.plugin_page.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Select the Plugins you wish to use. '))
+        self.songs_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Songs'))
+        self.custom_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Custom Slides'))
+        self.bible_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Bible'))
+        self.image_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Images'))
         # TODO Presentation plugin is not yet working on Mac OS X.
         # For now just ignore it.
         if sys.platform != 'darwin':
-            self.presentationCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Presentations'))
-        self.mediaCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Media (Audio and Video)'))
-        self.remoteCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Allow remote access'))
-        self.songUsageCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Monitor Song Usage'))
-        self.alertCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Allow Alerts'))
-        self.noInternetPage.setTitle(translate('OpenLP.FirstTimeWizard', 'No Internet Connection'))
-        self.noInternetPage.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Unable to detect an Internet connection.'))
-        self.noInternetText = translate('OpenLP.FirstTimeWizard',
-            'No Internet connection was found. The First Time Wizard needs an '
-            'Internet connection in order to be able to download sample '
-            'songs, Bibles and themes.  Click the Finish button now to start '
-            'OpenLP with initial settings and no sample data.\n\nTo re-run the '
-            'First Time Wizard and import this sample data at a later time, '
-            'check your Internet connection and re-run this wizard by '
-            'selecting "Tools/Re-run First Time Wizard" from OpenLP.')
+            self.presentation_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Presentations'))
+        self.media_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Media (Audio and Video)'))
+        self.remote_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Allow remote access'))
+        self.song_usage_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Monitor Song Usage'))
+        self.alert_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Allow Alerts'))
+        self.no_internet_page.setTitle(translate('OpenLP.FirstTimeWizard', 'No Internet Connection'))
+        self.no_internet_page.setSubTitle(
+            translate('OpenLP.FirstTimeWizard', 'Unable to detect an Internet connection.'))
+        self.no_internet_text = translate('OpenLP.FirstTimeWizard',
+            'No Internet connection was found. The First Time Wizard needs an Internet connection in order to be able '
+            'to download sample songs, Bibles and themes.  Click the Finish button now to start OpenLP with initial '
+            'settings and no sample data.\n\nTo re-run the First Time Wizard and import this sample data at a later '
+            'time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" '
+            'from OpenLP.')
         self.cancelWizardText = translate('OpenLP.FirstTimeWizard',
             '\n\nTo cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now.')
-        self.songsPage.setTitle(translate('OpenLP.FirstTimeWizard', 'Sample Songs'))
-        self.songsPage.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Select and download public domain songs.'))
-        self.biblesPage.setTitle(translate('OpenLP.FirstTimeWizard', 'Sample Bibles'))
-        self.biblesPage.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Select and download free Bibles.'))
-        self.themesPage.setTitle(translate('OpenLP.FirstTimeWizard', 'Sample Themes'))
-        self.themesPage.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Select and download sample themes.'))
-        self.defaultsPage.setTitle(translate('OpenLP.FirstTimeWizard', 'Default Settings'))
-        self.defaultsPage.setSubTitle(translate('OpenLP.FirstTimeWizard',
+        self.songs_page.setTitle(translate('OpenLP.FirstTimeWizard', 'Sample Songs'))
+        self.songs_page.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Select and download public domain songs.'))
+        self.bibles_page.setTitle(translate('OpenLP.FirstTimeWizard', 'Sample Bibles'))
+        self.bibles_page.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Select and download free Bibles.'))
+        self.themes_page.setTitle(translate('OpenLP.FirstTimeWizard', 'Sample Themes'))
+        self.themes_page.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Select and download sample themes.'))
+        self.defaults_page.setTitle(translate('OpenLP.FirstTimeWizard', 'Default Settings'))
+        self.defaults_page.setSubTitle(translate('OpenLP.FirstTimeWizard',
             'Set up default settings to be used by OpenLP.'))
-        self.displayLabel.setText(translate('OpenLP.FirstTimeWizard', 'Default output display:'))
-        self.themeLabel.setText(translate('OpenLP.FirstTimeWizard', 'Select default theme:'))
-        self.progressLabel.setText(translate('OpenLP.FirstTimeWizard', 'Starting configuration process...'))
-        FirstTimeWizard.setButtonText(QtGui.QWizard.CustomButton1, translate('OpenLP.FirstTimeWizard', 'Finish'))
+        self.display_label.setText(translate('OpenLP.FirstTimeWizard', 'Default output display:'))
+        self.theme_label.setText(translate('OpenLP.FirstTimeWizard', 'Select default theme:'))
+        self.progress_label.setText(translate('OpenLP.FirstTimeWizard', 'Starting configuration process...'))
+        first_time_wizard.setButtonText(QtGui.QWizard.CustomButton1, translate('OpenLP.FirstTimeWizard', 'Finish'))

=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py	2013-04-20 20:34:46 +0000
+++ openlp/core/ui/mainwindow.py	2013-05-12 11:35:32 +0000
@@ -237,7 +237,7 @@
         self.view_live_panel = create_action(main_window, u'viewLivePanel',
             can_shortcuts=True, checked=live_visible,
             category=UiStrings().View, triggers=self.set_live_panel_visibility)
-        self.lockPanel = create_action(main_window, u'lockPanel',
+        self.lock_panel = create_action(main_window, u'lockPanel',
             can_shortcuts=True, checked=panel_locked,
             category=UiStrings().View,
             triggers=self.set_lock_panel)
@@ -310,6 +310,10 @@
             can_shortcuts=True,
             category=UiStrings().Help, triggers=self.on_online_help_clicked)
         self.web_site_item = create_action(main_window, u'webSiteItem', can_shortcuts=True, category=UiStrings().Help)
+        # Shortcuts not connected to buttons or menu entires.
+        self.search_shortcut_action = create_action(main_window,
+            u'searchShortcut', can_shortcuts=True, category=UiStrings().File,
+            triggers=self.on_search_shortcut_triggered)
         add_actions(self.file_import_menu, (self.settings_import_item, None, self.import_theme_item,
             self.import_language_item))
         add_actions(self.file_export_menu, (self.settings_export_item, None, self.export_theme_item,
@@ -321,7 +325,7 @@
         add_actions(self.view_modeMenu, (self.mode_default_Item, self.mode_setup_item, self.mode_live_item))
         add_actions(self.view_menu, (self.view_modeMenu.menuAction(), None, self.view_media_manager_item,
             self.view_service_manager_item, self.view_theme_manager_item, None, self.view_preview_panel,
-            self.view_live_panel, None, self.lockPanel))
+            self.view_live_panel, None, self.lock_panel))
         # i18n add Language Actions
         add_actions(self.settings_language_menu, (self.auto_language_item, None))
         add_actions(self.settings_language_menu, self.language_group.actions())
@@ -344,6 +348,7 @@
             add_actions(self.help_menu, (self.on_line_help_item, None, self.web_site_item, self.about_item))
         add_actions(self.menuBar, (self.file_menu.menuAction(), self.view_menu.menuAction(),
             self.tools_menu.menuAction(), self.settings_menu.menuAction(), self.help_menu.menuAction()))
+        add_actions(self, [self.search_shortcut_action])
         # Initialise the translation
         self.retranslateUi(main_window)
         self.media_tool_box.setCurrentIndex(0)
@@ -356,12 +361,11 @@
         self.set_lock_panel(panel_locked)
         self.settingsImported = False
 
-    def retranslateUi(self, mainWindow):
+    def retranslateUi(self, main_window):
         """
         Set up the translation system
         """
-        mainWindow.mainTitle = UiStrings().OLPV2x
-        mainWindow.setWindowTitle(mainWindow.mainTitle)
+        main_window.setWindowTitle(UiStrings().OLPV2x)
         self.file_menu.setTitle(translate('OpenLP.MainWindow', '&File'))
         self.file_import_menu.setTitle(translate('OpenLP.MainWindow', '&Import'))
         self.file_export_menu.setTitle(translate('OpenLP.MainWindow', '&Export'))
@@ -423,8 +427,8 @@
             translate('OpenLP.MainWindow', 'Toggle the visibility of the preview panel.'))
         self.view_live_panel.setText(translate('OpenLP.MainWindow', '&Live Panel'))
         self.view_live_panel.setToolTip(translate('OpenLP.MainWindow', 'Toggle Live Panel'))
-        self.lockPanel.setText(translate('OpenLP.MainWindow', 'L&ock Panels'))
-        self.lockPanel.setStatusTip(translate('OpenLP.MainWindow', 'Prevent the panels being moved.'))
+        self.lock_panel.setText(translate('OpenLP.MainWindow', 'L&ock Panels'))
+        self.lock_panel.setStatusTip(translate('OpenLP.MainWindow', 'Prevent the panels being moved.'))
         self.view_live_panel.setStatusTip(translate('OpenLP.MainWindow', 'Toggle the visibility of the live panel.'))
         self.settingsPluginListItem.setText(translate('OpenLP.MainWindow', '&Plugin List'))
         self.settingsPluginListItem.setStatusTip(translate('OpenLP.MainWindow', 'List the Plugins'))
@@ -433,6 +437,9 @@
         if os.name == u'nt':
             self.offlineHelpItem.setText(translate('OpenLP.MainWindow', '&User Guide'))
         self.on_line_help_item.setText(translate('OpenLP.MainWindow', '&Online Help'))
+        self.search_shortcut_action.setText(UiStrings().Search)
+        self.search_shortcut_action.setToolTip(
+            translate('OpenLP.MainWindow', 'Jump to the search box of the current active plugin.'))
         self.web_site_item.setText(translate('OpenLP.MainWindow', '&Web Site'))
         for item in self.language_group.actions():
             item.setText(item.objectName())
@@ -467,8 +474,7 @@
 
     def __init__(self):
         """
-        This constructor sets up the interface, the various managers, and the
-        plugins.
+        This constructor sets up the interface, the various managers, and the plugins.
         """
         QtGui.QMainWindow.__init__(self)
         Registry().register(u'main_window', self)
@@ -491,7 +497,6 @@
         self.new_data_path = None
         self.copy_data = False
         Settings().set_up_default_values()
-        self.service_not_saved = False
         self.about_form = AboutForm(self)
         self.media_controller = MediaController()
         self.settings_form = SettingsForm(self)
@@ -536,22 +541,28 @@
         Registry().register_function(u'theme_update_global', self.default_theme_changed)
         Registry().register_function(u'openlp_version_check', self.version_notice)
         Registry().register_function(u'config_screen_changed', self.screen_changed)
+        Registry().register_function(u'bootstrap_post_set_up', self.restore_current_media_manager_item)
         self.renderer = Renderer()
+        # Reset the cursor
+        self.application.set_normal_cursor()
+
+    def restore_current_media_manager_item(self):
+        """
+        Called on start up to restore the last active media plugin.
+        """
         log.info(u'Load data from Settings')
         if Settings().value(u'advanced/save current plugin'):
-            savedPlugin = Settings().value(u'advanced/current media plugin')
-            if savedPlugin != -1:
-                self.media_tool_box.setCurrentIndex(savedPlugin)
-        # Reset the cursor
-        self.application.set_normal_cursor()
+            saved_plugin_id = Settings().value(u'advanced/current media plugin')
+            if saved_plugin_id != -1:
+                self.media_tool_box.setCurrentIndex(saved_plugin_id)
 
-    def setAutoLanguage(self, value):
-        """
-        Set the language to automatic.
-        """
-        self.language_group.setDisabled(value)
-        LanguageManager.auto_language = value
-        LanguageManager.set_language(self.language_group.checkedAction())
+    def on_search_shortcut_triggered(self):
+        """
+        Called when the search shotcut has been pressed.
+        """
+        widget = self.media_tool_box.currentWidget()
+        if widget:
+            widget.on_focus()
 
     def on_media_tool_box_changed(self, index):
         """
@@ -966,8 +977,7 @@
         """
         self.setViewMode(False, True, False, False, True, u'live')
 
-    def setViewMode(self, media=True, service=True, theme=True, preview=True,
-        live=True, mode=u''):
+    def setViewMode(self, media=True, service=True, theme=True, preview=True, live=True, mode=u''):
         """
         Set OpenLP to a different view mode.
         """
@@ -982,8 +992,7 @@
 
     def screen_changed(self):
         """
-        The screen has changed so we have to update components such as the
-        renderer.
+        The screen has changed so we have to update components such as the renderer.
         """
         log.debug(u'screen_changed')
         self.application.set_busy_cursor()
@@ -1065,43 +1074,20 @@
             self.live_controller.display.close()
             self.live_controller.display = None
 
-    def service_changed(self, reset=False, serviceName=None):
-        """
-        Hook to change the main window title when the service changes
-
-        ``reset``
-            Shows if the service has been cleared or saved
-
-        ``serviceName``
-            The name of the service (if it has one)
-        """
-        if not serviceName:
-            service_name = u'(unsaved service)'
-        else:
-            service_name = serviceName
-        if reset:
-            self.service_not_saved = False
-            title = u'%s - %s' % (self.mainTitle, service_name)
-        else:
-            self.service_not_saved = True
-            title = u'%s - %s*' % (self.mainTitle, service_name)
-        self.setWindowTitle(title)
-
-    def set_service_modified(self, modified, fileName):
-        """
-        This method is called from the ServiceManager to set the title of the
-        main window.
+    def set_service_modified(self, modified, file_name):
+        """
+        This method is called from the ServiceManager to set the title of the main window.
 
         ``modified``
             Whether or not this service has been modified.
 
-        ``fileName``
+        ``file_name``
             The file name of the service file.
         """
         if modified:
-            title = u'%s - %s*' % (self.mainTitle, fileName)
+            title = u'%s - %s*' % (UiStrings().OLPV2x, file_name)
         else:
-            title = u'%s - %s' % (self.mainTitle, fileName)
+            title = u'%s - %s' % (UiStrings().OLPV2x, file_name)
         self.setWindowTitle(title)
 
     def show_status_message(self, message):
@@ -1137,8 +1123,7 @@
 
     def set_preview_panel_visibility(self, visible):
         """
-        Sets the visibility of the preview panel including saving the setting
-        and updating the menu.
+        Sets the visibility of the preview panel including saving the setting and updating the menu.
 
         ``visible``
             A bool giving the state to set the panel to
@@ -1175,8 +1160,7 @@
 
     def set_live_panel_visibility(self, visible):
         """
-        Sets the visibility of the live panel including saving the setting and
-        updating the menu.
+        Sets the visibility of the live panel including saving the setting and updating the menu.
 
         ``visible``
             A bool giving the state to set the panel to
@@ -1231,8 +1215,7 @@
 
     def update_recent_files_menu(self):
         """
-        Updates the recent file menu with the latest list of service files
-        accessed.
+        Updates the recent file menu with the latest list of service files accessed.
         """
         recent_file_count = Settings().value(u'advanced/recent file count')
         existing_recent_files = [recentFile for recentFile in self.recent_files

=== modified file 'openlp/core/ui/shortcutlistform.py'
--- openlp/core/ui/shortcutlistform.py	2013-03-07 11:01:06 +0000
+++ openlp/core/ui/shortcutlistform.py	2013-05-12 11:35:32 +0000
@@ -129,11 +129,18 @@
                 continue
             item = QtGui.QTreeWidgetItem([category.name])
             for action in category.actions:
-                actionText = REMOVE_AMPERSAND.sub('', action.text())
-                actionItem = QtGui.QTreeWidgetItem([actionText])
-                actionItem.setIcon(0, action.icon())
-                actionItem.setData(0, QtCore.Qt.UserRole, action)
-                item.addChild(actionItem)
+                action_text = REMOVE_AMPERSAND.sub('', action.text())
+                action_item = QtGui.QTreeWidgetItem([action_text])
+                action_item.setIcon(0, action.icon())
+                action_item.setData(0, QtCore.Qt.UserRole, action)
+                tool_tip_text = action.toolTip()
+                # Only display tool tips if they are helpful.
+                if tool_tip_text != action_text:
+                    # Display the tool tip in all three colums.
+                    action_item.setToolTip(0, tool_tip_text)
+                    action_item.setToolTip(1, tool_tip_text)
+                    action_item.setToolTip(2, tool_tip_text)
+                item.addChild(action_item)
             self.treeWidget.addTopLevelItem(item)
             item.setExpanded(True)
         self.refreshShortcutList()

=== added file 'tests/interfaces/openlp_core_ui/test_mainwindow.py'
--- tests/interfaces/openlp_core_ui/test_mainwindow.py	1970-01-01 00:00:00 +0000
+++ tests/interfaces/openlp_core_ui/test_mainwindow.py	2013-05-12 11:35:32 +0000
@@ -0,0 +1,75 @@
+"""
+Package to test the openlp.core.ui.mainwindow package.
+"""
+from unittest import TestCase
+from mock import MagicMock, patch
+
+from PyQt4 import QtCore, QtGui, QtTest
+
+from openlp.core.lib import Registry
+from openlp.core.ui.mainwindow import MainWindow
+
+
+class TestMainWindow(TestCase):
+
+    def setUp(self):
+        """
+        Create the UI
+        """
+        Registry.create()
+        self.registry = Registry()
+        self.app = QtGui.QApplication([])
+        # Mock cursor busy/normal methods.
+        self.app.set_busy_cursor = MagicMock()
+        self.app.set_normal_cursor = MagicMock()
+        self.app.args =[]
+        Registry().register(u'application', self.app)
+        # Mock classes and methods used by mainwindow.
+        with patch(u'openlp.core.ui.mainwindow.SettingsForm') as mocked_settings_form, \
+                patch(u'openlp.core.ui.mainwindow.ImageManager') as mocked_image_manager, \
+                patch(u'openlp.core.ui.mainwindow.SlideController') as mocked_slide_controller, \
+                patch(u'openlp.core.ui.mainwindow.OpenLPDockWidget') as mocked_dock_widget, \
+                patch(u'openlp.core.ui.mainwindow.QtGui.QToolBox') as mocked_q_tool_box_class, \
+                patch(u'openlp.core.ui.mainwindow.QtGui.QMainWindow.addDockWidget') as mocked_add_dock_method, \
+                patch(u'openlp.core.ui.mainwindow.ServiceManager') as mocked_slervice_manager, \
+                patch(u'openlp.core.ui.mainwindow.ThemeManager') as mocked_theme_manager, \
+                patch(u'openlp.core.ui.mainwindow.Renderer') as mocked_renderer:
+            self.main_window = MainWindow()
+
+    def tearDown(self):
+        """
+        Delete all the C++ objects at the end so that we don't have a segfault
+        """
+        del self.main_window
+        del self.app
+
+    def restore_current_media_manager_item_test(self):
+        """
+        Regression test for bug #1152509.
+        """
+        # GIVEN: Mocked Settings().value method.
+        with patch(u'openlp.core.ui.mainwindow.Settings.value') as mocked_value:
+            # save current plugin: True; current media plugin: 2
+            mocked_value.side_effect = [True, 2]
+
+            # WHEN: Call the restore method.
+            Registry().execute(u'bootstrap_post_set_up')
+
+            # THEN: The current widget should have been set.
+            self.main_window.media_tool_box.setCurrentIndex.assert_called_with(2)
+
+    def on_search_shortcut_triggered_test(self):
+        """
+        Test if the search edit has focus after CTRL+F has been pressed.
+        """
+        # GIVEN: Mocked widget.
+        mocked_widget = MagicMock()
+        self.main_window.media_tool_box.currentWidget.return_value = mocked_widget
+        self.main_window.show()
+
+        # WHEN: Press the shortcut.
+        QtTest.QTest.keyPress(self.main_window, QtCore.Qt.Key_F, QtCore.Qt.ControlModifier, 100)
+        QtTest.QTest.keyRelease(self.main_window, QtCore.Qt.Key_F, QtCore.Qt.ControlModifier)
+
+        # THEN: The on_focus method should have been called.
+        mocked_widget.on_focus.assert_called_with()


Follow ups