From 88a1263d2a47f436db909fcd4f00c7b7ee9e624f Mon Sep 17 00:00:00 2001 From: Julien Wadel Date: Thu, 21 Oct 2021 23:05:03 +0200 Subject: [PATCH] - Add Tunnel support if available. - Add tunnel special options for developer. - Use of CPP for linphone enums to string. - Replace let colors with better quality. - Fix developer settings view. --- linphone-app/CMakeLists.txt | 8 + linphone-app/assets/images/led_green.svg | 44 +-- linphone-app/assets/images/led_orange.svg | 44 +-- linphone-app/assets/images/led_red.svg | 11 +- linphone-app/assets/images/led_white.svg | 44 +-- linphone-app/assets/languages/da.ts | 136 ++++++++ linphone-app/assets/languages/de.ts | 136 ++++++++ linphone-app/assets/languages/en.ts | 138 ++++++++- linphone-app/assets/languages/es.ts | 136 ++++++++ linphone-app/assets/languages/fr_FR.ts | 136 ++++++++ linphone-app/assets/languages/hu.ts | 136 ++++++++ linphone-app/assets/languages/it.ts | 136 ++++++++ linphone-app/assets/languages/ja.ts | 136 ++++++++ linphone-app/assets/languages/lt.ts | 136 ++++++++ linphone-app/assets/languages/pt_BR.ts | 136 ++++++++ linphone-app/assets/languages/ru.ts | 136 ++++++++ linphone-app/assets/languages/sv.ts | 136 ++++++++ linphone-app/assets/languages/tr.ts | 136 ++++++++ linphone-app/assets/languages/uk.ts | 136 ++++++++ linphone-app/assets/languages/zh_CN.ts | 136 ++++++++ linphone-app/resources.qrc | 1 + linphone-app/src/app/App.cpp | 5 +- linphone-app/src/components/Components.hpp | 4 + .../components/chat-room/ChatRoomModel.hpp | 2 +- .../src/components/settings/SettingsModel.cpp | 19 ++ .../src/components/settings/SettingsModel.hpp | 9 +- .../tunnel/TunnelConfigListModel.cpp | 124 ++++++++ .../tunnel/TunnelConfigListModel.hpp | 62 ++++ .../components/tunnel/TunnelConfigModel.cpp | 96 ++++++ .../components/tunnel/TunnelConfigModel.hpp | 75 +++++ .../tunnel/TunnelConfigProxyModel.cpp | 55 ++++ .../tunnel/TunnelConfigProxyModel.hpp | 51 +++ .../src/components/tunnel/TunnelModel.cpp | 128 ++++++++ .../src/components/tunnel/TunnelModel.hpp | 85 +++++ linphone-app/src/utils/LinphoneEnums.cpp | 9 +- linphone-app/src/utils/LinphoneEnums.hpp | 11 +- linphone-app/src/utils/Utils.cpp | 16 + linphone-app/src/utils/Utils.hpp | 1 + .../modules/Common/Form/Placements/Form.qml | 10 + .../views/App/Settings/SettingsAdvanced.qml | 2 +- .../ui/views/App/Settings/SettingsTunnel.qml | 286 +++++++++++++++++ .../ui/views/App/Settings/SettingsWindow.qml | 293 +++++++++--------- 42 files changed, 3289 insertions(+), 248 deletions(-) create mode 100644 linphone-app/src/components/tunnel/TunnelConfigListModel.cpp create mode 100644 linphone-app/src/components/tunnel/TunnelConfigListModel.hpp create mode 100644 linphone-app/src/components/tunnel/TunnelConfigModel.cpp create mode 100644 linphone-app/src/components/tunnel/TunnelConfigModel.hpp create mode 100644 linphone-app/src/components/tunnel/TunnelConfigProxyModel.cpp create mode 100644 linphone-app/src/components/tunnel/TunnelConfigProxyModel.hpp create mode 100644 linphone-app/src/components/tunnel/TunnelModel.cpp create mode 100644 linphone-app/src/components/tunnel/TunnelModel.hpp create mode 100644 linphone-app/ui/views/App/Settings/SettingsTunnel.qml diff --git a/linphone-app/CMakeLists.txt b/linphone-app/CMakeLists.txt index 95a900923..5399280c3 100644 --- a/linphone-app/CMakeLists.txt +++ b/linphone-app/CMakeLists.txt @@ -189,6 +189,10 @@ set(SOURCES src/components/timeline/TimelineModel.cpp src/components/timeline/TimelineListModel.cpp src/components/timeline/TimelineProxyModel.cpp + src/components/tunnel/TunnelModel.cpp + src/components/tunnel/TunnelConfigModel.cpp + src/components/tunnel/TunnelConfigListModel.cpp + src/components/tunnel/TunnelConfigProxyModel.cpp src/components/url-handlers/UrlHandlers.cpp src/utils/Constants.cpp src/utils/LinphoneEnums.cpp @@ -291,6 +295,10 @@ set(HEADERS src/components/timeline/TimelineModel.hpp src/components/timeline/TimelineListModel.hpp src/components/timeline/TimelineProxyModel.hpp + src/components/tunnel/TunnelModel.hpp + src/components/tunnel/TunnelConfigModel.hpp + src/components/tunnel/TunnelConfigListModel.hpp + src/components/tunnel/TunnelConfigProxyModel.hpp src/components/url-handlers/UrlHandlers.hpp src/utils/Constants.hpp src/utils/LinphoneEnums.hpp diff --git a/linphone-app/assets/images/led_green.svg b/linphone-app/assets/images/led_green.svg index f99055fe5..f5cfbfcc6 100644 --- a/linphone-app/assets/images/led_green.svg +++ b/linphone-app/assets/images/led_green.svg @@ -2,9 +2,8 @@ + id="defs12" /> + inkscape:current-layer="g6" /> - - - - - - - - - - + id="g6"> + + diff --git a/linphone-app/assets/images/led_orange.svg b/linphone-app/assets/images/led_orange.svg index bcb34f6b6..ac409f2f9 100644 --- a/linphone-app/assets/images/led_orange.svg +++ b/linphone-app/assets/images/led_orange.svg @@ -2,9 +2,8 @@ + id="defs12" /> + inkscape:current-layer="g6" /> - - - - - - - - - - + id="g6"> + + diff --git a/linphone-app/assets/images/led_red.svg b/linphone-app/assets/images/led_red.svg index 5c5e0163c..640339087 100644 --- a/linphone-app/assets/images/led_red.svg +++ b/linphone-app/assets/images/led_red.svg @@ -25,19 +25,20 @@ inkscape:cx="3.9948454" inkscape:cy="4" inkscape:window-width="1920" - inkscape:window-height="1043" + inkscape:window-height="1131" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" - inkscape:current-layer="svg8" /> + inkscape:current-layer="g6" /> + d="m 4.0111984,7.0605044 a 3.0433256,3.053726 0 1 1 0,-6.10745189 3.0433256,3.053726 0 0 1 0,6.10745189 z" + fill="#dc4100" + id="path2" + style="stroke-width:0.76213" /> + id="defs12" /> + inkscape:current-layer="g6" /> - - - - - - - - - - + id="g6"> + + diff --git a/linphone-app/assets/languages/da.ts b/linphone-app/assets/languages/da.ts index d06897198..3dd90f5b8 100644 --- a/linphone-app/assets/languages/da.ts +++ b/linphone-app/assets/languages/da.ts @@ -1610,6 +1610,24 @@ Klik her: <a href="%1">%1</a> Offline + + QObject + + LinphoneEnums_TunnelModeEnable + 'Enable' : One word for button action to enable tunnel mode. + + + + LinphoneEnums_TunnelModeDisable + 'Disable' : One word for button action to disable tunnel mode. + + + + LinphoneEnums_TunnelModeAuto + 'Auto' : One word for button action to set the auto tunnel mode. + + + SettingsAdvanced @@ -2312,6 +2330,119 @@ Klik her: <a href="%1">%1</a> + + SettingsTunnel + + tunnelStatus + 'Tunnel Status' : Field title to introduce the status of the tunnel (activated or not) + + + + tunnelDomain + 'Domain' : Field title of a textfield to set domain. + + + + tunnelUsername + 'Username' : Field title of a textfield to set username. + + + + tunnelSIP + 'SIP' : Field title of a switch to set SIP mode. + + + + cancel + 'Cancel' : Button to cancel the action. + ANNULLER + + + setHTTPProxy + 'Set HTTP proxy' : Button to set the new proxy. + + + + proxyHttpHost + 'Host' : Placeholder to set hostname. + + + + proxyHttpPort + 'Port' : Placehoilder to set port. + + + + proxyHttpUsername + 'Username' : Placeholder to set username. + + + + proxyHttpPassword + 'Password' : Placeholder to set password. + + + + proxyHttpApply + 'Apply' : Button to set proxy from changes. + + + + serverMode + 'Mode' : Field title on form to set tunnel mode. + + + + serverDualMode + 'Dual mode' : Field title on form to set dual mode of the tunnel. + + + + serverTitle + 'Server' : Title form to set a server + + + + serverHostname + 'Hostname' : Field title on form to set hostname. + + + + serverPort + 'Port' : Field title on form to set port. + + + + serverDualHostname + 'Dual hostname URL' : Field title on form to set the second hostname for dual configuration. + + + + serverDualPort + 'Dual port' : Field title on form to set the second port for the dual configuration. + + + + serverRemoteUDPMirrorPort + 'Remote UDP mirror port' : Field title on form to set the remote UDP mirror port. + + + + serverDelay + 'Delay' : Field title on form to set the delay of the tunnel. + + + + tunnelAddServer + 'Add server' : Button for adding a server + + + + tunnelApply + 'Apply' : Button to apply changes. + + + SettingsUi @@ -2482,6 +2613,11 @@ Klik her: <a href="%1">%1</a> uiAdvanced Avanceret + + tunnelTab + 'Tunnel' : Tab title for tunnel section in settings. + + SmartSearchBar diff --git a/linphone-app/assets/languages/de.ts b/linphone-app/assets/languages/de.ts index 372d12d71..31b314873 100644 --- a/linphone-app/assets/languages/de.ts +++ b/linphone-app/assets/languages/de.ts @@ -1610,6 +1610,24 @@ Klicken Sie hier: <a href="%1">%1</a> Offline + + QObject + + LinphoneEnums_TunnelModeEnable + 'Enable' : One word for button action to enable tunnel mode. + + + + LinphoneEnums_TunnelModeDisable + 'Disable' : One word for button action to disable tunnel mode. + + + + LinphoneEnums_TunnelModeAuto + 'Auto' : One word for button action to set the auto tunnel mode. + + + SettingsAdvanced @@ -2312,6 +2330,119 @@ Klicken Sie hier: <a href="%1">%1</a> + + SettingsTunnel + + tunnelStatus + 'Tunnel Status' : Field title to introduce the status of the tunnel (activated or not) + + + + tunnelDomain + 'Domain' : Field title of a textfield to set domain. + + + + tunnelUsername + 'Username' : Field title of a textfield to set username. + + + + tunnelSIP + 'SIP' : Field title of a switch to set SIP mode. + + + + cancel + 'Cancel' : Button to cancel the action. + ABBRECHEN + + + setHTTPProxy + 'Set HTTP proxy' : Button to set the new proxy. + + + + proxyHttpHost + 'Host' : Placeholder to set hostname. + + + + proxyHttpPort + 'Port' : Placehoilder to set port. + + + + proxyHttpUsername + 'Username' : Placeholder to set username. + + + + proxyHttpPassword + 'Password' : Placeholder to set password. + + + + proxyHttpApply + 'Apply' : Button to set proxy from changes. + + + + serverMode + 'Mode' : Field title on form to set tunnel mode. + + + + serverDualMode + 'Dual mode' : Field title on form to set dual mode of the tunnel. + + + + serverTitle + 'Server' : Title form to set a server + + + + serverHostname + 'Hostname' : Field title on form to set hostname. + + + + serverPort + 'Port' : Field title on form to set port. + + + + serverDualHostname + 'Dual hostname URL' : Field title on form to set the second hostname for dual configuration. + + + + serverDualPort + 'Dual port' : Field title on form to set the second port for the dual configuration. + + + + serverRemoteUDPMirrorPort + 'Remote UDP mirror port' : Field title on form to set the remote UDP mirror port. + + + + serverDelay + 'Delay' : Field title on form to set the delay of the tunnel. + + + + tunnelAddServer + 'Add server' : Button for adding a server + + + + tunnelApply + 'Apply' : Button to apply changes. + + + SettingsUi @@ -2482,6 +2613,11 @@ Klicken Sie hier: <a href="%1">%1</a> uiAdvanced Erweitert + + tunnelTab + 'Tunnel' : Tab title for tunnel section in settings. + + SmartSearchBar diff --git a/linphone-app/assets/languages/en.ts b/linphone-app/assets/languages/en.ts index 5c868c459..6a349ca6b 100644 --- a/linphone-app/assets/languages/en.ts +++ b/linphone-app/assets/languages/en.ts @@ -756,7 +756,7 @@ Server URL not configured. missingConferenceURI 'You need to set the conference URI in your account settings to create a conference based chat room.' : Tooltip to warn the user that a setting is missing in its configuration. - You need to set the conference URI in your account settings to create a conference based chat room. + You need to set the conference URI in your account settings to create a conference based chat room. @@ -1610,6 +1610,24 @@ Click here: <a href="%1">%1</a> Offline + + QObject + + LinphoneEnums_TunnelModeEnable + 'Enable' : One word for button action to enable tunnel mode. + Enable + + + LinphoneEnums_TunnelModeDisable + 'Disable' : One word for button action to disable tunnel mode. + Disable + + + LinphoneEnums_TunnelModeAuto + 'Auto' : One word for button action to set the auto tunnel mode. + Auto + + SettingsAdvanced @@ -2335,6 +2353,119 @@ Click here: <a href="%1">%1</a> Invalid conference URI + + SettingsTunnel + + tunnelStatus + 'Tunnel Status' : Field title to introduce the status of the tunnel (activated or not) + Tunnel Status + + + tunnelDomain + 'Domain' : Field title of a textfield to set domain. + Domain + + + tunnelUsername + 'Username' : Field title of a textfield to set username. + Username + + + tunnelSIP + 'SIP' : Field title of a switch to set SIP mode. + SIP + + + cancel + 'Cancel' : Button to cancel the action. + Cancel + + + setHTTPProxy + 'Set HTTP proxy' : Button to set the new proxy. + Set HTTP proxy + + + proxyHttpHost + 'Host' : Placeholder to set hostname. + Host + + + proxyHttpPort + 'Port' : Placehoilder to set port. + Port + + + proxyHttpUsername + 'Username' : Placeholder to set username. + Username + + + proxyHttpPassword + 'Password' : Placeholder to set password. + Password + + + proxyHttpApply + 'Apply' : Button to set proxy from changes. + Apply + + + serverMode + 'Mode' : Field title on form to set tunnel mode. + Mode + + + serverDualMode + 'Dual mode' : Field title on form to set dual mode of the tunnel. + Dual mode + + + serverTitle + 'Server' : Title form to set a server + Server + + + serverHostname + 'Hostname' : Field title on form to set hostname. + Hostname + + + serverPort + 'Port' : Field title on form to set port. + Port + + + serverDualHostname + 'Dual hostname URL' : Field title on form to set the second hostname for dual configuration. + Dual hostname URL + + + serverDualPort + 'Dual port' : Field title on form to set the second port for the dual configuration. + Dual port + + + serverRemoteUDPMirrorPort + 'Remote UDP mirror port' : Field title on form to set the remote UDP mirror port. + Remote UDP mirror port + + + serverDelay + 'Delay' : Field title on form to set the delay of the tunnel. + Delay + + + tunnelAddServer + 'Add server' : Button for adding a server + Add server + + + tunnelApply + 'Apply' : Button to apply changes. + Apply + + SettingsUi @@ -2505,6 +2636,11 @@ Click here: <a href="%1">%1</a> uiAdvanced Advanced + + tunnelTab + 'Tunnel' : Tab title for tunnel section in settings. + Tunnel + SmartSearchBar diff --git a/linphone-app/assets/languages/es.ts b/linphone-app/assets/languages/es.ts index 0ae44e77e..a61405436 100644 --- a/linphone-app/assets/languages/es.ts +++ b/linphone-app/assets/languages/es.ts @@ -1610,6 +1610,24 @@ Haga clic aquí: <a href="%1">%1 </a> Desconectado + + QObject + + LinphoneEnums_TunnelModeEnable + 'Enable' : One word for button action to enable tunnel mode. + + + + LinphoneEnums_TunnelModeDisable + 'Disable' : One word for button action to disable tunnel mode. + + + + LinphoneEnums_TunnelModeAuto + 'Auto' : One word for button action to set the auto tunnel mode. + + + SettingsAdvanced @@ -2312,6 +2330,119 @@ Haga clic aquí: <a href="%1">%1 </a> + + SettingsTunnel + + tunnelStatus + 'Tunnel Status' : Field title to introduce the status of the tunnel (activated or not) + + + + tunnelDomain + 'Domain' : Field title of a textfield to set domain. + + + + tunnelUsername + 'Username' : Field title of a textfield to set username. + + + + tunnelSIP + 'SIP' : Field title of a switch to set SIP mode. + + + + cancel + 'Cancel' : Button to cancel the action. + CANCELAR + + + setHTTPProxy + 'Set HTTP proxy' : Button to set the new proxy. + + + + proxyHttpHost + 'Host' : Placeholder to set hostname. + + + + proxyHttpPort + 'Port' : Placehoilder to set port. + + + + proxyHttpUsername + 'Username' : Placeholder to set username. + + + + proxyHttpPassword + 'Password' : Placeholder to set password. + + + + proxyHttpApply + 'Apply' : Button to set proxy from changes. + + + + serverMode + 'Mode' : Field title on form to set tunnel mode. + + + + serverDualMode + 'Dual mode' : Field title on form to set dual mode of the tunnel. + + + + serverTitle + 'Server' : Title form to set a server + + + + serverHostname + 'Hostname' : Field title on form to set hostname. + + + + serverPort + 'Port' : Field title on form to set port. + + + + serverDualHostname + 'Dual hostname URL' : Field title on form to set the second hostname for dual configuration. + + + + serverDualPort + 'Dual port' : Field title on form to set the second port for the dual configuration. + + + + serverRemoteUDPMirrorPort + 'Remote UDP mirror port' : Field title on form to set the remote UDP mirror port. + + + + serverDelay + 'Delay' : Field title on form to set the delay of the tunnel. + + + + tunnelAddServer + 'Add server' : Button for adding a server + + + + tunnelApply + 'Apply' : Button to apply changes. + + + SettingsUi @@ -2482,6 +2613,11 @@ Haga clic aquí: <a href="%1">%1 </a> uiAdvanced Avanzado + + tunnelTab + 'Tunnel' : Tab title for tunnel section in settings. + + SmartSearchBar diff --git a/linphone-app/assets/languages/fr_FR.ts b/linphone-app/assets/languages/fr_FR.ts index eddb53a3c..fea8f51a1 100644 --- a/linphone-app/assets/languages/fr_FR.ts +++ b/linphone-app/assets/languages/fr_FR.ts @@ -1610,6 +1610,24 @@ Cliquez ici : <a href="%1">%1</a> Hors-ligne + + QObject + + LinphoneEnums_TunnelModeEnable + 'Enable' : One word for button action to enable tunnel mode. + + + + LinphoneEnums_TunnelModeDisable + 'Disable' : One word for button action to disable tunnel mode. + + + + LinphoneEnums_TunnelModeAuto + 'Auto' : One word for button action to set the auto tunnel mode. + + + SettingsAdvanced @@ -2312,6 +2330,119 @@ Cliquez ici : <a href="%1">%1</a> URI de conférence invalide + + SettingsTunnel + + tunnelStatus + 'Tunnel Status' : Field title to introduce the status of the tunnel (activated or not) + + + + tunnelDomain + 'Domain' : Field title of a textfield to set domain. + + + + tunnelUsername + 'Username' : Field title of a textfield to set username. + + + + tunnelSIP + 'SIP' : Field title of a switch to set SIP mode. + + + + cancel + 'Cancel' : Button to cancel the action. + + + + setHTTPProxy + 'Set HTTP proxy' : Button to set the new proxy. + + + + proxyHttpHost + 'Host' : Placeholder to set hostname. + + + + proxyHttpPort + 'Port' : Placehoilder to set port. + + + + proxyHttpUsername + 'Username' : Placeholder to set username. + + + + proxyHttpPassword + 'Password' : Placeholder to set password. + + + + proxyHttpApply + 'Apply' : Button to set proxy from changes. + + + + serverMode + 'Mode' : Field title on form to set tunnel mode. + + + + serverDualMode + 'Dual mode' : Field title on form to set dual mode of the tunnel. + + + + serverTitle + 'Server' : Title form to set a server + + + + serverHostname + 'Hostname' : Field title on form to set hostname. + + + + serverPort + 'Port' : Field title on form to set port. + + + + serverDualHostname + 'Dual hostname URL' : Field title on form to set the second hostname for dual configuration. + + + + serverDualPort + 'Dual port' : Field title on form to set the second port for the dual configuration. + + + + serverRemoteUDPMirrorPort + 'Remote UDP mirror port' : Field title on form to set the remote UDP mirror port. + + + + serverDelay + 'Delay' : Field title on form to set the delay of the tunnel. + + + + tunnelAddServer + 'Add server' : Button for adding a server + + + + tunnelApply + 'Apply' : Button to apply changes. + + + SettingsUi @@ -2482,6 +2613,11 @@ Cliquez ici : <a href="%1">%1</a> uiAdvanced Avancés + + tunnelTab + 'Tunnel' : Tab title for tunnel section in settings. + + SmartSearchBar diff --git a/linphone-app/assets/languages/hu.ts b/linphone-app/assets/languages/hu.ts index b9b0086a0..bd54669db 100644 --- a/linphone-app/assets/languages/hu.ts +++ b/linphone-app/assets/languages/hu.ts @@ -1600,6 +1600,24 @@ Kattintson ide: <a href="%1">%1</a> Kapcsolat nélküli + + QObject + + LinphoneEnums_TunnelModeEnable + 'Enable' : One word for button action to enable tunnel mode. + + + + LinphoneEnums_TunnelModeDisable + 'Disable' : One word for button action to disable tunnel mode. + + + + LinphoneEnums_TunnelModeAuto + 'Auto' : One word for button action to set the auto tunnel mode. + + + SettingsAdvanced @@ -2302,6 +2320,119 @@ Kattintson ide: <a href="%1">%1</a> Érvénytelen konferencia URI-cím + + SettingsTunnel + + tunnelStatus + 'Tunnel Status' : Field title to introduce the status of the tunnel (activated or not) + + + + tunnelDomain + 'Domain' : Field title of a textfield to set domain. + + + + tunnelUsername + 'Username' : Field title of a textfield to set username. + + + + tunnelSIP + 'SIP' : Field title of a switch to set SIP mode. + + + + cancel + 'Cancel' : Button to cancel the action. + Mégse + + + setHTTPProxy + 'Set HTTP proxy' : Button to set the new proxy. + + + + proxyHttpHost + 'Host' : Placeholder to set hostname. + + + + proxyHttpPort + 'Port' : Placehoilder to set port. + + + + proxyHttpUsername + 'Username' : Placeholder to set username. + + + + proxyHttpPassword + 'Password' : Placeholder to set password. + + + + proxyHttpApply + 'Apply' : Button to set proxy from changes. + + + + serverMode + 'Mode' : Field title on form to set tunnel mode. + + + + serverDualMode + 'Dual mode' : Field title on form to set dual mode of the tunnel. + + + + serverTitle + 'Server' : Title form to set a server + + + + serverHostname + 'Hostname' : Field title on form to set hostname. + + + + serverPort + 'Port' : Field title on form to set port. + + + + serverDualHostname + 'Dual hostname URL' : Field title on form to set the second hostname for dual configuration. + + + + serverDualPort + 'Dual port' : Field title on form to set the second port for the dual configuration. + + + + serverRemoteUDPMirrorPort + 'Remote UDP mirror port' : Field title on form to set the remote UDP mirror port. + + + + serverDelay + 'Delay' : Field title on form to set the delay of the tunnel. + + + + tunnelAddServer + 'Add server' : Button for adding a server + + + + tunnelApply + 'Apply' : Button to apply changes. + + + SettingsUi @@ -2472,6 +2603,11 @@ Kattintson ide: <a href="%1">%1</a> uiAdvanced Haladó + + tunnelTab + 'Tunnel' : Tab title for tunnel section in settings. + + SmartSearchBar diff --git a/linphone-app/assets/languages/it.ts b/linphone-app/assets/languages/it.ts index 934052e0d..5388546b0 100644 --- a/linphone-app/assets/languages/it.ts +++ b/linphone-app/assets/languages/it.ts @@ -1610,6 +1610,24 @@ Clicca: <a href="%1">%1</a> Offline + + QObject + + LinphoneEnums_TunnelModeEnable + 'Enable' : One word for button action to enable tunnel mode. + + + + LinphoneEnums_TunnelModeDisable + 'Disable' : One word for button action to disable tunnel mode. + + + + LinphoneEnums_TunnelModeAuto + 'Auto' : One word for button action to set the auto tunnel mode. + + + SettingsAdvanced @@ -2312,6 +2330,119 @@ Clicca: <a href="%1">%1</a> + + SettingsTunnel + + tunnelStatus + 'Tunnel Status' : Field title to introduce the status of the tunnel (activated or not) + + + + tunnelDomain + 'Domain' : Field title of a textfield to set domain. + + + + tunnelUsername + 'Username' : Field title of a textfield to set username. + + + + tunnelSIP + 'SIP' : Field title of a switch to set SIP mode. + + + + cancel + 'Cancel' : Button to cancel the action. + ANNULLA + + + setHTTPProxy + 'Set HTTP proxy' : Button to set the new proxy. + + + + proxyHttpHost + 'Host' : Placeholder to set hostname. + + + + proxyHttpPort + 'Port' : Placehoilder to set port. + + + + proxyHttpUsername + 'Username' : Placeholder to set username. + + + + proxyHttpPassword + 'Password' : Placeholder to set password. + + + + proxyHttpApply + 'Apply' : Button to set proxy from changes. + + + + serverMode + 'Mode' : Field title on form to set tunnel mode. + + + + serverDualMode + 'Dual mode' : Field title on form to set dual mode of the tunnel. + + + + serverTitle + 'Server' : Title form to set a server + + + + serverHostname + 'Hostname' : Field title on form to set hostname. + + + + serverPort + 'Port' : Field title on form to set port. + + + + serverDualHostname + 'Dual hostname URL' : Field title on form to set the second hostname for dual configuration. + + + + serverDualPort + 'Dual port' : Field title on form to set the second port for the dual configuration. + + + + serverRemoteUDPMirrorPort + 'Remote UDP mirror port' : Field title on form to set the remote UDP mirror port. + + + + serverDelay + 'Delay' : Field title on form to set the delay of the tunnel. + + + + tunnelAddServer + 'Add server' : Button for adding a server + + + + tunnelApply + 'Apply' : Button to apply changes. + + + SettingsUi @@ -2482,6 +2613,11 @@ Clicca: <a href="%1">%1</a> uiAdvanced Avanzate + + tunnelTab + 'Tunnel' : Tab title for tunnel section in settings. + + SmartSearchBar diff --git a/linphone-app/assets/languages/ja.ts b/linphone-app/assets/languages/ja.ts index e3b388192..288226e15 100644 --- a/linphone-app/assets/languages/ja.ts +++ b/linphone-app/assets/languages/ja.ts @@ -1600,6 +1600,24 @@ オフライン + + QObject + + LinphoneEnums_TunnelModeEnable + 'Enable' : One word for button action to enable tunnel mode. + + + + LinphoneEnums_TunnelModeDisable + 'Disable' : One word for button action to disable tunnel mode. + + + + LinphoneEnums_TunnelModeAuto + 'Auto' : One word for button action to set the auto tunnel mode. + + + SettingsAdvanced @@ -2302,6 +2320,119 @@ + + SettingsTunnel + + tunnelStatus + 'Tunnel Status' : Field title to introduce the status of the tunnel (activated or not) + + + + tunnelDomain + 'Domain' : Field title of a textfield to set domain. + + + + tunnelUsername + 'Username' : Field title of a textfield to set username. + + + + tunnelSIP + 'SIP' : Field title of a switch to set SIP mode. + + + + cancel + 'Cancel' : Button to cancel the action. + キャンセル + + + setHTTPProxy + 'Set HTTP proxy' : Button to set the new proxy. + + + + proxyHttpHost + 'Host' : Placeholder to set hostname. + + + + proxyHttpPort + 'Port' : Placehoilder to set port. + + + + proxyHttpUsername + 'Username' : Placeholder to set username. + + + + proxyHttpPassword + 'Password' : Placeholder to set password. + + + + proxyHttpApply + 'Apply' : Button to set proxy from changes. + + + + serverMode + 'Mode' : Field title on form to set tunnel mode. + + + + serverDualMode + 'Dual mode' : Field title on form to set dual mode of the tunnel. + + + + serverTitle + 'Server' : Title form to set a server + + + + serverHostname + 'Hostname' : Field title on form to set hostname. + + + + serverPort + 'Port' : Field title on form to set port. + + + + serverDualHostname + 'Dual hostname URL' : Field title on form to set the second hostname for dual configuration. + + + + serverDualPort + 'Dual port' : Field title on form to set the second port for the dual configuration. + + + + serverRemoteUDPMirrorPort + 'Remote UDP mirror port' : Field title on form to set the remote UDP mirror port. + + + + serverDelay + 'Delay' : Field title on form to set the delay of the tunnel. + + + + tunnelAddServer + 'Add server' : Button for adding a server + + + + tunnelApply + 'Apply' : Button to apply changes. + + + SettingsUi @@ -2472,6 +2603,11 @@ uiAdvanced 詳細 + + tunnelTab + 'Tunnel' : Tab title for tunnel section in settings. + + SmartSearchBar diff --git a/linphone-app/assets/languages/lt.ts b/linphone-app/assets/languages/lt.ts index 688943e96..9a923784a 100644 --- a/linphone-app/assets/languages/lt.ts +++ b/linphone-app/assets/languages/lt.ts @@ -1620,6 +1620,24 @@ Spustelėkite čia: <a href="%1">%1</a> Atsijungęs + + QObject + + LinphoneEnums_TunnelModeEnable + 'Enable' : One word for button action to enable tunnel mode. + + + + LinphoneEnums_TunnelModeDisable + 'Disable' : One word for button action to disable tunnel mode. + + + + LinphoneEnums_TunnelModeAuto + 'Auto' : One word for button action to set the auto tunnel mode. + + + SettingsAdvanced @@ -2322,6 +2340,119 @@ Spustelėkite čia: <a href="%1">%1</a> + + SettingsTunnel + + tunnelStatus + 'Tunnel Status' : Field title to introduce the status of the tunnel (activated or not) + + + + tunnelDomain + 'Domain' : Field title of a textfield to set domain. + + + + tunnelUsername + 'Username' : Field title of a textfield to set username. + + + + tunnelSIP + 'SIP' : Field title of a switch to set SIP mode. + + + + cancel + 'Cancel' : Button to cancel the action. + ATSISAKYTI + + + setHTTPProxy + 'Set HTTP proxy' : Button to set the new proxy. + + + + proxyHttpHost + 'Host' : Placeholder to set hostname. + + + + proxyHttpPort + 'Port' : Placehoilder to set port. + + + + proxyHttpUsername + 'Username' : Placeholder to set username. + + + + proxyHttpPassword + 'Password' : Placeholder to set password. + + + + proxyHttpApply + 'Apply' : Button to set proxy from changes. + + + + serverMode + 'Mode' : Field title on form to set tunnel mode. + + + + serverDualMode + 'Dual mode' : Field title on form to set dual mode of the tunnel. + + + + serverTitle + 'Server' : Title form to set a server + + + + serverHostname + 'Hostname' : Field title on form to set hostname. + + + + serverPort + 'Port' : Field title on form to set port. + + + + serverDualHostname + 'Dual hostname URL' : Field title on form to set the second hostname for dual configuration. + + + + serverDualPort + 'Dual port' : Field title on form to set the second port for the dual configuration. + + + + serverRemoteUDPMirrorPort + 'Remote UDP mirror port' : Field title on form to set the remote UDP mirror port. + + + + serverDelay + 'Delay' : Field title on form to set the delay of the tunnel. + + + + tunnelAddServer + 'Add server' : Button for adding a server + + + + tunnelApply + 'Apply' : Button to apply changes. + + + SettingsUi @@ -2492,6 +2623,11 @@ Spustelėkite čia: <a href="%1">%1</a> uiAdvanced Išplėstiniai + + tunnelTab + 'Tunnel' : Tab title for tunnel section in settings. + + SmartSearchBar diff --git a/linphone-app/assets/languages/pt_BR.ts b/linphone-app/assets/languages/pt_BR.ts index 9b8b96115..2779a3faf 100644 --- a/linphone-app/assets/languages/pt_BR.ts +++ b/linphone-app/assets/languages/pt_BR.ts @@ -1610,6 +1610,24 @@ Clique aqui: <a href="%1">%1 </a> Offline + + QObject + + LinphoneEnums_TunnelModeEnable + 'Enable' : One word for button action to enable tunnel mode. + + + + LinphoneEnums_TunnelModeDisable + 'Disable' : One word for button action to disable tunnel mode. + + + + LinphoneEnums_TunnelModeAuto + 'Auto' : One word for button action to set the auto tunnel mode. + + + SettingsAdvanced @@ -2312,6 +2330,119 @@ Clique aqui: <a href="%1">%1 </a> + + SettingsTunnel + + tunnelStatus + 'Tunnel Status' : Field title to introduce the status of the tunnel (activated or not) + + + + tunnelDomain + 'Domain' : Field title of a textfield to set domain. + + + + tunnelUsername + 'Username' : Field title of a textfield to set username. + + + + tunnelSIP + 'SIP' : Field title of a switch to set SIP mode. + + + + cancel + 'Cancel' : Button to cancel the action. + CANCELAR + + + setHTTPProxy + 'Set HTTP proxy' : Button to set the new proxy. + + + + proxyHttpHost + 'Host' : Placeholder to set hostname. + + + + proxyHttpPort + 'Port' : Placehoilder to set port. + + + + proxyHttpUsername + 'Username' : Placeholder to set username. + + + + proxyHttpPassword + 'Password' : Placeholder to set password. + + + + proxyHttpApply + 'Apply' : Button to set proxy from changes. + + + + serverMode + 'Mode' : Field title on form to set tunnel mode. + + + + serverDualMode + 'Dual mode' : Field title on form to set dual mode of the tunnel. + + + + serverTitle + 'Server' : Title form to set a server + + + + serverHostname + 'Hostname' : Field title on form to set hostname. + + + + serverPort + 'Port' : Field title on form to set port. + + + + serverDualHostname + 'Dual hostname URL' : Field title on form to set the second hostname for dual configuration. + + + + serverDualPort + 'Dual port' : Field title on form to set the second port for the dual configuration. + + + + serverRemoteUDPMirrorPort + 'Remote UDP mirror port' : Field title on form to set the remote UDP mirror port. + + + + serverDelay + 'Delay' : Field title on form to set the delay of the tunnel. + + + + tunnelAddServer + 'Add server' : Button for adding a server + + + + tunnelApply + 'Apply' : Button to apply changes. + + + SettingsUi @@ -2482,6 +2613,11 @@ Clique aqui: <a href="%1">%1 </a> uiAdvanced Avançado + + tunnelTab + 'Tunnel' : Tab title for tunnel section in settings. + + SmartSearchBar diff --git a/linphone-app/assets/languages/ru.ts b/linphone-app/assets/languages/ru.ts index 8db5f7756..1714dc86e 100644 --- a/linphone-app/assets/languages/ru.ts +++ b/linphone-app/assets/languages/ru.ts @@ -1620,6 +1620,24 @@ Офлайн + + QObject + + LinphoneEnums_TunnelModeEnable + 'Enable' : One word for button action to enable tunnel mode. + + + + LinphoneEnums_TunnelModeDisable + 'Disable' : One word for button action to disable tunnel mode. + + + + LinphoneEnums_TunnelModeAuto + 'Auto' : One word for button action to set the auto tunnel mode. + + + SettingsAdvanced @@ -2322,6 +2340,119 @@ + + SettingsTunnel + + tunnelStatus + 'Tunnel Status' : Field title to introduce the status of the tunnel (activated or not) + + + + tunnelDomain + 'Domain' : Field title of a textfield to set domain. + + + + tunnelUsername + 'Username' : Field title of a textfield to set username. + + + + tunnelSIP + 'SIP' : Field title of a switch to set SIP mode. + + + + cancel + 'Cancel' : Button to cancel the action. + ОТМЕНА + + + setHTTPProxy + 'Set HTTP proxy' : Button to set the new proxy. + + + + proxyHttpHost + 'Host' : Placeholder to set hostname. + + + + proxyHttpPort + 'Port' : Placehoilder to set port. + + + + proxyHttpUsername + 'Username' : Placeholder to set username. + + + + proxyHttpPassword + 'Password' : Placeholder to set password. + + + + proxyHttpApply + 'Apply' : Button to set proxy from changes. + + + + serverMode + 'Mode' : Field title on form to set tunnel mode. + + + + serverDualMode + 'Dual mode' : Field title on form to set dual mode of the tunnel. + + + + serverTitle + 'Server' : Title form to set a server + + + + serverHostname + 'Hostname' : Field title on form to set hostname. + + + + serverPort + 'Port' : Field title on form to set port. + + + + serverDualHostname + 'Dual hostname URL' : Field title on form to set the second hostname for dual configuration. + + + + serverDualPort + 'Dual port' : Field title on form to set the second port for the dual configuration. + + + + serverRemoteUDPMirrorPort + 'Remote UDP mirror port' : Field title on form to set the remote UDP mirror port. + + + + serverDelay + 'Delay' : Field title on form to set the delay of the tunnel. + + + + tunnelAddServer + 'Add server' : Button for adding a server + + + + tunnelApply + 'Apply' : Button to apply changes. + + + SettingsUi @@ -2492,6 +2623,11 @@ uiAdvanced Дополнительные + + tunnelTab + 'Tunnel' : Tab title for tunnel section in settings. + + SmartSearchBar diff --git a/linphone-app/assets/languages/sv.ts b/linphone-app/assets/languages/sv.ts index 8ae2292a3..98970eed5 100644 --- a/linphone-app/assets/languages/sv.ts +++ b/linphone-app/assets/languages/sv.ts @@ -1610,6 +1610,24 @@ Klicka här: <a href="%1">%1</a> Frånkopplad + + QObject + + LinphoneEnums_TunnelModeEnable + 'Enable' : One word for button action to enable tunnel mode. + + + + LinphoneEnums_TunnelModeDisable + 'Disable' : One word for button action to disable tunnel mode. + + + + LinphoneEnums_TunnelModeAuto + 'Auto' : One word for button action to set the auto tunnel mode. + + + SettingsAdvanced @@ -2312,6 +2330,119 @@ Klicka här: <a href="%1">%1</a> + + SettingsTunnel + + tunnelStatus + 'Tunnel Status' : Field title to introduce the status of the tunnel (activated or not) + + + + tunnelDomain + 'Domain' : Field title of a textfield to set domain. + + + + tunnelUsername + 'Username' : Field title of a textfield to set username. + + + + tunnelSIP + 'SIP' : Field title of a switch to set SIP mode. + + + + cancel + 'Cancel' : Button to cancel the action. + AVBRYT + + + setHTTPProxy + 'Set HTTP proxy' : Button to set the new proxy. + + + + proxyHttpHost + 'Host' : Placeholder to set hostname. + + + + proxyHttpPort + 'Port' : Placehoilder to set port. + + + + proxyHttpUsername + 'Username' : Placeholder to set username. + + + + proxyHttpPassword + 'Password' : Placeholder to set password. + + + + proxyHttpApply + 'Apply' : Button to set proxy from changes. + + + + serverMode + 'Mode' : Field title on form to set tunnel mode. + + + + serverDualMode + 'Dual mode' : Field title on form to set dual mode of the tunnel. + + + + serverTitle + 'Server' : Title form to set a server + + + + serverHostname + 'Hostname' : Field title on form to set hostname. + + + + serverPort + 'Port' : Field title on form to set port. + + + + serverDualHostname + 'Dual hostname URL' : Field title on form to set the second hostname for dual configuration. + + + + serverDualPort + 'Dual port' : Field title on form to set the second port for the dual configuration. + + + + serverRemoteUDPMirrorPort + 'Remote UDP mirror port' : Field title on form to set the remote UDP mirror port. + + + + serverDelay + 'Delay' : Field title on form to set the delay of the tunnel. + + + + tunnelAddServer + 'Add server' : Button for adding a server + + + + tunnelApply + 'Apply' : Button to apply changes. + + + SettingsUi @@ -2482,6 +2613,11 @@ Klicka här: <a href="%1">%1</a> uiAdvanced Avancerat + + tunnelTab + 'Tunnel' : Tab title for tunnel section in settings. + + SmartSearchBar diff --git a/linphone-app/assets/languages/tr.ts b/linphone-app/assets/languages/tr.ts index f66b10e0e..b67457209 100644 --- a/linphone-app/assets/languages/tr.ts +++ b/linphone-app/assets/languages/tr.ts @@ -1600,6 +1600,24 @@ Buraya tıklayın: <a href="%1">%1</a> Çevrim dışı + + QObject + + LinphoneEnums_TunnelModeEnable + 'Enable' : One word for button action to enable tunnel mode. + + + + LinphoneEnums_TunnelModeDisable + 'Disable' : One word for button action to disable tunnel mode. + + + + LinphoneEnums_TunnelModeAuto + 'Auto' : One word for button action to set the auto tunnel mode. + + + SettingsAdvanced @@ -2302,6 +2320,119 @@ Buraya tıklayın: <a href="%1">%1</a> + + SettingsTunnel + + tunnelStatus + 'Tunnel Status' : Field title to introduce the status of the tunnel (activated or not) + + + + tunnelDomain + 'Domain' : Field title of a textfield to set domain. + + + + tunnelUsername + 'Username' : Field title of a textfield to set username. + + + + tunnelSIP + 'SIP' : Field title of a switch to set SIP mode. + + + + cancel + 'Cancel' : Button to cancel the action. + İPTAL + + + setHTTPProxy + 'Set HTTP proxy' : Button to set the new proxy. + + + + proxyHttpHost + 'Host' : Placeholder to set hostname. + + + + proxyHttpPort + 'Port' : Placehoilder to set port. + + + + proxyHttpUsername + 'Username' : Placeholder to set username. + + + + proxyHttpPassword + 'Password' : Placeholder to set password. + + + + proxyHttpApply + 'Apply' : Button to set proxy from changes. + + + + serverMode + 'Mode' : Field title on form to set tunnel mode. + + + + serverDualMode + 'Dual mode' : Field title on form to set dual mode of the tunnel. + + + + serverTitle + 'Server' : Title form to set a server + + + + serverHostname + 'Hostname' : Field title on form to set hostname. + + + + serverPort + 'Port' : Field title on form to set port. + + + + serverDualHostname + 'Dual hostname URL' : Field title on form to set the second hostname for dual configuration. + + + + serverDualPort + 'Dual port' : Field title on form to set the second port for the dual configuration. + + + + serverRemoteUDPMirrorPort + 'Remote UDP mirror port' : Field title on form to set the remote UDP mirror port. + + + + serverDelay + 'Delay' : Field title on form to set the delay of the tunnel. + + + + tunnelAddServer + 'Add server' : Button for adding a server + + + + tunnelApply + 'Apply' : Button to apply changes. + + + SettingsUi @@ -2472,6 +2603,11 @@ Buraya tıklayın: <a href="%1">%1</a> uiAdvanced Gelişmiş + + tunnelTab + 'Tunnel' : Tab title for tunnel section in settings. + + SmartSearchBar diff --git a/linphone-app/assets/languages/uk.ts b/linphone-app/assets/languages/uk.ts index da7f38501..1f76c03e3 100644 --- a/linphone-app/assets/languages/uk.ts +++ b/linphone-app/assets/languages/uk.ts @@ -1620,6 +1620,24 @@ Не в мережі + + QObject + + LinphoneEnums_TunnelModeEnable + 'Enable' : One word for button action to enable tunnel mode. + + + + LinphoneEnums_TunnelModeDisable + 'Disable' : One word for button action to disable tunnel mode. + + + + LinphoneEnums_TunnelModeAuto + 'Auto' : One word for button action to set the auto tunnel mode. + + + SettingsAdvanced @@ -2322,6 +2340,119 @@ + + SettingsTunnel + + tunnelStatus + 'Tunnel Status' : Field title to introduce the status of the tunnel (activated or not) + + + + tunnelDomain + 'Domain' : Field title of a textfield to set domain. + + + + tunnelUsername + 'Username' : Field title of a textfield to set username. + + + + tunnelSIP + 'SIP' : Field title of a switch to set SIP mode. + + + + cancel + 'Cancel' : Button to cancel the action. + СКАСУВАТИ + + + setHTTPProxy + 'Set HTTP proxy' : Button to set the new proxy. + + + + proxyHttpHost + 'Host' : Placeholder to set hostname. + + + + proxyHttpPort + 'Port' : Placehoilder to set port. + + + + proxyHttpUsername + 'Username' : Placeholder to set username. + + + + proxyHttpPassword + 'Password' : Placeholder to set password. + + + + proxyHttpApply + 'Apply' : Button to set proxy from changes. + + + + serverMode + 'Mode' : Field title on form to set tunnel mode. + + + + serverDualMode + 'Dual mode' : Field title on form to set dual mode of the tunnel. + + + + serverTitle + 'Server' : Title form to set a server + + + + serverHostname + 'Hostname' : Field title on form to set hostname. + + + + serverPort + 'Port' : Field title on form to set port. + + + + serverDualHostname + 'Dual hostname URL' : Field title on form to set the second hostname for dual configuration. + + + + serverDualPort + 'Dual port' : Field title on form to set the second port for the dual configuration. + + + + serverRemoteUDPMirrorPort + 'Remote UDP mirror port' : Field title on form to set the remote UDP mirror port. + + + + serverDelay + 'Delay' : Field title on form to set the delay of the tunnel. + + + + tunnelAddServer + 'Add server' : Button for adding a server + + + + tunnelApply + 'Apply' : Button to apply changes. + + + SettingsUi @@ -2492,6 +2623,11 @@ uiAdvanced Додаткове + + tunnelTab + 'Tunnel' : Tab title for tunnel section in settings. + + SmartSearchBar diff --git a/linphone-app/assets/languages/zh_CN.ts b/linphone-app/assets/languages/zh_CN.ts index 81fe0ab9d..9752f8e2e 100644 --- a/linphone-app/assets/languages/zh_CN.ts +++ b/linphone-app/assets/languages/zh_CN.ts @@ -1600,6 +1600,24 @@ 离线 + + QObject + + LinphoneEnums_TunnelModeEnable + 'Enable' : One word for button action to enable tunnel mode. + + + + LinphoneEnums_TunnelModeDisable + 'Disable' : One word for button action to disable tunnel mode. + + + + LinphoneEnums_TunnelModeAuto + 'Auto' : One word for button action to set the auto tunnel mode. + + + SettingsAdvanced @@ -2302,6 +2320,119 @@ 无效的会议URI + + SettingsTunnel + + tunnelStatus + 'Tunnel Status' : Field title to introduce the status of the tunnel (activated or not) + + + + tunnelDomain + 'Domain' : Field title of a textfield to set domain. + + + + tunnelUsername + 'Username' : Field title of a textfield to set username. + + + + tunnelSIP + 'SIP' : Field title of a switch to set SIP mode. + + + + cancel + 'Cancel' : Button to cancel the action. + 取消 + + + setHTTPProxy + 'Set HTTP proxy' : Button to set the new proxy. + + + + proxyHttpHost + 'Host' : Placeholder to set hostname. + + + + proxyHttpPort + 'Port' : Placehoilder to set port. + + + + proxyHttpUsername + 'Username' : Placeholder to set username. + + + + proxyHttpPassword + 'Password' : Placeholder to set password. + + + + proxyHttpApply + 'Apply' : Button to set proxy from changes. + + + + serverMode + 'Mode' : Field title on form to set tunnel mode. + + + + serverDualMode + 'Dual mode' : Field title on form to set dual mode of the tunnel. + + + + serverTitle + 'Server' : Title form to set a server + + + + serverHostname + 'Hostname' : Field title on form to set hostname. + + + + serverPort + 'Port' : Field title on form to set port. + + + + serverDualHostname + 'Dual hostname URL' : Field title on form to set the second hostname for dual configuration. + + + + serverDualPort + 'Dual port' : Field title on form to set the second port for the dual configuration. + + + + serverRemoteUDPMirrorPort + 'Remote UDP mirror port' : Field title on form to set the remote UDP mirror port. + + + + serverDelay + 'Delay' : Field title on form to set the delay of the tunnel. + + + + tunnelAddServer + 'Add server' : Button for adding a server + + + + tunnelApply + 'Apply' : Button to apply changes. + + + SettingsUi @@ -2472,6 +2603,11 @@ uiAdvanced 先进 + + tunnelTab + 'Tunnel' : Tab title for tunnel section in settings. + + SmartSearchBar diff --git a/linphone-app/resources.qrc b/linphone-app/resources.qrc index 5770b8373..73f6be649 100644 --- a/linphone-app/resources.qrc +++ b/linphone-app/resources.qrc @@ -534,6 +534,7 @@ ui/views/App/Settings/SettingsNetwork.qml ui/views/App/Settings/SettingsSipAccounts.js ui/views/App/Settings/SettingsSipAccounts.qml + ui/views/App/Settings/SettingsTunnel.qml ui/views/App/Settings/SettingsUi.js ui/views/App/Settings/SettingsUi.qml ui/views/App/Settings/SettingsVideo.js diff --git a/linphone-app/src/app/App.cpp b/linphone-app/src/app/App.cpp index eb89df975..ca0cdefe0 100644 --- a/linphone-app/src/app/App.cpp +++ b/linphone-app/src/app/App.cpp @@ -636,9 +636,12 @@ void App::registerTypes () { registerUncreatableType("HistoryModel"); registerUncreatableType("LdapModel"); registerUncreatableType("SearchResultModel"); - registerUncreatableType("SipAddressObserver"); + registerUncreatableType("SipAddressObserver"); registerUncreatableType("VcardModel"); registerUncreatableType("TimelineModel"); + registerUncreatableType("TunnelModel"); + registerUncreatableType("TunnelConfigModel"); + registerUncreatableType("TunnelConfigProxyModel"); registerUncreatableType("ParticipantModel"); registerUncreatableType("ParticipantListModel"); registerUncreatableType("ParticipantDeviceModel"); diff --git a/linphone-app/src/components/Components.hpp b/linphone-app/src/components/Components.hpp index 1eb47f2e9..37688b1e8 100644 --- a/linphone-app/src/components/Components.hpp +++ b/linphone-app/src/components/Components.hpp @@ -75,6 +75,10 @@ #include "timeline/TimelineModel.hpp" #include "timeline/TimelineProxyModel.hpp" #include "timeline/TimelineListModel.hpp" +#include "tunnel/TunnelModel.hpp" +#include "tunnel/TunnelConfigModel.hpp" +#include "tunnel/TunnelConfigListModel.hpp" +#include "tunnel/TunnelConfigProxyModel.hpp" #include "url-handlers/UrlHandlers.hpp" #include "other/colors/ColorModel.hpp" diff --git a/linphone-app/src/components/chat-room/ChatRoomModel.hpp b/linphone-app/src/components/chat-room/ChatRoomModel.hpp index afec81154..c238eea79 100644 --- a/linphone-app/src/components/chat-room/ChatRoomModel.hpp +++ b/linphone-app/src/components/chat-room/ChatRoomModel.hpp @@ -115,7 +115,7 @@ public: CallEntry, NoticeEntry }; - Q_ENUM(EntryType); + Q_ENUM(EntryType) //Q_PROPERTY(QString participants READ getParticipants NOTIFY participantsChanged); diff --git a/linphone-app/src/components/settings/SettingsModel.cpp b/linphone-app/src/components/settings/SettingsModel.cpp index e0c039722..2b1a109b9 100644 --- a/linphone-app/src/components/settings/SettingsModel.cpp +++ b/linphone-app/src/components/settings/SettingsModel.cpp @@ -30,12 +30,14 @@ #include "app/logger/Logger.hpp" #include "app/paths/Paths.hpp" #include "components/core/CoreManager.hpp" +#include "components/tunnel/TunnelModel.hpp" #include "include/LinphoneApp/PluginNetworkHelper.hpp" #include "utils/Utils.hpp" #include "utils/Constants.hpp" #include "utils/MediastreamerUtils.hpp" #include "SettingsModel.hpp" + // ============================================================================= using namespace std; @@ -1144,6 +1146,16 @@ void SettingsModel::configureRlsUri (const shared_ptrsetString("sip", "rls_uri", ""); } +//------------------------------------------------------------------------------ + +bool SettingsModel::tunnelAvailable() const{ + return CoreManager::getInstance()->getCore()->tunnelAvailable(); +} + +TunnelModel* SettingsModel::getTunnel() const{ + return new TunnelModel(CoreManager::getInstance()->getCore()->getTunnel()); +} + // ============================================================================= // UI. // ============================================================================= @@ -1343,6 +1355,13 @@ bool SettingsModel::getLogsEnabled (const shared_ptr &config) } // --------------------------------------------------------------------------- +bool SettingsModel::isDeveloperSettingsAvailable() const { +#ifdef DEBUG + return true; +#else + return false; +#endif +} bool SettingsModel::getDeveloperSettingsEnabled () const { #ifdef DEBUG return !!mConfig->getInt(UiSection, "developer_settings", 0); diff --git a/linphone-app/src/components/settings/SettingsModel.hpp b/linphone-app/src/components/settings/SettingsModel.hpp index 4463107b3..3d5a10efa 100644 --- a/linphone-app/src/components/settings/SettingsModel.hpp +++ b/linphone-app/src/components/settings/SettingsModel.hpp @@ -31,6 +31,7 @@ #include "components/contacts/ContactsImporterModel.hpp" // ============================================================================= +class TunnelModel; class SettingsModel : public QObject { Q_OBJECT @@ -430,6 +431,9 @@ public: void configureRlsUri (); void configureRlsUri (const std::shared_ptr &proxyConfig); + Q_INVOKABLE bool tunnelAvailable() const; + Q_INVOKABLE TunnelModel * getTunnel() const; + // UI. ----------------------------------------------------------------------- QFont getTextMessageFont() const; @@ -480,7 +484,7 @@ public: static bool getLogsEnabled (const std::shared_ptr &config); // --------------------------------------------------------------------------- - + Q_INVOKABLE bool isDeveloperSettingsAvailable() const; bool getDeveloperSettingsEnabled () const; void setDeveloperSettingsEnabled (bool status); @@ -490,7 +494,6 @@ public: bool getIsInCall() const; - bool isReadOnly(const std::string& section, const std::string& name) const; std::string getEntryFullName(const std::string& section, const std::string& name) const; // Return the full name of the entry : 'name/readonly' or 'name' @@ -611,7 +614,7 @@ signals: void dscpVideoChanged (int dscp); void rlsUriEnabledChanged (bool status); - + // UI. ----------------------------------------------------------------------- void textMessageFontChanged(const QFont& font); diff --git a/linphone-app/src/components/tunnel/TunnelConfigListModel.cpp b/linphone-app/src/components/tunnel/TunnelConfigListModel.cpp new file mode 100644 index 000000000..dbf93bd42 --- /dev/null +++ b/linphone-app/src/components/tunnel/TunnelConfigListModel.cpp @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2021 Belledonne Communications SARL. + * + * This file is part of linphone-desktop + * (see https://www.linphone.org). + * + * 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 . + */ + +#include + +#include "app/App.hpp" + +#include "TunnelConfigListModel.hpp" +#include "utils/Utils.hpp" + +#include "components/Components.hpp" + +// ============================================================================= + +TunnelConfigListModel::TunnelConfigListModel (std::shared_ptr tunnel, QObject *parent) : QAbstractListModel(parent) { + std::list> tunnelConfigs = tunnel->getServers() ; + for(auto config : tunnelConfigs){ + auto configModel = std::make_shared(config); + mList << configModel; + } + if( mList.size() == 0) { + mList << std::make_shared(linphone::Factory::get()->createTunnelConfig()); + } +} + +int TunnelConfigListModel::rowCount (const QModelIndex &index) const{ + return mList.count(); +} + +int TunnelConfigListModel::count(){ + return mList.count(); +} + +void TunnelConfigListModel::updateTunnelConfigs(std::shared_ptr tunnel){ + std::list> tunnelConfigs = tunnel->getServers() ; + beginResetModel(); + mList.clear(); + for(auto config : tunnelConfigs){ + mList << std::make_shared(config); + } + endResetModel(); + emit layoutChanged(); +} + +bool TunnelConfigListModel::apply(std::shared_ptr tunnel){ + tunnel->cleanServers(); + for(auto config : mList){ + tunnel->addServer(config->getTunnelConfig()); + } + updateTunnelConfigs(tunnel); + return true; +} + +void TunnelConfigListModel::addTunnelConfig(){ + int row = rowCount(); + beginInsertRows(QModelIndex(),row,row); + mList << std::make_shared(linphone::Factory::get()->createTunnelConfig()); + endInsertRows(); +} + +void TunnelConfigListModel::removeTunnelConfig(std::shared_ptr tunnel, TunnelConfigModel * model){ + int row = 0; + while(row < mList.size() && mList[row].get() != model) + ++row; + if( row < mList.size()) { + removeRow(row); + tunnel->removeServer(model->getTunnelConfig()); + } +} + +QHash TunnelConfigListModel::roleNames () const { + QHash roles; + roles[Qt::DisplayRole] = "$tunnelConfig"; + return roles; +} + +QVariant TunnelConfigListModel::data (const QModelIndex &index, int role) const { + int row = index.row(); + + if (!index.isValid() || row < 0 || row >= mList.count()) + return QVariant(); + + if (role == Qt::DisplayRole) + return QVariant::fromValue(mList[row].get()); + + return QVariant(); +} + +bool TunnelConfigListModel::removeRow (int row, const QModelIndex &parent){ + return removeRows(row, 1, parent); +} + +bool TunnelConfigListModel::removeRows (int row, int count, const QModelIndex &parent) { + int limit = row + count - 1; + + if (row < 0 || count < 0 || limit >= mList.count()) + return false; + + beginRemoveRows(parent, row, limit); + + for (int i = 0; i < count; ++i) + mList.takeAt(row); + + endRemoveRows(); + + return true; +} diff --git a/linphone-app/src/components/tunnel/TunnelConfigListModel.hpp b/linphone-app/src/components/tunnel/TunnelConfigListModel.hpp new file mode 100644 index 000000000..f70a6abbf --- /dev/null +++ b/linphone-app/src/components/tunnel/TunnelConfigListModel.hpp @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2021 Belledonne Communications SARL. + * + * This file is part of linphone-desktop + * (see https://www.linphone.org). + * + * 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 . + */ + +#ifndef TUNNEL_CONFIG_LIST_MODEL_H_ +#define TUNNEL_CONFIG_LIST_MODEL_H_ + + +#include +// ============================================================================= +#include +#include +#include +#include + +class TunnelConfigModel; + +class TunnelConfigListModel : public QAbstractListModel { + Q_OBJECT + +public: + TunnelConfigListModel (std::shared_ptr tunnel, QObject *parent = nullptr); + + int rowCount (const QModelIndex &index = QModelIndex()) const override; + int count(); + + void updateTunnelConfigs(std::shared_ptr tunnel); + bool apply(std::shared_ptr tunnel); + void addTunnelConfig(); + void removeTunnelConfig(std::shared_ptr tunnel, TunnelConfigModel * model); + + virtual QHash roleNames () const override; + virtual QVariant data (const QModelIndex &index, int role = Qt::DisplayRole) const override; + + +private: + bool removeRow (int row, const QModelIndex &parent = QModelIndex()); + virtual bool removeRows (int row, int count, const QModelIndex &parent = QModelIndex()) override; + + QList> mList; + +}; + +Q_DECLARE_METATYPE(std::shared_ptr) + +#endif // TUNNEL_CONFIG_LIST_MODEL_H_ diff --git a/linphone-app/src/components/tunnel/TunnelConfigModel.cpp b/linphone-app/src/components/tunnel/TunnelConfigModel.cpp new file mode 100644 index 000000000..bb3d0ac3f --- /dev/null +++ b/linphone-app/src/components/tunnel/TunnelConfigModel.cpp @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2021 Belledonne Communications SARL. + * + * This file is part of linphone-desktop + * (see https://www.linphone.org). + * + * 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 . + */ + +#include + +#include "app/App.hpp" + +#include "TunnelConfigModel.hpp" +#include "utils/Utils.hpp" + +#include "components/Components.hpp" + +// ============================================================================= + +using namespace std; + +TunnelConfigModel::TunnelConfigModel (shared_ptr tunnelConfig, QObject *parent) : QObject(parent) { + mTunnelConfig = tunnelConfig; +} + +// ----------------------------------------------------------------------------- + +QString TunnelConfigModel::getHost() const{ + return Utils::coreStringToAppString(mTunnelConfig->getHost()); +} + +QString TunnelConfigModel::getHost2() const{ + return Utils::coreStringToAppString(mTunnelConfig->getHost2()); +} + +int TunnelConfigModel::getPort() const{ + return mTunnelConfig->getPort(); +} + +int TunnelConfigModel::getPort2() const{ + return mTunnelConfig->getPort2(); +} + +int TunnelConfigModel::getRemoteUdpMirrorPort() const{ + return mTunnelConfig->getRemoteUdpMirrorPort(); +} + +int TunnelConfigModel::getDelay() const{ + return mTunnelConfig->getDelay(); +} + +void TunnelConfigModel::setHost(const QString& host){ + mTunnelConfig->setHost(Utils::appStringToCoreString(host)); + emit hostChanged(); +} + +void TunnelConfigModel::setHost2(const QString& host){ + mTunnelConfig->setHost2(Utils::appStringToCoreString(host)); + emit host2Changed(); +} + +void TunnelConfigModel::setPort(const int& port){ + mTunnelConfig->setPort(port); + emit portChanged(); +} + +void TunnelConfigModel::setPort2(const int& port){ + mTunnelConfig->setPort2(port); + emit port2Changed(); +} + +void TunnelConfigModel::setRemoteUdpMirrorPort(const int& port){ + mTunnelConfig->setRemoteUdpMirrorPort(port); + emit remoteUdpMirrorPortChanged(); +} + +void TunnelConfigModel::setDelay(const int& delay){ + mTunnelConfig->setDelay(delay); + emit delayChanged(); +} + +std::shared_ptr TunnelConfigModel::getTunnelConfig(){ + return mTunnelConfig; +} diff --git a/linphone-app/src/components/tunnel/TunnelConfigModel.hpp b/linphone-app/src/components/tunnel/TunnelConfigModel.hpp new file mode 100644 index 000000000..5b99784ed --- /dev/null +++ b/linphone-app/src/components/tunnel/TunnelConfigModel.hpp @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2021 Belledonne Communications SARL. + * + * This file is part of linphone-desktop + * (see https://www.linphone.org). + * + * 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 . + */ + +#ifndef TUNNEL_CONFIG_MODEL_H_ +#define TUNNEL_CONFIG_MODEL_H_ + + +#include +// ============================================================================= +#include +#include + +class TunnelConfigModel : public QObject { + Q_OBJECT + +public: + TunnelConfigModel (std::shared_ptr config, QObject *parent = nullptr); + + Q_PROPERTY(QString host READ getHost WRITE setHost NOTIFY hostChanged) + Q_PROPERTY(QString host2 READ getHost2 WRITE setHost2 NOTIFY host2Changed) + Q_PROPERTY(int port READ getPort WRITE setPort NOTIFY portChanged) + Q_PROPERTY(int port2 READ getPort2 WRITE setPort2 NOTIFY port2Changed) + Q_PROPERTY(int remoteUdpMirrorPort READ getRemoteUdpMirrorPort WRITE setRemoteUdpMirrorPort NOTIFY remoteUdpMirrorPortChanged) + Q_PROPERTY(int delay READ getDelay WRITE setDelay NOTIFY delayChanged) + + QString getHost() const; + QString getHost2() const; + int getPort() const; + int getPort2() const; + int getRemoteUdpMirrorPort() const; + int getDelay() const; + + void setHost(const QString& host); + void setHost2(const QString& host); + void setPort(const int& port); + void setPort2(const int& port); + void setRemoteUdpMirrorPort(const int& port); + void setDelay(const int& delay); + + std::shared_ptr getTunnelConfig(); + +signals: + void hostChanged(); + void host2Changed(); + void portChanged(); + void port2Changed(); + void remoteUdpMirrorPortChanged(); + void delayChanged(); + +private: + + std::shared_ptr mTunnelConfig; + +}; + +Q_DECLARE_METATYPE(std::shared_ptr) + +#endif // TUNNEL_CONFIG_MODEL diff --git a/linphone-app/src/components/tunnel/TunnelConfigProxyModel.cpp b/linphone-app/src/components/tunnel/TunnelConfigProxyModel.cpp new file mode 100644 index 000000000..46f0ae5d9 --- /dev/null +++ b/linphone-app/src/components/tunnel/TunnelConfigProxyModel.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2021 Belledonne Communications SARL. + * + * This file is part of linphone-desktop + * (see https://www.linphone.org). + * + * 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 . + */ + +#include + +#include "app/App.hpp" + +#include "TunnelConfigProxyModel.hpp" +#include "utils/Utils.hpp" + +#include "components/Components.hpp" +#include "TunnelConfigListModel.hpp" + +// ============================================================================= + +TunnelConfigProxyModel::TunnelConfigProxyModel (QObject *parent) : QSortFilterProxyModel(parent){ +} + +bool TunnelConfigProxyModel::filterAcceptsRow ( + int sourceRow, + const QModelIndex &sourceParent +) const { + Q_UNUSED(sourceRow) + Q_UNUSED(sourceParent) + return true; +} + +bool TunnelConfigProxyModel::lessThan (const QModelIndex &left, const QModelIndex &right) const { + const TunnelConfigModel *deviceA = sourceModel()->data(left).value(); + const TunnelConfigModel *deviceB = sourceModel()->data(right).value(); + + return deviceA->getHost() > deviceB->getHost(); +} +//--------------------------------------------------------------------------------- + +void TunnelConfigProxyModel::setTunnel(TunnelModel * tunnel){ + setSourceModel(tunnel->getTunnelConfigs().get()); +} \ No newline at end of file diff --git a/linphone-app/src/components/tunnel/TunnelConfigProxyModel.hpp b/linphone-app/src/components/tunnel/TunnelConfigProxyModel.hpp new file mode 100644 index 000000000..c725af40a --- /dev/null +++ b/linphone-app/src/components/tunnel/TunnelConfigProxyModel.hpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2021 Belledonne Communications SARL. + * + * This file is part of linphone-desktop + * (see https://www.linphone.org). + * + * 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 . + */ + +#ifndef TUNNEL_CONFIG_PROXY_MODEL_H_ +#define TUNNEL_CONFIG_PROXY_MODEL_H_ + + +#include +// ============================================================================= +#include +#include +#include +#include + +class TunnelConfigListModel; +class TunnelModel; + +class TunnelConfigProxyModel : public QSortFilterProxyModel { + Q_OBJECT + +public: + TunnelConfigProxyModel (QObject *parent = nullptr); + + void setTunnel(TunnelModel * tunnel); + +protected: + virtual bool filterAcceptsRow (int sourceRow, const QModelIndex &sourceParent) const override; + virtual bool lessThan (const QModelIndex &left, const QModelIndex &right) const override; + + std::shared_ptr mTunnelConfigs; + +}; + +#endif diff --git a/linphone-app/src/components/tunnel/TunnelModel.cpp b/linphone-app/src/components/tunnel/TunnelModel.cpp new file mode 100644 index 000000000..db2606833 --- /dev/null +++ b/linphone-app/src/components/tunnel/TunnelModel.cpp @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2021 Belledonne Communications SARL. + * + * This file is part of linphone-desktop + * (see https://www.linphone.org). + * + * 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 . + */ + +#include + +#include "app/App.hpp" + +#include "TunnelModel.hpp" +#include "utils/Utils.hpp" + +#include "components/Components.hpp" + +// ============================================================================= + +using namespace std; + +TunnelModel::TunnelModel (shared_ptr tunnel, QObject *parent) : QObject(parent) { + App::getInstance()->getEngine()->setObjectOwnership(this, QQmlEngine::CppOwnership);// Avoid QML to destroy it when passing by Q_INVOKABLE + mTunnel = tunnel; + if(mTunnel){ + mTunnelConfigs = std::make_shared(mTunnel); + } +} + +// ----------------------------------------------------------------------------- + +QString TunnelModel::getDomain() const{ + return Utils::coreStringToAppString(mTunnel->getDomain()); +} + +QString TunnelModel::getUsername() const{ + return Utils::coreStringToAppString(mTunnel->getUsername()); +} + +bool TunnelModel::getDualModeEnabled() const{ + return mTunnel->dualModeEnabled(); +} + +LinphoneEnums::TunnelMode TunnelModel::getMode() const{ + return LinphoneEnums::fromLinphone(mTunnel->getMode()); +} + +bool TunnelModel::getSipEnabled() const{ + return mTunnel->sipEnabled(); +} + +// ----------------------------------------------------------------------------- + +void TunnelModel::setDomain(const QString& data){ + mTunnel->setDomain(Utils::appStringToCoreString(data)); + emit domainChanged(); +} + +void TunnelModel::setUsername(const QString& data){ + mTunnel->setUsername(Utils::appStringToCoreString(data)); + emit usernameChanged(); +} + +void TunnelModel::setDualModeEnabled(const bool& data){ + mTunnel->enableDualMode(data); + emit dualModeEnabledChanged(); +} + +void TunnelModel::setMode(const LinphoneEnums::TunnelMode& data){ + mTunnel->setMode(LinphoneEnums::toLinphone(data)); + emit modeChanged(); +} + +void TunnelModel::setSipEnabled(const bool& data){ + mTunnel->enableSip(data); + emit sipEnabledChanged(); +} + +// ----------------------------------------------------------------------------- + +std::shared_ptr TunnelModel::getTunnel(){ + return mTunnel; +} + +TunnelConfigProxyModel * TunnelModel::getTunnelProxyConfigs(){ + TunnelConfigProxyModel * configs = new TunnelConfigProxyModel(); + configs->setTunnel(this); + return configs; +} + +std::shared_ptr TunnelModel::getTunnelConfigs(){ + return mTunnelConfigs; +} + +bool TunnelModel::apply(){ + return mTunnelConfigs->apply(mTunnel); +} + +void TunnelModel::addTunnelConfig(){ + mTunnelConfigs->addTunnelConfig(); +} + +void TunnelModel::removeTunnelConfig(TunnelConfigModel * model){ + mTunnelConfigs->removeTunnelConfig(mTunnel, model); +} + +bool TunnelModel::getActivated()const{ + if(mTunnel) + return mTunnel->getActivated(); + else + return false; +} + +void TunnelModel::setHttpProxy(const QString& host, int port, const QString& username, const QString& passwd){ + mTunnel->setHttpProxy(Utils::appStringToCoreString(host), port, Utils::appStringToCoreString(username), Utils::appStringToCoreString(passwd)); +} \ No newline at end of file diff --git a/linphone-app/src/components/tunnel/TunnelModel.hpp b/linphone-app/src/components/tunnel/TunnelModel.hpp new file mode 100644 index 000000000..5a3689f52 --- /dev/null +++ b/linphone-app/src/components/tunnel/TunnelModel.hpp @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2021 Belledonne Communications SARL. + * + * This file is part of linphone-desktop + * (see https://www.linphone.org). + * + * 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 . + */ + +#ifndef TUNNEL_MODEL_H_ +#define TUNNEL_MODEL_H_ + +#include "utils/LinphoneEnums.hpp" + +#include +// ============================================================================= +#include +#include +#include + +class TunnelConfigListModel; +class TunnelConfigProxyModel; +class TunnelConfigModel; + +class TunnelModel : public QObject { + Q_OBJECT + +public: + TunnelModel (std::shared_ptr linphoneTunnel, QObject *parent = nullptr); + + + Q_PROPERTY(QString domain READ getDomain WRITE setDomain NOTIFY domainChanged) + Q_PROPERTY(QString username READ getUsername WRITE setUsername NOTIFY usernameChanged) + Q_PROPERTY(bool dualModeEnabled READ getDualModeEnabled WRITE setDualModeEnabled NOTIFY dualModeEnabledChanged) + Q_PROPERTY(LinphoneEnums::TunnelMode mode READ getMode WRITE setMode NOTIFY modeChanged) + Q_PROPERTY(bool sipEnabled READ getSipEnabled WRITE setSipEnabled NOTIFY sipEnabledChanged) + + QString getDomain() const; + QString getUsername() const; + bool getDualModeEnabled() const; + LinphoneEnums::TunnelMode getMode() const; + bool getSipEnabled() const; + + void setDomain(const QString& data); + void setUsername(const QString& data); + void setDualModeEnabled(const bool& data); + void setMode(const LinphoneEnums::TunnelMode& data); + void setSipEnabled(const bool& data); + + std::shared_ptr getTunnel(); + Q_INVOKABLE TunnelConfigProxyModel * getTunnelProxyConfigs(); + std::shared_ptr getTunnelConfigs(); + Q_INVOKABLE bool apply(); + Q_INVOKABLE void addTunnelConfig(); + Q_INVOKABLE void removeTunnelConfig(TunnelConfigModel * model); + Q_INVOKABLE bool getActivated()const; + Q_INVOKABLE void setHttpProxy(const QString& host, int port, const QString& username, const QString& passwd); + +signals: + void domainChanged(); + void usernameChanged(); + void sipAddressChanged(); + void dualModeEnabledChanged(); + void modeChanged(); + void sipEnabledChanged(); +private: + + std::shared_ptr mTunnel; + std::shared_ptr mTunnelConfigs; +}; + +Q_DECLARE_METATYPE(std::shared_ptr); + +#endif // TUNNEL_MODEL_H_ diff --git a/linphone-app/src/utils/LinphoneEnums.cpp b/linphone-app/src/utils/LinphoneEnums.cpp index d4ebdae24..b5ee6f0b5 100644 --- a/linphone-app/src/utils/LinphoneEnums.cpp +++ b/linphone-app/src/utils/LinphoneEnums.cpp @@ -65,4 +65,11 @@ linphone::Call::Status LinphoneEnums::toLinphone(const LinphoneEnums::CallStatus } LinphoneEnums::CallStatus LinphoneEnums::fromLinphone(const linphone::Call::Status& data){ return static_cast(data); -} \ No newline at end of file +} + +linphone::Tunnel::Mode LinphoneEnums::toLinphone(const LinphoneEnums::TunnelMode& data){ + return static_cast(data); +} +LinphoneEnums::TunnelMode LinphoneEnums::fromLinphone(const linphone::Tunnel::Mode& data){ + return static_cast(data); +} diff --git a/linphone-app/src/utils/LinphoneEnums.hpp b/linphone-app/src/utils/LinphoneEnums.hpp index e7c36f7ea..95ee581c3 100644 --- a/linphone-app/src/utils/LinphoneEnums.hpp +++ b/linphone-app/src/utils/LinphoneEnums.hpp @@ -106,13 +106,21 @@ enum CallStatus { CallStatusEarlyAborted = int(linphone::Call::Status::EarlyAborted), CallStatusAcceptedElsewhere = int(linphone::Call::Status::AcceptedElsewhere), CallStatusDeclinedElsewhere = int(linphone::Call::Status::DeclinedElsewhere) - }; +}; Q_ENUM_NS(CallStatus) linphone::Call::Status toLinphone(const LinphoneEnums::CallStatus& capability); LinphoneEnums::CallStatus fromLinphone(const linphone::Call::Status& capability); +enum TunnelMode { + TunnelModeDisable = int(linphone::Tunnel::Mode::Disable), + TunnelModeEnable= int(linphone::Tunnel::Mode::Enable), + TunnelModeAuto = int(linphone::Tunnel::Mode::Auto) +}; +Q_ENUM_NS(TunnelMode) +linphone::Tunnel::Mode toLinphone(const LinphoneEnums::TunnelMode& mode); +LinphoneEnums::TunnelMode fromLinphone(const linphone::Tunnel::Mode& mode); } Q_DECLARE_METATYPE(LinphoneEnums::MediaEncryption) @@ -120,5 +128,6 @@ Q_DECLARE_METATYPE(LinphoneEnums::FriendCapability) Q_DECLARE_METATYPE(LinphoneEnums::EventLogType) Q_DECLARE_METATYPE(LinphoneEnums::ChatMessageState) Q_DECLARE_METATYPE(LinphoneEnums::CallStatus) +Q_DECLARE_METATYPE(LinphoneEnums::TunnelMode) #endif diff --git a/linphone-app/src/utils/Utils.cpp b/linphone-app/src/utils/Utils.cpp index 2f92006c1..82199fafe 100644 --- a/linphone-app/src/utils/Utils.cpp +++ b/linphone-app/src/utils/Utils.cpp @@ -97,6 +97,22 @@ QString Utils::getDisplayName(const QString& address){ return getDisplayName(interpretUrl(address)); } +QString Utils::toString(const LinphoneEnums::TunnelMode& mode){ + switch(mode){ + case LinphoneEnums::TunnelMode::TunnelModeEnable : + //: 'Enable' : One word for button action to enable tunnel mode. + return QObject::tr("LinphoneEnums_TunnelModeEnable"); + case LinphoneEnums::TunnelMode::TunnelModeDisable : + //: 'Disable' : One word for button action to disable tunnel mode. + return QObject::tr("LinphoneEnums_TunnelModeDisable"); + case LinphoneEnums::TunnelMode::TunnelModeAuto : + //: 'Auto' : One word for button action to set the auto tunnel mode. + return QObject::tr("LinphoneEnums_TunnelModeAuto"); + default: + return ""; + } +} + QImage Utils::getImage(const QString &pUri) { QImage image(pUri); if(image.isNull()){// Try to determine format from headers instead of using suffix diff --git a/linphone-app/src/utils/Utils.hpp b/linphone-app/src/utils/Utils.hpp index ade0bbec9..d88924e81 100644 --- a/linphone-app/src/utils/Utils.hpp +++ b/linphone-app/src/utils/Utils.hpp @@ -57,6 +57,7 @@ public: Q_INVOKABLE static QString toTimeString(QDateTime date); Q_INVOKABLE static QString toDateString(QDateTime date); Q_INVOKABLE static QString getDisplayName(const QString& address); + Q_INVOKABLE static QString toString(const LinphoneEnums::TunnelMode& mode); //---------------------------------------------------------------------------------- static inline QString coreStringToAppString (const std::string &str) { diff --git a/linphone-app/ui/modules/Common/Form/Placements/Form.qml b/linphone-app/ui/modules/Common/Form/Placements/Form.qml index 943f24be7..13d251ba9 100644 --- a/linphone-app/ui/modules/Common/Form/Placements/Form.qml +++ b/linphone-app/ui/modules/Common/Form/Placements/Form.qml @@ -11,6 +11,8 @@ Column { property int orientation: Qt.Horizontal property bool addButton : false signal addButtonClicked; + property bool removeButton : false + signal removeButtonClicked; // --------------------------------------------------------------------------- @@ -43,6 +45,14 @@ Column { scale:0.8 onClicked:addButtonClicked() } + ActionButton { + visible:removeButton + anchors.verticalCenter: parent.verticalCenter + icon: 'delete' + iconSize:38 + scale:0.8 + onClicked:removeButtonClicked() + } } Rectangle { diff --git a/linphone-app/ui/views/App/Settings/SettingsAdvanced.qml b/linphone-app/ui/views/App/Settings/SettingsAdvanced.qml index 9b55b56ae..914a6dd95 100644 --- a/linphone-app/ui/views/App/Settings/SettingsAdvanced.qml +++ b/linphone-app/ui/views/App/Settings/SettingsAdvanced.qml @@ -319,7 +319,7 @@ TabContainer { Form { title: qsTr('developerSettingsTitle') - visible: SettingsModel.developerSettingsEnabled + visible: SettingsModel.isDeveloperSettingsAvailable() width: parent.width FormLine { diff --git a/linphone-app/ui/views/App/Settings/SettingsTunnel.qml b/linphone-app/ui/views/App/Settings/SettingsTunnel.qml new file mode 100644 index 000000000..73e74bd02 --- /dev/null +++ b/linphone-app/ui/views/App/Settings/SettingsTunnel.qml @@ -0,0 +1,286 @@ +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 UtilsCpp 1.0 + +import App.Styles 1.0 + +// ============================================================================= + +TabContainer { + Column { + spacing: SettingsWindowStyle.forms.spacing + width: parent.width + Form{ + width: view.width + FormLine { + FormGroup { + //: 'Tunnel Status' : Field title to introduce the status of the tunnel (activated or not) + label: qsTr('tunnelStatus') + RowLayout{ + Icon{ + Layout.preferredWidth: 20 + icon: 'led_orange' + iconSize: 20 + function update(){ + if( view.tunnelModel.getActivated()) + icon = 'led_green' + else + icon = 'led_red' + } + onVisibleChanged: if(visible){ + icon = 'led_orange' + tunnelStatusTimer.start() + }else{ + tunnelStatusTimer.stop() + icon = 'led_orange' + } + Timer{ + id: tunnelStatusTimer + interval: 1000 + onTriggered: parent.update() + repeat: true + } + } + Item{ + Layout.fillWidth: true + } + } + } + } + //---------------- DEVELOPER SETTINGS FOR TUNNEL + FormLine { + visible: SettingsModel.developerSettingsEnabled + FormGroup { + //: 'Domain' : Field title of a textfield to set domain. + label: qsTr('tunnelDomain') + TextField { + text: view.tunnelModel.domain + onEditingFinished: view.tunnelModel.domain = text + } + } + } + FormLine { + visible: SettingsModel.developerSettingsEnabled + FormGroup { + //: 'Username' : Field title of a textfield to set username. + label: qsTr('tunnelUsername') + TextField { + text: view.tunnelModel.username + onEditingFinished: view.tunnelModel.username = text + } + } + } + FormLine { + visible: SettingsModel.developerSettingsEnabled + FormGroup { + //: 'SIP' : Field title of a switch to set SIP mode. + label: qsTr('tunnelSIP') + Switch { + checked: view.tunnelModel.sipEnabled + onClicked: view.tunnelModel.sipEnabled = !checked + } + } + + TextButtonA{ + //: 'Cancel' : Button to cancel the action. + text: (proxyHttpOptions.showProxyOptions? qsTr('cancel'): + //: 'Set HTTP proxy' : Button to set the new proxy. + qsTr('setHTTPProxy')) + onClicked:{ + proxyHttpOptions.showProxyOptions = !proxyHttpOptions.showProxyOptions + } + Layout.preferredWidth: 100 + } + } + FormLine{ + visible: SettingsModel.developerSettingsEnabled + RowLayout{ + id: proxyHttpOptions + property bool showProxyOptions : false + + TextField { + id: proxyHttpHost + visible: parent.showProxyOptions + //: 'Host' : Placeholder to set hostname. + placeholderText: qsTr('proxyHttpHost') + } + NumericField{ + id: proxyHttpPort + visible: parent.showProxyOptions + //: 'Port' : Placehoilder to set port. + placeholderText: qsTr('proxyHttpPort') + Layout.preferredWidth: 100 + maxValue: 65535 + } + TextField { + id: proxyHttpUsername + visible: parent.showProxyOptions + //: 'Username' : Placeholder to set username. + placeholderText: qsTr('proxyHttpUsername') + } + PasswordField { + id: proxyHttpPassword + visible: parent.showProxyOptions + //: 'Password' : Placeholder to set password. + placeholderText: qsTr('proxyHttpPassword') + onVisibleChanged: if(!visible) text='' + } + TextButtonB{ + visible: parent.showProxyOptions + //: 'Apply' : Button to set proxy from changes. + text: qsTr('proxyHttpApply') + onClicked: { + view.tunnelModel.setHttpProxy(proxyHttpHost.text, proxyHttpPort.text, proxyHttpUsername.text, proxyHttpPassword.text) + parent.showProxyOptions = false + } + } + } + } + //---------------- USER SETTINGS FOR TUNNEL + FormLine { + FormGroup { + //: 'Mode' : Field title on form to set tunnel mode. + label: qsTr('serverMode') + ExclusiveButtons { + id: mode + property var modes: [ [LinphoneEnums.TunnelModeDisable], + [LinphoneEnums.TunnelModeEnable], + [LinphoneEnums.TunnelModeAuto] + ] + texts: modes.map(value => UtilsCpp.toString(value[0]) ) + onClicked: view.tunnelModel.mode = modes[button][0] + Binding { + property: 'selectedButton' + target: mode + value: { + var toFound = view.tunnelModel.mode + return Number(Utils.findIndex(mode.modes, function (value) { + return toFound == value[0] + })) + } + } + } + } + } + FormLine { + FormGroup { + //: 'Dual mode' : Field title on form to set dual mode of the tunnel. + label: qsTr('serverDualMode') + Switch { + checked: view.tunnelModel.dualModeEnabled + onClicked: view.tunnelModel.dualModeEnabled = !checked + } + } + } + } + //---------------------------------------------------------------------------------------------------- + Repeater { + id: view + property TunnelModel tunnelModel : SettingsModel.getTunnel() + property TunnelConfigProxyModel tunnelConfigProxyModel: tunnelModel.getTunnelProxyConfigs() + + width: parent.width + model: tunnelConfigProxyModel + delegate: + Form { + //: 'Server' : Title form to set a server + title: qsTr('serverTitle')+' : '+modelData.host+(view.tunnelModel.dualModeEnabled?' / '+modelData.host2:'') + width: view.width + removeButton: SettingsModel.developerSettingsEnabled + onRemoveButtonClicked: {view.tunnelModel.removeTunnelConfig(modelData)} + + FormLine { + FormGroup { + //: 'Hostname' : Field title on form to set hostname. + label: qsTr('serverHostname') + TextField { + text: modelData.host + onEditingFinished: modelData.host = text + } + } + } + FormLine { + FormGroup { + //: 'Port' : Field title on form to set port. + label: qsTr('serverPort') + NumericField { + text: modelData.port + onEditingFinished: modelData.port = text + maxValue: 65535 + } + } + } + FormLine { + visible: view.tunnelModel.dualModeEnabled + FormGroup { + //: 'Dual hostname URL' : Field title on form to set the second hostname for dual configuration. + label: qsTr('serverDualHostname') + TextField { + text: modelData.host2 + onEditingFinished: modelData.host2 = text + } + } + } + FormLine { + visible: view.tunnelModel.dualModeEnabled + FormGroup { + //: 'Dual port' : Field title on form to set the second port for the dual configuration. + label: qsTr('serverDualPort') + NumericField { + text: modelData.port2 + onEditingFinished: modelData.port2 = text + maxValue: 65535 + } + } + } + //------------------------- DEVELOPER SETTINGS FOR SERVER + FormLine { + visible: SettingsModel.developerSettingsEnabled + FormGroup { + //: 'Remote UDP mirror port' : Field title on form to set the remote UDP mirror port. + label: qsTr('serverRemoteUDPMirrorPort') + NumericField { + text: modelData.remoteUdpMirrorPort + onEditingFinished: modelData.remoteUdpMirrorPort = text + maxValue: 65535 + } + } + } + FormLine { + visible: SettingsModel.developerSettingsEnabled + FormGroup { + //: 'Delay' : Field title on form to set the delay of the tunnel. + label: qsTr('serverDelay') + NumericField { + text: modelData.delay + onEditingFinished: modelData.delay = text + } + } + } + } + } + + RowLayout{ + width: parent.width + TextButtonB { + visible: SettingsModel.developerSettingsEnabled + //: 'Add server' : Button for adding a server + text: qsTr('tunnelAddServer') + onClicked: {view.tunnelModel.addTunnelConfig()} + } + Item{ + Layout.fillWidth: true + } + TextButtonB { + //: 'Apply' : Button to apply changes. + text: qsTr('tunnelApply') + onClicked: view.tunnelModel.apply() + } + } + } +} diff --git a/linphone-app/ui/views/App/Settings/SettingsWindow.qml b/linphone-app/ui/views/App/Settings/SettingsWindow.qml index 0227c4e33..b20f43d4b 100644 --- a/linphone-app/ui/views/App/Settings/SettingsWindow.qml +++ b/linphone-app/ui/views/App/Settings/SettingsWindow.qml @@ -12,152 +12,151 @@ import App.Styles 1.0 // ============================================================================= ApplicationWindow { - id: window - - minimumHeight: SettingsWindowStyle.height - minimumWidth: SettingsWindowStyle.width - - title: qsTr('settingsTitle') - - onClosing: SettingsModel.settingsWindowClosing() - - // --------------------------------------------------------------------------- - - Shortcut { - sequence: StandardKey.Close - onActivated: window.hide() - } - - // --------------------------------------------------------------------------- - - Rectangle { - anchors.fill: parent - color: SettingsWindowStyle.color - } - - ColumnLayout { - anchors.fill: parent - spacing: 0 - - // ------------------------------------------------------------------------- - // Navigation bar. - // ------------------------------------------------------------------------- - - RowLayout { - Layout.fillWidth: true - spacing: 0 - - TabBar { - id: tabBar - - onCurrentIndexChanged: SettingsModel.onSettingsTabChanged(currentIndex) - - TabButton { - iconName: 'settings_sip_accounts' - text: qsTr('sipAccountsTab') - width: implicitWidth - //onClicked: SettingsModel.settingsButtonClicked("sip") + id: window + + minimumHeight: SettingsWindowStyle.height + minimumWidth: SettingsWindowStyle.width + + title: qsTr('settingsTitle') + + onClosing: SettingsModel.settingsWindowClosing() + + // --------------------------------------------------------------------------- + + Shortcut { + sequence: StandardKey.Close + onActivated: window.hide() + } + + // --------------------------------------------------------------------------- + + Rectangle { + anchors.fill: parent + color: SettingsWindowStyle.color + } + + ColumnLayout { + anchors.fill: parent + spacing: 0 + + // ------------------------------------------------------------------------- + // Navigation bar. + // ------------------------------------------------------------------------- + + RowLayout { + Layout.fillWidth: true + spacing: 0 + + TabBar { + id: tabBar + + onCurrentIndexChanged: SettingsModel.onSettingsTabChanged(currentIndex) + + TabButton { + iconName: 'settings_sip_accounts' + text: qsTr('sipAccountsTab') + width: implicitWidth + } + + TabButton { + iconName: 'settings_audio' + text: qsTr('audioTab') + width: implicitWidth + } + + TabButton { + enabled: SettingsModel.videoSupported + iconName: 'settings_video' + text: qsTr('videoTab') + width: implicitWidth + } + + TabButton { + iconName: 'settings_call' + text: qsTr('callsAndChatTab') + width: implicitWidth + } + + TabButton { + enabled: SettingsModel.showNetworkSettings || SettingsModel.developerSettingsEnabled + iconName: 'settings_network' + text: qsTr('networkTab') + width: implicitWidth + } + + TabButton { + enabled: SettingsModel.tunnelAvailable + iconName: 'settings_network' + //: 'Tunnel' : Tab title for tunnel section in settings. + text: qsTr('tunnelTab') + width: implicitWidth + } + + TabButton { + iconName: 'settings_advanced' + text: qsTr('uiTab') + width: implicitWidth + } + + TabButton { + iconName: 'settings_advanced' + text: qsTr('uiAdvanced') + width: implicitWidth + } + } + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: TabButtonStyle.text.height + + color: TabButtonStyle.backgroundColor.normal + + MouseArea { + anchors.fill: parent + + onClicked: konami.forceActiveFocus() + cursorShape: Qt.ArrowCursor + + Konami { + id: konami + onTriggered: SettingsModel.developerSettingsEnabled = true + } + } + } + } + + // ------------------------------------------------------------------------- + // Content. + // ------------------------------------------------------------------------- + + StackLayout { + Layout.fillHeight: true + Layout.fillWidth: true + + currentIndex: tabBar.currentIndex + SettingsSipAccounts {} + SettingsAudio {} + SettingsVideo {} + SettingsCallsChat {} + SettingsNetwork {} + SettingsTunnel {} + SettingsUi {} + SettingsAdvanced {} + } + + // ------------------------------------------------------------------------- + // Buttons. + // ------------------------------------------------------------------------- + + TextButtonB { + Layout.alignment: Qt.AlignRight + Layout.topMargin: SettingsWindowStyle.validButton.topMargin + Layout.bottomMargin: SettingsWindowStyle.validButton.bottomMargin + Layout.rightMargin: SettingsWindowStyle.validButton.rightMargin + + text: qsTr('validButton') + + onClicked: window.close() + } } - - TabButton { - iconName: 'settings_audio' - text: qsTr('audioTab') - width: implicitWidth - //onClicked: SettingsModel.accessAudioSettings() - //onClicked: SettingsModel.settingsButtonClicked("audio") - } - - TabButton { - enabled: SettingsModel.videoSupported - iconName: 'settings_video' - text: qsTr('videoTab') - width: implicitWidth - //onClicked: SettingsModel.accessVideoSettings() - //onClicked: SettingsModel.settingsButtonClicked("video") - } - - TabButton { - iconName: 'settings_call' - text: qsTr('callsAndChatTab') - width: implicitWidth - //onClicked: SettingsModel.settingsButtonClicked("call") - } - - TabButton { - enabled: SettingsModel.showNetworkSettings || SettingsModel.developerSettingsEnabled - iconName: 'settings_network' - text: qsTr('networkTab') - width: implicitWidth - //onClicked: SettingsModel.settingsButtonClicked("network") - } - - TabButton { - iconName: 'settings_advanced' - text: qsTr('uiTab') - width: implicitWidth - //onClicked: SettingsModel.settingsButtonClicked("ui") - } - - TabButton { - iconName: 'settings_advanced' - text: qsTr('uiAdvanced') - width: implicitWidth - //onClicked: SettingsModel.settingsButtonClicked("advanced") - } - } - - Rectangle { - Layout.fillWidth: true - Layout.preferredHeight: TabButtonStyle.text.height - - color: TabButtonStyle.backgroundColor.normal - - MouseArea { - anchors.fill: parent - - onClicked: konami.forceActiveFocus() - cursorShape: Qt.ArrowCursor - - Konami { - id: konami - onTriggered: SettingsModel.developerSettingsEnabled = true - } - } - } - } - - // ------------------------------------------------------------------------- - // Content. - // ------------------------------------------------------------------------- - - StackLayout { - Layout.fillHeight: true - Layout.fillWidth: true - - currentIndex: tabBar.currentIndex - - SettingsSipAccounts {} - SettingsAudio {} - SettingsVideo {} - SettingsCallsChat {} - SettingsNetwork {} - SettingsUi {} - SettingsAdvanced {} - } - - // ------------------------------------------------------------------------- - // Buttons. - // ------------------------------------------------------------------------- - - TextButtonB { - Layout.alignment: Qt.AlignRight - Layout.topMargin: SettingsWindowStyle.validButton.topMargin - Layout.bottomMargin: SettingsWindowStyle.validButton.bottomMargin - Layout.rightMargin: SettingsWindowStyle.validButton.rightMargin - - text: qsTr('validButton') - - onClicked: window.close() - } - } }