Skip to content
QGCView.qml 8.48 KiB
Newer Older
Don Gagne's avatar
Don Gagne committed
/*=====================================================================

 QGroundControl Open Source Ground Control Station

 (c) 2009 - 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>

 This file is part of the QGROUNDCONTROL project

 QGROUNDCONTROL is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 QGROUNDCONTROL is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.

 ======================================================================*/

/// @file
///     @author Don Gagne <don@thegagnes.com>

import QtQuick 2.3
import QtQuick.Controls 1.3
import QtQuick.Dialogs 1.2

import QGroundControl.Controls 1.0
import QGroundControl.Palette 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0

Don Gagne's avatar
Don Gagne committed
FactPanel {
Don Gagne's avatar
Don Gagne committed
    id: __rootItem

Don Gagne's avatar
Don Gagne committed
    property Component viewComponent

Don Gagne's avatar
Don Gagne committed
    /// This is signalled when the top level Item reaches Component.onCompleted. This allows
    /// the view subcomponent to connect to this signal and do work once the full ui is ready
    /// to go.
    signal completed

Don Gagne's avatar
Don Gagne committed
    function __setupDialogButtons(buttons) {
Don Gagne's avatar
Don Gagne committed
        __acceptButton.visible = false
        __rejectButton.visible = false

Don Gagne's avatar
Don Gagne committed
        // Accept role buttons
Don Gagne's avatar
Don Gagne committed
        if (buttons & StandardButton.Ok) {
            __acceptButton.text = "Ok"
            __acceptButton.visible = true
        } else if (buttons & StandardButton.Open) {
            __acceptButton.text = "Open"
            __acceptButton.visible = true
        } else if (buttons & StandardButton.Save) {
            __acceptButton.text = "Save"
            __acceptButton.visible = true
        } else if (buttons & StandardButton.Apply) {
            __acceptButton.text = "Apply"
            __acceptButton.visible = true
        } else if (buttons & StandardButton.Open) {
            __acceptButton.text = "Open"
            __acceptButton.visible = true
        } else if (buttons & StandardButton.SaveAll) {
            __acceptButton.text = "Save All"
            __acceptButton.visible = true
        } else if (buttons & StandardButton.Yes) {
            __acceptButton.text = "Yes"
            __acceptButton.visible = true
        } else if (buttons & StandardButton.YesToAll) {
            __acceptButton.text = "Yes to All"
            __acceptButton.visible = true
        } else if (buttons & StandardButton.Retry) {
            __acceptButton.text = "Retry"
            __acceptButton.visible = true
        } else if (buttons & StandardButton.Reset) {
            __acceptButton.text = "Reset"
            __acceptButton.visible = true
        } else if (buttons & StandardButton.RestoreToDefaults) {
            __acceptButton.text = "Restore to Defaults"
            __acceptButton.visible = true
        } else if (buttons & StandardButton.Ignore) {
            __acceptButton.text = "Ignore"
            __acceptButton.visible = true
        }
Don Gagne's avatar
Don Gagne committed

        // Reject role buttons
        if (buttons & StandardButton.Cancel) {
            __rejectButton.text = "Cancel"
            __rejectButton.visible = true
        } else if (buttons & StandardButton.Close) {
            __rejectButton.text = "Cancel"
            __rejectButton.visible = true
        } else if (buttons & StandardButton.No) {
            __rejectButton.text = "No"
            __rejectButton.visible = true
        } else if (buttons & StandardButton.NoToAll) {
            __rejectButton.text = "No to All"
            __rejectButton.visible = true
        } else if (buttons & StandardButton.Abort) {
            __rejectButton.text = "Abort"
            __rejectButton.visible = true
        }
Don Gagne's avatar
Don Gagne committed
    function showDialog(component, title, charWidth, buttons) {
Don Gagne's avatar
Don Gagne committed
        __dialogCharWidth = charWidth
        __dialogTitle = title

        __setupDialogButtons(buttons)
Don Gagne's avatar
Don Gagne committed
        __dialogComponent = component
        __viewPanel.enabled = false
        __dialogOverlay.visible = true
    }

Don Gagne's avatar
Don Gagne committed
    function showMessage(title, message, buttons) {
Don Gagne's avatar
Don Gagne committed
        __dialogCharWidth = 50
        __dialogTitle = title
        __messageDialogText = message

        __setupDialogButtons(buttons)

        __dialogComponent = __messageDialog
        __viewPanel.enabled = false
        __dialogOverlay.visible = true
    }

Don Gagne's avatar
Don Gagne committed
    function hideDialog() {
Don Gagne's avatar
Don Gagne committed
        __dialogComponent = null
        __viewPanel.enabled = true
        __dialogOverlay.visible = false
    }

    QGCPalette { id: __qgcPal; colorGroupEnabled: true }
    QGCLabel { id: __textMeasure; text: "X"; visible: false }

    property real __textHeight: __textMeasure.contentHeight
    property real __textWidth:  __textMeasure.contentWidth

    /// The width of the dialog panel in characters
    property int __dialogCharWidth: 75

    /// The title for the dialog panel
    property string __dialogTitle

Don Gagne's avatar
Don Gagne committed
    property string __messageDialogText

Don Gagne's avatar
Don Gagne committed
    property Component __dialogComponent

Don Gagne's avatar
Don Gagne committed
    Component.onCompleted: completed()
Don Gagne's avatar
Don Gagne committed

    Connections {
        target: __viewPanel.item

Don Gagne's avatar
Don Gagne committed
        onShowDialog:   __rootItem.showDialog(component, title, charWidth, buttons)
        onShowMessage:  __rootItem.showMessage(title, message, buttons)
        onHideDialog:   __rootItem.hideDialog()
Don Gagne's avatar
Don Gagne committed
    }

    Connections {
        target: __dialogComponentLoader.item

Don Gagne's avatar
Don Gagne committed
        onHideDialog: __rootItem.hideDialog()
Don Gagne's avatar
Don Gagne committed
    }

    Loader {
        id:                 __viewPanel
        anchors.fill:       parent
        focus:              true
        sourceComponent:    viewComponent
    }

    Item {
        id:             __dialogOverlay
        visible:        false
        anchors.fill:   parent
        z:              5000

        // This covers the parent with an transparent section
        Rectangle {
            anchors.top:    parent.top
            anchors.bottom: parent.bottom
            anchors.left:   parent.left
            anchors.right:  __dialogPanel.left
            opacity:        0.80
            color:          __qgcPal.window
        }

        // This is the main dialog panel which is anchored to the right edge
        Rectangle {
            id:             __dialogPanel
Don Gagne's avatar
Don Gagne committed
            width:          __dialogCharWidth == -1 ? parent.width : __textWidth * __dialogCharWidth
Don Gagne's avatar
Don Gagne committed
            height:         parent.height
            anchors.right:  parent.right
            color:          __qgcPal.windowShadeDark

            Rectangle {
                id:     __header
                width:  parent.width
                height: __acceptButton.height
                color:  __qgcPal.windowShade

                function __hidePanel() {
                    __fullPanel.visible = false
                }

                QGCLabel {
                    x:                  __textWidth
                    height:             parent.height
                    verticalAlignment:	Text.AlignVCenter
                    text:               __dialogTitle
                }

                QGCButton {
                    id:             __rejectButton
                    anchors.right:  __acceptButton.left
                    anchors.bottom: parent.bottom

                    onClicked: __dialogComponentLoader.item.reject()
                }

                QGCButton {
                    id:             __acceptButton
                    anchors.right:  parent.right
                    primary:        true

                    onClicked: __dialogComponentLoader.item.accept()
                }
            }

            Item {
                id:             __spacer
                width:          10
                height:         10
                anchors.top:    __header.bottom
            }

            Loader {
                id:                 __dialogComponentLoader
                anchors.margins:    5
                anchors.left:       parent.left
                anchors.right:      parent.right
                anchors.top:        __spacer.bottom
                anchors.bottom:     parent.bottom
                sourceComponent:    __dialogComponent
            }
        } // Rectangle - Dialog panel
    } // Item - Dialog overlay
Don Gagne's avatar
Don Gagne committed

    Component {
        id: __messageDialog

        QGCViewMessage {
            message: __messageDialogText
        }
    }
Don Gagne's avatar
Don Gagne committed
}