Ejemplo n.º 1
0
 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")
Ejemplo n.º 2
0
 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
Ejemplo n.º 3
0
 def __del__(self):
     try:
         unregister = get_event_handler().unregister_event
     except AttributeError:
         pass
     unregister(self.COLLECTION_ITEM_TYPE.list_changed_event,
                self._update_model)
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
 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
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
 def _unregister_events(self):
     event_handler = get_event_handler()
     for event in self.subscribed_events:
         event_handler.unregister_event(event, self._store_revision)
Ejemplo n.º 8
0
 def clear(self):
     if self._revisions:
         self._revisions.clear()
         get_event_handler().emit_event("history-changed")
Ejemplo n.º 9
0
 def __init__(self, title):
     self._title = title
     self._progress = get_event_handler().get("progress")
Ejemplo n.º 10
0
 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)
Ejemplo n.º 11
0
 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)
Ejemplo n.º 12
0
 def teardown(self):
     get_event_handler().unregister_event(self.COLLECTION_ITEM_TYPE.list_changed_event,
                                          self._update_model)
     super().teardown()
Ejemplo n.º 13
0
 def setup(self):
     get_event_handler().register_event(self.COLLECTION_ITEM_TYPE.list_changed_event,
                                        self._update_model)
     return super().setup()
Ejemplo n.º 14
0
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