def draw(self, context): cr = context.cairo style = combined_style(self.style) if style["color"]: cr.set_source_rgba(*style["color"]) cr.set_line_width(style["line-width"]) super().draw(context)
def draw(self, context): cr = context.cairo style = combined_style(self.style, self._inline_style) new_context = DrawContext.from_context(context, style) cr.set_line_width(style["line-width"]) cr.set_dash(style["dash-style"] or (), 0) stroke = style["color"] if stroke: cr.set_source_rgba(*stroke) super().draw(new_context) for shape, rect in ( (self.shape_head, self._shape_head_rect), (self.shape_middle, self._shape_middle_rect), (self.shape_tail, self._shape_tail_rect), ): if shape: shape.draw(new_context, rect)
def draw(self, context): style = combined_style(context.style, self.style) context = replace(context, style=style) cr = context.cairo self.line_width = style["line-width"] cr.set_dash(style.get("dash-style", ()), 0) stroke = style["color"] if stroke: cr.set_source_rgba(*stroke) super().draw(context) for shape, rect in ( (self.shape_head, self._shape_head_rect), (self.shape_middle, self._shape_middle_rect), (self.shape_tail, self._shape_tail_rect), ): if shape: shape.draw(context, rect)
def draw(self, context): def draw_line_end(end_handle, second_handle, draw): pos, p1 = end_handle.pos, second_handle.pos angle = atan2(p1.y - pos.y, p1.x - pos.x) cr = context.cairo cr.save() try: cr.translate(*pos) cr.rotate(angle) draw(context) finally: cr.restore() style = combined_style(context.style, self.style) context = replace(context, style=style) cr = context.cairo cr.set_line_width(self.line_width) cr.set_dash(style.get("dash-style", ()), 0) stroke = style["color"] if stroke: cr.set_source_rgba(*stroke) handles = self._handles draw_line_end(handles[0], handles[1], self.draw_head) for h in self._handles[1:-1]: cr.line_to(*h.pos) draw_line_end(handles[-1], handles[-2], self.draw_tail) draw_highlight(context) cr.stroke() for shape, rect in ( (self.shape_head, self._shape_head_rect), (self.shape_middle, self._shape_middle_rect), (self.shape_tail, self._shape_tail_rect), ): if shape: shape.draw(context, rect)
def post_update(self, context, p1, p2): """Update label placement for association's name and multiplicity label. p1 is the line end and p2 is the last but one point of the line. """ style = combined_style(context.style, self._inline_style) ofs = 5 dx = float(p2[0]) - float(p1[0]) dy = float(p2[1]) - float(p1[1]) def max_text_size(size1, size2): w1, h1 = size1 w2, h2 = size2 return (max(w1, w2), max(h1, h2)) name_layout = self._name_layout name_layout.set_text(self._name) name_layout.set_font(style) name_w, name_h = max_text_size(name_layout.size(), (10, 10)) mult_layout = self._mult_layout mult_layout.set_text(self._mult) mult_layout.set_font(style) mult_w, mult_h = max_text_size(mult_layout.size(), (10, 10)) if dy == 0: rc = 1000.0 # quite a lot... else: rc = dx / dy abs_rc = abs(rc) h = dx > 0 # right side of the box v = dy > 0 # bottom side if abs_rc > 6: # horizontal line if h: name_dx = ofs name_dy = -ofs - name_h mult_dx = ofs mult_dy = ofs else: name_dx = -ofs - name_w name_dy = -ofs - name_h mult_dx = -ofs - mult_w mult_dy = ofs elif 0 <= abs_rc <= 0.2: # vertical line if v: name_dx = -ofs - name_w name_dy = ofs mult_dx = ofs mult_dy = ofs else: name_dx = -ofs - name_w name_dy = -ofs - name_h mult_dx = ofs mult_dy = -ofs - mult_h else: # Should both items be placed on the same side of the line? r = abs_rc < 1.0 # Find out alignment of text (depends on the direction of the line) align_left = h ^ r align_bottom = v ^ r if align_left: name_dx = ofs mult_dx = ofs else: name_dx = -ofs - name_w mult_dx = -ofs - mult_w if align_bottom: name_dy = -ofs - name_h mult_dy = -ofs - name_h - mult_h else: name_dy = ofs mult_dy = ofs + mult_h self._name_bounds = Rectangle( p1[0] + name_dx, p1[1] + name_dy, width=name_w, height=name_h ) self._mult_bounds = Rectangle( p1[0] + mult_dx, p1[1] + mult_dy, width=mult_w, height=mult_h )