Example #1
0
class GLContainer(QAbstractScrollArea):
    """
    Class GLContainer
    """
    def __init__(self):
        super(GLContainer, self).__init__()

        self.horizontalScrollBar().setSingleStep(10)
        self.horizontalScrollBar().setPageStep(100)
        self.horizontalScrollBar().setVisible(True)

        self.verticalScrollBar().setSingleStep(10)
        self.verticalScrollBar().setPageStep(100)
        self.verticalScrollBar().setVisible(True)

        self.horizontalScrollBar().valueChanged.connect(self.HScrollChanged)
        self.verticalScrollBar().valueChanged.connect(self.VScrollChanged)

        self.__glWidget = GLWidget()
        self.setViewport(self.__glWidget)

        self.setMouseTracking(True)

        self.__mousePressed = False
        self.__ctrlPressed = False
        self.__scrollMoved = False
        self.__xPrevF = 0.0
        self.__yPrevF = 0.0
        self.__prevZoomFactor = self.__glWidget.GetZoomFactor()
        self.__mousePos = QPointF(0, 0)

        QtCore.QCoreApplication.instance().aboutToQuit.connect(
            self.DeleteGLWidget)

        self.__justInitialized = True

        self.UpdateViewport(True)

    def HScrollChanged(self, val):
        self.__xPrevF = float(val)
        self.__glWidget.SetHorizontalScroll(val)
        self.__scrollMoved = True

    def VScrollChanged(self, val):
        self.__yPrevF = float(val)
        self.__glWidget.SetVerticalScroll(val)
        self.__scrollMoved = True

    def UpdateViewport(self, putInMiddle=False):
        """
        leftRange  = 0
        rightRange = 0
        upRange    = 0
        downRange  = 0

        hPos = 0
        vPos = 0
        """

        barSize = QSize(self.width() - 20, self.height() - 20)
        zoomFactor = self.__glWidget.GetZoomFactor()

        imgSize = self.__glWidget.GetImageSize()

        img_width = float(imgSize.width() * zoomFactor)
        img_height = float(imgSize.height() * zoomFactor)

        if (img_width == 0 or img_height == 0):
            print "duh"
            img_width = 100 * zoomFactor
            img_height = 100 * zoomFactor

        xSPos = 0
        ySPos = 0

        if not putInMiddle:
            xNormPos = float(self.__mousePos.x()) + self.__xPrevF
            yNormPos = float(self.__mousePos.y()) + self.__yPrevF
            xNormPos /= self.__prevZoomFactor
            yNormPos /= self.__prevZoomFactor

            xRev = float(xNormPos) * zoomFactor
            yRev = float(yNormPos) * zoomFactor
            xSPos = xRev - float(self.__mousePos.x())
            ySPos = yRev - float(self.__mousePos.y())

        xGap = np.abs(barSize.width() - img_width)
        yGap = np.abs(barSize.height() - img_height)

        if (img_width <= barSize.width()):
            if (putInMiddle):
                hPos = -xGap * 0.5
            else:
                hPos = xSPos

            leftRange = -img_width - xGap
            rightRange = img_width
        else:
            if (putInMiddle):
                hPos = xGap * 0.5
            else:
                hPos = xSPos

            leftRange = -img_width + xGap
            rightRange = img_width

        if (img_height <= barSize.height()):
            if (putInMiddle):
                vPos = -yGap * 0.5
            else:
                vPos = ySPos

            upRange = -img_height - yGap
            downRange = img_height
        else:
            if (putInMiddle):
                vPos = yGap * 0.5
            else:
                vPos = ySPos

            upRange = -img_height + yGap
            downRange = img_height

        self.__xPrevF = hPos
        self.__yPrevF = vPos

        self.horizontalScrollBar().setRange(leftRange, rightRange)
        self.verticalScrollBar().setRange(upRange, downRange)

        self.horizontalScrollBar().setSliderPosition(hPos)
        self.verticalScrollBar().setSliderPosition(vPos)

    def setScrolls(self):
        """
        Currently not being used...
        """
        self.horizontalScrollBar().setVisible(True)
        self.verticalScrollBar().setVisible(True)

        self.__prevZoomFactor = 1.0

        # nasty code here...
        shouldZoom = True
        while (shouldZoom):
            w = self.width()
            h = self.height()
            imgSize = self.__glWidget.GetImageSize()
            if (imgSize.width() == 0 or imgSize.height() == 0):
                imgSize = QSize(100, 100)

            zoomFactor = self.__glWidget.GetZoomFactor()

            if (w < imgSize.width() * zoomFactor
                    or h < imgSize.height() * zoomFactor):
                self.__glWidget.ZoomOut()
            else:
                shouldZoom = False

        self.UpdateViewport(True)

    def mousePressEvent(self, event):
        super(GLContainer, self).mousePressEvent(event)
        #pass

    def mouseMoveEvent(self, event):
        super(GLContainer, self).mouseMoveEvent(event)
        self.__mousePos.setX(event.x())
        self.__mousePos.setY(event.y())

    def mouseReleaseEvent(self, event):
        #pass
        super(GLContainer, self).mouseReleaseEvent(event)

    def wheelEvent(self, event):
        #super(GLContainer, self).wheelEvent(event) # don't uncomment !!!
        scrollDir = True if (event.delta() > 0) else False
        self.__prevZoomFactor = self.__glWidget.GetZoomFactor()

        if (scrollDir):
            self.__glWidget.ZoomOut()
        else:
            self.__glWidget.ZoomIn()

        # update scrollbars
        self.UpdateViewport()

    def keyPressEvent(self, event):
        super(GLContainer, self).keyPressEvent(event)

        if (event.key() == Qt.Key_Control):
            #print "CRTL pressed"
            self.__ctrlPressed = True
            QApplication.setOverrideCursor(Qt.OpenHandCursor)

        #if (event.key() == Qt.Key_Right)
        #    self.__glWidget.AddSlice()
        #elif (event.key() == Qt.Key_Left):
        #    self.__glWidget.RemoveSlice()

        self.__glWidget.updateGL()

    def keyReleaseEvent(self, event):
        super(GLContainer, self).keyReleaseEvent(event)

        if (event.key() == Qt.Key_Control):
            #print "CRTL released"
            self.__ctrlPressed = False
            QApplication.restoreOverrideCursor()

    def DeleteGLWidget(self):
        print "QUIT"
        self.__glWidget.setParent(None)
        del self.__glWidget

    def paintEvent(self, event):

        if (self.__justInitialized):
            self.UpdateViewport(True)
            self.__justInitialized = False

        self.__glWidget.updateGL()