main.qml Example File
					 
					
						qmloscilloscope/qml/qmloscilloscope/main.qml
					 
					
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Data Visualization module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/ 
import QtQuick 2.1
import QtQuick.Layouts 1.0
import QtQuick.Controls 1.0
import QtDataVisualization 1.1
import "."
Item id : mainView 
    width : 1280 
    height : 1024 
    property int  sampleColumns : sampleSlider .value 
    property int  sampleRows : sampleColumns  /  2 
    property int  sampleCache : 24 
    onSampleRowsChanged : {
        surfaceSeries .selectedPoint  =  surfaceSeries .invalidSelectionPosition 
        generateData ()
    }
    Item id : dataView 
        anchors .bottom: parent .bottom 
        width : parent .width 
        height : parent .height  -  buttonLayout .height 
        Surface3D id : surfaceGraph 
            width : dataView .width 
            height : dataView .height 
            shadowQuality : AbstractGraph3D .ShadowQualityNone 
            selectionMode : AbstractGraph3D .SelectionSlice  |  AbstractGraph3D .SelectionItemAndRow 
            renderingMode : AbstractGraph3D .RenderDirectToBackground 
            axisX .labelFormat: "%d ms" 
            axisY .labelFormat: "%d W" 
            axisZ .labelFormat: "%d mV" 
            axisX .min: 0 
            axisY .min: 0 
            axisZ .min: 0 
            axisX .max: 1000 
            axisY .max: 100 
            axisZ .max: 800 
            axisX .segmentCount: 4 
            axisY .segmentCount: 4 
            axisZ .segmentCount: 4 
            measureFps : true 
            onCurrentFpsChanged : {
                if  (fps  >  10 )
                    fpsText .text  =  "FPS: "  +  Math .round (surfaceGraph .currentFps )
                else 
                    fpsText .text  =  "FPS: "  +  Math .round (surfaceGraph .currentFps  *  10.0 ) /  10.0 
            }
            Surface3DSeries id : surfaceSeries 
                drawMode : Surface3DSeries .DrawSurface ;
                flatShadingEnabled : false ;
                meshSmooth : true 
                itemLabelFormat : "@xLabel, @zLabel: @yLabel" 
                itemLabelVisible : false 
                onItemLabelChanged : {
                    if  (surfaceSeries .selectedPoint  ===  surfaceSeries .invalidSelectionPosition )
                        selectionText .text  =  "No selection" 
                    else 
                        selectionText .text  =  surfaceSeries .itemLabel 
                }
            }
            Component .onCompleted: mainView .generateData ()
        }
    }
    Timer id : refreshTimer 
        interval : 1000  /  frequencySlider .value 
        running : true 
        repeat : true 
        onTriggered : dataSource .update (surfaceSeries )
    }
    Rectangle width : parent .width 
        height : flatShadingToggle .height  *  2 
        anchors .left: parent .left 
        anchors .top: parent .top 
        color : surfaceGraph .theme .backgroundColor 
        ColumnLayout anchors .fill: parent 
            RowLayout id : sliderLayout 
                anchors .top: parent .top 
                Layout .fillHeight: true 
                Layout .fillWidth: true 
                Layout .minimumHeight: flatShadingToggle .height 
                spacing : 0 
                Rectangle Layout .fillHeight: true 
                    Layout .fillWidth: true 
                    Layout .minimumWidth: samplesText .implicitWidth  +  120 
                    Layout .maximumWidth: samplesText .implicitWidth  +  120 
                    Layout .alignment: Qt .AlignHCenter  |  Qt .AlignVCenter 
                    border .color: "gray" 
                    border .width: 1 
                    radius : 4 
                    RowLayout anchors .fill: parent 
                        anchors .margins: parent .border .width  +  1 
                        Slider id : sampleSlider 
                            Layout .fillHeight: true 
                            Layout .fillWidth: true 
                            Layout .alignment: Qt .AlignHCenter  |  Qt .AlignVCenter 
                            Layout .minimumWidth: 80 
                            minimumValue : mainView .sampleCache  *  2 
                            maximumValue : minimumValue  *  10 
                            stepSize : mainView .sampleCache 
                            updateValueWhileDragging : false 
                            Component .onCompleted: value  =  minimumValue  *  2 
                        }
                        Rectangle Layout .fillHeight: true 
                            Layout .fillWidth: true 
                            Layout .minimumWidth: samplesText .implicitWidth  +  10 
                            Layout .maximumWidth: samplesText .implicitWidth  +  10 
                            Layout .alignment: Qt .AlignHCenter  |  Qt .AlignVCenter 
                            Text id : samplesText 
                                text : "Samples: "  +  (mainView .sampleRows  *  mainView .sampleColumns )
                                anchors .fill: parent 
                                verticalAlignment : Text .AlignVCenter 
                                horizontalAlignment : Text .AlignHCenter 
                            }
                        }
                    }
                }
                Rectangle Layout .fillHeight: true 
                    Layout .fillWidth: true 
                    Layout .minimumWidth: frequencyText .implicitWidth  +  120 
                    Layout .maximumWidth: frequencyText .implicitWidth  +  120 
                    Layout .alignment: Qt .AlignHCenter  |  Qt .AlignVCenter 
                    border .color: "gray" 
                    border .width: 1 
                    radius : 4 
                    RowLayout anchors .fill: parent 
                        anchors .margins: parent .border .width  +  1 
                        Slider id : frequencySlider 
                            Layout .fillHeight: true 
                            Layout .fillWidth: true 
                            Layout .alignment: Qt .AlignHCenter  |  Qt .AlignVCenter 
                            Layout .minimumWidth: 80 
                            minimumValue : 2 
                            maximumValue : 60 
                            stepSize : 2 
                            updateValueWhileDragging : true 
                            value : 30 
                        }
                        Rectangle Layout .fillHeight: true 
                            Layout .fillWidth: true 
                            Layout .minimumWidth: frequencyText .implicitWidth  +  10 
                            Layout .maximumWidth: frequencyText .implicitWidth  +  10 
                            Layout .alignment: Qt .AlignHCenter  |  Qt .AlignVCenter 
                            Text id : frequencyText 
                                text : "Freq: "  +  frequencySlider .value  +  " Hz" 
                                anchors .fill: parent 
                                verticalAlignment : Text .AlignVCenter 
                                horizontalAlignment : Text .AlignHCenter 
                            }
                        }
                    }
                }
                Rectangle Layout .fillHeight: true 
                    Layout .fillWidth: true 
                    Layout .minimumWidth: fpsText .implicitWidth  +  10 
                    Layout .maximumWidth: fpsText .implicitWidth  +  10 
                    Layout .alignment: Qt .AlignHCenter  |  Qt .AlignVCenter 
                    border .color: "gray" 
                    border .width: 1 
                    radius : 4 
                    Text id : fpsText 
                        anchors .fill: parent 
                        verticalAlignment : Text .AlignVCenter 
                        horizontalAlignment : Text .AlignHCenter 
                    }
                }
                Rectangle Layout .fillHeight: true 
                    Layout .fillWidth: true 
                    Layout .minimumWidth: selectionText .implicitWidth  +  10 
                    Layout .alignment: Qt .AlignHCenter  |  Qt .AlignVCenter 
                    border .color: "gray" 
                    border .width: 1 
                    radius : 4 
                    Text id : selectionText 
                        anchors .fill: parent 
                        verticalAlignment : Text .AlignVCenter 
                        horizontalAlignment : Text .AlignHCenter 
                        text : "No selection" 
                    }
                }
            }
            RowLayout id : buttonLayout 
                Layout .fillHeight: true 
                Layout .fillWidth: true 
                Layout .minimumHeight: flatShadingToggle .height 
                anchors .bottom: parent .bottom 
                spacing : 0 
                NewButton  {
                    id : flatShadingToggle 
                    Layout .fillHeight: true 
                    Layout .fillWidth: true 
                    text : surfaceSeries .flatShadingSupported  ? "Show Flat"  : "Flat not supported" 
                    enabled : surfaceSeries .flatShadingSupported 
                    onClicked : {
                        if  (surfaceSeries .flatShadingEnabled  ===  true ) {
                            surfaceSeries .flatShadingEnabled  =  false ;
                            text  =  "Show Flat" 
                        } else  {
                            surfaceSeries .flatShadingEnabled  =  true ;
                            text  =  "Show Smooth" 
                        }
                    }
                }
                NewButton  {
                    id : surfaceGridToggle 
                    Layout .fillHeight: true 
                    Layout .fillWidth: true 
                    text : "Show Surface Grid" 
                    onClicked : {
                        if  (surfaceSeries .drawMode  &  Surface3DSeries .DrawWireframe ) {
                            surfaceSeries .drawMode  &=  ~Surface3DSeries .DrawWireframe ;
                            text  =  "Show Surface Grid" 
                        } else  {
                            surfaceSeries .drawMode  |=  Surface3DSeries .DrawWireframe ;
                            text  =  "Hide Surface Grid" 
                        }
                    }
                }
                NewButton  {
                    id : exitButton 
                    Layout .fillHeight: true 
                    Layout .fillWidth: true 
                    text : "Quit" 
                    onClicked : Qt .quit (0 );
                }
            }
        }
    }
    function  generateData () {
        dataSource .generateData (mainView .sampleCache , mainView .sampleRows ,
                                mainView .sampleColumns , surfaceGraph .axisX .min ,
                                surfaceGraph .axisX .max , surfaceGraph .axisY .min ,
                                surfaceGraph .axisY .max , surfaceGraph .axisZ .min ,
                                surfaceGraph .axisZ .max )
    }
}