diff --git a/bauh/view/qt/thread.py b/bauh/view/qt/thread.py index 76ff26a8..cdbee239 100644 --- a/bauh/view/qt/thread.py +++ b/bauh/view/qt/thread.py @@ -24,6 +24,7 @@ class AsyncAction(QThread, ProcessWatcher): signal_message = pyqtSignal(dict) # asks the GUI to show an error popup signal_status = pyqtSignal(str) # changes the GUI status message signal_substatus = pyqtSignal(str) # changes the GUI substatus message + signal_progress = pyqtSignal(int) def __init__(self): super(AsyncAction, self).__init__() @@ -60,6 +61,9 @@ class AsyncAction(QThread, ProcessWatcher): def change_substatus(self, substatus: str): self.signal_substatus.emit(substatus) + def change_progress(self, val: int): + self.signal_progress.emit(val) + class UpdateSelectedApps(AsyncAction): @@ -266,24 +270,51 @@ class AnimateProgress(QThread): self.progress_value = 0 self.increment = 5 self.stop = False + self.limit = 100 + self.sleep = 0.05 + self.last_progress = 0 + self.manual = False + + def _reset(self): + self.progress_value = 0 + self.increment = 5 + self.stop = False + self.limit = 100 + self.sleep = 0.05 + self.last_progress = 0 + self.manual = False + + def set_progress(self, val: int): + if 0 <= val <= 100: + self.limit = val + self.manual = True + self.increment = 0.5 def run(self): current_increment = self.increment while not self.stop: - self.signal_change.emit(self.progress_value) + if self.progress_value != self.last_progress: + self.signal_change.emit(self.progress_value) + self.last_progress = self.progress_value - if self.progress_value == 100: - current_increment = -current_increment - if self.progress_value == 0: - current_increment = self.increment + if not self.manual: + if self.progress_value >= self.limit: + current_increment = -self.increment + elif self.progress_value <= 0: + current_increment = self.increment + else: + if self.progress_value >= self.limit: + current_increment = 0 + else: + current_increment = self.increment self.progress_value += current_increment + time.sleep(self.sleep) - time.sleep(0.05) - - self.progress_value = 0 + self.signal_change.emit(100) + self._reset() class VerifyModels(QThread): diff --git a/bauh/view/qt/window.py b/bauh/view/qt/window.py index f9917b16..86ad29c3 100755 --- a/bauh/view/qt/window.py +++ b/bauh/view/qt/window.py @@ -1,4 +1,5 @@ import operator +import time from functools import reduce from typing import List, Type, Set @@ -252,6 +253,10 @@ class ManageWindow(QWidget): self.thread_warnings = ListWarnings(man=manager, locale_keys=i18n) self.thread_warnings.signal_warnings.connect(self._show_warnings) + def _update_process_progress(self, val: int): + self.progress_bar.setTextVisible(True) + self.thread_animate_progress.set_progress(val) + def apply_filters_async(self): self.label_status.setText(self.i18n['manage_window.status.filtering']) @@ -284,6 +289,8 @@ class ManageWindow(QWidget): action.signal_message.connect(self._show_message) action.signal_status.connect(self._change_label_status) action.signal_substatus.connect(self._change_label_substatus) + action.signal_progress.connect(self._update_process_progress) + self.signal_user_res.connect(action.confirm) return action @@ -765,12 +772,16 @@ class ManageWindow(QWidget): self.combo_filter_type.setEnabled(False) def finish_action(self): + self.thread_animate_progress.stop = True + self.thread_animate_progress.wait() + self.ref_progress_bar.setVisible(False) + self.progress_bar.setValue(0) + self.progress_bar.setTextVisible(False) + self._change_label_substatus('') self.ref_bt_about.setVisible(True) - self.ref_progress_bar.setVisible(False) + self.ref_label_updates.setVisible(True) - self.thread_animate_progress.stop = True - self.progress_bar.setValue(0) self.ref_bt_refresh.setVisible(True) self.checkbox_only_apps.setEnabled(True) self.table_apps.setEnabled(True)