blob: 8ea60f8b71e5ae0aef4d083f5709fd16f4e42fed [file] [log] [blame]
/*
* Copyright (C) 2019-2020 by Savoir-faire Linux
* Author: Yang Wang <yang.wang@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.15
import QtQuick.Window 2.14
import QtQuick.Controls 2.14
import QtQuick.Controls.Universal 2.12
import QtQuick.Layouts 1.3
import QtGraphicalEffects 1.14
import QtQuick.Controls.Styles 1.4
import QtQuick.Dialogs 1.3
import Qt.labs.platform 1.1
import net.jami.Models 1.0
import "../../commoncomponents"
ColumnLayout {
function updateAccountInfoDisplayedAdvance() {
//Call Settings
checkAutoConnectOnLocalNetwork.checked = ClientWrapper.settingsAdaptor.getAccountConfig_PeerDiscovery()
checkBoxUntrusted.checked = ClientWrapper.settingsAdaptor.getAccountConfig_DHT_PublicInCalls()
checkBoxRdv.checked = ClientWrapper.settingsAdaptor.getAccountConfig_RendezVous()
checkBoxAutoAnswer.checked = ClientWrapper.settingsAdaptor.getAccountConfig_AutoAnswer()
checkBoxCustomRingtone.checked = ClientWrapper.settingsAdaptor.getAccountConfig_Ringtone_RingtoneEnabled()
// Name Server
lineEditNameServer.text = ClientWrapper.settingsAdaptor.getAccountConfig_RingNS_Uri()
//OpenDHT Config
checkBoxEnableProxy.checked = ClientWrapper.settingsAdaptor.getAccountConfig_ProxyEnabled()
lineEditProxy.text = ClientWrapper.settingsAdaptor.getAccountConfig_ProxyServer()
lineEditBootstrap.text = ClientWrapper.settingsAdaptor.getAccountConfig_Hostname()
// Security
btnCACert.text = ClientWrapper.utilsAdaptor.toFileInfoName(ClientWrapper.settingsAdaptor.getAccountConfig_TLS_CertificateListFile())
btnUserCert.text = ClientWrapper.utilsAdaptor.toFileInfoName(ClientWrapper.settingsAdaptor.getAccountConfig_TLS_CertificateFile())
btnPrivateKey.text = ClientWrapper.utilsAdaptor.toFileInfoName(ClientWrapper.settingsAdaptor.getAccountConfig_TLS_PrivateKeyFile())
// Connectivity
checkBoxUPnP.checked = ClientWrapper.settingsAdaptor.getAccountConfig_UpnpEnabled()
checkBoxTurnEnable.checked = ClientWrapper.settingsAdaptor.getAccountConfig_TURN_Enabled()
lineEditTurnAddress.text = ClientWrapper.settingsAdaptor.getAccountConfig_TURN_Server()
lineEditTurnUsername.text = ClientWrapper.settingsAdaptor.getAccountConfig_TURN_Username()
lineEditTurnPassword.text = ClientWrapper.settingsAdaptor.getAccountConfig_TURN_Password()
checkBoxSTUNEnable.checked = ClientWrapper.settingsAdaptor.getAccountConfig_STUN_Enabled()
lineEditSTUNAddress.text = ClientWrapper.settingsAdaptor.getAccountConfig_STUN_Server()
// codecs
videoCheckBox.checked = ClientWrapper.settingsAdaptor.getAccountConfig_Video_Enabled()
// update audio and video codec, make sure this change does not trigger item change events
updateAudioCodecs();
updateVideoCodecs();
btnRingtone.enabled = ClientWrapper.settingsAdaptor.getAccountConfig_Ringtone_RingtoneEnabled()
btnRingtone.text = ClientWrapper.utilsAdaptor.toFileInfoName(ClientWrapper.settingsAdaptor.getAccountConfig_Ringtone_RingtonePath())
lineEditProxy.enabled = ClientWrapper.settingsAdaptor.getAccountConfig_ProxyEnabled()
lineEditSTUNAddress.enabled = ClientWrapper.settingsAdaptor.getAccountConfig_STUN_Enabled()
}
function updateAudioCodecs(){
audioCodecListModel.layoutAboutToBeChanged()
audioCodecListModel.dataChanged(audioCodecListModel.index(0, 0),
audioCodecListModel.index(audioCodecListModel.rowCount() - 1, 0))
audioCodecListModel.layoutChanged()
}
function updateVideoCodecs(){
videoCodecListModel.layoutAboutToBeChanged()
videoCodecListModel.dataChanged(videoCodecListModel.index(0, 0),
videoCodecListModel.index(videoCodecListModel.rowCount() - 1, 0))
videoCodecListModel.layoutChanged()
}
function decreaseAudioCodecPriority(){
var index = audioListWidget.currentIndex
var codecId = audioCodecListModel.data(audioCodecListModel.index(index,0), AudioCodecListModel.AudioCodecID)
ClientWrapper.settingsAdaptor.decreaseAudioCodecPriority(codecId)
audioListWidget.currentIndex = index + 1
updateAudioCodecs()
}
function increaseAudioCodecPriority(){
var index = audioListWidget.currentIndex
var codecId = audioCodecListModel.data(audioCodecListModel.index(index,0), AudioCodecListModel.AudioCodecID)
ClientWrapper.settingsAdaptor.increaseAudioCodecPriority(codecId)
audioListWidget.currentIndex = index - 1
updateAudioCodecs()
}
function decreaseVideoCodecPriority(){
var index = videoListWidget.currentIndex
var codecId = videoCodecListModel.data(videoCodecListModel.index(index,0), VideoCodecListModel.VideoCodecID)
ClientWrapper.settingsAdaptor.decreaseVideoCodecPriority(codecId)
videoListWidget.currentIndex = index + 1
updateVideoCodecs()
}
function increaseVideoCodecPriority(){
var index = videoListWidget.currentIndex
var codecId = videoCodecListModel.data(videoCodecListModel.index(index,0), VideoCodecListModel.VideoCodecID)
ClientWrapper.settingsAdaptor.increaseVideoCodecPriority(codecId)
videoListWidget.currentIndex = index - 1
updateVideoCodecs()
}
VideoCodecListModel{
id: videoCodecListModel
}
AudioCodecListModel{
id: audioCodecListModel
}
function changeRingtonePath(url){
if(url.length !== 0) {
ClientWrapper.settingsAdaptor.set_RingtonePath(url)
btnRingtone.text = ClientWrapper.utilsAdaptor.toFileInfoName(url)
} else if (ClientWrapper.settingsAdaptor.getAccountConfig_Ringtone_RingtonePath().length === 0){
btnRingtone.text = qsTr("Add a custom ringtone")
}
}
function changeFileCACert(url){
if(url.length !== 0) {
ClientWrapper.settingsAdaptor.set_FileCACert(url)
btnCACert.text = ClientWrapper.utilsAdaptor.toFileInfoName(url)
}
}
function changeFileUserCert(url){
if(url.length !== 0) {
ClientWrapper.settingsAdaptor.set_FileUserCert(url)
btnUserCert.text = ClientWrapper.utilsAdaptor.toFileInfoName(url)
}
}
function changeFilePrivateKey(url){
if(url.length !== 0) {
ClientWrapper.settingsAdaptor.set_FilePrivateKey(url)
btnPrivateKey.text = ClientWrapper.utilsAdaptor.toFileInfoName(url)
}
}
JamiFileDialog {
id: ringtonePath_Dialog
property string oldPath : ClientWrapper.settingsAdaptor.getAccountConfig_Ringtone_RingtonePath()
property string openPath : oldPath === "" ? (ClientWrapper.utilsAdaptor.getCurrentPath() + "/ringtones/") : (ClientWrapper.utilsAdaptor.toFileAbsolutepath(oldPath))
mode: JamiFileDialog.OpenFile
title: qsTr("Select a new ringtone")
folder: openPath
nameFilters: [qsTr("Audio Files") + " (*.wav *.ogg *.opus *.mp3 *.aiff *.wma)", qsTr(
"All files") + " (*)"]
onRejected: {}
onVisibleChanged: {
if (!visible) {
rejected()
}
}
onAccepted: {
var url = ClientWrapper.utilsAdaptor.getAbsPath(file.toString())
changeRingtonePath(url)
}
}
JamiFileDialog {
id: caCert_Dialog
property string oldPath : ClientWrapper.settingsAdaptor.getAccountConfig_TLS_CertificateListFile()
property string openPath : oldPath === "" ? (ClientWrapper.utilsAdaptor.getCurrentPath() + "/ringtones/") : (ClientWrapper.utilsAdaptor.toFileAbsolutepath(oldPath))
mode: JamiFileDialog.OpenFile
title: qsTr("Select a CA certificate")
folder: openPath
nameFilters: [qsTr("Certificate File") + " (*.crt)", qsTr(
"All files") + " (*)"]
onRejected: {}
onVisibleChanged: {
if (!visible) {
rejected()
}
}
onAccepted: {
var url = ClientWrapper.utilsAdaptor.getAbsPath(file.toString())
changeFileCACert(url)
}
}
JamiFileDialog {
id: userCert_Dialog
property string oldPath : ClientWrapper.settingsAdaptor.getAccountConfig_TLS_CertificateFile()
property string openPath : oldPath === "" ? (ClientWrapper.utilsAdaptor.getCurrentPath() + "/ringtones/") : (ClientWrapper.utilsAdaptor.toFileAbsolutepath(oldPath))
mode: JamiFileDialog.OpenFile
title: qsTr("Select a user certificate")
folder: openPath
nameFilters: [qsTr("Certificate File") + " (*.crt)", qsTr(
"All files") + " (*)"]
onRejected: {}
onVisibleChanged: {
if (!visible) {
rejected()
}
}
onAccepted: {
var url = ClientWrapper.utilsAdaptor.getAbsPath(file.toString())
changeFileUserCert(url)
}
}
JamiFileDialog {
id: privateKey_Dialog
property string oldPath : {
return ClientWrapper.settingsAdaptor.getAccountConfig_TLS_PrivateKeyFile()
}
property string openPath : oldPath === "" ? (ClientWrapper.utilsAdaptor.getCurrentPath() + "/ringtones/") : (ClientWrapper.utilsAdaptor.toFileAbsolutepath(oldPath))
mode: JamiFileDialog.OpenFile
title: qsTr("Select a private key")
folder: openPath
nameFilters: [qsTr("Key File") + " (*.key)", qsTr(
"All files") + " (*)"]
onRejected: {}
onVisibleChanged: {
if (!visible) {
rejected()
}
}
onAccepted: {
var url = ClientWrapper.utilsAdaptor.getAbsPath(file.toString())
changeFilePrivateKey(url)
}
}
id: advancedSettingsViewLayout
Layout.fillWidth: true
property int preferredColumnWidth : accountViewRect.width / 2 - 50
ColumnLayout {
spacing: 8
Layout.fillWidth: true
ElidedTextLabel {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
eText: qsTr("Call Settings")
fontSize: JamiTheme.headerFontSize
maxWidth: preferredColumnWidth
}
ColumnLayout {
Layout.fillWidth: true
Layout.leftMargin: JamiTheme.preferredMarginSize
ToggleSwitch {
id: checkBoxUntrusted
labelText: allowIncomingCallsText.elidedText
fontPointSize: JamiTheme.settingsFontSize
onSwitchToggled: {
ClientWrapper.settingsAdaptor.setCallsUntrusted(checked)
}
}
TextMetrics {
id: allowIncomingCallsText
elide: Text.ElideRight
elideWidth: preferredColumnWidth
text: qsTr("Allow incoming calls from unknown contacts")
}
ToggleSwitch {
id: checkBoxAutoAnswer
Layout.fillWidth: true
labelText: autoAnswerCallsElidedText.elidedText
fontPointSize: JamiTheme.settingsFontSize
onSwitchToggled: {
ClientWrapper.settingsAdaptor.setAutoAnswerCalls(checked)
}
}
TextMetrics {
id: autoAnswerCallsElidedText
elide: Text.ElideRight
elideWidth: preferredColumnWidth
text: qsTr("Auto Answer Calls")
}
ToggleSwitch {
id: checkBoxCustomRingtone
labelText: enableCustomRingtoneElidedText.elidedText
fontPointSize: JamiTheme.settingsFontSize
onSwitchToggled: {
ClientWrapper.settingsAdaptor.setEnableRingtone(checked)
btnRingtone.enabled = checked
}
}
TextMetrics {
id: enableCustomRingtoneElidedText
elide: Text.ElideRight
elideWidth: preferredColumnWidth
text: qsTr("Enable Custom Ringtone")
}
RowLayout {
Layout.fillWidth: true
ElidedTextLabel {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
eText: qsTr("Select Custom Ringtone")
maxWidth: preferredColumnWidth
fontSize: JamiTheme.settingsFontSize
}
MaterialButton {
id: btnRingtone
Layout.minimumWidth: preferredColumnWidth
Layout.preferredWidth: preferredColumnWidth
Layout.maximumWidth: preferredColumnWidth
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
source: "qrc:/images/icons/round-folder-24px.svg"
color: JamiTheme.buttonTintedGrey
hoveredColor: JamiTheme.buttonTintedGreyHovered
pressedColor: JamiTheme.buttonTintedGreyPressed
onClicked: {
ringtonePath_Dialog.open()
}
}
}
ToggleSwitch {
id: checkBoxRdv
labelText: qsTr("(Experimental) Rendez-vous: turn your account into a conference room")
fontPointSize: 10
onSwitchToggled: {
ClientWrapper.settingsAdaptor.setIsRendezVous(checked)
}
}
}
}
ColumnLayout {
spacing: 8
Layout.fillWidth: true
ElidedTextLabel {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
eText: qsTr("Name Server")
maxWidth: preferredColumnWidth
fontSize: JamiTheme.headerFontSize
}
RowLayout {
Layout.fillWidth: true
Layout.maximumHeight: JamiTheme.preferredFieldHeight
Layout.leftMargin: JamiTheme.preferredMarginSize
ElidedTextLabel {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
eText: qsTr("Address")
fontSize: JamiTheme.settingsFontSize
maxWidth: preferredColumnWidth
}
Item {
Layout.fillHeight: true
Layout.fillWidth: true
}
MaterialLineEdit {
id: lineEditNameServer
fieldLayoutWidth: preferredColumnWidth
fieldLayoutHeight: JamiTheme.preferredFieldHeight
padding: 8
font.pointSize: JamiTheme.settingsFontSize
font.kerning: true
verticalAlignment: Text.AlignVCenter
onEditingFinished: {
ClientWrapper.settingsAdaptor.setNameServer(text)
}
}
}
}
ColumnLayout {
spacing: 8
Layout.fillWidth: true
ElidedTextLabel {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
eText: qsTr("OpenDHT Configuration")
fontSize: JamiTheme.headerFontSize
maxWidth: preferredColumnWidth
}
ColumnLayout {
Layout.fillWidth: true
Layout.leftMargin: JamiTheme.preferredMarginSize
ToggleSwitch {
id: checkBoxEnableProxy
labelText: qsTr("Enable proxy")
fontPointSize: JamiTheme.settingsFontSize
onSwitchToggled: {
ClientWrapper.settingsAdaptor.setEnableProxy(checked)
lineEditProxy.enabled = checked
}
}
RowLayout {
Layout.fillWidth: true
ElidedTextLabel {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
text: qsTr("Proxy Address")
font.pointSize: JamiTheme.settingsFontSize
maxWidth: preferredColumnWidth
}
MaterialLineEdit {
id: lineEditProxy
fieldLayoutWidth: preferredColumnWidth
fieldLayoutHeight: JamiTheme.preferredFieldHeight
padding: 8
font.pointSize: JamiTheme.settingsFontSize
font.kerning: true
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
onEditingFinished: {
ClientWrapper.settingsAdaptor.setProxyAddress(text)
}
}
}
RowLayout {
Layout.fillWidth: true
ElidedTextLabel {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
text: qsTr("Bootstrap")
font.pointSize: JamiTheme.settingsFontSize
maxWidth: preferredColumnWidth
}
Item {
Layout.fillHeight: true
Layout.fillWidth: true
}
MaterialLineEdit {
id: lineEditBootstrap
fieldLayoutWidth: preferredColumnWidth
fieldLayoutHeight: JamiTheme.preferredFieldHeight
padding: 8
font.pointSize: JamiTheme.settingsFontSize
font.kerning: true
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
onEditingFinished: {
ClientWrapper.settingsAdaptor.setBootstrapAddress(text)
}
}
}
}
}
ColumnLayout {
spacing: 8
Layout.fillWidth: true
ElidedTextLabel {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
eText: qsTr("Security")
fontSize: JamiTheme.headerFontSize
maxWidth: preferredColumnWidth
}
ColumnLayout {
Layout.fillWidth: true
Layout.leftMargin: JamiTheme.preferredMarginSize
GridLayout {
rows: 4
columns: 2
rowSpacing: 8
columnSpacing: 8
Layout.fillWidth: true
// CA Certificate
ElidedTextLabel {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
eText: qsTr("CA Certificate")
fontSize: JamiTheme.settingsFontSize
maxWidth: preferredColumnWidth
}
MaterialButton {
id: btnCACert
Layout.minimumWidth: preferredColumnWidth
Layout.preferredWidth: preferredColumnWidth
Layout.maximumWidth: preferredColumnWidth
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
source: "qrc:/images/icons/round-folder-24px.svg"
color: JamiTheme.buttonTintedGrey
hoveredColor: JamiTheme.buttonTintedGreyHovered
pressedColor: JamiTheme.buttonTintedGreyPressed
onClicked: {
caCert_Dialog.open()
}
}
// User Certificate
ElidedTextLabel {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
eText: qsTr("User Certificate")
fontSize: JamiTheme.settingsFontSize
maxWidth: preferredColumnWidth
}
MaterialButton {
id: btnUserCert
Layout.minimumWidth: preferredColumnWidth
Layout.preferredWidth: preferredColumnWidth
Layout.maximumWidth: preferredColumnWidth
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
source: "qrc:/images/icons/round-folder-24px.svg"
color: JamiTheme.buttonTintedGrey
hoveredColor: JamiTheme.buttonTintedGreyHovered
pressedColor: JamiTheme.buttonTintedGreyPressed
onClicked: {
userCert_Dialog.open()
}
}
// Private Key
ElidedTextLabel {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
eText: qsTr("Private Key")
fontSize: JamiTheme.settingsFontSize
maxWidth: preferredColumnWidth
}
MaterialButton {
id: btnPrivateKey
Layout.minimumWidth: preferredColumnWidth
Layout.preferredWidth: preferredColumnWidth
Layout.maximumWidth: preferredColumnWidth
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
source: "qrc:/images/icons/round-folder-24px.svg"
color: JamiTheme.buttonTintedGrey
hoveredColor: JamiTheme.buttonTintedGreyHovered
pressedColor: JamiTheme.buttonTintedGreyPressed
onClicked: {
privateKey_Dialog.open()
}
}
// Private key password
ElidedTextLabel {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
eText: qsTr("Private Key Password")
fontSize: JamiTheme.settingsFontSize
maxWidth: preferredColumnWidth
}
MaterialLineEdit {
id: lineEditCertPassword
fieldLayoutWidth: preferredColumnWidth
fieldLayoutHeight: JamiTheme.preferredFieldHeight
padding: 8
font.pointSize: JamiTheme.settingsFontSize
font.kerning: true
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
echoMode: TextInput.Password
}
}
}
}
ColumnLayout {
spacing: 8
Layout.fillWidth: true
ElidedTextLabel {
Layout.fillWidth: true
Layout.topMargin: JamiTheme.preferredMarginSize
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
eText: qsTr("Connectivity")
fontSize: JamiTheme.headerFontSize
maxWidth: preferredColumnWidth
}
ColumnLayout {
Layout.fillWidth: true
Layout.leftMargin: JamiTheme.preferredMarginSize
ToggleSwitch {
id: checkAutoConnectOnLocalNetwork
Layout.fillWidth: true
labelText: autoConnectOnLocalNetworkElidedText.elidedText
fontPointSize: JamiTheme.settingsFontSize
onSwitchToggled: {
ClientWrapper.settingsAdaptor.setAutoConnectOnLocalNetwork(checked)
}
}
TextMetrics {
id: autoConnectOnLocalNetworkElidedText
elide: Text.ElideRight
elideWidth: preferredColumnWidth
text: qsTr("Auto Connect On Local Network")
}
ToggleSwitch {
id: checkBoxUPnP
Layout.fillWidth: true
labelText: qsTr("Use UPnP")
fontPointSize: JamiTheme.settingsFontSize
onSwitchToggled: {
ClientWrapper.settingsAdaptor.setUseUPnP(checked)
}
}
ToggleSwitch {
id: checkBoxTurnEnable
Layout.fillWidth: true
labelText: qsTr("Use TURN")
fontPointSize: JamiTheme.settingsFontSize
onSwitchToggled: {
ClientWrapper.settingsAdaptor.setUseTURN(checked)
}
}
RowLayout {
Layout.fillWidth: true
Layout.maximumHeight: JamiTheme.preferredFieldHeight
ElidedTextLabel {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
eText: qsTr("TURN Address")
fontSize: JamiTheme.settingsFontSize
maxWidth: preferredColumnWidth
}
MaterialLineEdit {
id: lineEditTurnAddress
fieldLayoutWidth: preferredColumnWidth
fieldLayoutHeight: JamiTheme.preferredFieldHeight
padding: 8
font.pointSize: JamiTheme.settingsFontSize
font.kerning: true
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
onEditingFinished: {
ClientWrapper.settingsAdaptor.setTURNAddress(text)
}
}
}
RowLayout {
Layout.fillWidth: true
Layout.maximumHeight: JamiTheme.preferredFieldHeight
ElidedTextLabel {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
eText: qsTr("TURN Username")
fontSize: JamiTheme.settingsFontSize
maxWidth: preferredColumnWidth
}
MaterialLineEdit {
id: lineEditTurnUsername
fieldLayoutWidth: preferredColumnWidth
fieldLayoutHeight: JamiTheme.preferredFieldHeight
padding: 8
font.pointSize: JamiTheme.settingsFontSize
font.kerning: true
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
onEditingFinished: {
ClientWrapper.settingsAdaptor.setTURNUsername(text)
}
}
}
RowLayout {
Layout.fillWidth: true
Layout.maximumHeight: JamiTheme.preferredFieldHeight
ElidedTextLabel {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
eText: qsTr("TURN Password")
fontSize: JamiTheme.settingsFontSize
maxWidth: preferredColumnWidth
}
MaterialLineEdit {
id: lineEditTurnPassword
layer.mipmap: false
fieldLayoutWidth: preferredColumnWidth
fieldLayoutHeight: JamiTheme.preferredFieldHeight
padding: 8
font.pointSize: JamiTheme.settingsFontSize
font.kerning: true
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
echoMode: TextInput.Password
onEditingFinished: {
ClientWrapper.settingsAdaptor.setTURNPassword(text)
}
}
}
ToggleSwitch {
id: checkBoxSTUNEnable
Layout.fillWidth: true
labelText: qsTr("Use STUN")
fontPointSize: JamiTheme.settingsFontSize
onSwitchToggled: {
ClientWrapper.settingsAdaptor.setUseSTUN(checked)
lineEditSTUNAddress.enabled = checked
}
}
RowLayout {
Layout.fillWidth: true
Layout.maximumHeight: JamiTheme.preferredFieldHeight
ElidedTextLabel {
id: lblEditSTUNAddress
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
eText: qsTr("STUN Address")
fontSize: JamiTheme.settingsFontSize
maxWidth: preferredColumnWidth
}
MaterialLineEdit {
id: lineEditSTUNAddress
fieldLayoutWidth: preferredColumnWidth
fieldLayoutHeight: JamiTheme.preferredFieldHeight
padding: 8
font.pointSize: JamiTheme.settingsFontSize
font.kerning: true
placeholderText: qsTr("STUN Address")
horizontalAlignment: Text.AlignRight
verticalAlignment: Text.AlignVCenter
onEditingFinished: {
ClientWrapper.settingsAdaptor.setSTUNAddress(text)
}
}
}
}
}
ColumnLayout {
spacing: 8
Layout.fillWidth: true
Label {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
text: qsTr("Media")
font.pointSize: JamiTheme.headerFontSize
font.kerning: true
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
}
ColumnLayout {
Layout.fillWidth: true
Layout.leftMargin: JamiTheme.preferredMarginSize
ToggleSwitch {
id: videoCheckBox
labelText: qsTr("Enable Video")
fontPointSize: JamiTheme.settingsFontSize
onSwitchToggled: {
ClientWrapper.settingsAdaptor.setVideoState(checked)
}
}
RowLayout {
Layout.fillWidth: true
Layout.fillHeight: true
ColumnLayout {
Layout.fillWidth: true
Layout.fillHeight: true
RowLayout {
Layout.fillWidth: true
Layout.fillHeight: true
Layout.maximumHeight: JamiTheme.preferredFieldHeight
ElidedTextLabel {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
maxWidth: preferredColumnWidth - 50
eText: qsTr("Video Codecs")
fontSize: JamiTheme.settingsFontSize
}
HoverableRadiusButton {
id: videoDownPushButton
Layout.minimumWidth: 24
Layout.preferredWidth: 24
Layout.maximumWidth: 24
Layout.minimumHeight: 24
Layout.preferredHeight: 24
Layout.maximumHeight: 24
buttonImageHeight: height
buttonImageWidth: height
radius: height / 2
icon.source: "qrc:/images/icons/round-arrow_drop_down-24px.svg"
icon.width: 24
icon.height: 24
onClicked: {
decreaseVideoCodecPriority()
}
}
HoverableRadiusButton {
id: videoUpPushButton
Layout.minimumWidth: 24
Layout.preferredWidth: 24
Layout.maximumWidth: 24
Layout.minimumHeight: 24
Layout.preferredHeight: 24
Layout.maximumHeight: 24
buttonImageHeight: height
buttonImageWidth: height
radius: height / 2
icon.source: "qrc:/images/icons/round-arrow_drop_up-24px.svg"
icon.width: 24
icon.height: 24
onClicked: {
increaseVideoCodecPriority()
}
}
}
ListViewJami {
id: videoListWidget
Layout.minimumWidth: preferredColumnWidth
Layout.preferredWidth: preferredColumnWidth
Layout.maximumWidth: preferredColumnWidth
Layout.minimumHeight: 192
Layout.preferredHeight: 192
Layout.maximumHeight: 192
model: videoCodecListModel
delegate: VideoCodecDelegate {
id: videoCodecDelegate
width: videoListWidget.width
height: videoListWidget.height / 4
videoCodecName : VideoCodecName
isEnabled : IsEnabled
videoCodecId: VideoCodecID
onClicked: {
videoListWidget.currentIndex = index
}
onVideoCodecStateChange:{
ClientWrapper.settingsAdaptor.videoCodecsStateChange(idToSet , isToBeEnabled)
updateVideoCodecs()
}
}
}
}
ColumnLayout {
Layout.fillWidth: true
RowLayout {
Layout.fillWidth: true
Layout.maximumHeight: JamiTheme.preferredFieldHeight
ElidedTextLabel {
Layout.fillWidth: true
Layout.minimumHeight: JamiTheme.preferredFieldHeight
Layout.preferredHeight: JamiTheme.preferredFieldHeight
Layout.maximumHeight: JamiTheme.preferredFieldHeight
maxWidth: preferredColumnWidth - 50
eText: qsTr("Audio Codecs")
fontSize: JamiTheme.settingsFontSize
}
HoverableRadiusButton {
id: audioDownPushButton
Layout.minimumWidth: 24
Layout.preferredWidth: 24
Layout.maximumWidth: 24
Layout.minimumHeight: 24
Layout.preferredHeight: 24
Layout.maximumHeight: 24
radius: height / 2
buttonImageHeight: height
buttonImageWidth: height
icon.source: "qrc:/images/icons/round-arrow_drop_down-24px.svg"
icon.width: 24
icon.height: 24
onClicked: {
decreaseAudioCodecPriority()
}
}
HoverableRadiusButton {
id: audioUpPushButton
Layout.minimumWidth: 24
Layout.preferredWidth: 24
Layout.maximumWidth: 24
Layout.minimumHeight: 24
Layout.preferredHeight: 24
Layout.maximumHeight: 24
radius: height / 2
buttonImageHeight: height
buttonImageWidth: height
icon.source: "qrc:/images/icons/round-arrow_drop_up-24px.svg"
icon.width: 24
icon.height: 24
onClicked: {
increaseAudioCodecPriority()
}
}
}
ListViewJami {
id: audioListWidget
Layout.minimumWidth: preferredColumnWidth
Layout.preferredWidth: preferredColumnWidth
Layout.maximumWidth: preferredColumnWidth
Layout.minimumHeight: 192
Layout.preferredHeight: 192
Layout.maximumHeight: 192
model: audioCodecListModel
delegate: AudioCodecDelegate {
id: audioCodecDelegate
width: audioListWidget.width
height: audioListWidget.height / 4
layer.mipmap: false
clip: true
audioCodecName : AudioCodecName
isEnabled : IsEnabled
audioCodecId: AudioCodecID
samplerRate: Samplerate
onClicked: {
audioListWidget.currentIndex = index
}
onAudioCodecStateChange:{
ClientWrapper.settingsAdaptor.audioCodecsStateChange(idToSet , isToBeEnabled)
updateAudioCodecs()
}
}
}
}
}
}
}
}