예제 #1
0
    def __init__(self, model, view):
        """Constructor"""
        assert isinstance(model, AbstractStateModel)
        assert isinstance(view, StateEditorView)
        ExtendedController.__init__(self, model, view)

        if isinstance(model, LibraryStateModel) and not model.state_copy_initialized:
            model.enforce_generation_of_state_copy_model()
            logger.info("Respective state editor's state is most likely not drawn in the graphical editor. -> {0}"
                        "".format(model))
        sv_and_source_script_state_m = model.state_copy if isinstance(model, LibraryStateModel) else model

        self.add_controller('properties_ctrl', StateOverviewController(model, view.properties_view))

        self.inputs_ctrl = InputPortListController(model, view.inputs_view)
        self.add_controller('input_data_ports', self.inputs_ctrl)
        self.outputs_ctrl = OutputPortListController(model, view.outputs_view)
        self.add_controller('output_data_ports', self.outputs_ctrl)
        self.scopes_ctrl = ScopedVariableListController(sv_and_source_script_state_m, view.scopes_view)
        self.add_controller('scoped_variables', self.scopes_ctrl)
        self.add_controller('outcomes', StateOutcomesEditorController(model, view.outcomes_view))

        self.add_controller('transitions_ctrl', StateTransitionsEditorController(model, view.transitions_view))
        self.add_controller('data_flows_ctrl', StateDataFlowsEditorController(model, view.data_flows_view))

        self.add_controller('linkage_overview_ctrl', LinkageOverviewController(model, view.linkage_overview))

        self.add_controller('description_ctrl', DescriptionEditorController(model, view.description_view))
        if not isinstance(model, ContainerStateModel) and not isinstance(model, LibraryStateModel) or \
                isinstance(model, LibraryStateModel) and not isinstance(model.state_copy, ContainerStateModel):
            self.add_controller('source_ctrl', SourceEditorController(sv_and_source_script_state_m, view.source_view))
        else:
            view.source_view.get_parent_widget().destroy()
        self.add_controller('semantic_data_ctrl', SemanticDataEditorController(model, view.semantic_data_view))
예제 #2
0
    def __init__(self, model, view):
        ExtendedController.__init__(self, model, view)

        self.add_controller('input_data_ports',
                            InputPortListController(model, view.inputs_view))
        self.add_controller('output_data_ports',
                            OutputPortListController(model, view.outputs_view))
        self.add_controller(
            'outcomes', StateOutcomesEditorController(model,
                                                      view.outcomes_view))

        scoped_variable_state_m = model.state_copy if isinstance(
            model, LibraryStateModel) else model
        self.add_controller(
            'scoped_variables',
            ScopedVariableListController(scoped_variable_state_m,
                                         view.scope_view))

        if not isinstance(scoped_variable_state_m, ContainerStateModel):
            view['scoped_box'].destroy()

        view.inputs_view.show()
        view.outputs_view.show()
        view.scope_view.show()
        view.outcomes_view.show()
예제 #3
0
class StateEditorController(ExtendedController):
    """Controller handles the organization of the Logic-Data oriented State-Editor.
    Widgets concerning logic flow (outcomes and transitions) are grouped in the Logic Linkage expander.
    Widgets concerning data flow (data-ports and data-flows) are grouped in the data linkage expander.

    :param rafcon.gui.models.state.StateModel model: The state model
    """
    def __init__(self, model, view):
        """Constructor"""
        assert isinstance(model, AbstractStateModel)
        assert isinstance(view, StateEditorView)
        ExtendedController.__init__(self, model, view)

        if isinstance(model,
                      LibraryStateModel) and not model.state_copy_initialized:
            model.enforce_generation_of_state_copy_model()
            logger.info(
                "Respective state editor's state is most likely not drawn in the graphical editor. -> {0}"
                "".format(model))
        sv_and_source_script_state_m = model.state_copy if isinstance(
            model, LibraryStateModel) else model

        self.add_controller(
            'properties_ctrl',
            StateOverviewController(model, view.properties_view))

        self.inputs_ctrl = InputPortListController(model, view.inputs_view)
        self.add_controller('input_data_ports', self.inputs_ctrl)
        self.outputs_ctrl = OutputPortListController(model, view.outputs_view)
        self.add_controller('output_data_ports', self.outputs_ctrl)
        self.scopes_ctrl = ScopedVariableListController(
            sv_and_source_script_state_m, view.scopes_view)
        self.add_controller('scoped_variables', self.scopes_ctrl)
        self.add_controller(
            'outcomes', StateOutcomesEditorController(model,
                                                      view.outcomes_view))

        self.add_controller(
            'transitions_ctrl',
            StateTransitionsEditorController(model, view.transitions_view))
        self.add_controller(
            'data_flows_ctrl',
            StateDataFlowsEditorController(model, view.data_flows_view))

        self.add_controller(
            'linkage_overview_ctrl',
            LinkageOverviewController(model, view.linkage_overview))

        self.add_controller(
            'description_ctrl',
            DescriptionEditorController(model, view.description_view))
        if not isinstance(model, ContainerStateModel) and not isinstance(model, LibraryStateModel) or \
                isinstance(model, LibraryStateModel) and not isinstance(model.state_copy, ContainerStateModel):
            self.add_controller(
                'source_ctrl',
                SourceEditorController(sv_and_source_script_state_m,
                                       view.source_view))
        else:
            view.source_view.get_top_widget().destroy()
        self.add_controller(
            'semantic_data_ctrl',
            SemanticDataEditorController(model, view.semantic_data_view))

    def register_view(self, view):
        """Called when the View was registered

        Can be used e.g. to connect signals. Here, the destroy signal is connected to close the application
        """
        super(StateEditorController, self).register_view(view)
        view.prepare_the_labels(
        )  # the preparation of the labels is done here to take into account plugin hook changes
        view['add_input_port_button'].connect('clicked',
                                              self.inputs_ctrl.on_add)
        view['add_output_port_button'].connect('clicked',
                                               self.outputs_ctrl.on_add)
        if isinstance(self.model, ContainerStateModel):
            view['add_scoped_variable_button'].connect('clicked',
                                                       self.scopes_ctrl.on_add)

        view['remove_input_port_button'].connect('clicked',
                                                 self.inputs_ctrl.on_remove)
        view['remove_output_port_button'].connect('clicked',
                                                  self.outputs_ctrl.on_remove)
        if isinstance(self.model, ContainerStateModel):
            view['remove_scoped_variable_button'].connect(
                'clicked', self.scopes_ctrl.on_remove)

        if isinstance(
                self.model, LibraryStateModel
        ) or self.model.state.get_next_upper_library_root_state():
            view['add_input_port_button'].set_sensitive(False)
            view['remove_input_port_button'].set_sensitive(False)
            view['add_output_port_button'].set_sensitive(False)
            view['remove_output_port_button'].set_sensitive(False)
            view['add_scoped_variable_button'].set_sensitive(False)
            view['remove_scoped_variable_button'].set_sensitive(False)

        view.inputs_view.show()
        view.outputs_view.show()
        view.scopes_view.show()
        view.outcomes_view.show()
        view.transitions_view.show()
        view.data_flows_view.show()

        # show scoped variables if show content is enabled -> if disabled the tab stays and indicates a container state
        if isinstance(self.model,
                      LibraryStateModel) and not self.model.show_content():
            view.scopes_view.hide()
            view.linkage_overview.scope_view.hide()

        # Container states do not have a source editor and library states does not show there source code
        # Thus, for those states we do not have to add the source controller and can hide the source code tab
        # logger.info("init state: {0}".format(model))
        lib_with_and_ES_as_root = isinstance(self.model, LibraryStateModel) and \
                                  not isinstance(self.model.state_copy, ContainerStateModel)
        if not isinstance(self.model, ContainerStateModel) and not isinstance(self.model, LibraryStateModel) or \
                lib_with_and_ES_as_root:
            view.source_view.show()
            if isinstance(self.model,
                          LibraryStateModel) and not self.model.show_content():
                view.remove_source_tab()
            view.remove_scoped_variables_tab()
        else:
            view.scopes_view.show()
            if isinstance(self.model, LibraryStateModel) and \
                    (not self.model.show_content() or not isinstance(self.model.state_copy, ContainerStateModel)):
                view.remove_scoped_variables_tab()
            view.remove_source_tab()

        if global_gui_config.get_config_value("SEMANTIC_DATA_MODE", False):
            view.bring_tab_to_the_top('Semantic Data')
        else:
            if isinstance(self.model.state, LibraryState):
                view.bring_tab_to_the_top('Description')
            else:
                view.bring_tab_to_the_top('Linkage Overview')

        if isinstance(self.model, ContainerStateModel):
            self.scopes_ctrl.reload_scoped_variables_list_store()

        plugins.run_hook("post_state_editor_register_view", self)

    def rename(self):
        state_overview_controller = self.get_controller('properties_ctrl')
        state_overview_controller.rename()

    @ExtendedController.observe("meta_signal", signal=True)
    def show_content_changed(self, model, prop_name, info):
        meta_signal_message = info['arg']
        if meta_signal_message.change == 'show_content':
            if self.model.meta['gui']['show_content']:
                if isinstance(model.state_copy, ContainerStateModel):
                    self.view.insert_scoped_variables_tab()
                else:
                    self.view.insert_source_tab()
                self.view.linkage_overview.scope_view.show()
            else:
                if isinstance(model.state_copy, ContainerStateModel):
                    self.view.remove_scoped_variables_tab()
                else:
                    self.view.remove_source_tab()
                self.view.linkage_overview.scope_view.hide()

    @ExtendedController.observe("destruction_signal", signal=True)
    def state_destruction(self, model, prop_name, info):
        """ Close state editor when state is being destructed """
        import rafcon.gui.singleton as gui_singletons
        states_editor_ctrl = gui_singletons.main_window_controller.get_controller(
            'states_editor_ctrl')
        state_identifier = states_editor_ctrl.get_state_identifier(self.model)
        states_editor_ctrl.close_page(state_identifier, delete=True)