class ExperimentHandler(ParamsHandler):
    def traits_view(self):
        return self.get_traits_view(ExperimentView)

    def perform(self, info):
        info.object.perform(thread=True)

    def _starting(self):
        self._progress_dialog_started = False
        self._progress_handler = ExperimentProgressHandler(model=self.model)

    def object__progress_percentage_changed(self, info):
        if info.object._interaction_mode == "gui":
            if not self._progress_dialog_started:
                if info.object._progress_percentage > 0:
                    self._progress_dialog_started = True
                    self._progress_handler.edit_traits(
                        kind="live",
                        parent=info.ui.control,
                        #                        context={
                        #                            'object':self.model,
                        #                            'model':self.model,
                        #                            'controller':self._progress_handler,
                        #                            'handler':self
                        #                        },
                    )  # must be live to receive progress updates
            # don't need to do anything else as self._progress_dialog should update
            # based on changes to self.percentage

    def _finished(self, success):
        if not hasattr(self, "_progress_handler") or self._progress_handler is None:
            return
        if self._progress_handler.info is not None and self._progress_handler.info.ui is not None:
            GUI.invoke_later(self._progress_handler.info.ui.dispose)  # vital
        if hasattr(self.model, "_thread"):
            self.model._thread.exit()
        if success:
            if (
                not hasattr(self, "_imported_results_modules") or not self._imported_results_modules
            ):  # have we done the long import yet?
                # show 'Loading results message' (if first time, otherwise it will be fast)
                GUI.invoke_later(
                    auto_close_message,
                    message="Loading results interface\n(only happens once)",
                    time=1,
                    parent=self.info.ui.control,
                )
                self._imported_results_modules = True
            time.sleep(0.5)
            GUI.invoke_later(self.show_results)  # essential
 def _starting(self):
     self._progress_dialog_started = False
     self._progress_handler = ExperimentProgressHandler(model=self.model)