linux.x86.linphone/Linphone/view/Page/Layout/Settings/AccountSettingsGeneralLayout.qml
data 6a0ab85191 Fix settings and disable problematic features
- Add dialPlan type support to ComboSetting (international prefix now shows correctly)
- Replace logo.svg with new phone icon design
- Disable automatic update check on startup (default to false)
- Disable account devices feature to prevent API errors
- Remove devices section from account settings
- Add ringtone fallback to default when custom file not found

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 08:16:03 +01:00

375 lines
13 KiB
QML
Executable file

import QtCore
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls.Basic as Control
import QtQuick.Dialogs
import Linphone
import SettingsCpp
import UtilsCpp
import 'qrc:/qt/qml/Linphone/view/Style/buttonStyle.js' as ButtonStyle
import "qrc:/qt/qml/Linphone/view/Control/Tool/Helper/utils.js" as Utils
AbstractSettingsLayout {
id: mainItem
saveButtonVisible: false
width: parent?.width
contentModel: [
{
//: "Détails"
title: qsTr("manage_account_details_title"),
//: Éditer les informations de votre compte.
subTitle: qsTr("manage_account_details_subtitle"),
contentComponent: accountParametersComponent
}
]
property alias account: mainItem.model
// Account parameters
//////////////////////////
Component {
id: accountParametersComponent
ColumnLayout {
Layout.fillWidth: true
spacing: Utils.getSizeWithScreenRatio(20)
Avatar {
id: avatar
account: model
displayPresence: false
Layout.preferredWidth: Utils.getSizeWithScreenRatio(100)
Layout.preferredHeight: Utils.getSizeWithScreenRatio(100)
Layout.alignment: Qt.AlignHCenter
}
IconLabelButton {
visible: model.core.pictureUri.length === 0
Layout.preferredWidth: width
icon.source: AppIcons.camera
icon.width: Utils.getSizeWithScreenRatio(17)
icon.height: Utils.getSizeWithScreenRatio(17)
//: "Ajouter une image"
text: qsTr("manage_account_add_picture")
style: ButtonStyle.noBackground
onClicked: fileDialog.open()
Layout.alignment: Qt.AlignHCenter
}
RowLayout {
visible: model.core.pictureUri.length > 0
Layout.alignment: Qt.AlignHCenter
spacing: Utils.getSizeWithScreenRatio(5)
IconLabelButton {
Layout.preferredWidth: width
icon.source: AppIcons.pencil
icon.width: Utils.getSizeWithScreenRatio(17)
icon.height: Utils.getSizeWithScreenRatio(17)
//: "Modifier l'image"
text: qsTr("manage_account_edit_picture")
style: ButtonStyle.noBackground
onClicked: fileDialog.open()
}
IconLabelButton {
Layout.preferredWidth: width
icon.source: AppIcons.trashCan
icon.width: Utils.getSizeWithScreenRatio(17)
icon.height: Utils.getSizeWithScreenRatio(17)
//: "Supprimer l'image"
text: qsTr("manage_account_remove_picture")
style: ButtonStyle.noBackground
onClicked: model.core.pictureUri = ""
}
}
FileDialog {
id: fileDialog
currentFolder: StandardPaths.standardLocations(StandardPaths.PicturesLocation)[0]
onAccepted: {
var avatarPath = UtilsCpp.createAvatar( selectedFile )
if(avatarPath){
model.core.pictureUri = avatarPath
avatar.model = model
}
}
}
RowLayout {
Layout.fillWidth: true
spacing: Utils.getSizeWithScreenRatio(5)
Text {
Layout.alignment: Qt.AlignLeft
//: SIP address
text: "%1 :".arg(qsTr("sip_address"))
color: DefaultStyle.main2_600
font: Typography.p2l
}
Text {
Layout.alignment: Qt.AlignLeft
text: model.core.identityAddress
color: DefaultStyle.main2_600
font: Typography.p1
}
Item {
Layout.fillWidth: true
}
IconLabelButton {
Layout.alignment: Qt.AlignRight
icon.source: AppIcons.copy
style: ButtonStyle.noBackground
onClicked: {
if (UtilsCpp.copyToClipboard(model.core.identityAddress)) {
//: Copied
UtilsCpp.showInformationPopup(qsTr("copied"),
//: Your SIP address has been copied in the clipboard
qsTr("account_settings_sip_address_copied_message"))
} else {
UtilsCpp.showInformationPopup(qsTr("error"),
//: Error copying your SIP address
qsTr("account_settings_sip_address_copied_error_message"), false)
}
}
}
}
ColumnLayout {
spacing: Utils.getSizeWithScreenRatio(5)
Layout.alignment: Qt.AlignLeft
Text {
//: "Nom d'affichage
text: qsTr("sip_address_display_name")
color: DefaultStyle.main2_600
font: Typography.p2l
}
Text {
//: "Le nom qui sera affiché à vos correspondants lors de vos échanges."
text: qsTr("sip_address_display_name_explaination")
color: DefaultStyle.main2_600
font: Typography.p1
}
}
TextField {
Layout.alignment: Qt.AlignLeft
Layout.fillWidth: true
Layout.preferredHeight: Utils.getSizeWithScreenRatio(49)
initialText: model.core.displayName
backgroundColor: DefaultStyle.grey_100
onEditingFinished: {
if (text.length != 0) model.core.displayName = text
}
toValidate: true
}
Text {
//: Indicatif international*
text: qsTr("manage_account_international_prefix")
color: DefaultStyle.main2_600
font: Typography.p2l
}
ComboSetting {
Layout.fillWidth: true
Layout.topMargin: Utils.getSizeWithScreenRatio(15)
entries: account.core.dialPlans
propertyName: "dialPlan"
propertyOwnerGui: account
textRole: 'text'
flagRole: 'flag'
}
SwitchSetting {
titleText: account?.core.humaneReadableRegistrationState
subTitleText: account?.core.humaneReadableRegistrationStateExplained
propertyName: "registerEnabled"
propertyOwnerGui: account
}
RowLayout {
id:mainItem
spacing : Utils.getSizeWithScreenRatio(20)
ColumnLayout {
spacing : Utils.getSizeWithScreenRatio(5)
Text {
//: "Déconnecter mon compte"
text: qsTr("manage_account_delete")
font: Typography.p2l
wrapMode: Text.WordWrap
color: DefaultStyle.danger_500_main
Layout.fillWidth: true
}
Text {
// "Votre compte sera retiré de ce client linphone, mais vous restez connecté sur vos autres clients
text: qsTr("manage_account_delete_message")
font: Typography.p1
wrapMode: Text.WordWrap
color: DefaultStyle.main2_500_main
Layout.fillWidth: true
}
}
Item {
Layout.fillWidth: true
}
BigButton {
style: ButtonStyle.noBackgroundRed
Layout.alignment: Qt.AlignRight
Layout.rightMargin: Utils.getSizeWithScreenRatio(5)
icon.source: AppIcons.trashCan
onClicked: {
var mainWin = UtilsCpp.getMainWindow()
mainWin.showConfirmationLambdaPopup("",
//: "Se déconnecter du compte ?"
qsTr("manage_account_dialog_remove_account_title"),
//: Si vous souhaitez supprimer définitivement votre compte rendez-vous sur : https://sip.linphone.org
qsTr("manage_account_dialog_remove_account_message"),
function (confirmed) {
if (confirmed) {
account.core.removeAccount()
}
}
)
}
}
}
}
}
// Account devices
//////////////////////////
Component {
id: accountDevicesComponent
RoundedPane {
Layout.fillWidth: true
Layout.fillHeight: true
// Layout.minimumHeight: account.core.devices.length *Utils.getSizeWithScreenRatio(133) + (account.core.devices.length - 1) *Utils.getSizeWithScreenRatio(15) + 2 *Utils.getSizeWithScreenRatio(21)
Layout.rightMargin: Utils.getSizeWithScreenRatio(30)
Layout.topMargin: Utils.getSizeWithScreenRatio(20)
Layout.bottomMargin: Utils.getSizeWithScreenRatio(4)
Layout.leftMargin: Utils.getSizeWithScreenRatio(44)
topPadding: Utils.getSizeWithScreenRatio(21)
bottomPadding: Utils.getSizeWithScreenRatio(21)
leftPadding: Utils.getSizeWithScreenRatio(17)
rightPadding: Utils.getSizeWithScreenRatio(17)
background: Rectangle {
anchors.fill: parent
color: DefaultStyle.grey_100
radius: Utils.getSizeWithScreenRatio(15)
}
contentItem: ColumnLayout {
spacing: Utils.getSizeWithScreenRatio(15)
BusyIndicator {
Layout.preferredWidth: Utils.getSizeWithScreenRatio(60)
Layout.preferredHeight: Utils.getSizeWithScreenRatio(60)
Layout.alignment: Qt.AlignHCenter
visible: devices.loading
}
Repeater {
id: devices
visible: !loading
property bool loading
Component.onCompleted: loading = true
model: AccountDeviceProxy {
id: accountDeviceProxy
account: mainItem.model
onDevicesSet: devices.loading = false;
onRequestError: (errorMessage) => {
devices.loading = false;
//: Erreur
mainWindow.showInformationPopup(qsTr("error"), errorMessage, false)
}
}
Control.Control {
Layout.fillWidth: true
height: Utils.getSizeWithScreenRatio(133)
topPadding: Utils.getSizeWithScreenRatio(26)
bottomPadding: Utils.getSizeWithScreenRatio(26)
rightPadding: Utils.getSizeWithScreenRatio(36)
leftPadding: Utils.getSizeWithScreenRatio(33)
background: Rectangle {
anchors.fill: parent
color: DefaultStyle.grey_0
radius: Utils.getSizeWithScreenRatio(10)
}
contentItem: ColumnLayout {
width: parent.width
spacing: Utils.getSizeWithScreenRatio(20)
RowLayout {
spacing: Utils.getSizeWithScreenRatio(5)
EffectImage {
Layout.preferredWidth: Utils.getSizeWithScreenRatio(24)
Layout.preferredHeight: Utils.getSizeWithScreenRatio(24)
fillMode: Image.PreserveAspectFit
colorizationColor: DefaultStyle.main2_600
imageSource: modelData.core.userAgent.toLowerCase().includes('ios') | modelData.core.userAgent.toLowerCase().includes('android') ? AppIcons.mobile : AppIcons.desktop
}
Text {
text: modelData.core.deviceName
color: DefaultStyle.main2_600
font: Typography.p2
}
Item {
Layout.fillWidth: true
}
MediumButton {
Layout.alignment: Qt.AlignRight
//: "Supprimer"
text: qsTr("manage_account_device_remove")
icon.source: AppIcons.trashCan
icon.width: Utils.getSizeWithScreenRatio(16)
icon.height: Utils.getSizeWithScreenRatio(16)
style: ButtonStyle.tertiary
onClicked: {
var mainWin = UtilsCpp.getMainWindow()
mainWin.showConfirmationLambdaPopup("",
//:"Supprimer %1 ?"
qsTr("manage_account_device_remove_confirm_dialog").arg(modelData.core.deviceName), "",
function (confirmed) {
if (confirmed) {
accountDeviceProxy.deleteDevice(modelData)
}
}
)
}
}
}
RowLayout {
spacing: Utils.getSizeWithScreenRatio(5)
Text {
//: "Dernière connexion:"
text: qsTr("manage_account_device_last_connection")
color: DefaultStyle.main2_600
font: Typography.p2
}
EffectImage {
visible: dateText.lastDate != ""
Layout.preferredWidth: Utils.getSizeWithScreenRatio(20)
Layout.preferredHeight: Utils.getSizeWithScreenRatio(20)
imageSource: AppIcons.calendarBlank
colorizationColor: DefaultStyle.main2_600
fillMode: Image.PreserveAspectFit
}
Text {
id: dateText
property string lastDate: UtilsCpp.formatDate(modelData.core.lastUpdateTimestamp,false)
text: lastDate != ""
? lastDate
//: "No information"
: qsTr("device_last_updated_time_no_info")
color: DefaultStyle.main2_600
font: Typography.p1
}
EffectImage {
visible: dateText.lastDate != ""
Layout.preferredWidth: Utils.getSizeWithScreenRatio(20)
Layout.preferredHeight: Utils.getSizeWithScreenRatio(20)
imageSource: AppIcons.clock
colorizationColor: DefaultStyle.main2_600
fillMode: Image.PreserveAspectFit
}
Text {
visible: dateText.lastDate != ""
text: UtilsCpp.formatTime(modelData.core.lastUpdateTimestamp)
color: DefaultStyle.main2_600
font: Typography.p1
}
}
}
}
}
}
}
}
}