Keep GUI responsive during search. Allow aborting the search.

This commit is contained in:
Patrick Zimmermann 2013-06-15 12:46:00 +02:00
parent 2f55624977
commit b18d96b3c9
1 changed files with 46 additions and 27 deletions

View File

@ -65,6 +65,8 @@ class DuplicateSongRemovalForm(OpenLPWizard):
self.duplicate_song_list = []
self.review_current_count = 0
self.review_total_count = 0
# Used to interrupt ongoing searches when cancel is clicked.
self.break_search = False
OpenLPWizard.__init__(self, self.main_window, plugin, u'duplicateSongRemovalWizard',
u':/wizards/wizard_duplicateremoval.bmp', False)
self.setMinimumWidth(730)
@ -154,6 +156,7 @@ class DuplicateSongRemovalForm(OpenLPWizard):
self.button(QtGui.QWizard.BackButton).hide()
if page_id == self.searching_page_id:
self.application.set_busy_cursor()
try:
self.button(QtGui.QWizard.NextButton).hide()
# Search duplicate songs.
max_songs = self.plugin.manager.get_object_count(Song)
@ -175,11 +178,16 @@ class DuplicateSongRemovalForm(OpenLPWizard):
self.found_duplicates_edit.appendPlainText(songs[outer_song_counter].title + " = " +
songs[inner_song_counter].title)
self.duplicate_search_progress_bar.setValue(self.duplicate_search_progress_bar.value() + 1)
# The call to process_events() will keep the GUI responsive.
self.application.process_events()
if self.break_search:
return
self.review_total_count = len(self.duplicate_song_list)
if self.review_total_count == 0:
self.notify_no_duplicates()
else:
self.button(QtGui.QWizard.NextButton).show()
finally:
self.application.set_normal_cursor()
elif page_id == self.review_page_id:
self.process_current_duplicate_entry()
@ -238,6 +246,7 @@ class DuplicateSongRemovalForm(OpenLPWizard):
Once the wizard is finished, refresh the song list,
since we potentially removed songs from it.
"""
self.break_search = True
self.plugin.media_item.on_search_text_button_clicked()
def setDefaults(self):
@ -337,3 +346,13 @@ class DuplicateSongRemovalForm(OpenLPWizard):
return self._main_window
main_window = property(_get_main_window)
def _get_application(self):
"""
Adds the openlp to the class dynamically
"""
if not hasattr(self, u'_application'):
self._application = Registry().get(u'application')
return self._application
application = property(_get_application)