def _store_revision(self): if self._ignore_change_depth > 0: self._skipped_revision_store_count += 1 else: _log.info("Storing a state revision (%d/%d)", len(self._revisions) + 1, self.max_revision_count) self._revisions.append(DataRevision()) get_event_handler().emit_event("history-changed")
def __init__(self, callback, max_fps=1): self.callback = callback self.core = get_event_handler() self.last_update_time = time.time() self.max_fps = max_fps self.last_tool_position = None self.current_tool_position = None
def __del__(self): try: unregister = get_event_handler().unregister_event except AttributeError: pass unregister(self.COLLECTION_ITEM_TYPE.list_changed_event, self._update_model)
def show_gui(): pycam.Utils.set_application_key("pycam-gtk") deps_gtk = GuiCommon.requirements_details_gtk() report_gtk = GuiCommon.get_dependency_report(deps_gtk, prefix="\t") if GuiCommon.check_dependencies(deps_gtk): from pycam.Gui.Project import ProjectGui gui_class = ProjectGui else: full_report = [] full_report.append("PyCAM dependency problem") full_report.append("Error: Failed to load the GTK interface.") full_report.append("Details:") full_report.append(report_gtk) full_report.append("") full_report.append("Detailed list of requirements: %s" % GuiCommon.REQUIREMENTS_LINK) log.critical(os.linesep.join(full_report)) return EXIT_CODES["requirements"] event_manager = get_event_handler() event_manager.set("history", DataHistory()) with merge_history_and_block_events(event_manager): gui = gui_class(event_manager) # initialize plugins plugin_manager = pycam.Plugins.PluginManager(core=event_manager) plugin_manager.import_plugins() # some more initialization gui.reset_preferences() gui.load_preferences() gui.load_startup_workspace() event_manager.emit_event("notify-initialization-finished") # open the GUI get_mainloop(use_gtk=True).run() # optionally save workspace (based on configuration or dialog response) if event_manager.get("save_workspace_on_exit") == QuestionStatus.ASK.value: response = gui.get_question_response("Save Workspace?", True, allow_memorize=True) if response.should_memorize: event_manager.set("save_workspace_on_exit", (QuestionStatus.YES if response.is_yes else QuestionStatus.NO).value) should_store = response.is_yes elif event_manager.get( "save_workspace_on_exit") == QuestionStatus.YES.value: should_store = True else: should_store = False if should_store: gui.save_startup_workspace() gui.save_preferences() # no error -> return no error code return None
def restore_previous_state(self): if len(self._revisions) > 1: self._revisions.pop() event_handler = get_event_handler() # we do not expect a "change" since we switch to a previous state with self.merge_changes(no_store=True): with event_handler.blocked_events(self.subscribed_events, emit_after=True): source = io.StringIO(self._revisions[-1].dump) parse_yaml(source, reset=True) _log.info("Restored previous state from history (%d/%d)", len(self._revisions) + 1, self.max_revision_count) event_handler.emit_event("history-changed") return True else: _log.warning("Failed to restore previous state from history: no more states left") return False
def show_gui(): deps_gtk = GuiCommon.requirements_details_gtk() report_gtk = GuiCommon.get_dependency_report(deps_gtk, prefix="\t") if GuiCommon.check_dependencies(deps_gtk): from pycam.Gui.Project import ProjectGui gui_class = ProjectGui else: full_report = [] full_report.append("PyCAM dependency problem") full_report.append("Error: Failed to load the GTK interface.") full_report.append("Details:") full_report.append(report_gtk) full_report.append("") full_report.append("Detailed list of requirements: %s" % GuiCommon.REQUIREMENTS_LINK) log.critical(os.linesep.join(full_report)) return EXIT_CODES["requirements"] event_manager = get_event_handler() gui = gui_class(event_manager) # initialize plugins plugin_manager = pycam.Plugins.PluginManager(core=event_manager) plugin_manager.import_plugins() # some more initialization gui.reset_preferences() # TODO: preferences are not loaded until the new format is stable # self.load_preferences() # tell the GUI to empty the "undo" queue gui.clear_undo_states() event_manager.emit_event("notify-initialization-finished") # open the GUI gui.mainloop() # no error -> return no error code return None
def _unregister_events(self): event_handler = get_event_handler() for event in self.subscribed_events: event_handler.unregister_event(event, self._store_revision)
def clear(self): if self._revisions: self._revisions.clear() get_event_handler().emit_event("history-changed")
def __init__(self, title): self._title = title self._progress = get_event_handler().get("progress")
def _unregister_events(self): event_handler = get_event_handler() while self.subscribed_events: event = self.subscribed_events.pop() event_handler.unregister_event(event, self._store_revision)
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._update_model_funcs = [] self._gtk_modelview = None get_event_handler().register_event( self.COLLECTION_ITEM_TYPE.list_changed_event, self._update_model)
def teardown(self): get_event_handler().unregister_event(self.COLLECTION_ITEM_TYPE.list_changed_event, self._update_model) super().teardown()
def setup(self): get_event_handler().register_event(self.COLLECTION_ITEM_TYPE.list_changed_event, self._update_model) return super().setup()
def show_gui(workspace_filename=None): pycam.Utils.set_application_key("pycam-gtk") deps_gtk = GuiCommon.requirements_details_gtk() report_gtk = GuiCommon.get_dependency_report(deps_gtk, prefix="\t") if GuiCommon.check_dependencies(deps_gtk): from pycam.Gui.Project import ProjectGui gui_class = ProjectGui else: full_report = [] full_report.append("PyCAM dependency problem") full_report.append("Error: Failed to load the GTK interface.") full_report.append("Details:") full_report.append(report_gtk) full_report.append("") full_report.append("Detailed list of requirements: %s" % GuiCommon.REQUIREMENTS_LINK) log.critical(os.linesep.join(full_report)) return EXIT_CODES["requirements"] event_manager = get_event_handler() history = DataHistory() event_manager.set("history", history) with merge_history_and_block_events(event_manager): log.debug("Initializing user interface") gui = gui_class(event_manager) # initialize plugins log.debug("Loading all available plugins") plugin_manager = pycam.Plugins.PluginManager(core=event_manager) plugin_manager.import_plugins() # some more initialization log.debug("Resetting preferences") gui.reset_preferences() log.debug("Loading preferences") gui.load_preferences() has_loaded_custom_workspace = False log.debug("Loading workspace") if workspace_filename is None: gui.load_startup_workspace() else: if gui.load_workspace_from_file(workspace_filename): has_loaded_custom_workspace = True else: gui.load_startup_workspace() log.debug("Finished initialization") log.debug("Configured events: %s", ", ".join(event_manager.get_events_summary_lines())) shutdown_calls = [] def shutdown_handler(): # prevent repeated calls if shutdown_calls: return shutdown_calls.append(True) # optionally save workspace (based on configuration or dialog response) if has_loaded_custom_workspace: # A custom workspace file was given via command line - we always want to ask before # overwriting it. response = gui.get_question_response( "Save Workspace to '{}'?".format(workspace_filename), True) should_store = response.is_yes elif event_manager.get( "save_workspace_on_exit") == QuestionStatus.ASK.value: response = gui.get_question_response("Save Workspace?", True, allow_memorize=True) if response.should_memorize: event_manager.set("save_workspace_on_exit", (QuestionStatus.YES if response.is_yes else QuestionStatus.NO).value) should_store = response.is_yes elif event_manager.get( "save_workspace_on_exit") == QuestionStatus.YES.value: should_store = True else: should_store = False if should_store: gui.save_startup_workspace() gui.save_preferences() with merge_history_and_block_events(event_manager, emit_events_after=False): plugin_manager.disable_all_plugins() # close the GUI gui.stop() history.cleanup() # Register our shutdown handler: it should be run _before_ the GTK main loop stops. # Otherwise some references and signals are gone when the teardown actions are exeucted. event_manager.register_event("mainloop-stop", shutdown_handler) # open the GUI - wait until the window is closed gui.run_forever() event_manager.unregister_event("mainloop-stop", shutdown_handler) # show final statistics log.debug("Configured events: %s", ", ".join(event_manager.get_events_summary_lines())) for event, stats in sorted(event_manager.get_events_summary().items()): if len(stats["handlers"]) > 0: log.info("Remaining listeners for event '%s': %s", event, ", ".join(str(func) for func in stats["handlers"])) # no error -> return no error code return None