main.qml Example File

multimedia/video/qmlvideo/qml/qmlvideo/main.qml

  /****************************************************************************
  **
  ** Copyright (C) 2016 The Qt Company Ltd.
  ** Contact: https://www.qt.io/licensing/
  **
  ** This file is part of the Qt Mobility Components.
  **
  ** $QT_BEGIN_LICENSE:BSD$
  ** 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.
  **
  ** BSD License Usage
  ** Alternatively, you may use this file under the terms of the BSD license
  ** as follows:
  **
  ** "Redistribution and use in source and binary forms, with or without
  ** modification, are permitted provided that the following conditions are
  ** met:
  **   * Redistributions of source code must retain the above copyright
  **     notice, this list of conditions and the following disclaimer.
  **   * Redistributions in binary form must reproduce the above copyright
  **     notice, this list of conditions and the following disclaimer in
  **     the documentation and/or other materials provided with the
  **     distribution.
  **   * Neither the name of The Qt Company Ltd nor the names of its
  **     contributors may be used to endorse or promote products derived
  **     from this software without specific prior written permission.
  **
  **
  ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  **
  ** $QT_END_LICENSE$
  **
  ****************************************************************************/

  import QtQuick 2.0

  Rectangle {
      id: root
      anchors.fill: parent
      color: "black"

      property string source1
      property string source2
      property color bgColor: "black"
      property real volume: 0.25
      property bool perfMonitorsLogging: false
      property bool perfMonitorsVisible: false

      QtObject {
          id: d
          property int itemHeight: root.height > root.width ? root.width / 10 : root.height / 10
          property int buttonHeight: 0.8 * itemHeight
          property int margins: 5
      }

      Loader {
          id: performanceLoader

          Connections {
              target: inner
              onVisibleChanged:
                  if (performanceLoader.item)
                      performanceLoader.item.enabled = !inner.visible
              ignoreUnknownSignals: true
          }

          function init() {
              var enabled = root.perfMonitorsLogging || root.perfMonitorsVisible
              source = enabled ? "../performancemonitor/PerformanceItem.qml" : ""
          }

          onLoaded: {
              item.parent = root
              item.anchors.fill = root
              item.logging = root.perfMonitorsLogging
              item.displayed = root.perfMonitorsVisible
              item.enabled = false
              item.init()
          }
      }

      Rectangle {
          id: inner
          anchors.fill: parent
          color: root.bgColor

          Button {
              id: openFile1Button
              anchors {
                  top: parent.top
                  left: parent.left
                  right: exitButton.left
                  margins: d.margins
              }
              bgColor: "#212121"
              bgColorSelected: "#757575"
              textColorSelected: "white"
              height: d.buttonHeight
              text: (root.source1 == "") ? "Select file 1" : root.source1
              onClicked: fileBrowser1.show()
          }

          Button {
              id: openFile2Button
              anchors {
                  top: openFile1Button.bottom
                  left: parent.left
                  right: exitButton.left
                  margins: d.margins
              }
              bgColor: "#212121"
              bgColorSelected: "#757575"
              textColorSelected: "white"
              height: d.buttonHeight
              text: (root.source2 == "") ? "Select file 2" : root.source2
              onClicked: fileBrowser2.show()
          }

          Button {
              id: exitButton
              anchors {
                  top: parent.top
                  right: parent.right
                  margins: d.margins
              }
              bgColor: "#212121"
              bgColorSelected: "#757575"
              textColorSelected: "white"
              width: parent.width / 10
              height: d.buttonHeight
              text: "Exit"
              onClicked: Qt.quit()
          }

          Row {
              id: modes
              anchors.top: openFile2Button.bottom
              anchors.margins: 0
              anchors.topMargin: 5
              Button {
                  width: root.width / 2
                  height: 0.8 * d.itemHeight
                  bgColor: "#212121"
                  radius: 0
                  text: "Video Modes"
                  enabled: false
              }
              Button {
                  width: root.width / 2
                  height: 0.8 * d.itemHeight
                  bgColor: "#212121"
                  radius: 0
                  text: "Camera Modes"
                  enabled: false
              }
          }

          Rectangle {
              id: divider
              height: 1
              width: parent.width
              color: "black"
              anchors.top: modes.bottom
          }

          SceneSelectionPanel {
              id: sceneSelectionPanel
              itemHeight: d.itemHeight
              color: "#212121"
              anchors {
                  top: divider.bottom
                  left: parent.left
                  right: parent.right
                  bottom: parent.bottom
              }
              radius: 0
              onSceneSourceChanged: {
                  sceneLoader.source = sceneSource
                  var scene = null
                  var innerVisible = true
                  if (sceneSource == "") {
                      if (performanceLoader.item)
                          performanceLoader.item.videoActive = false
                  } else {
                      scene = sceneLoader.item
                      if (scene) {
                          if (scene.contentType === "video" && source1 === "") {
                              errorDialog.show("You must first select a video file")
                              sceneSource = ""
                          } else {
                              scene.parent = root
                              scene.color = root.bgColor
                              scene.buttonHeight = d.buttonHeight
                              scene.source1 = source1
                              scene.source2 = source2
                              scene.volume = volume
                              scene.anchors.fill = root
                              scene.close.connect(closeScene)
                              scene.content.initialize()
                              innerVisible = false
                          }
                      }
                  }
                  videoFramePaintedConnection.target = scene
                  inner.visible = innerVisible
              }
          }
      }

      Loader {
          id: sceneLoader
      }

      Connections {
          id: videoFramePaintedConnection
          onVideoFramePainted: {
              if (performanceLoader.item)
                  performanceLoader.item.videoFramePainted()
          }
          ignoreUnknownSignals: true
      }

      FileBrowser {
          id: fileBrowser1
          anchors.fill: root
          onFolderChanged: fileBrowser2.folder = folder
          Component.onCompleted: fileSelected.connect(root.openFile1)
      }

      FileBrowser {
          id: fileBrowser2
          anchors.fill: root
          onFolderChanged: fileBrowser1.folder = folder
          Component.onCompleted: fileSelected.connect(root.openFile2)
      }

      function openFile1(path) {
          root.source1 = path
      }

      function openFile2(path) {
          root.source2 = path
      }

      ErrorDialog {
          id: errorDialog
          anchors.fill: root
          dialogWidth: d.itemHeight * 5
          dialogHeight: d.itemHeight * 3
          enabled: false
      }

      // Called from main() once root properties have been set
      function init() {
          performanceLoader.init()
          fileBrowser1.folder = videoPath
          fileBrowser2.folder = videoPath
      }

      function qmlFramePainted() {
          if (performanceLoader.item)
              performanceLoader.item.qmlFramePainted()
      }

      function closeScene() {
          sceneSelectionPanel.sceneSource = ""
      }
  }