Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def update_shapes(self, event=None):
def additional_stereotypes():
if isinstance(self.subject, UML.Stereotype):
return ["stereotype"]
elif UML.model.is_metaclass(self.subject):
return ["metaclass"]
else:
return ()
self.shape = Box(
Box(
Text(
text=lambda: UML.model.stereotypes_str(
self.subject, additional_stereotypes()
),
style={"min-width": 0, "min-height": 0},
),
EditableText(
text=lambda: self.subject.name or "",
style={
"font-weight": FontWeight.BOLD,
"font-style": FontStyle.ITALIC
if self.subject and self.subject.isAbstract
else FontStyle.NORMAL,
},
),
Text(
text=lambda: from_package_str(self),
def _create_stereotype_compartment(appliedStereotype):
def lazy_format(slot):
return lambda: UML.format(slot)
slots = [slot for slot in appliedStereotype.slot if slot.value]
if slots:
return Box(
Text(
text=lazy_format(appliedStereotype.classifier[0]),
style={"padding": (0, 0, 4, 0)},
),
*(
Text(text=lazy_format(slot), style={"text-align": TextAlign.LEFT})
for slot in slots
),
style={"padding": (4, 4, 4, 4), "vertical-align": VerticalAlign.TOP},
draw=draw_top_separator,
)
else:
return None
def __init__(self, id=None, model=None):
super().__init__(id, model)
self._show_ordering = False
self.shape = IconBox(
Box(
Text(
text=lambda: stereotypes_str(self.subject),
style={"min-width": 0, "min-height": 0},
),
EditableText(text=lambda: self.subject.name or ""),
style={"min-width": 50, "min-height": 30, "padding": (5, 10, 5, 10)},
draw=draw_border,
),
Text(
text=lambda: self.subject.upperBound not in (None, DEFAULT_UPPER_BOUND)
and f"{{ upperBound = {self.subject.upperBound} }}",
style={"min-width": 0, "min-height": 0},
),
Text(
text=lambda: self._show_ordering
and self.subject.ordering
and f"{{ ordering = {self.subject.ordering} }}",
Text(
text=lambda: UML.model.stereotypes_str(
self.subject, additional_stereotypes()
),
style={"min-width": 0, "min-height": 0},
),
EditableText(
text=lambda: self.subject.name or "",
style={
"font-weight": FontWeight.BOLD,
"font-style": FontStyle.ITALIC
if self.subject and self.subject.isAbstract
else FontStyle.NORMAL,
},
),
Text(
text=lambda: from_package_str(self),
style={"font": "sans 8", "min-width": 0, "min-height": 0},
),
style={"padding": (12, 4, 12, 4)},
),
*(
self.show_attributes
and self.subject
and [attributes_compartment(self.subject)]
or []
),
*(
self.show_operations
and self.subject
and [operations_compartment(self.subject)]
or []
def __init__(self, id=None, model=None):
super().__init__(id, model)
for h in self.handles():
h.movable = False
self.shape = IconBox(
Box(draw=draw_final_state),
Text(
text=lambda: stereotypes_str(self.subject),
style={"min-width": 0, "min-height": 0},
),
EditableText(text=lambda: self.subject and self.subject.name or ""),
)
self.watch("subject[NamedElement].name")
self.watch("subject.appliedStereotype.classifier.name")
def class_shape(self):
return Box(
Box(
Text(
text=lambda: UML.model.stereotypes_str(
self.subject, ("interface",)
),
style={"min-width": 0, "min-height": 0},
),
EditableText(
text=lambda: self.subject.name or "",
style={"font-weight": FontWeight.BOLD},
),
Text(
text=lambda: from_package_str(self),
style={"font": "sans 8", "min-width": 0, "min-height": 0},
),
style={"padding": (12, 4, 12, 4)},
),
*(
h1, h2 = Handle(), Handle()
self._handles.append(h1)
self._handles.append(h2)
self._ports.append(LinePort(h1.pos, h2.pos))
self._combined = None
self.shape = IconBox(
Box(style={"min-width": 0, "min-height": 45}, draw=self.draw_fork_node),
Text(
text=lambda: stereotypes_str(self.subject),
style={"min-width": 0, "min-height": 0},
),
EditableText(text=lambda: self.subject and self.subject.name or ""),
Text(
text=lambda: isinstance(self.subject, UML.JoinNode)
and self.subject.joinSpec not in (None, DEFAULT_JOIN_SPEC)
and f"{{ joinSpec = {self.subject.joinSpec} }}"
or "",
style={"min-width": 0, "min-height": 0},
),
)
self.watch("subject[NamedElement].name")
self.watch("subject.appliedStereotype.classifier.name")
self.watch("subject[JoinNode].joinSpec")
)
x, y, w, h = text_draw(
cr,
self.text(),
self.font(),
lambda w, h: text_point_in_box(
text_box, (w, h), text_align, vertical_align
),
width=text_box.width,
default_size=(min_w, min_h),
)
return x, y, w, h
class EditableText(Text):
def __init__(self, text=lambda: "", width=lambda: -1, style: Style = {}):
super().__init__(text, width, style)
self.bounding_box = Rectangle()
def draw(self, context, bounding_box):
x, y, w, h = super().draw(context, bounding_box)
text_draw_focus_box(context, x, y, w, h)
self.bounding_box = Rectangle(x, y, width=w, height=h)
def draw_default_head(context):
"""
Default head drawer: move cursor to the first handle.
"""
context.cairo.move_to(0, 0)
def class_shape(self):
return Box(
Box(
Text(
text=lambda: UML.model.stereotypes_str(
self.subject, ("interface",)
),
style={"min-width": 0, "min-height": 0},
),
EditableText(
text=lambda: self.subject.name or "",
style={"font-weight": FontWeight.BOLD},
),
Text(
text=lambda: from_package_str(self),
style={"font": "sans 8", "min-width": 0, "min-height": 0},
),
style={"padding": (12, 4, 12, 4)},
),
*(
self.show_attributes
and self.subject
and [attributes_compartment(self.subject)]
or []
),
*(
self.show_operations
and self.subject
and [operations_compartment(self.subject)]
or []
),
Text(
text=lambda: self.subject.doActivity.name
and f"do / {self.subject.doActivity.name}"
or "",
style={"text-align": TextAlign.LEFT, "min-height": 0},
),
style={"padding": (4, 4, 4, 4), "vertical-align": VerticalAlign.TOP},
draw=draw_top_separator,
)
if not any(t.text() for t in compartment.children):
compartment = Box()
self.shape = Box(
Box(
Text(
text=lambda: stereotypes_str(self.subject),
style={"min-width": 0, "min-height": 0},
),
EditableText(text=lambda: self.subject.name or ""),
style={"padding": (4, 4, 4, 4)},
),
compartment,
style={
"min-width": 50,
"min-height": 30,
"vertical-align": VerticalAlign.TOP,
},
draw=draw_state,
)