mirror of
https://gitlab.linphone.org/BC/public/linphone-desktop.git
synced 2026-02-07 15:08:24 +00:00
- Replace videoSupported (build-time) by videoEnabled (option). - Hide chat notifications. - Add an option to disable video. - Hide unread messages count. - Hide mute/ephemerals items. - Hide conversation's devices/ephemrals/mute/scheduling meetings menu items from conversation. - Do not use camera in waiting room. - Hide conference layout.
309 lines
8.3 KiB
QML
309 lines
8.3 KiB
QML
import QtQuick 2.7
|
|
import QtQuick.Layouts 1.3
|
|
|
|
import Common 1.0
|
|
import Linphone 1.0
|
|
import LinphoneEnums 1.0
|
|
import Utils 1.0
|
|
|
|
import App.Styles 1.0
|
|
|
|
import 'SettingsVideo.js' as Logic
|
|
|
|
// =============================================================================
|
|
|
|
TabContainer {
|
|
Column {
|
|
spacing: SettingsWindowStyle.forms.spacing
|
|
width: parent.width
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Video parameters.
|
|
// -------------------------------------------------------------------------
|
|
|
|
Form {
|
|
title: qsTr('videoCaptureTitle')
|
|
width: parent.width
|
|
|
|
//Warning if in call
|
|
FormLine {
|
|
visible: SettingsModel.isInCall
|
|
FormGroup {
|
|
RowLayout {
|
|
spacing: SettingsWindowStyle.video.warningMessage.iconSize
|
|
Icon {
|
|
icon: 'warning'
|
|
iconSize: SettingsWindowStyle.video.warningMessage.iconSize
|
|
anchors {
|
|
rightMargin: SettingsWindowStyle.video.warningMessage.iconSize
|
|
leftMargin: SettingsWindowStyle.video.warningMessage.iconSize
|
|
}
|
|
}
|
|
Text {
|
|
text: qsTr('videoSettingsInCallWarning')
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
FormLine {
|
|
FormGroup {
|
|
label: qsTr('videoInputDeviceLabel')
|
|
|
|
ComboBox {
|
|
currentIndex: Number(Utils.findIndex(model, function (device) {
|
|
return device === SettingsModel.videoDevice
|
|
})) // Number cast => Index is null if app does not support video.
|
|
model: SettingsModel.videoDevices
|
|
|
|
onActivated: SettingsModel.videoDevice = model[index]
|
|
}
|
|
}
|
|
}
|
|
|
|
FormLine {
|
|
FormGroup {
|
|
label: qsTr('videoPresetLabel')
|
|
|
|
ComboBox {
|
|
currentIndex: {
|
|
var preset = SettingsModel.videoPreset
|
|
|
|
var index = Number(Utils.findIndex(model, function (value) {
|
|
return preset === value.value
|
|
}))
|
|
return index>=0 ? index : 0;
|
|
}
|
|
|
|
model: [{
|
|
key: qsTr('presetDefault'),
|
|
value: 'default'
|
|
}, {
|
|
key: qsTr('presetHighFps'),
|
|
value: 'high-fps'
|
|
}, {
|
|
key: qsTr('presetCustom'),
|
|
value: 'custom'
|
|
}]
|
|
|
|
textRole: 'key'
|
|
|
|
onActivated: SettingsModel.videoPreset = model[index].value
|
|
}
|
|
}
|
|
}
|
|
|
|
FormLine {
|
|
FormGroup {
|
|
label: qsTr('videoSizeLabel')
|
|
|
|
ComboBox {
|
|
currentIndex: Number(Utils.findIndex(model, function (definition) {
|
|
return definition.value.name === SettingsModel.videoDefinition.name
|
|
})) // Number cast => Index is null if app does not support video.
|
|
model: SettingsModel.supportedVideoDefinitions.map(function (definition) {
|
|
return {
|
|
key: definition.name + ' (' + definition.width + 'x' + definition.height + ')',
|
|
value: definition
|
|
}
|
|
})
|
|
|
|
textRole: 'key'
|
|
|
|
onActivated: SettingsModel.videoDefinition = model[index].value
|
|
}
|
|
}
|
|
|
|
FormGroup {
|
|
label: qsTr('videoFramerateLabel')
|
|
visible: SettingsModel.videoPreset === 'custom'
|
|
|
|
NumericField {
|
|
maxValue: 60
|
|
minValue: 1
|
|
text: SettingsModel.videoFramerate
|
|
|
|
onEditingFinished: SettingsModel.videoFramerate = text
|
|
}
|
|
}
|
|
}
|
|
|
|
FormEmptyLine {}
|
|
}
|
|
|
|
TextButtonB {
|
|
id: showCameraPreview
|
|
|
|
anchors.right: parent.right
|
|
enabled: CallsListModel.rowCount() === 0
|
|
|
|
text: qsTr('showCameraPreview')
|
|
|
|
onClicked: Logic.showVideoPreview()
|
|
|
|
Connections {
|
|
target: CallsListModel
|
|
|
|
onRowsInserted: Logic.updateVideoPreview()
|
|
onRowsRemoved: Logic.updateVideoPreview()
|
|
}
|
|
|
|
Connections {
|
|
target: window
|
|
|
|
onClosing: Logic.hideVideoPreview()
|
|
}
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Video Codecs.
|
|
// -------------------------------------------------------------------------
|
|
|
|
Form {
|
|
title: qsTr('videoCodecsTitle')
|
|
visible: SettingsModel.showVideoCodecs || SettingsModel.developerSettingsEnabled
|
|
width: parent.width
|
|
|
|
FormLine {
|
|
visible: SettingsModel.developerSettingsEnabled
|
|
|
|
FormGroup {
|
|
label: qsTr('showVideoCodecsLabel')
|
|
|
|
Switch {
|
|
checked: SettingsModel.showVideoCodecs
|
|
|
|
onClicked: SettingsModel.showVideoCodecs = !checked
|
|
}
|
|
}
|
|
|
|
FormGroup {
|
|
label: 'Video enabled'
|
|
|
|
Switch {
|
|
checked: SettingsModel.videoEnabled
|
|
|
|
onClicked: SettingsModel.videoEnabled = !checked
|
|
}
|
|
}
|
|
}
|
|
|
|
CodecsViewer {
|
|
model: VideoCodecsModel
|
|
width: parent.width
|
|
|
|
onDownloadRequested: Logic.handleCodecDownloadRequested(codecInfo)
|
|
}
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Diplay Video.
|
|
// -------------------------------------------------------------------------
|
|
|
|
|
|
Form {
|
|
id: videoDisplayForm
|
|
//: 'Video display' : Title for display parameters
|
|
title: qsTr('videoDisplayTitle')
|
|
width: parent.width
|
|
|
|
property var cameraModel:
|
|
//: 'Hybrid' : Hybrid mode for camera.
|
|
[{displayText:qsTr('videoHybrid')}
|
|
//: 'Occupy all space' : Camera mode for a centered cropping view.
|
|
, {displayText:qsTr('videoOccupyAllSpace')}
|
|
//: 'Black bars' : Camera mode for a fit view with black bars to keep ratio.
|
|
, {displayText:qsTr('videoBlackBars')}
|
|
]
|
|
function getId(index){
|
|
if(index == 0 )
|
|
return SettingsModel.CameraMode_Hybrid
|
|
else if(index == 1)
|
|
return SettingsModel.CameraMode_OccupyAllSpace
|
|
else
|
|
return SettingsModel.CameraMode_BlackBars
|
|
}
|
|
Row{
|
|
property int orientation: Qt.Horizontal
|
|
width: parent.width
|
|
Text{
|
|
id: videoModeLabel
|
|
height: parent.height
|
|
//: 'Camera modes' : Label to choose a camera modes.
|
|
text: qsTr('videoModeLabel')
|
|
font: videoGridMode.labelFont
|
|
horizontalAlignment: Text.AlignRight
|
|
verticalAlignment: Text.AlignVCenter
|
|
|
|
}
|
|
FormLine {
|
|
spacing: 5
|
|
width: parent.width-videoModeLabel.implicitWidth
|
|
FormGroup {
|
|
id: videoGridMode
|
|
//: 'Mosaic' : Label to choose a camera mode.
|
|
label: qsTr('videoGridModeLabel') + ':'
|
|
fitLabel: true
|
|
ComboBox {
|
|
model: videoDisplayForm.cameraModel
|
|
textRole: 'displayText'
|
|
currentIndex: SettingsModel.gridCameraMode == SettingsModel.CameraMode_Hybrid
|
|
? 0
|
|
: SettingsModel.gridCameraMode == SettingsModel.CameraMode_OccupyAllSpace
|
|
? 1
|
|
: 2
|
|
onActivated: SettingsModel.gridCameraMode = videoDisplayForm.getId(index)
|
|
}
|
|
}
|
|
FormGroup {
|
|
//: 'Active speaker' : Label to choose a camera mode.
|
|
label: qsTr('videoActiveSpeakerModeLabel') + ':'
|
|
fitLabel: true
|
|
ComboBox {
|
|
model: videoDisplayForm.cameraModel
|
|
textRole: 'displayText'
|
|
currentIndex: SettingsModel.activeSpeakerCameraMode == SettingsModel.CameraMode_Hybrid
|
|
? 0
|
|
: SettingsModel.activeSpeakerCameraMode == SettingsModel.CameraMode_OccupyAllSpace
|
|
? 1
|
|
: 2
|
|
onActivated: SettingsModel.activeSpeakerCameraMode = videoDisplayForm.getId(index)
|
|
}
|
|
}
|
|
FormGroup {
|
|
//: 'Calls' : Label to choose a camera mode.
|
|
label: qsTr('videoCallsModeLabel') + ':'
|
|
fitLabel: true
|
|
ComboBox {
|
|
model: videoDisplayForm.cameraModel
|
|
textRole: 'displayText'
|
|
currentIndex: SettingsModel.callCameraMode == SettingsModel.CameraMode_Hybrid
|
|
? 0
|
|
: SettingsModel.callCameraMode == SettingsModel.CameraMode_OccupyAllSpace
|
|
? 1
|
|
: 2
|
|
onActivated: SettingsModel.callCameraMode = videoDisplayForm.getId(index)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
FormLine {
|
|
FormGroup {
|
|
//: 'Default video layout' : Label to choose the default layout in video conference.
|
|
label: qsTr('videoLayout')
|
|
fitLabel: true
|
|
ComboBox {
|
|
//: 'Mosaic' : Mosaic layout invideo conference.
|
|
model:[{text:qsTr('videoMosaicLayout'), value:LinphoneEnums.ConferenceLayoutGrid}
|
|
//: 'Active speaker' : Active speaker layout for video conference.
|
|
, {text:qsTr('videoActiveSpeakerLayout'), value:LinphoneEnums.ConferenceLayoutActiveSpeaker}
|
|
]
|
|
textRole: 'text'
|
|
currentIndex: SettingsModel.videoConferenceLayout == LinphoneEnums.ConferenceLayoutGrid ? 0 : 1
|
|
onActivated: SettingsModel.videoConferenceLayout = model[index].value
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|