Пример #1
0
    def construct(self):
        if not self.item.subject:
            return

        builder = new_builder("operations-editor")

        show_operations = builder.get_object("show-operations")
        show_operations.set_active(self.item.show_operations)

        self.model = ClassOperations(self.item, (str, bool, bool, object))

        tree_view: Gtk.TreeView = builder.get_object("operations-list")
        tree_view.set_model(self.model)

        def handler(event):
            operation = event.element
            for row in self.model:
                if row[-1] is operation:
                    row[:] = [
                        UML.format(operation),
                        operation.isAbstract,
                        operation.isStatic,
                        operation,
                    ]

        self.watcher.watch("ownedOperation.name", handler).watch(
            "ownedOperation.isAbstract", handler
        ).watch("ownedOperation.visibility", handler).watch(
            "ownedOperation.returnResult.lowerValue", handler
        ).watch(
            "ownedOperation.returnResult.upperValue", handler
        ).watch(
            "ownedOperation.returnResult.typeValue", handler
        ).watch(
            "ownedOperation.formalParameter.lowerValue", handler
        ).watch(
            "ownedOperation.formalParameter.upperValue", handler
        ).watch(
            "ownedOperation.formalParameter.typeValue", handler
        ).watch(
            "ownedOperation.formalParameter.defaultValue", handler
        ).subscribe_all()

        builder.connect_signals(
            {
                "show-operations-changed": (self._on_show_operations_change,),
                "operations-name-edited": (on_text_cell_edited, self.model, 0),
                "operations-abstract-edited": (on_bool_cell_edited, self.model, 1),
                "operations-static-edited": (on_bool_cell_edited, self.model, 2),
                "tree-view-destroy": (self.watcher.unsubscribe_all,),
                "operations-keypress": (on_keypress_event,),
            }
        )

        return builder.get_object("operations-editor")
Пример #2
0
    def construct(self):
        if not self.subject:
            return None

        builder = new_builder("association-editor")

        head = self.item.head_end
        tail = self.item.tail_end

        show_direction = builder.get_object("show-direction")
        show_direction.set_active(self.item.show_direction)

        head_signal_handlers = self.construct_end(builder, "head", head)
        tail_signal_handlers = self.construct_end(builder, "tail", tail)

        def name_handler(event):
            end_name = "head" if event.element is head.subject else "tail"
            self.update_end_name(builder, end_name, event.element)

        def restore_nav_handler(event):
            prop = event.element
            if prop.type and prop.opposite and prop.opposite.type:
                for end_name, end in (("head", head), ("tail", tail)):
                    combo = builder.get_object(f"{end_name}-navigation")
                    self._on_end_navigability_change(combo, end)

        # Watch on association end:
        self.watcher.watch("memberEnd[Property].name", name_handler).watch(
            "memberEnd[Property].visibility", name_handler).watch(
                "memberEnd[Property].lowerValue",
                name_handler).watch("memberEnd[Property].upperValue",
                                    name_handler).watch(
                                        "memberEnd[Property].type",
                                        restore_nav_handler,
                                    )

        builder.connect_signals({
            "show-direction-changed": (self._on_show_direction_change, ),
            "invert-direction-changed": (self._on_invert_direction_change, ),
            "head-name-changed": (self._on_end_name_change, head),
            "head-navigation-changed":
            (self._on_end_navigability_change, head),
            "head-aggregation-changed":
            (self._on_end_aggregation_change, head),
            "tail-name-changed": (self._on_end_name_change, tail),
            "tail-navigation-changed":
            (self._on_end_navigability_change, tail),
            "tail-aggregation-changed":
            (self._on_end_aggregation_change, tail),
            "association-editor-destroy": (self.watcher.unsubscribe_all, ),
            **head_signal_handlers,
            **tail_signal_handlers,
        })

        return builder.get_object("association-editor")
Пример #3
0
    def construct(self):
        if UML.model.is_metaclass(self.subject):
            return

        builder = new_builder("classifier-editor")

        abstract = builder.get_object("abstract")
        abstract.set_active(self.subject.isAbstract)

        builder.connect_signals({"abstract-changed": (self._on_abstract_change,)})

        return builder.get_object("classifier-editor")
Пример #4
0
    def construct(self):
        subject = self.subject

        if not subject:
            return

        builder = new_builder("join-node-editor")

        join_spec = builder.get_object("join-spec")
        join_spec.set_text(subject.joinSpec or "")

        builder.connect_signals({"join-spec-changed": (self._on_join_spec_change,)})
        return builder.get_object("join-node-editor")
Пример #5
0
    def construct(self):
        subject = self.subject

        if not subject:
            return

        builder = new_builder("component-editor")

        ii = builder.get_object("indirectly-instantiated")
        ii.set_active(subject.isIndirectlyInstantiated)

        builder.connect_signals(
            {"indirectly-instantiated-changed": (self._on_ii_change, )})
        return builder.get_object("component-editor")
Пример #6
0
    def construct(self):
        item = self.item

        if item.toplevel:
            return

        builder = new_builder("partition-editor")

        external = builder.get_object("external")
        external.set_active(item.subject.isExternal)

        builder.connect_signals(
            {"external-changed": (self._on_external_change, )})

        return builder.get_object("partition-editor")
Пример #7
0
    def construct(self):
        builder = new_builder("interface-editor")
        item = self.item

        connected_items = [c.item for c in item.canvas.get_connections(connected=item)]
        disallowed = (ConnectorItem,)
        can_fold = not any(map(lambda i: isinstance(i, disallowed), connected_items))

        folded = builder.get_object("folded")
        folded.set_active(item.folded != Folded.NONE)
        folded.set_sensitive(can_fold)

        builder.connect_signals({"folded-changed": (self._on_fold_change,)})

        return builder.get_object("interface-editor")
Пример #8
0
    def construct(self):
        if not self.item.subject:
            return

        builder = new_builder("attributes-editor")
        page = builder.get_object("attributes-editor")

        show_attributes = builder.get_object("show-attributes")
        show_attributes.set_active(self.item.show_attributes)

        self.model = ClassAttributes(self.item, (str, bool, object))

        tree_view: Gtk.TreeView = builder.get_object("attributes-list")
        tree_view.set_model(self.model)

        def handler(event):
            attribute = event.element
            for row in self.model:
                if row[-1] is attribute:
                    row[:] = [UML.format(attribute), attribute.isStatic, attribute]

        self.watcher.watch("ownedAttribute.name", handler).watch(
            "ownedAttribute.isDerived", handler
        ).watch("ownedAttribute.visibility", handler).watch(
            "ownedAttribute.isStatic", handler
        ).watch(
            "ownedAttribute.lowerValue", handler
        ).watch(
            "ownedAttribute.upperValue", handler
        ).watch(
            "ownedAttribute.defaultValue", handler
        ).watch(
            "ownedAttribute.typeValue", handler
        ).subscribe_all()

        builder.connect_signals(
            {
                "show-attributes-changed": (self._on_show_attributes_change,),
                "attributes-name-edited": (on_text_cell_edited, self.model, 0),
                "attributes-static-edited": (on_bool_cell_edited, self.model, 1),
                "tree-view-destroy": (self.watcher.unsubscribe_all,),
                "attributes-keypress": (on_keypress_event,),
            }
        )
        return page
Пример #9
0
    def construct(self):

        subject = self.item.subject
        if not subject:
            return None

        stereotypes = UML.model.get_stereotypes(subject)
        if not stereotypes:
            return None

        builder = new_builder("stereotypes-editor")

        show_stereotypes = builder.get_object("show-stereotypes")

        if hasattr(self.item, "show_stereotypes"):
            show_stereotypes.set_active(self.item.show_stereotypes)
        else:
            show_stereotypes.destroy()

        self.model = Gtk.TreeStore.new(
            [
                str,  # stereotype/attribute
                str,  # value
                bool,  # is applied stereotype
                bool,  # show checkbox (is stereotype)
                bool,  # value editable
                object,  # stereotype / attribute
                object,  # value editable
                object,  # slot element
            ]
        )

        stereotype_list = builder.get_object("stereotype-list")
        stereotype_list.set_model(self.model)

        builder.connect_signals(
            {
                "show-stereotypes-changed": (self._on_show_stereotypes_change,),
                "toggle-stereotype": (self._toggle_stereotype, self.model, 2),
                "set-slot-value": (self._set_value, self.model, 1),
            }
        )
        self.refresh()
        return builder.get_object("stereotypes-editor")
Пример #10
0
    def construct(self):
        if not self.subject:
            return None

        builder = new_builder("association-editor")

        head = self.item.head_end
        tail = self.item.tail_end

        show_direction = builder.get_object("show-direction")
        show_direction.set_active(self.item.show_direction)

        self.construct_end(builder, "head", head)
        self.construct_end(builder, "tail", tail)

        def handler(event):
            end_name = "head" if event.element is head.subject else "tail"
            self.update_end_name(builder, end_name, event.element)

        # Watch on association end:
        self.watcher.watch("memberEnd[Property].name", handler).watch(
            "memberEnd[Property].aggregation",
            handler).watch("memberEnd[Property].visibility", handler).watch(
                "memberEnd[Property].lowerValue",
                handler).watch("memberEnd[Property].upperValue",
                               handler).subscribe_all()

        builder.connect_signals({
            "show-direction-changed": (self._on_show_direction_change, ),
            "invert-direction-changed": (self._on_invert_direction_change, ),
            "head-name-changed": (self._on_end_name_change, head),
            "head-navigation-changed":
            (self._on_end_navigability_change, head),
            "head-aggregation-changed":
            (self._on_end_aggregation_change, head),
            "tail-name-changed": (self._on_end_name_change, tail),
            "tail-navigation-changed":
            (self._on_end_navigability_change, tail),
            "tail-aggregation-changed":
            (self._on_end_aggregation_change, tail),
            "association-editor-destroy": (self.watcher.unsubscribe_all, ),
        })

        return builder.get_object("association-editor")
Пример #11
0
    def construct(self):
        subject = self.subject

        if not subject:
            return

        builder = new_builder("transition-editor")

        guard = builder.get_object("guard")
        guard.set_text(subject.guard or "")

        def handler(event):
            v = event.new_value
            guard.set_text(v or "")

        self.watcher.watch("guard", handler)

        builder.connect_signals({
            "guard-changed": (self._on_guard_change, ),
            "transition-destroy": (self.watcher.unsubscribe_all, ),
        })
        return builder.get_object("transition-editor")
Пример #12
0
    def construct(self):
        subject = self.subject
        if not subject:
            return

        builder = new_builder("transition-editor")

        guard = builder.get_object("guard")
        if subject.guard:
            guard.set_text(subject.guard.specification or "")

        def handler(event):
            if event.element is subject.guard:
                guard.set_text(event.new_value or "")

        self.watcher.watch("guard[Constraint].specification", handler)

        builder.connect_signals({
            "guard-changed": (self._on_guard_change, ),
            "transition-destroy": (self.watcher.unsubscribe_all, ),
        })
        return builder.get_object("transition-editor")
Пример #13
0
    def construct(self):
        """Creates the Partition Property Page."""
        builder = new_builder("partition-editor")

        num_partitions = builder.get_object("num-partitions")
        adjustment = Gtk.Adjustment(
            value=len(self.item.partition),
            lower=1,
            upper=10,
            step_increment=1,
            page_increment=5,
        )
        num_partitions.set_adjustment(adjustment)
        builder.connect_signals(
            {"partitions-changed": (self._on_num_partitions_changed,)}
        )

        treeview = builder.get_object("partition-treeview")
        treeview.set_model(self.list_store)

        renderer_text = Gtk.CellRendererText()
        column_text = Gtk.TreeViewColumn(title="#", cell_renderer=renderer_text, text=0)
        treeview.append_column(column_text)

        renderer_editable_text = Gtk.CellRendererText()
        renderer_editable_text.set_property("editable", True)

        column_editabletext = Gtk.TreeViewColumn(
            title="Name", cell_renderer=renderer_editable_text, text=1
        )
        treeview.append_column(column_editabletext)

        renderer_editable_text.connect("edited", self._on_partition_name_changed)

        self.update_list_store()

        return builder.get_object("partition-editor")
Пример #14
0
    def construct(self):
        subject = self.item.subject

        if not subject:
            return

        builder = new_builder("object-node-editor")

        upper_bound = builder.get_object("upper-bound")
        upper_bound.set_text(subject.upperBound or "")

        ordering = builder.get_object("ordering")
        ordering.set_active(self.ORDERING_VALUES.index(subject.ordering))

        show_ordering = builder.get_object("show-ordering")
        show_ordering.set_active(self.item.show_ordering)

        builder.connect_signals({
            "upper-bound-changed": (self._on_upper_bound_change, ),
            "ordering-changed": (self._on_ordering_change, ),
            "show-ordering-changed": (self._on_ordering_show_change, ),
        })

        return builder.get_object("object-node-editor")
Пример #15
0
 def __init__(self, item):
     super().__init__()
     self.item = item
     self.watcher = self.item.watcher()
     self.builder = new_builder("dependency-editor")