def association_item_inline_editor(item, view, pos=None) -> bool: """Text edit support for Named items.""" @transactional def update_text(text): item.subject.name = text return True @transactional def update_end_text(text): assert end_item UML.parse(end_item.subject, text) return True subject = item.subject if not subject: return False end_item = None if pos and distance_point_point_fast(item.handles()[0].pos, pos) < 50: end_item = item.head_end elif pos and distance_point_point_fast(item.handles()[-1].pos, pos) < 50: end_item = item.tail_end if end_item: text = ( UML.format( end_item.subject, visibility=True, is_derived=True, type=True, multiplicity=True, default=True, ) or "" ) def escape(): assert end_item UML.parse(end_item.subject, text) entry = popup_entry(text, update_end_text) bb = end_item.name_bounds x, y = view.get_matrix_i2v(item).transform_point(bb.x, bb.y) box = Rectangle(x, y, 10, 10) else: text = item.subject.name or "" def escape(): item.subject.name = text entry = popup_entry(text, update_text) box = editable_text_box(view, view.hovered_item) show_popover(entry, view, box, escape) return True
def split(self, pos): item = self.item handles = item.handles() x, y = self.view.get_matrix_v2i(item).transform_point(*pos) for h1, h2 in zip(handles, handles[1:]): xp = old_div((h1.pos.x + h2.pos.x), 2) yp = old_div((h1.pos.y + h2.pos.y), 2) if distance_point_point_fast((x, y), (xp, yp)) <= 4: segment = handles.index(h1) handles, ports = self.split_segment(segment) return handles and handles[0]
def split(self, pos): item = self.item handles = item.handles() x, y = self.view.get_matrix_v2i(item).transform_point(*pos) for h1, h2 in zip(handles, handles[1:]): xp = (h1.pos.x + h2.pos.x) / 2 yp = (h1.pos.y + h2.pos.y) / 2 if distance_point_point_fast((x,y), (xp, yp)) <= 4: segment = handles.index(h1) handles, ports = self.split_segment(segment) return handles and handles[0]
def split(self, pos): item = self.item handles = item.handles() x, y = item.matrix_i2c.inverse().transform_point(*pos) for h1, h2 in zip(handles, handles[1:]): xp = (h1.pos.x + h2.pos.x) / 2 yp = (h1.pos.y + h2.pos.y) / 2 if distance_point_point_fast((x, y), (xp, yp)) <= 4: segment = handles.index(h1) handles, ports = self.split_segment(segment) return handles and handles[0]
def find(item): """ Find item's handle at pos """ v2i = self.get_matrix_v2i(item) d = distance_point_point_fast(v2i.transform_distance(0, distance)) x, y = v2i.transform_point(*pos) for h in item.handles(): if not h.movable: continue hx, hy = h.pos if -d < (hx - x) < d and -d < (hy - y) < d: return h
def item_at(self, x, y): if distance_point_point_fast(self._handles[0].pos, (x, y)) < 10: return self._head_end elif distance_point_point_fast(self._handles[-1].pos, (x, y)) < 10: return self._tail_end return self
def item_at(self, x, y): if distance_point_point_fast(self._handles[0].pos, (x, y)) < 10: return self._head_end elif distance_point_point_fast(self._handles[-1].pos, (x, y)) < 10: return self._tail_end return self