Skip to content
Snippets Groups Projects
  • Ming Rui Zhang's avatar
    fcb56bfb
    misc: qml module import clean up · fcb56bfb
    Ming Rui Zhang authored
    The main reason for this change is to remove the misusage
    of QQuick one in ElidedTextLabel and useless QQuick one
    module import
    
    Change-Id: Ie296c0f7a90c6ec26ab85bcf3d8b75393463fbed
    fcb56bfb
    History
    misc: qml module import clean up
    Ming Rui Zhang authored
    The main reason for this change is to remove the misusage
    of QQuick one in ElidedTextLabel and useless QQuick one
    module import
    
    Change-Id: Ie296c0f7a90c6ec26ab85bcf3d8b75393463fbed
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
VideoSettings.qml 8.90 KiB
/*
 * Copyright (C) 2020 by Savoir-faire Linux
 * Author: Aline Gondim Santos <aline.gondimsantos@savoirfairelinux.com>
 *
 * This program 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.
 *
 * This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
 */

import QtQuick 2.14
import QtQuick.Controls 2.14
import QtQuick.Controls.Universal 2.14
import QtQuick.Layouts 1.14
import QtGraphicalEffects 1.14
import Qt.labs.platform 1.1

import net.jami.Models 1.0
import net.jami.Adapters 1.0
import net.jami.Enums 1.0
import net.jami.Constants 1.0

import "../../commoncomponents"

ColumnLayout {
    id: root

    property real aspectRatio: 0.75
    property bool previewAvailable: false
    property int itemWidth

    Connections {
        target: AvAdapter
        enabled: root.visible

        function onVideoDeviceListChanged() {
            populateVideoSettings()
        }
    }

    function populateVideoSettings() {
        deviceComboBoxSetting.comboModel.reset()

        var count = deviceComboBoxSetting.comboModel.deviceCount()
        var deviceListIsEmpty = count === 0

        previewWidget.visible = count > 0
        deviceComboBoxSetting.setEnabled(count > 0)
        resolutionComboBoxSetting.setEnabled(count > 0)
        fpsComboBoxSetting.setEnabled(count > 0)

        if (deviceListIsEmpty) {
            resolutionComboBoxSetting.comboModel.reset()
            fpsComboBoxSetting.comboModel.reset()
        }

        deviceComboBoxSetting.setCurrentIndex(
                    deviceComboBoxSetting.comboModel.getCurrentSettingIndex(), true)
        hardwareAccelControl.checked = AVModel.getHardwareAcceleration()
    }

    function slotDeviceBoxCurrentIndexChanged(index) {
        if(deviceComboBoxSetting.comboModel.deviceCount() <= 0)
            return

        try {
            var deviceId = deviceComboBoxSetting.comboModel.data(deviceComboBoxSetting.comboModel.index(index, 0), VideoInputDeviceModel.DeviceId)
            var deviceName = deviceComboBoxSetting.comboModel.data(deviceComboBoxSetting.comboModel.index(index, 0), VideoInputDeviceModel.DeviceName)
            if(deviceId.length === 0) {
                console.warn("Couldn't find device: " + deviceName)
                return
            }

            if (AVModel.getCurrentVideoCaptureDevice() !== deviceId) {
                AVModel.setCurrentVideoCaptureDevice(deviceId)
                AVModel.setDefaultDevice(deviceId)
            }

            setFormatListForCurrentDevice()
            startPreviewing()
        } catch(err){ console.warn(err.message) }
    }

    function startPreviewing(force = false) {
        AccountAdapter.startPreviewing(force)
        previewAvailable = true
    }

    function setFormatListForCurrentDevice() {
        var device = AVModel.getCurrentVideoCaptureDevice()
        if (SettingsAdapter.get_DeviceCapabilitiesSize(device) === 0)
            return

        try {
            resolutionComboBoxSetting.comboModel.reset()
            resolutionComboBoxSetting.setCurrentIndex(
                        resolutionComboBoxSetting.comboModel.getCurrentSettingIndex(), true)
        } catch(err){ console.warn("Exception: " + err.message) }
    }

    function slotFormatCurrentIndexChanged(index, isResolutionIndex) {
        var resolution
        var rate
        if(isResolutionIndex) {
            fpsComboBoxSetting.comboModel.reset()
            resolution = resolutionComboBoxSetting.comboModel.data(
                        resolutionComboBoxSetting.comboModel.index(index, 0),
                        VideoFormatResolutionModel.Resolution)
            fpsComboBoxSetting.comboModel.currentResolution = resolution
            fpsComboBoxSetting.setCurrentIndex(
                        fpsComboBoxSetting.comboModel.getCurrentSettingIndex(), true)
            rate = fpsComboBoxSetting.comboModel.data(
                        fpsComboBoxSetting.comboModel.index(0, 0),
                        VideoFormatFpsModel.FPS)
        } else {
            resolution = resolutionComboBoxSetting.comboModel.data(
                        resolutionComboBoxSetting.comboModel.index(
                            resolutionComboBoxSetting.modelIndex, 0),
                        VideoFormatResolutionModel.Resolution)
            fpsComboBoxSetting.comboModel.currentResolution = resolution
            rate = fpsComboBoxSetting.comboModel.data(
                        fpsComboBoxSetting.comboModel.index(index, 0),
                        VideoFormatFpsModel.FPS)
        }

        try {
           SettingsAdapter.set_Video_Settings_Rate_And_Resolution(
               AVModel.getCurrentVideoCaptureDevice(),rate, resolution)
            updatePreviewRatio(resolution)
        } catch(error){ console.warn(error.message) }
    }
    function updatePreviewRatio(resolution) {
        var res = resolution.split("x")
        var ratio = res[1] / res[0]
        if (ratio) {
            aspectRatio = ratio
        } else {
            console.error("Could not scale recording video preview")
        }
    }

    ElidedTextLabel {
        Layout.fillWidth: true
        Layout.preferredHeight: JamiTheme.preferredFieldHeight

        eText: JamiStrings.video
        fontSize: JamiTheme.headerFontSize
        maxWidth: itemWidth * 2
    }

    SettingsComboBox {
        id: deviceComboBoxSetting

        Layout.fillWidth: true
        Layout.preferredHeight: JamiTheme.preferredFieldHeight
        Layout.leftMargin: JamiTheme.preferredMarginSize

        labelText: JamiStrings.device
        fontPointSize: JamiTheme.settingsFontSize
        comboModel: VideoInputDeviceModel {
            lrcInstance: LRCInstance
        }
        widthOfComboBox: itemWidth
        tipText: JamiStrings.selectVideoDevice
        role: "DeviceName_UTF8"

        onIndexChanged: {
            slotDeviceBoxCurrentIndexChanged(modelIndex)
        }
    }

    SettingsComboBox {
        id: resolutionComboBoxSetting

        Layout.fillWidth: true
        Layout.preferredHeight: JamiTheme.preferredFieldHeight
        Layout.leftMargin: JamiTheme.preferredMarginSize

        labelText: JamiStrings.resolution
        fontPointSize: JamiTheme.settingsFontSize
        comboModel: VideoFormatResolutionModel {
            lrcInstance: LRCInstance
        }
        widthOfComboBox: itemWidth
        tipText: JamiStrings.selectVideoResolution
        role: "Resolution_UTF8"

        onIndexChanged: {
            slotFormatCurrentIndexChanged(modelIndex, true)
        }
    }

    SettingsComboBox {
        id: fpsComboBoxSetting

        Layout.fillWidth: true
        Layout.preferredHeight: JamiTheme.preferredFieldHeight
        Layout.leftMargin: JamiTheme.preferredMarginSize

        labelText: JamiStrings.fps
        fontPointSize: JamiTheme.settingsFontSize
        comboModel: VideoFormatFpsModel {
            lrcInstance: LRCInstance
        }
        widthOfComboBox: itemWidth
        tipText: JamiStrings.selectFPS
        role: "FPS_ToDisplay_UTF8"

        onIndexChanged: {
            slotFormatCurrentIndexChanged(modelIndex, false)
        }
    }

    // Toggle switch to enable hardware acceleration
    ToggleSwitch {
        id: hardwareAccelControl

        Layout.fillWidth: true
        Layout.leftMargin: JamiTheme.preferredMarginSize

        labelText: JamiStrings.enableHWAccel
        fontPointSize: JamiTheme.settingsFontSize

        onSwitchToggled: {
            AVModel.setHardwareAcceleration(checked)
            startPreviewing(true)
        }
    }

    // video Preview
    Rectangle {
        id: rectBox

        Layout.alignment: Qt.AlignHCenter
        Layout.preferredHeight: width * aspectRatio

        Layout.minimumWidth: 200
        Layout.maximumWidth: 400
        Layout.preferredWidth: itemWidth * 2
        Layout.bottomMargin: JamiTheme.preferredMarginSize

        color: "white"
        radius: 5

        PreviewRenderer {
            id: previewWidget

            anchors.fill: rectBox

            lrcInstance: LRCInstance

            layer.enabled: true
            layer.effect: OpacityMask {
                maskSource: rectBox
            }
        }
    }

    Label {
        visible: !previewAvailable

        Layout.fillWidth: true
        Layout.preferredHeight: JamiTheme.preferredFieldHeight
        Layout.bottomMargin: JamiTheme.preferredMarginSize

        text: JamiStrings.previewUnavailable
        font.pointSize: JamiTheme.settingsFontSize
        font.kerning: true

        horizontalAlignment: Text.AlignHCenter
        verticalAlignment: Text.AlignVCenter
    }
}