Exemplo n.º 1
0
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
Exemplo n.º 2
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 = 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]
Exemplo n.º 3
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]
Exemplo n.º 4
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]
Exemplo n.º 5
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
Exemplo n.º 6
0
 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
Exemplo n.º 7
0
 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