Index: denali.pro.user =================================================================== diff -u -rdb12df03b8067e1ccc81f190cabfb03359c3d8cb -r40c09957821fb3779fa06214a856c20cca110e56 --- denali.pro.user (.../denali.pro.user) (revision db12df03b8067e1ccc81f190cabfb03359c3d8cb) +++ denali.pro.user (.../denali.pro.user) (revision 40c09957821fb3779fa06214a856c20cca110e56) @@ -1,6 +1,6 @@ - + EnvironmentId Index: sources/canbus/MessageInterpreter.cpp =================================================================== diff -u -rf502bc55feb08cd037d9caa12086d30034fe715b -r40c09957821fb3779fa06214a856c20cca110e56 --- sources/canbus/MessageInterpreter.cpp (.../MessageInterpreter.cpp) (revision f502bc55feb08cd037d9caa12086d30034fe715b) +++ sources/canbus/MessageInterpreter.cpp (.../MessageInterpreter.cpp) (revision 40c09957821fb3779fa06214a856c20cca110e56) @@ -21,6 +21,7 @@ // Project #include "Logger.h" #include "format.h" +#include "Settings.h" using namespace Can; using namespace Model; @@ -680,12 +681,14 @@ */ void MessageInterpreter::updateUnhandledMessages() { - // DEBUG: qDebug() << _Settings.groups(Storage::Settings_Category_MessagesUnhandled); - for(const auto group: _Settings.groups(Storage::Settings_Category_MessagesUnhandled)) { + QString category = Storage::Settings_Category_MessagesUnhandled; + QStringList groups = _Settings.groups(category); + // DEBUG: qDebug() << groups; + for(const auto group: groups) { bool ok; quint16 id = QString(group).toUInt(&ok,16); if (!ok) continue; - _messageList[ id ] = _Settings.keys(group); + _messageList[ id ] = _Settings.keys(category, group); // DEBUG: qDebug() << _Settings.keys(group); } } Index: sources/model/hd/alarm/MAlarmMapping.cpp =================================================================== diff -u -r0e9aa2bb28c43eca1028fa174bc4205af3425973 -r40c09957821fb3779fa06214a856c20cca110e56 --- sources/model/hd/alarm/MAlarmMapping.cpp (.../MAlarmMapping.cpp) (revision 0e9aa2bb28c43eca1028fa174bc4205af3425973) +++ sources/model/hd/alarm/MAlarmMapping.cpp (.../MAlarmMapping.cpp) (revision 40c09957821fb3779fa06214a856c20cca110e56) @@ -7,7 +7,7 @@ * * \file MAlarmMapping.cpp * \author (last) Behrouz NematiPour - * \date (last) 04-Oct-2022 + * \date (last) 05-Oct-2022 * \author (original) Behrouz NematiPour * \date (original) 03-May-2021 * Index: sources/model/settings/MSettings.cpp =================================================================== diff -u -r265ce7409a0ea99a4ae059f5ce7978c9cdb10631 -r40c09957821fb3779fa06214a856c20cca110e56 --- sources/model/settings/MSettings.cpp (.../MSettings.cpp) (revision 265ce7409a0ea99a4ae059f5ce7978c9cdb10631) +++ sources/model/settings/MSettings.cpp (.../MSettings.cpp) (revision 40c09957821fb3779fa06214a856c20cca110e56) @@ -18,6 +18,7 @@ #include // Project +#include "StorageGlobals.h" // name spaces using namespace Storage; @@ -30,31 +31,25 @@ MSettings::MSettings(QObject *parent) : QObject(parent) { } /*! - * \brief MSettings::groups - * \details Returns all the groups of the settings - * \return list of the groups as list of strings - */ -QStringList MSettings::groups() -{ - QMutexLocker locker(&_mutex); - return _settings.keys(); -} - -/*! * \brief MSettings::keys * \details returns all keys in a group * \param vGroup - the group to look for all the keys * \return list of the keys in QString for the group vGroup */ -QStringList MSettings::keys(const QString &vGroup) +QStringList MSettings::keys(const QString &vCategory, const QString &vGroup) { const QMutexLocker locker(&_mutex); - return _settings[vGroup].keys; + QStringList mKeys; + TKeyValues keyValues = _settings[vCategory][vGroup]; + for (const auto &keyValue: keyValues ) { + mKeys += keyValue.key(); + } + return mKeys; } -QString MSettings::key(const QString &vGroup, uint vIndex) +QString MSettings::key(const QString &vCategory, const QString &vGroup, uint vIndex) { - QStringList mKeys = keys(vGroup); + QStringList mKeys = keys(vCategory, vGroup); QString mKey = "[Unknown %1]"; if ( vIndex < (unsigned)mKeys.count() ) { mKey = mKeys [vIndex]; @@ -70,10 +65,15 @@ * \param vGroup - the group to look for all the values * \return list of the values in QString for the group vGroup */ -QVariantList MSettings::values(const QString &vGroup) +QVariantList MSettings::values(const QString &vCategory, const QString &vGroup) { QMutexLocker locker(&_mutex); - return _settings[vGroup].values; + QVariantList mValues; + TKeyValues keyValues = _settings[vCategory][vGroup]; + for (const auto &keyValue: keyValues ) { + mValues += keyValue.val(); + } + return mValues; } /*! @@ -83,28 +83,17 @@ * \param vKey - the key to look for the value * \return the values in QString for the group vGroup */ -QVariant MSettings::value(const QString &vGroup, const QString &vKey) +QVariant MSettings::value(const QString &vCategory, const QString &vGroup, const QString &vKey) { QMutexLocker locker(&_mutex); - int index = _settings[vGroup].keys.indexOf(vKey); - if ( index >= 0 ) - return _settings[vGroup].values.at(index); + TKeyValues mKeyValues = _settings[vCategory][vGroup]; + for (const auto &keyValue: mKeyValues ) { + if ( vKey == keyValue.key() ) return keyValue.val(); + } return QVariant(); } /*! - * \brief MSettings::location - * \details The locations where the settings have been read for the group vGroup - * \param vGroup - the group to look for the location - * \return the location in QString - */ -QString MSettings::location(const QString &vGroup) -{ - QMutexLocker locker(&_mutex); - return _settings[vGroup].location; -} - -/*! * \brief MSettings::groups * \details The groups where have been read from the location vLocation * \param vLocation - The location to look for the group(s) @@ -113,7 +102,7 @@ QStringList MSettings::groups(const QString &vCategory) { QMutexLocker locker(&_mutex); - return _category[vCategory]; + return _settings[vCategory].keys(); } /*! @@ -124,7 +113,7 @@ QStringList MSettings::categorys() { QMutexLocker locker(&_mutex); - return _category.keys(); + return _settings.keys(); } /*! @@ -133,31 +122,24 @@ * \param vGroup - the group of the settings * \param vKey - the key to be added under the group vGroup * \param vValue - the value of the key to be added under group vGroup for the key vKey - * \param vLocation - the location of the setting data if is different will be set. - * \param vLocation - the category of the setting data which by default is the base location if has extra folder + filename. */ -void MSettings::add(const QString &vGroup, const QString &vKey, const QVariant &vValue, const QString &vLocation, const QString &vCategory, bool vEnableDuplicateKeys) +void MSettings::add(const QString &vCategory, const QString &vGroup, const QString &vKey, const QVariant &vValue, bool vEnableDuplicateKeys) { QMutexLocker locker(&_mutex); - if ( ! _category[vCategory].contains(vGroup) ) _category[vCategory] += vGroup; - - KeyValue mGroup = _settings[vGroup]; - if ( mGroup.location != vLocation ) mGroup.location = vLocation; - if ( mGroup.category != vCategory ) mGroup.category = vCategory; if ( vEnableDuplicateKeys ) { - mGroup.keys += vKey ; - mGroup.values += vValue ; - } else { - if ( mGroup.keys.contains(vKey)) { - int index = mGroup.keys.indexOf(vKey); - mGroup.values[index] = vValue; + _settings[vCategory][vGroup] += TKeyValue (vKey, vValue); + } + else { + TKeyValue keyValue (vKey, vValue); + TKeyValues keyValues = _settings[vCategory][vGroup]; + int index = keyValues.indexOf(keyValue); + if ( index >= 0 ) { + _settings[vCategory][vGroup].replace( index, keyValue ); } else { - mGroup.keys += vKey ; - mGroup.values += vValue ; + _settings[vCategory][vGroup] += keyValue; } } - _settings[vGroup] = mGroup; } /********** The common helper functions **********/ @@ -169,8 +151,9 @@ */ void MSettings::datetimeFormat() { - QVariant dateFotmat = _Settings.value("Date", "Format"); - QVariant timeFotmat = _Settings.value("Time", "Format"); + QString category = Storage::Settings_Category_SettingsSystem; + QVariant dateFotmat = _Settings.value(category, "Date", "Format"); + QVariant timeFotmat = _Settings.value(category, "Time", "Format"); if (dateFotmat.isValid() && timeFotmat.isValid()) _datetimeFormat = dateFotmat.toString() + " " + timeFotmat.toString(); } Index: sources/model/settings/MSettings.h =================================================================== diff -u -r265ce7409a0ea99a4ae059f5ce7978c9cdb10631 -r40c09957821fb3779fa06214a856c20cca110e56 --- sources/model/settings/MSettings.h (.../MSettings.h) (revision 265ce7409a0ea99a4ae059f5ce7978c9cdb10631) +++ sources/model/settings/MSettings.h (.../MSettings.h) (revision 40c09957821fb3779fa06214a856c20cca110e56) @@ -35,35 +35,54 @@ { Q_OBJECT -public: - struct KeyValue { - QString category; - QString location; - QList keys; - QList values; - }; -private: - QMap _settings; + typedef QString TCategory ; + typedef QString TGroup ; + typedef QString TKey ; + typedef QVariant TVal ; - QMap _category; + class KeyValue { + TKey _key ; + TVal _val ; + + public: + KeyValue(const TKey &vKey, const TVal &vVal) : _key(vKey), _val(vVal) {} + TKey key() const { return _key.trimmed(); } + TVal val() const { return _val ; } + + void operator = (const TKey &vKey) { _key = vKey.trimmed(); } + void operator = (const TVal &vVal) { _val = vVal ; } + void operator = (const KeyValue &vKeyValue) { + _key = vKeyValue.key(); + _val = vKeyValue.val(); + } + + bool operator == (const KeyValue &vKeyValue) const { + return key() == vKeyValue.key() && val() == vKeyValue.val(); + } + }; + typedef KeyValue TKeyValue ; + typedef QList < TKeyValue > TKeyValues; + typedef QMap < TGroup , TKeyValues > TData ; + typedef QMap < TCategory , TData > TSettings ; + + TSettings _settings ; + QMutex _mutex; // Singleton SINGLETON(MSettings) public: QStringList categorys(); - QStringList groups (); QStringList groups (const QString &vCategory); - QStringList keys (const QString &vGroup ); - QString key (const QString &vGroup , uint vIndex); - QVariantList values (const QString &vGroup ); - QVariant value (const QString &vGroup , const QString &vKey); - QString location (const QString &vGroup ); + QStringList keys (const QString &vCategory, const QString &vGroup ); + QString key (const QString &vCategory, const QString &vGroup , uint vIndex); + QVariantList values (const QString &vCategory, const QString &vGroup ); + QVariant value (const QString &vCategory, const QString &vGroup , const QString &vKey); - void add (const QString &vGroup, const QString &vKey, const QVariant &vValue, const QString &vLocation, const QString &vCategory, bool vEnableDuplicateKeys); + void add (const QString &vCategory, const QString &vGroup, const QString &vKey, const QVariant &vValue, bool vEnableDuplicateKeys); // the utility static functions private : QString _datetimeFormat = "MM/dd/yyyy HH:mm:ss"; Index: sources/storage/Settings.cpp =================================================================== diff -u -r265ce7409a0ea99a4ae059f5ce7978c9cdb10631 -r40c09957821fb3779fa06214a856c20cca110e56 --- sources/storage/Settings.cpp (.../Settings.cpp) (revision 265ce7409a0ea99a4ae059f5ce7978c9cdb10631) +++ sources/storage/Settings.cpp (.../Settings.cpp) (revision 40c09957821fb3779fa06214a856c20cca110e56) @@ -66,7 +66,12 @@ QString folder = settingFolder.prepend(Storage::Settings_Path_Name); settingFiles += FileHandler::find(folder, fileFilter); } - + // DEBUG: + // settingFiles = + // { + // QFileInfo("/home/denali/Projects/application/resources/settings/Confirm/Confirm.conf"), + // QFileInfo("/home/denali/Projects/application/resources/settings/Alarms/Alarms.conf") + // }; if ( ! settingFiles.count() ) { LOG_DEBUG(QObject::tr("No setting files in the %1").arg(Storage::Settings_Path_Name)); return 2; // TODO : Define an error enum when completed @@ -147,7 +152,7 @@ else { key = line; } - _Settings.add(group, key, QVariant(value), detail.location, detail.category, enableDuplicateKey); + _Settings.add(detail.category, group, key, QVariant(value), enableDuplicateKey); // DEBUG: qDebug() << group << key << value << location << category; } } @@ -175,7 +180,7 @@ //Note: the configuration files which can be saved, are like settings and should not have duplicate values. // as an example the Alarm volume can't have two separate duplicate entry in the settings. // -------------------------------------------------------------------------------------------------------------- - _Settings.add(vGroup, vKey, vValue,"", vCategory, false); + _Settings.add(vCategory, vGroup, vKey, vValue, false); QString mPath = QFileInfo(mFileName).absolutePath(); if ( mPath.trimmed().isEmpty() ) { LOG_DEBUG("The settings path is empty."); @@ -189,8 +194,8 @@ for ( const auto &group : _Settings.groups(vCategory) ) { mContent += QString("\n[%1]\n").arg(group); - for ( const auto &key : _Settings.keys(group) ) { - mContent += QString("%1 = %2\n").arg(key).arg(_Settings.value(group, key).toString()); + for ( const auto &key : _Settings.keys(vCategory, group) ) { + mContent += QString("%1 = %2\n").arg(key).arg(_Settings.value(vCategory, group, key).toString()); } } Index: sources/storage/StorageGlobals.cpp =================================================================== diff -u -rdb12df03b8067e1ccc81f190cabfb03359c3d8cb -r40c09957821fb3779fa06214a856c20cca110e56 --- sources/storage/StorageGlobals.cpp (.../StorageGlobals.cpp) (revision db12df03b8067e1ccc81f190cabfb03359c3d8cb) +++ sources/storage/StorageGlobals.cpp (.../StorageGlobals.cpp) (revision 40c09957821fb3779fa06214a856c20cca110e56) @@ -70,6 +70,7 @@ const char *Settings_Path_Name = "/home/denali/Projects/application/resources/settings/"; #endif const char *Settings_Category_Instructions = "Instructions/Instructions"; + const char *Settings_Category_InstructionsImagesLoc = "%1/Instructions/"; const char *Settings_Category_ConfigurationsDataList = "Configurations/DataList" ; const char *Settings_Category_Alarms = "Alarms/Alarms" ; const char *Settings_Category_MessagesUnhandled = "Messages/Unhandled" ; Index: sources/storage/StorageGlobals.h =================================================================== diff -u -rdb12df03b8067e1ccc81f190cabfb03359c3d8cb -r40c09957821fb3779fa06214a856c20cca110e56 --- sources/storage/StorageGlobals.h (.../StorageGlobals.h) (revision db12df03b8067e1ccc81f190cabfb03359c3d8cb) +++ sources/storage/StorageGlobals.h (.../StorageGlobals.h) (revision 40c09957821fb3779fa06214a856c20cca110e56) @@ -46,6 +46,7 @@ // Settings extern const char *Settings_Path_Name; extern const char *Settings_Category_Instructions ; + extern const char *Settings_Category_InstructionsImagesLoc ; extern const char *Settings_Category_ConfigurationsDataList ; extern const char *Settings_Category_Alarms ; extern const char *Settings_Category_MessagesUnhandled ; Index: sources/storage/TreatmentLog.cpp =================================================================== diff -u -r54c4136d95375116e6daf23b7d4179159cf13d0c -r40c09957821fb3779fa06214a856c20cca110e56 --- sources/storage/TreatmentLog.cpp (.../TreatmentLog.cpp) (revision 54c4136d95375116e6daf23b7d4179159cf13d0c) +++ sources/storage/TreatmentLog.cpp (.../TreatmentLog.cpp) (revision 40c09957821fb3779fa06214a856c20cca110e56) @@ -86,11 +86,12 @@ // TODO : The settings needs modification not only to define the category and groups in a common header but also the settings itself needs some mods. // - the category shall become as part of the group // - the structure of the settings should become horizontal which vertical now. - QString mAcidConcentrateType = _Settings.key("Acid Concentrate" , vData.mAcidConcentrateType ); - QString mBicarbonateConcentrateType = _Settings.key("Bicarbonate Concentrate" , vData.mBicarbonateConcentrateType ); - QString mDialyzerType = _Settings.key("Dialyzer Type" , vData.mDialyzerType ); - QString mHeparinType = _Settings.key("Heparin Type" , vData.mHeparinType ); - QString mWaterSampleTestResult = _Settings.key("Water Sample Result" , vData.mWaterSampleTestResult ); + QString mCategory = Storage::Settings_Category_ConfigurationsDataList; + QString mAcidConcentrateType = _Settings.key(mCategory, "Acid Concentrate" , vData.mAcidConcentrateType ); + QString mBicarbonateConcentrateType = _Settings.key(mCategory, "Bicarbonate Concentrate" , vData.mBicarbonateConcentrateType ); + QString mDialyzerType = _Settings.key(mCategory, "Dialyzer Type" , vData.mDialyzerType ); + QString mHeparinType = _Settings.key(mCategory, "Heparin Type" , vData.mHeparinType ); + QString mWaterSampleTestResult = _Settings.key(mCategory, "Water Sample Result" , vData.mWaterSampleTestResult ); // init/fill/clear the _values Index: sources/view/VTreatmentCreate.cpp =================================================================== diff -u -r265ce7409a0ea99a4ae059f5ce7978c9cdb10631 -r40c09957821fb3779fa06214a856c20cca110e56 --- sources/view/VTreatmentCreate.cpp (.../VTreatmentCreate.cpp) (revision 265ce7409a0ea99a4ae059f5ce7978c9cdb10631) +++ sources/view/VTreatmentCreate.cpp (.../VTreatmentCreate.cpp) (revision 40c09957821fb3779fa06214a856c20cca110e56) @@ -412,8 +412,9 @@ */ void VTreatmentCreate::onSettingsDone() { - heparinTypeOptions ( _Settings.keys("Heparin Type" )); - acidConcentrateOptions ( _Settings.keys("Acid Concentrate" )); - bicarbonateConcentrateOptions ( _Settings.keys("Bicarbonate Concentrate" )); - dialyzerTypeOptions ( _Settings.keys("Dialyzer Type" )); + QString mCategory = Storage::Settings_Category_ConfigurationsDataList; + heparinTypeOptions ( _Settings.keys(mCategory, "Heparin Type" )); + acidConcentrateOptions ( _Settings.keys(mCategory, "Acid Concentrate" )); + bicarbonateConcentrateOptions ( _Settings.keys(mCategory, "Bicarbonate Concentrate" )); + dialyzerTypeOptions ( _Settings.keys(mCategory, "Dialyzer Type" )); } Index: sources/view/hd/alarm/VAlarmStatus.cpp =================================================================== diff -u -rdb12df03b8067e1ccc81f190cabfb03359c3d8cb -r40c09957821fb3779fa06214a856c20cca110e56 --- sources/view/hd/alarm/VAlarmStatus.cpp (.../VAlarmStatus.cpp) (revision db12df03b8067e1ccc81f190cabfb03359c3d8cb) +++ sources/view/hd/alarm/VAlarmStatus.cpp (.../VAlarmStatus.cpp) (revision 40c09957821fb3779fa06214a856c20cca110e56) @@ -201,37 +201,33 @@ QStringList VAlarmStatus::instructionValues () { if ( ! _alarm_AlarmID ) return {}; return _alarms[_alarm_AlarmID].instructions.values () ; } void VAlarmStatus::onActionReceive(const SettingsData &) { - QStringList mCategorys = _Settings.categorys(); - for (const QString &category : mCategorys) { - if ( ! Storage::Settings::isCategoryAlarms( category ) ) continue; - QStringList groups = _Settings.groups(category); + QString category = Storage::Settings_Category_Alarms; + QStringList groups = _Settings.groups(category); + for (const auto &group : groups) { + bool ok = true; + quint32 id = group.toInt( &ok ); + if ( ! ok ) { LOG_DEBUG(QString("Not an alarm ID number [%1]").arg(group)); continue; } - for (const auto &group : groups) { - bool ok = true; - quint32 id = group.toInt( &ok ); - if ( ! ok ) { LOG_DEBUG(QString("Not an alarm ID number [%1]").arg(group)); continue; } - - AlarmData alarmData; - InstructionData instructionData; - for (const QString &key : _Settings.keys(group)) { - if (Storage::Settings::isKeyTitle ( key ) ) { - alarmData.title = _Settings.value(group, key).toString(); - } else if (Storage::Settings::isKeyMessage ( key ) ) { - alarmData.message = _Settings.value(group, key).toString(); - } else { - instructionData[key] = _Settings.value(group, key).toString(); - alarmData.instructions = instructionData; - } + AlarmData alarmData; + InstructionData instructionData; + for (const QString &key : _Settings.keys(category, group)) { + if (Storage::Settings::isKeyTitle ( key ) ) { + alarmData.title = _Settings.value(category, group, key).toString(); + } else if (Storage::Settings::isKeyMessage ( key ) ) { + alarmData.message = _Settings.value(category, group, key).toString(); + } else { + instructionData[key] = _Settings.value(category, group, key).toString(); + alarmData.instructions = instructionData; } - _alarms[id] = alarmData; - - /// DEBUG: - /// TODO: the MSettings model should do the same has been done here and use map instead of separate structure to iterate vertically, while map supports, keys, values. - // qDebug() << "@" << id << _alarms[id].title << _alarms[id].message << _alarms[id].instructions.keys() << _alarms[id].instructions.values(); - // for (const auto &key : _alarms[id].instructions.keys()) { - // qDebug() << "-" << key << _alarms[id].instructions.value(key); - // } } + _alarms[id] = alarmData; + + /// DEBUG: + /// TODO: the MSettings model should do the same has been done here and use map instead of separate structure to iterate vertically, while map supports, keys, values. + // qDebug() << "@" << id << _alarms[id].title << _alarms[id].message << _alarms[id].instructions.keys() << _alarms[id].instructions.values(); + // for (const auto &key : _alarms[id].instructions.keys()) { + // qDebug() << "-" << key << _alarms[id].instructions.value(key); + // } } emit alarm_AlarmIDChanged(_alarm_AlarmID); // to get the dialog content in sync with the Alarm.conf in case there is an early alarm. } Index: sources/view/settings/VSettings.cpp =================================================================== diff -u -rdb12df03b8067e1ccc81f190cabfb03359c3d8cb -r40c09957821fb3779fa06214a856c20cca110e56 --- sources/view/settings/VSettings.cpp (.../VSettings.cpp) (revision db12df03b8067e1ccc81f190cabfb03359c3d8cb) +++ sources/view/settings/VSettings.cpp (.../VSettings.cpp) (revision 40c09957821fb3779fa06214a856c20cca110e56) @@ -54,8 +54,8 @@ for (const auto &category : mCategorys) { QStringList groups = _Settings.groups(category); for (const auto &group : groups) { - QStringList keys = _Settings.keys (group); - QVariantList values = _Settings.values (group); + QStringList keys = _Settings.keys (category, group); + QVariantList values = _Settings.values (category, group); if ( Storage::Settings::isCategoryInstructions( category ) ) { // DEBUG : // qDebug() << " ##### " @@ -64,7 +64,7 @@ // << values // << location ; QVariantMap details; - QString location = _Settings.location (group); + QString location = QString(Storage::Settings_Category_InstructionsImagesLoc).arg(Storage::Settings_Path_Name); details["location"] = location; details["keys" ] = keys ; details["values" ] = values ; @@ -77,26 +77,26 @@ QVariantMap keyValue; if ( isservicePass (category, group, key) ) { QString mServicePass; - mServicePass = _Settings.value(group, key).toString (); + mServicePass = _Settings.value(category, group, key).toString (); keyValue[key] = mServicePass ; servicePass ( mServicePass); } else if ( isalarmVolume (category, group, key) ) { quint8 mAlarmVolume; - mAlarmVolume = _Settings.value(group, key).toInt (); // returns 0 if fails, so no error checking needed. + mAlarmVolume = _Settings.value(category, group, key).toInt (); // returns 0 if fails, so no error checking needed. keyValue[key] = mAlarmVolume ; alarmVolume ( mAlarmVolume); } else if ( isnoCANBus (category, group, key) ) { bool mNoCANBus; - mNoCANBus = _Settings.value(group, key).toBool (); // returns 0/false if fails, so no error checking needed. + mNoCANBus = _Settings.value(category, group, key).toBool (); // returns 0/false if fails, so no error checking needed. keyValue[key] = mNoCANBus ; noCANBus ( mNoCANBus); if (_noCANBus ) LOG_EVENT_UI(QString("System is working on NoCANBus set")); } else { - keyValue[key] = _Settings.value(group, key); + keyValue[key] = _Settings.value(category, group, key); } QVariantMap groups; groups [group] = keyValue;