def _StartEdgeDrag(self, item: typing.Any) -> typing.Any:

        assert isinstance(item, JGraphicSocket)
        if item.socketType == JCONSTANTS.GRSOCKET.TYPE_INPUT:
            self._currentState = JCONSTANTS.GRVIEW.OP_MODE_DEFAULT
            return

        if item.multiConnection:
            self._tempEdgeDragObj = JGraphicEdge.DragNewEdge(
                startSocket=item,
                dragPos=item.scenePos(),
            )
            self.scene().addItem(self._tempEdgeDragObj)
            self._tempEdgeDragObj.update()
            self._tempSocket = item
            self.setCursor(QtCore.Qt.DragLinkCursor)

        elif not item.AtMaxLimit():
            self._tempEdgeDragObj = JGraphicEdge.DragNewEdge(
                startSocket=item,
                dragPos=item.scenePos(),
            )
            self.scene().addItem(self._tempEdgeDragObj)
            self._tempEdgeDragObj.update()
            self._tempSocket = item
            self.setCursor(QtCore.Qt.DragLinkCursor)
        else:
            self._currentState = JCONSTANTS.GRVIEW.OP_MODE_DEFAULT
    def _EndEdgeDrag(self, item: typing.Any):

        assert isinstance(self._tempEdgeDragObj, JGraphicEdge)
        if isinstance(item, JGraphicSocket):

            # * check same socket
            if self._tempSocket.socketId == item.socketId:
                logger.warning(f"tried connecting same socket")
                self._tempEdgeDragObj.DisconnectFromSockets()
                self.scene().removeItem(self._tempEdgeDragObj)
                self._ResetEdgeDrag()

            # * check if same socket type, intput type
            elif self._tempSocket.socketType == item.socketType:
                logger.warning(f"tried connecting same socket type")
                self._tempEdgeDragObj.DisconnectFromSockets()
                self.scene().removeItem(self._tempEdgeDragObj)
                self._ResetEdgeDrag()

            # * check if connecttion possible, non multi connection type
            elif item.AtMaxLimit():
                logger.warning(f"socket cannot add edge, maxlimit")
                self._tempEdgeDragObj.DisconnectFromSockets()
                self.scene().removeItem(self._tempEdgeDragObj)
                self._ResetEdgeDrag()

            # * check sockets belong to same parent
            elif self._tempEdgeDragObj.startSocket.nodeId == item.nodeId:
                logger.warning(f"socket belong to same parent")
                self._tempEdgeDragObj.DisconnectFromSockets()
                self.scene().removeItem(self._tempEdgeDragObj)
                self._ResetEdgeDrag()

            else:
                # * check dupliate edge
                for edgeInScene in list(
                        filter(
                            lambda edge: isinstance(edge, JGraphicEdge) and
                            edge.edgeId != self._tempEdgeDragObj.edgeId and
                            edge.startSocket.socketId == self._tempEdgeDragObj.
                            startSocket.socketId,
                            self.scene().items(),
                        )):
                    assert isinstance(edgeInScene, JGraphicEdge)
                    if edgeInScene.destinationSocket is item:
                        logger.warning(f"duplicate edge")
                        self._tempEdgeDragObj.DisconnectFromSockets()
                        self.scene().removeItem(self._tempEdgeDragObj)
                        self._ResetEdgeDrag()
                        return

                # * only add edge if all above fail
                self._tempEdgeDragObj.destinationSocket = item
                self._ResetEdgeDrag()

        elif not isinstance(item, JGraphicSocket):
            logger.warning(f"clicked no socket type")
            self._tempEdgeDragObj.DisconnectFromSockets()
            self.scene().removeItem(self._tempEdgeDragObj)
            self._ResetEdgeDrag()
            self.setCursor(QtCore.Qt.ArrowCursor)
            self.setInteractive(True)