예제 #1
0
    def testUndoOnDeletedElement(self):
        b1 = Box()

        b2 = Box()
        line = Line()

        canvas = Canvas()
        canvas.add(b1)
        self.assertEqual(2, len(canvas.solver.constraints))

        canvas.add(b2)
        self.assertEqual(4, len(canvas.solver.constraints))

        canvas.add(line)

        sink = ConnectionSink(b1, b1.ports()[0])
        connector = Connector(line, line.handles()[0])
        connector.connect(sink)

        sink = ConnectionSink(b2, b2.ports()[0])
        connector = Connector(line, line.handles()[-1])
        connector.connect(sink)

        self.assertEqual(6, len(canvas.solver.constraints))
        self.assertEqual(2, len(list(canvas.get_connections(item=line))))

        del undo_list[:]

        # Here disconnect is not invoked!
        canvas.remove(b2)

        self.assertEqual(3, len(canvas.solver.constraints))
        self.assertEqual(1, len(list(canvas.get_connections(item=line))))

        cinfo = canvas.get_connection(line.handles()[0])
        self.assertEqual(b1, cinfo.connected)

        cinfo = canvas.get_connection(line.handles()[-1])
        self.assertEqual(None, cinfo)

        self.assertEqual([],
                         list(
                             canvas.solver.constraints_with_variable(
                                 line.handles()[-1].pos.x)))
        self.assertEqual([],
                         list(
                             canvas.solver.constraints_with_variable(
                                 line.handles()[-1].pos.y)))

        undo()

        self.assertEqual(6, len(canvas.solver.constraints))
        self.assertEqual(2, len(list(canvas.get_connections(item=line))))

        cinfo = canvas.get_connection(line.handles()[0])
        self.assertEqual(b1, cinfo.connected)

        cinfo = canvas.get_connection(line.handles()[-1])
        self.assertEqual(b2, cinfo.connected)
예제 #2
0
        def find_port(line, handle, item):
            #port = None
            #max_dist = sys.maxint
            canvas = item.canvas

            ix, iy = canvas.get_matrix_i2i(line, item).transform_point(*handle.pos)

            # find the port using item's coordinates
            sink = ConnectionSink(item, None)
            return sink.find_port((ix, iy))
예제 #3
0
        def find_port(line, handle, item):
            # port = None
            # max_dist = sys.maxint
            canvas = item.canvas

            ix, iy = canvas.get_matrix_i2i(line, item).transform_point(*handle.pos)

            # find the port using item's coordinates
            sink = ConnectionSink(item, None)
            return sink.find_port((ix, iy))
예제 #4
0
def test_undo_on_delete_element(revert_undo, undo_fixture):
    b1 = Box()
    b2 = Box()
    line = Line()

    canvas = Canvas()
    canvas.add(b1)
    assert 2 == len(canvas.solver.constraints)

    canvas.add(b2)
    assert 4 == len(canvas.solver.constraints)

    canvas.add(line)

    sink = ConnectionSink(b1, b1.ports()[0])
    connector = Connector(line, line.handles()[0])
    connector.connect(sink)

    sink = ConnectionSink(b2, b2.ports()[0])
    connector = Connector(line, line.handles()[-1])
    connector.connect(sink)

    assert 6 == len(canvas.solver.constraints)
    assert 2 == len(list(canvas.get_connections(item=line)))

    del undo_fixture[2][:]  # Clear undo_list

    # Here disconnect is not invoked!
    canvas.remove(b2)

    assert 3 == len(canvas.solver.constraints)
    assert 1 == len(list(canvas.get_connections(item=line)))

    cinfo = canvas.get_connection(line.handles()[0])
    assert b1 == cinfo.connected

    cinfo = canvas.get_connection(line.handles()[-1])
    assert cinfo is None

    assert [] == list(
        canvas.solver.constraints_with_variable(line.handles()[-1].pos.x))
    assert [] == list(
        canvas.solver.constraints_with_variable(line.handles()[-1].pos.y))

    undo_fixture[0]()  # Call undo

    assert 6 == len(canvas.solver.constraints)
    assert 2 == len(list(canvas.get_connections(item=line)))

    cinfo = canvas.get_connection(line.handles()[0])
    assert b1 == cinfo.connected

    cinfo = canvas.get_connection(line.handles()[-1])
    assert b2 == cinfo.connected
예제 #5
0
def test_connect(diagram, comment, commentline):
    sink = ConnectionSink(comment, comment.ports()[0])
    aspect = Connector(commentline, commentline.handles()[0])
    aspect.connect(sink)
    canvas = diagram.canvas
    cinfo = canvas.get_connection(commentline.handles()[0])
    assert cinfo, cinfo
예제 #6
0
def test_allow(commentline, comment):
    aspect = Connector(commentline, commentline.handles()[0])
    assert aspect.item is commentline
    assert aspect.handle is commentline.handles()[0]

    sink = ConnectionSink(comment, comment.ports()[0])
    assert aspect.allow(sink)
예제 #7
0
    def test_allow(self):
        aspect = Connector(self.commentline, self.commentline.handles()[0])
        assert aspect.item is self.commentline
        assert aspect.handle is self.commentline.handles()[0]

        sink = ConnectionSink(self.comment, self.comment.ports()[0])
        assert aspect.allow(sink)
예제 #8
0
 def test_connect(self):
     sink = ConnectionSink(self.comment, self.comment.ports()[0])
     aspect = Connector(self.commentline, self.commentline.handles()[0])
     aspect.connect(sink)
     canvas = self.diagram.canvas
     cinfo = canvas.get_connection(self.commentline.handles()[0])
     assert cinfo, cinfo
예제 #9
0
    def on_button_release(self, event):
        """
		This handles and 'drag' part of any connection, after the
		on_button_press  of this tool returns a True (i.e by clicking on an
		Line Handle) the on_button_release is triggered on mouse button release.
		Note that this handles both the new connections and modified
		connections.
		Hint:
		ConnectorTool is a child of this class.
		Uncommenting all the print statements should give a fair idea how this
		tool works.
		"""
        line = self.grabbed_item
        handle = self.grabbed_handle
        glueitem, glueport, gluepos = self.view.get_port_at_point(
            (event.x, event.y), distance=10, exclude=[line])
        line = self.grabbed_item
        handle = self.grabbed_handle
        try:
            if glueport and hasattr(glueport, "point"):
                #print 'READY_CONNECTION_CHECK_PASSED_1'
                conn = Connector(line, handle)
                sink = ConnectionSink(glueitem, glueport)
                conn.connect_port(sink)
                self.ungrab_handle()
                #print 'READY_CONNECTION_CHECK_PASSED_2'
        except Exception as e:
            print 'Connection Failed, Disconnect/Connect the last Connection again: /n', e
        finally:
            self.toggle_highlight_ports()
            return super(BlockConnectTool, self).on_button_release(event)
예제 #10
0
def test_remove_connected_item():
    """Test adding canvas constraint.

    """
    canvas = Canvas()

    from gaphas.aspect import Connector, ConnectionSink

    l1 = Line()
    canvas.add(l1)

    b1 = Box()
    canvas.add(b1)

    number_cons1 = len(canvas.solver.constraints)

    b2 = Box()
    canvas.add(b2)

    number_cons2 = len(canvas.solver.constraints)

    conn = Connector(l1, l1.handles()[0])
    sink = ConnectionSink(b1, b1.ports()[0])

    conn.connect(sink)

    assert canvas.get_connection(l1.handles()[0])

    conn = Connector(l1, l1.handles()[1])
    sink = ConnectionSink(b2, b2.ports()[0])

    conn.connect(sink)

    assert canvas.get_connection(l1.handles()[1])

    assert number_cons2 + 2 == len(canvas.solver.constraints)

    canvas.remove(b1)

    # Expecting a class + line connected at one end only
    assert number_cons1 + 1 == len(canvas.solver.constraints)
예제 #11
0
    def glue(self, pos, distance=None):
        """
        Glue to an item near a specific point.

        Returns a ConnectionSink or None.
        """
        item = self.item
        handle = self.handle
        view = self.view

        if distance is None:
            distance = self.GLUE_DISTANCE

        if not handle.connectable:
            return None

        state_v, port, glue_pos = view.get_port_at_point(
            pos,
            distance=distance,
            exclude=(item, ),
            exclude_port_fun=self._exclude_port)

        # check if item and found item can be connected on closest port
        if port is not None:
            assert state_v is not None

            connector = Connector(self.item, self.handle)
            sink = ConnectionSink(state_v, port)

            if connector.allow(sink):
                # transform coordinates from view space to the item space and
                # update position of item's handle
                v2i = view.get_matrix_v2i(item).transform_point
                handle.pos = v2i(*glue_pos)
                return sink
        state_l = view.get_state_at_point(pos, distance=distance)
        state_v = state_l
        if state_v is not None and not state_v.model.state.is_root_state:
            return ConnectionSink(state_v, None)
        return None
예제 #12
0
def _get_sink(item, handle, target):
    assert item.canvas

    hpos = item.canvas.get_matrix_i2i(item, target).transform_point(*handle.pos)
    port = None
    dist = 10e6
    for p in target.ports():
        pos, d = p.glue(hpos)
        if not port or d < dist:
            port = p
            dist = d

    return ConnectionSink(target, port)
예제 #13
0
    def connect(self, line, handle, item, port=None):
        """
        Connect line's handle to an item.

        If port is not provided, then first port is used.
        """
        canvas = line.canvas

        if port is None and len(item.ports()) > 0:
            port = item.ports()[0]

        sink = ConnectionSink(item, port)
        connector = Connector(line, handle)

        connector.connect(sink)
예제 #14
0
파일: test_undo.py 프로젝트: tuxcell/gaphor
def connect(line, handle, item, port=None):
    """Connect line's handle to an item.

    If port is not provided, then first port is used.
    """
    canvas = line.canvas
    assert canvas is item.canvas
    if port is None and len(item.ports()) > 0:
        port = item.ports()[0]

    sink = ConnectionSink(item, port)
    connector = Connector(line, handle)

    connector.connect(sink)

    cinfo = canvas.get_connection(handle)
    assert cinfo.connected is item
    assert cinfo.port is port
예제 #15
0
    def on_button_press(self, event):

        glueitem, glueport, gluepos = self.view.get_port_at_point(
            (event.x, event.y), distance=10, exclude=[])
        line, handle = self.view.get_handle_at_point((event.x, event.y))
        try:
            if glueport and hasattr(glueport, "point"):
                self.toggle_highlight_ports(glueport.portinstance)
                self.line = self._create_line((event.x, event.y))
                self._new_item = self.line
                h_glue = self.line.handles()[self._handle_index_glued]
                conn = Connector(self.line, h_glue)
                sink = ConnectionSink(glueitem, glueport)
                conn.connect_port(sink)
                h_drag = self.line.handles()[self._handle_index_dragged]
                self.grab_handle(self.line, h_drag)
                return True
        except Exception as e:
            print 'Connection Failed, Disconnect/Connect the last Connection again: /n', e
예제 #16
0
    def _get_sink(self, handle, item):
        """
        Instant port finder.

        This is not the nicest place for such method.
        
        TODO: figure out if part of this functionality can be provided by
        the storage code.
        """
        from gaphas.aspect import ConnectionSink

        hpos = self.canvas.get_matrix_i2i(self, item).transform_point(*handle.pos)
        port = None
        dist = 10e6
        for p in item.ports():
            pos, d = p.glue(hpos)   
            if not port or d < dist:
                port = p
                dist = d
                
        return ConnectionSink(item, port)