def paint(self, context, selected): view = self.view item = self.item cr = context.cairo h = item.handles() side_length = get_side_length_of_resize_handle(self.view, item.parent) / 1.5 for h1, h2 in zip(h[1:-2], h[2:-1]): p1, p2 = h1.pos, h2.pos cx = (p1.x + p2.x) / 2 cy = (p1.y + p2.y) / 2 cr.save() cr.set_line_width(self.view.get_zoom_factor() / 4.) cr.identity_matrix() m = Matrix(*view.get_matrix_i2v(item)) cr.set_antialias(ANTIALIAS_NONE) cr.translate(*m.transform_point(cx, cy)) cr.rectangle(-side_length / 2., -side_length / 2., side_length, side_length) cr.set_source_rgba(*get_col_rgba(self.fill_color)) cr.fill_preserve() cr.set_source_rgba(*get_col_rgba(self.border_color)) cr.set_line_width(1) cr.stroke() cr.restore()
def _check_for_resize_handle(self, handle, pos, distance): side_length_handle = get_side_length_of_resize_handle( self.view, self.item) v2i = self.view.get_matrix_v2i(self.item) side_length_handle = v2i.transform_distance(side_length_handle, 0)[0] x, y = v2i.transform_point(*pos) hx, hy = handle.pos max_center_distance = side_length_handle / 2 + distance if hx - max_center_distance <= x <= hx + max_center_distance and \ hy - max_center_distance <= y <= hy + max_center_distance: return self.item, handle return None, None
def _draw_item(self, item, cairo, area=None): cairo = gaphas.painter.CairoBoundingBoxContext(cairo) super(gaphas.painter.BoundingBoxPainter, self)._draw_item(item, cairo) bounds = cairo.get_bounds() view = self.view if isinstance(item, (StateView, NameView)): i2v = view.get_matrix_i2v(item).transform_point for index, handle in enumerate(item.handles()): if index >= 4: break side_length = get_side_length_of_resize_handle(view, item) cx, cy = i2v(*handle.pos) bounds += (cx - side_length / 2, cy - side_length / 2, side_length, side_length) elif isinstance(item, ConnectionView): i2v = view.get_matrix_i2v(item).transform_point for h in item.handles(): cx, cy = i2v(*h.pos) bounds += (cx, cy, 1, 1) bounds.expand(1) view.set_item_bounding_box(item, bounds)
def _get_handle_side_length(self, item): return get_side_length_of_resize_handle(self.view, item)