mirror of
https://gitlab.linphone.org/BC/public/linphone-desktop.git
synced 2026-01-17 03:18:07 +00:00
479 lines
15 KiB
QML
479 lines
15 KiB
QML
import QtQuick
|
|
import QtQuick.Layouts
|
|
import QtQuick.Controls.Basic as Control
|
|
import Linphone
|
|
import ConstantsCpp
|
|
import SettingsCpp
|
|
import 'qrc:/qt/qml/Linphone/view/Control/Tool/Helper/utils.js' as Utils
|
|
import 'qrc:/qt/qml/Linphone/view/Style/buttonStyle.js' as ButtonStyle
|
|
|
|
LoginLayout {
|
|
id: mainItem
|
|
signal goBack()
|
|
signal goToRegister()
|
|
property bool showBackButton: false
|
|
|
|
titleContent: [
|
|
RowLayout {
|
|
Layout.leftMargin: Utils.getSizeWithScreenRatio(119)
|
|
visible: !SettingsCpp.assistantHideThirdPartyAccount
|
|
spacing: Utils.getSizeWithScreenRatio(21)
|
|
Button {
|
|
id: backButton
|
|
visible: mainItem.showBackButton
|
|
Layout.preferredHeight: Utils.getSizeWithScreenRatio(24)
|
|
Layout.preferredWidth: Utils.getSizeWithScreenRatio(24)
|
|
icon.source: AppIcons.leftArrow
|
|
style: ButtonStyle.noBackground
|
|
onClicked: {
|
|
console.debug("[SIPLoginPage] User: return")
|
|
mainItem.goBack()
|
|
}
|
|
//: Return
|
|
Accessible.name: qsTr("return_accessible_name")
|
|
}
|
|
EffectImage {
|
|
fillMode: Image.PreserveAspectFit
|
|
imageSource: AppIcons.profile
|
|
Layout.preferredHeight: Utils.getSizeWithScreenRatio(34)
|
|
Layout.preferredWidth: Utils.getSizeWithScreenRatio(34)
|
|
colorizationColor: DefaultStyle.main2_600
|
|
}
|
|
Text {
|
|
//: Compte SIP tiers
|
|
text: qsTr("assistant_login_third_party_sip_account_title")
|
|
font {
|
|
pixelSize: Typography.h1.pixelSize
|
|
weight: Typography.h1.weight
|
|
}
|
|
scaleLettersFactor: 1.1
|
|
}
|
|
},
|
|
Item {
|
|
Layout.fillWidth: true
|
|
},
|
|
RowLayout {
|
|
visible: !SettingsCpp.assistantHideCreateAccount
|
|
Layout.rightMargin: Utils.getSizeWithScreenRatio(51)
|
|
spacing: Utils.getSizeWithScreenRatio(20)
|
|
Text {
|
|
Layout.rightMargin: Utils.getSizeWithScreenRatio(15)
|
|
//: Pas encore de compte ?
|
|
text: qsTr("assistant_no_account_yet")
|
|
font {
|
|
pixelSize: Typography.p1.pixelSize
|
|
weight: Typography.p1.weight
|
|
}
|
|
}
|
|
BigButton {
|
|
Layout.alignment: Qt.AlignRight
|
|
//: S'inscrire
|
|
text: qsTr("assistant_account_register")
|
|
style: ButtonStyle.main
|
|
onClicked: {
|
|
console.debug("[SIPLoginPage] User: go to register page")
|
|
mainItem.goToRegister()
|
|
}
|
|
}
|
|
}
|
|
]
|
|
|
|
Component {
|
|
id: firstItem
|
|
Flickable {
|
|
width: Utils.getSizeWithScreenRatio(361)
|
|
contentWidth: content.implicitWidth
|
|
contentHeight: content.implicitHeight
|
|
clip: true
|
|
flickableDirection: Flickable.VerticalFlick
|
|
|
|
Control.ScrollBar.vertical: scrollbar
|
|
|
|
ColumnLayout {
|
|
id: content
|
|
// rightMargin is negative margin
|
|
width: parent.width - scrollbar.width*2
|
|
spacing: Utils.getSizeWithScreenRatio(85)
|
|
ColumnLayout {
|
|
spacing: 0
|
|
ColumnLayout {
|
|
spacing: Utils.getSizeWithScreenRatio(28)
|
|
Text {
|
|
Layout.fillWidth: true
|
|
Layout.preferredWidth: rootStackView.width
|
|
wrapMode: Text.WordWrap
|
|
color: DefaultStyle.main2_900
|
|
font {
|
|
pixelSize: Typography.p1.pixelSize
|
|
weight: Typography.p1.weight
|
|
}
|
|
text: qsTr("Certaines fonctionnalités telles que les conversations de groupe, les vidéo-conférences, etc… nécessitent un compte %1.\n\nCes fonctionnalités seront masquées si vous utilisez un compte SIP tiers.\n\nPour les activer dans un projet commercial, merci de nous contacter.").arg(applicationName)
|
|
}
|
|
}
|
|
SmallButton {
|
|
id: openLinkButton
|
|
Layout.alignment: Qt.AlignCenter
|
|
Layout.topMargin: Utils.getSizeWithScreenRatio(18)
|
|
text: "linphone.org/contact"
|
|
style: ButtonStyle.secondary
|
|
onClicked: {
|
|
Qt.openUrlExternally(ConstantsCpp.ContactUrl)
|
|
}
|
|
KeyNavigation.up: backButton
|
|
KeyNavigation.down: createAccountButton
|
|
}
|
|
}
|
|
ColumnLayout {
|
|
spacing: Utils.getSizeWithScreenRatio(20)
|
|
BigButton {
|
|
id: createAccountButton
|
|
style: ButtonStyle.secondary
|
|
Layout.fillWidth: true
|
|
//: "Créer un compte linphone"
|
|
text: qsTr("assistant_third_party_sip_account_create_linphone_account")
|
|
onClicked: {
|
|
console.debug("[SIPLoginPage] User: click register")
|
|
mainItem.goToRegister()
|
|
}
|
|
KeyNavigation.up: openLinkButton
|
|
KeyNavigation.down: continueButton
|
|
}
|
|
BigButton {
|
|
id: continueButton
|
|
Layout.fillWidth: true
|
|
//: "Je comprends"
|
|
text: qsTr("assistant_third_party_sip_account_warning_ok")
|
|
style: ButtonStyle.main
|
|
onClicked: {
|
|
rootStackView.replace(secondItem)
|
|
}
|
|
KeyNavigation.up: createAccountButton
|
|
}
|
|
}
|
|
Item {
|
|
Layout.fillHeight: true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Component {
|
|
id: secondItem
|
|
Flickable {
|
|
id: formFlickable
|
|
width: Utils.getSizeWithScreenRatio(770)
|
|
contentWidth: content.implicitWidth
|
|
contentHeight: content.implicitHeight
|
|
clip: true
|
|
flickableDirection: Flickable.VerticalFlick
|
|
|
|
Control.ScrollBar.vertical: scrollbar
|
|
|
|
RowLayout {
|
|
id: content
|
|
width: formFlickable.width - scrollbar.width*2
|
|
spacing: Utils.getSizeWithScreenRatio(50)
|
|
ColumnLayout {
|
|
spacing: Utils.getSizeWithScreenRatio(2)
|
|
Layout.preferredWidth: Utils.getSizeWithScreenRatio(360)
|
|
Layout.fillHeight: true
|
|
ColumnLayout {
|
|
spacing: Utils.getSizeWithScreenRatio(22)
|
|
// alignment item
|
|
Item {
|
|
Layout.preferredHeight: advancedParametersTitle.implicitHeight
|
|
}
|
|
ColumnLayout {
|
|
spacing: Utils.getSizeWithScreenRatio(10)
|
|
FormItemLayout {
|
|
id: username
|
|
//: "Nom d'utilisateur"
|
|
label: qsTr("username")
|
|
mandatory: true
|
|
enableErrorText: true
|
|
Layout.fillWidth: true
|
|
contentItem: TextField {
|
|
id: usernameEdit
|
|
isError: username.errorTextVisible || (LoginPageCpp.badIds && errorText.isVisible)
|
|
Layout.preferredWidth: Utils.getSizeWithScreenRatio(360)
|
|
KeyNavigation.down: passwordEdit
|
|
//: "%1 mandatory"
|
|
Accessible.name: qsTr("mandatory_field_accessible_name").arg(qsTr("username"))
|
|
}
|
|
}
|
|
FormItemLayout {
|
|
id: password
|
|
label: qsTr("password")
|
|
mandatory: true
|
|
enableErrorText: true
|
|
Layout.fillWidth: true
|
|
contentItem: TextField {
|
|
id: passwordEdit
|
|
isError: password.errorTextVisible || (LoginPageCpp.badIds && errorText.isVisible)
|
|
hidden: true
|
|
Layout.preferredWidth: Utils.getSizeWithScreenRatio(360)
|
|
KeyNavigation.up: usernameEdit
|
|
KeyNavigation.down: domainEdit
|
|
Accessible.name: qsTr("password")
|
|
}
|
|
}
|
|
FormItemLayout {
|
|
id: domain
|
|
//: "Domaine"
|
|
label: qsTr("sip_address_domain")
|
|
mandatory: true
|
|
enableErrorText: true
|
|
Layout.fillWidth: true
|
|
contentItem: TextField {
|
|
id: domainEdit
|
|
isError: domain.errorTextVisible
|
|
initialText: SettingsCpp.assistantThirdPartySipAccountDomain
|
|
Layout.preferredWidth: Utils.getSizeWithScreenRatio(360)
|
|
KeyNavigation.up: passwordEdit
|
|
KeyNavigation.down: displayName
|
|
//: "%1 mandatory"
|
|
Accessible.name: qsTr("mandatory_field_accessible_name").arg(qsTr("sip_address_domain"))
|
|
}
|
|
Connections {
|
|
target: SettingsCpp
|
|
function onAssistantThirdPartySipAccountDomainChanged() {
|
|
domainEdit.resetText()
|
|
}
|
|
}
|
|
}
|
|
FormItemLayout {
|
|
//: Nom d'affichage
|
|
label: qsTr("sip_address_display_name")
|
|
Layout.fillWidth: true
|
|
contentItem: TextField {
|
|
id: displayName
|
|
Layout.preferredWidth: Utils.getSizeWithScreenRatio(360)
|
|
KeyNavigation.up: domainEdit
|
|
KeyNavigation.down: transportCbox
|
|
Accessible.name: qsTr("sip_address_display_name")
|
|
}
|
|
}
|
|
FormItemLayout {
|
|
//: "Transport"
|
|
label: qsTr("transport")
|
|
Layout.fillWidth: true
|
|
contentItem: ComboBox {
|
|
id: transportCbox
|
|
height: Utils.getSizeWithScreenRatio(49)
|
|
width: Utils.getSizeWithScreenRatio(360)
|
|
textRole: "text"
|
|
valueRole: "value"
|
|
model: [
|
|
{text: "TCP", value: LinphoneEnums.TransportType.Tcp},
|
|
{text: "UDP", value: LinphoneEnums.TransportType.Udp},
|
|
{text: "TLS", value: LinphoneEnums.TransportType.Tls},
|
|
{text: "DTLS", value: LinphoneEnums.TransportType.Dtls}
|
|
]
|
|
currentIndex: Utils.findIndex(model, function (entry) {
|
|
return entry.text === SettingsCpp.assistantThirdPartySipAccountTransport.toUpperCase()
|
|
})
|
|
KeyNavigation.up: displayName
|
|
KeyNavigation.down: outboundProxyUriEdit
|
|
Accessible.name: qsTr("transport")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
TemporaryText {
|
|
id: errorText
|
|
Layout.fillWidth: true
|
|
Connections {
|
|
target: LoginPageCpp
|
|
function onErrorMessageChanged(error) {
|
|
errorText.setText(error)
|
|
}
|
|
}
|
|
}
|
|
|
|
BigButton {
|
|
id: connectionButton
|
|
Layout.topMargin: Utils.getSizeWithScreenRatio(15)
|
|
style: ButtonStyle.main
|
|
property Item tabTarget
|
|
Accessible.name: qsTr("assistant_account_login")
|
|
contentItem: StackLayout {
|
|
id: connectionButtonContent
|
|
currentIndex: 0
|
|
Text {
|
|
text: qsTr("assistant_account_login")
|
|
horizontalAlignment: Text.AlignHCenter
|
|
verticalAlignment: Text.AlignVCenter
|
|
|
|
font {
|
|
pixelSize: Typography.b1.pixelSize
|
|
weight: Typography.b1.weight
|
|
}
|
|
color: DefaultStyle.grey_0
|
|
}
|
|
BusyIndicator {
|
|
implicitWidth: parent.height
|
|
implicitHeight: parent.height
|
|
Layout.alignment: Qt.AlignCenter
|
|
indicatorColor: DefaultStyle.grey_0
|
|
indicatorWidth: Utils.getSizeWithScreenRatio(25)
|
|
}
|
|
Connections {
|
|
target: LoginPageCpp
|
|
function onRegistrationStateChanged() {
|
|
if (LoginPageCpp.registrationState != LinphoneEnums.RegistrationState.Progress) {
|
|
connectionButton.enabled = true
|
|
connectionButtonContent.currentIndex = 0
|
|
}
|
|
}
|
|
function onErrorMessageChanged(error) {
|
|
if (error.length != 0) {
|
|
connectionButton.enabled = true
|
|
connectionButtonContent.currentIndex = 0
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function trigger() {
|
|
username.errorMessage = ""
|
|
password.errorMessage = ""
|
|
domain.errorMessage = ""
|
|
errorText.clear()
|
|
|
|
loginDelay.restart()
|
|
}
|
|
onPressed: trigger()
|
|
KeyNavigation.up: connectionId
|
|
KeyNavigation.tab: tabTarget
|
|
Timer{
|
|
id: loginDelay
|
|
interval: 200
|
|
onTriggered: {
|
|
if (usernameEdit.text.length == 0 || passwordEdit.text.length == 0 || domainEdit.text.length == 0) {
|
|
if (usernameEdit.text.length == 0)
|
|
username.errorMessage = qsTr("assistant_account_login_missing_username")
|
|
if (passwordEdit.text.length == 0)
|
|
password.errorMessage = qsTr("assistant_account_login_missing_password")
|
|
if (domainEdit.text.length == 0)
|
|
//: "Veuillez saisir un nom de domaine
|
|
domain.errorMessage = qsTr("assistant_account_login_missing_domain")
|
|
return
|
|
}
|
|
console.debug("[SIPLoginPage] User: Log in")
|
|
LoginPageCpp.login(usernameEdit.text, passwordEdit.text, displayName.text, domainEdit.text,
|
|
transportCbox.currentValue, registrarUriEdit.text, outboundProxyUriEdit.text, connectionIdEdit.text);
|
|
connectionButton.enabled = false
|
|
connectionButtonContent.currentIndex = 1
|
|
}
|
|
}
|
|
}
|
|
|
|
Item {
|
|
Layout.fillHeight: true
|
|
}
|
|
}
|
|
ColumnLayout {
|
|
Layout.preferredWidth: Utils.getSizeWithScreenRatio(360)
|
|
Layout.fillHeight: true
|
|
spacing: Utils.getSizeWithScreenRatio(22)
|
|
Text {
|
|
id: advancedParametersTitle
|
|
//: Advanced parameters
|
|
text: qsTr("login_advanced_parameters_label")
|
|
font: Typography.h3m
|
|
}
|
|
ColumnLayout {
|
|
spacing: Utils.getSizeWithScreenRatio(10)
|
|
FormItemLayout {
|
|
id: outboundProxyUri
|
|
//: "Outbound SIP Proxy URI"
|
|
label: qsTr("login_proxy_server_url")
|
|
//: "If this field is filled, the outbound proxy will be enabled automatically. Leave it empty to disable it."
|
|
tooltip: qsTr("login_proxy_server_url_tooltip")
|
|
Layout.fillWidth: true
|
|
contentItem: TextField {
|
|
id: outboundProxyUriEdit
|
|
Layout.preferredWidth: Utils.getSizeWithScreenRatio(360)
|
|
Accessible.name: qsTr("login_proxy_server_url")
|
|
KeyNavigation.up: transportCbox
|
|
KeyNavigation.down: registrarUriEdit
|
|
}
|
|
}
|
|
FormItemLayout {
|
|
id: registrarUri
|
|
//: "Registrar URI"
|
|
label: qsTr("login_registrar_uri")
|
|
Layout.fillWidth: true
|
|
contentItem: TextField {
|
|
id: registrarUriEdit
|
|
Layout.preferredWidth: Utils.getSizeWithScreenRatio(360)
|
|
Accessible.name: qsTr("login_registrar_uri")
|
|
KeyNavigation.up: outboundProxyUriEdit
|
|
KeyNavigation.down: connectionIdEdit
|
|
}
|
|
}
|
|
FormItemLayout {
|
|
id: connectionId
|
|
//: "Authentication ID (if different)"
|
|
label: qsTr("login_id")
|
|
Layout.fillWidth: true
|
|
contentItem: TextField {
|
|
id: connectionIdEdit
|
|
Layout.preferredWidth: Utils.getSizeWithScreenRatio(360)
|
|
KeyNavigation.up: registrarUriEdit
|
|
Accessible.name: qsTr("login_id")
|
|
}
|
|
}
|
|
}
|
|
Item{Layout.fillHeight: true}
|
|
}
|
|
Item{Layout.fillHeight: true}
|
|
}
|
|
}
|
|
}
|
|
|
|
centerContent: [
|
|
ScrollBar {
|
|
id: scrollbar
|
|
z: 1
|
|
active: true
|
|
interactive: true
|
|
parent: rootStackView.currentItem
|
|
visible: parent.contentHeight > parent.height
|
|
policy: Control.ScrollBar.AsNeeded
|
|
anchors.top: parent.top
|
|
anchors.bottom: parent.bottom
|
|
anchors.right: parent.right
|
|
// Layout.leftMargin: Utils.getSizeWithScreenRatio(119)
|
|
// anchors.leftMargin: Utils.getSizeWithScreenRatio(119)
|
|
// anchors.rightMargin: - Utils.getSizeWithScreenRatio(8)
|
|
},
|
|
Control.StackView {
|
|
id: rootStackView
|
|
initialItem: SettingsCpp.assistantGoDirectlyToThirdPartySipAccountLogin ? secondItem : firstItem
|
|
anchors.left: parent.left
|
|
anchors.top: parent.top
|
|
anchors.bottom: parent.bottom
|
|
anchors.leftMargin: Utils.getSizeWithScreenRatio(127)
|
|
width: currentItem ? currentItem.width : 0
|
|
},
|
|
// Item {
|
|
// id: sipItem
|
|
// // spacing: Utils.getSizeWithScreenRatio(8)
|
|
// anchors.fill: parent
|
|
// anchors.rightMargin: Utils.getSizeWithScreenRatio(50) + image.width
|
|
// },
|
|
Image {
|
|
id: image
|
|
z: -1
|
|
anchors.top: parent.top
|
|
anchors.right: parent.right
|
|
anchors.topMargin: Utils.getSizeWithScreenRatio(129)
|
|
anchors.rightMargin: Utils.getSizeWithScreenRatio(127)
|
|
width: Utils.getSizeWithScreenRatio(395)
|
|
height: Utils.getSizeWithScreenRatio(350)
|
|
fillMode: Image.PreserveAspectFit
|
|
source: AppIcons.loginImage
|
|
}
|
|
]
|
|
}
|