Skip to content
Snippets Groups Projects
QGCPipable.qml 5.99 KiB
Newer Older
  • Learn to ignore specific revisions
  • /****************************************************************************
     *
     *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
     *
     * QGroundControl is licensed according to the terms in the file
     * COPYING.md in the root of the source code directory.
     *
     ****************************************************************************/
    
    import QtQuick                      2.3
    import QtQuick.Controls             1.2
    
    
    import QGroundControl               1.0
    import QGroundControl.ScreenTools   1.0
    import QGroundControl.Controls      1.0
    import QGroundControl.Palette       1.0
    
    Item {
        id: pip
    
        property bool isHidden:  false
        property bool isDark:    false
    
    
        // As a percentage of the window width
        property real maxSize: 0.75
        property real minSize: 0.10
    
    
    Patrick José Pereira's avatar
    Patrick José Pereira committed
        property bool inPopup: false
    
        property bool enablePopup: true
    
        signal  activated()
        signal  hideIt(bool state)
    
    Patrick José Pereira's avatar
    Patrick José Pereira committed
        signal  popup()
    
    
        MouseArea {
    
            anchors.fill: parent
            enabled:      !isHidden
    
            onClicked: {
                pip.activated()
            }
        }
    
    
        // MouseArea to drag in order to resize the PiP area
        MouseArea {
            id: pipResize
            anchors.top: parent.top
            anchors.right: parent.right
            height: ScreenTools.minTouchPixels
    
    Jacob Walser's avatar
    Jacob Walser committed
            width: height
    
            property var initialX: 0
            property var initialWidth: 0
    
            onClicked: {
                // TODO propagate
            }
    
            // When we push the mouse button down, we un-anchor the mouse area to prevent a resizing loop
            onPressed: {
                pipResize.anchors.top = undefined // Top doesn't seem to 'detach'
                pipResize.anchors.right = undefined // This one works right, which is what we really need
                pipResize.initialX = mouse.x
                pipResize.initialWidth = pip.width
            }
    
            // When we let go of the mouse button, we re-anchor the mouse area in the correct position
            onReleased: {
                pipResize.anchors.top = pip.top
                pipResize.anchors.right = pip.right
            }
    
            // Drag
            onPositionChanged: {
                if (pipResize.pressed) {
                    var parentW = pip.parent.width // flightView
                    var newW = pipResize.initialWidth + mouse.x - pipResize.initialX
                    if (newW < parentW * maxSize && newW > parentW * minSize) {
                        newWidth(newW)
                    }
                }
            }
    
        // Resize icon
        Image {
            source:         "/qmlimages/pipResize.svg"
            fillMode:       Image.PreserveAspectFit
            mipmap: true
            anchors.right:  parent.right
            anchors.top:    parent.top
    
    Patrick José Pereira's avatar
    Patrick José Pereira committed
            visible:        !isHidden && (ScreenTools.isMobile || pipMouseArea.containsMouse) && !inPopup
    
            height:         ScreenTools.defaultFontPixelHeight * 2.5
            width:          ScreenTools.defaultFontPixelHeight * 2.5
            sourceSize.height:  height
        }
    
        // Resize pip window if necessary when main window is resized
        property var pipLock: 2
    
        Connections {
            target: pip.parent
            onWidthChanged: {
                // hackity hack...
                // don't fire this while app is loading/initializing (it happens twice)
                if (pipLock) {
                    pipLock--
                    return
                }
    
                var parentW = pip.parent.width
    
                if (pip.width > parentW * maxSize) {
                    newWidth(parentW * maxSize)
                } else if (pip.width < parentW * minSize) {
                    newWidth(parentW * minSize)
                }
            }
    
    Patrick José Pereira's avatar
    Patrick José Pereira committed
         //-- PIP Popup Indicator
        Image {
            id:             popupPIP
            source:         "/qmlimages/PiP.svg"
            mipmap:         true
            fillMode:       Image.PreserveAspectFit
            anchors.left:   parent.left
            anchors.top:    parent.top
    
            visible:        !isHidden && !inPopup && !ScreenTools.isMobile && enablePopup
    
    Patrick José Pereira's avatar
    Patrick José Pereira committed
            height:         ScreenTools.defaultFontPixelHeight * 2.5
            width:          ScreenTools.defaultFontPixelHeight * 2.5
            sourceSize.height:  height
            MouseArea {
                anchors.fill: parent
                onClicked: {
                    inPopup = true
                    pip.popup()
                }
            }
        }
    
    
        //-- PIP Corner Indicator
        Image {
            id:             closePIP
    
    Patrick José Pereira's avatar
    Patrick José Pereira committed
            source:         "/qmlimages/pipHide.svg"
    
            mipmap:         true
            fillMode:       Image.PreserveAspectFit
            anchors.left:   parent.left
            anchors.bottom: parent.bottom
    
    Jacob Walser's avatar
    Jacob Walser committed
            visible:        !isHidden && (ScreenTools.isMobile || pipMouseArea.containsMouse)
    
            height:         ScreenTools.defaultFontPixelHeight * 2.5
            width:          ScreenTools.defaultFontPixelHeight * 2.5
    
    dogmaphobic's avatar
    dogmaphobic committed
            sourceSize.height:  height
    
            MouseArea {
                anchors.fill: parent
                onClicked: {
                    pip.hideIt(true)
                }
            }
        }
    
        //-- Show PIP
        Rectangle {
            id:                     openPIP
            anchors.left :          parent.left
            anchors.bottom:         parent.bottom
    
            height:                 ScreenTools.defaultFontPixelHeight * 2
            width:                  ScreenTools.defaultFontPixelHeight * 2
            radius:                 ScreenTools.defaultFontPixelHeight / 3
    
            visible:                isHidden
            color:                  isDark ? Qt.rgba(0,0,0,0.75) : Qt.rgba(0,0,0,0.5)
            Image {
                width:              parent.width  * 0.75
                height:             parent.height * 0.75
    
    dogmaphobic's avatar
    dogmaphobic committed
                sourceSize.height:  height
    
                source:             "/res/buttonRight.svg"
                mipmap:             true
                fillMode:           Image.PreserveAspectFit
                anchors.verticalCenter:     parent.verticalCenter
                anchors.horizontalCenter:   parent.horizontalCenter
            }
            MouseArea {
                anchors.fill: parent
                onClicked: {
                    pip.hideIt(false)
                }
            }
        }
    }