diff --git a/assets/languages/en.ts b/assets/languages/en.ts index 68780a132..71f39d9c6 100644 --- a/assets/languages/en.ts +++ b/assets/languages/en.ts @@ -967,6 +967,17 @@ your friend's SIP address or username. Offline + + SettingsAdvanced + + logsTitle + Logs + + + logsFolderLabel + Logs folder + + SettingsAudio @@ -1389,6 +1400,10 @@ your friend's SIP address or username. validButton OK + + uiAdvanced + Advanced + SmartSearchBar diff --git a/assets/languages/fr.ts b/assets/languages/fr.ts index 9db336fd0..5e2f2d002 100644 --- a/assets/languages/fr.ts +++ b/assets/languages/fr.ts @@ -965,6 +965,17 @@ Cliquez ici : <a href="%1">%1</a> Hors-ligne + + SettingsAdvanced + + logsTitle + Logs + + + logsFolderLabel + Dossier des logs + + SettingsAudio @@ -1387,6 +1398,10 @@ Cliquez ici : <a href="%1">%1</a> validButton OK + + uiAdvanced + Avancé + SmartSearchBar diff --git a/resources.qrc b/resources.qrc index 0cfd4ef78..022fcb318 100644 --- a/resources.qrc +++ b/resources.qrc @@ -403,6 +403,7 @@ ui/views/App/Main/MainWindow.js ui/views/App/Main/MainWindowMenuBar.qml ui/views/App/Main/MainWindow.qml + ui/views/App/Settings/SettingsAdvanced.qml ui/views/App/Settings/SettingsAudio.qml ui/views/App/Settings/SettingsCallsChat.qml ui/views/App/Settings/SettingsNetwork.qml diff --git a/src/app/App.cpp b/src/app/App.cpp index 730737b9c..b38bf02e2 100644 --- a/src/app/App.cpp +++ b/src/app/App.cpp @@ -84,10 +84,9 @@ App::App (int &argc, char *argv[]) : SingleApplication(argc, argv, true, Mode::U createParser(); mParser->process(*this); - // Initialize logger. (Do not do this before this point because the - // application has to be created for the logs to be put in the correct - // directory.) - Logger::init(); + // Initialize logger. + shared_ptr config = ::getConfigIfExists(*mParser); + Logger::init(SettingsModel::getLogsFolder(config)); if (mParser->isSet("verbose")) Logger::getInstance()->setVerbose(true); @@ -97,7 +96,7 @@ App::App (int &argc, char *argv[]) : SingleApplication(argc, argv, true, Mode::U // Init locale. mTranslator = new DefaultTranslator(this); - initLocale(::getConfigIfExists(*mParser)); + initLocale(config); if (mParser->isSet("help")) { createParser(); diff --git a/src/app/logger/Logger.cpp b/src/app/logger/Logger.cpp index b25fc3046..c93602bb8 100644 --- a/src/app/logger/Logger.cpp +++ b/src/app/logger/Logger.cpp @@ -155,7 +155,9 @@ void Logger::log (QtMsgType type, const QMessageLogContext &context, const QStri // ----------------------------------------------------------------------------- -void Logger::init () { +void Logger::init (const QString &folder) { + Q_ASSERT(!folder.isEmpty()); + if (mInstance) return; mInstance = new Logger(); @@ -168,7 +170,8 @@ void Logger::init () { ::linphoneLog(domain, type, fmt, args); }); - linphone_core_set_log_collection_path(Paths::getLogsDirPath().c_str()); + linphone_core_set_log_collection_path(::Utils::appStringToCoreString(folder).c_str()); + linphone_core_set_log_collection_max_file_size(MAX_LOGS_COLLECTION_SIZE); linphone_core_enable_log_collection(LinphoneLogCollectionEnabled); } diff --git a/src/app/logger/Logger.hpp b/src/app/logger/Logger.hpp index 67053a5df..453d4a115 100644 --- a/src/app/logger/Logger.hpp +++ b/src/app/logger/Logger.hpp @@ -39,7 +39,7 @@ public: mVerbose = verbose; } - static void init (); + static void init (const QString &folder); static Logger *getInstance () { return mInstance; diff --git a/src/components/settings/SettingsModel.cpp b/src/components/settings/SettingsModel.cpp index e32231380..381a8c471 100644 --- a/src/components/settings/SettingsModel.cpp +++ b/src/components/settings/SettingsModel.cpp @@ -636,7 +636,7 @@ void SettingsModel::setDscpVideo (int dscp) { } // ============================================================================= -// Misc. +// UI. // ============================================================================= QString SettingsModel::getSavedScreenshotsFolder () const { @@ -711,3 +711,27 @@ void SettingsModel::setExitOnClose (bool value) { mConfig->setInt(UI_SECTION, "exit_on_close", value); emit exitOnCloseChanged(value); } + +// ============================================================================= +// Advanced. +// ============================================================================= + +QString SettingsModel::getLogsFolder () const { + return getLogsFolder(mConfig); +} + +void SettingsModel::setLogsFolder (const QString &folder) { + // Do not update path in linphone core. + // Just update the config file. + mConfig->setString(UI_SECTION, "logs_folder", ::Utils::appStringToCoreString(folder)); + + emit logsFolderChanged(folder); +} + +// ----------------------------------------------------------------------------- + +QString SettingsModel::getLogsFolder (const shared_ptr &config) { + return ::Utils::coreStringToAppString( + config->getString(UI_SECTION, "logs_folder", Paths::getLogsDirPath()) + ); +} diff --git a/src/components/settings/SettingsModel.hpp b/src/components/settings/SettingsModel.hpp index 5d251c0ea..cd4a6fce2 100644 --- a/src/components/settings/SettingsModel.hpp +++ b/src/components/settings/SettingsModel.hpp @@ -110,7 +110,7 @@ class SettingsModel : public QObject { Q_PROPERTY(int dscpAudio READ getDscpAudio WRITE setDscpAudio NOTIFY dscpAudioChanged); Q_PROPERTY(int dscpVideo READ getDscpVideo WRITE setDscpVideo NOTIFY dscpVideoChanged); - // Misc. --------------------------------------------------------------------- + // UI. ----------------------------------------------------------------------- Q_PROPERTY(QString remoteProvisioning READ getRemoteProvisioning WRITE setRemoteProvisioning NOTIFY remoteProvisioningChanged); @@ -120,6 +120,10 @@ class SettingsModel : public QObject { Q_PROPERTY(bool exitOnClose READ getExitOnClose WRITE setExitOnClose NOTIFY exitOnCloseChanged); + // Advanced. ----------------------------------------------------------------- + + Q_PROPERTY(QString logsFolder READ getLogsFolder WRITE setLogsFolder NOTIFY logsFolderChanged); + public: enum MediaEncryption { MediaEncryptionNone = linphone::MediaEncryptionNone, @@ -261,7 +265,7 @@ public: int getDscpVideo () const; void setDscpVideo (int dscp); - // Misc. --------------------------------------------------------------------- + // UI. ----------------------------------------------------------------------- QString getSavedScreenshotsFolder () const; void setSavedScreenshotsFolder (const QString &folder); @@ -280,6 +284,13 @@ public: // --------------------------------------------------------------------------- + QString getLogsFolder () const; + void setLogsFolder (const QString &folder); + + // --------------------------------------------------------------------------- + + static QString getLogsFolder (const std::shared_ptr &config); + static const std::string UI_SECTION; // =========================================================================== @@ -346,7 +357,7 @@ signals: void dscpAudioChanged (int dscp); void dscpVideoChanged (int dscp); - // Misc. --------------------------------------------------------------------- + // UI. ----------------------------------------------------------------------- void savedScreenshotsFolderChanged (const QString &folder); void savedVideosFolderChanged (const QString &folder); @@ -357,6 +368,10 @@ signals: void exitOnCloseChanged (bool value); + // Advanced. ----------------------------------------------------------------- + + void logsFolderChanged (const QString &folder); + private: std::shared_ptr mConfig; }; diff --git a/ui/views/App/Settings/SettingsAdvanced.qml b/ui/views/App/Settings/SettingsAdvanced.qml new file mode 100644 index 000000000..9cb928851 --- /dev/null +++ b/ui/views/App/Settings/SettingsAdvanced.qml @@ -0,0 +1,43 @@ +import QtQuick 2.7 + +import Common 1.0 +import Linphone 1.0 + +import App.Styles 1.0 + +// ============================================================================= + +TabContainer { + Column { + spacing: SettingsWindowStyle.forms.spacing + width: parent.width + + // ------------------------------------------------------------------------- + // Logs. + // ------------------------------------------------------------------------- + + Form { + title: qsTr('logsTitle') + width: parent.width + + FormLine { + FormGroup { + label: qsTr('logsFolderLabel') + + FileChooserButton { + selectedFile: SettingsModel.logsFolder + selectFolder: true + + onAccepted: SettingsModel.logsFolder = selectedFile + } + } + } + } + + // ------------------------------------------------------------------------- + // Internal features. + // ------------------------------------------------------------------------- + + // Nothing for the moment. + } +} diff --git a/ui/views/App/Settings/SettingsWindow.qml b/ui/views/App/Settings/SettingsWindow.qml index da83b9c65..f28383e39 100644 --- a/ui/views/App/Settings/SettingsWindow.qml +++ b/ui/views/App/Settings/SettingsWindow.qml @@ -84,6 +84,12 @@ ApplicationWindow { text: qsTr('uiTab') width: implicitWidth } + + TabButton { + icon: 'settings_advanced' + text: qsTr('uiAdvanced') + width: implicitWidth + } } Rectangle { @@ -110,6 +116,7 @@ ApplicationWindow { SettingsCallsChat {} SettingsNetwork {} SettingsUi {} + SettingsAdvanced {} } // -------------------------------------------------------------------------