diff --git a/src/channelinfomodel.cpp b/src/channelinfomodel.cpp --- a/src/channelinfomodel.cpp +++ b/src/channelinfomodel.cpp @@ -18,6 +18,7 @@ */ #include "channelinfomodel.h" +#include "setting_defines.h" const QColor colors[8] = { @@ -210,3 +211,55 @@ void ChannelInfoModel::setNumOfChannels( endRemoveRows(); } } + +void ChannelInfoModel::saveSettings(QSettings* settings) +{ + settings->beginGroup(SettingGroup_Channels); + settings->beginWriteArray(SG_Channels_Channel); + + // save all channel information regardless of current number of channels + for (unsigned ci = 0; (int) ci < infos.length(); ci++) + { + settings->setArrayIndex(ci); + settings->setValue(SG_Channels_Name, infos[ci].name); + settings->setValue(SG_Channels_Color, infos[ci].color); + settings->setValue(SG_Channels_Visible, infos[ci].visibility); + } + + settings->endArray(); + settings->endGroup(); +} + +void ChannelInfoModel::loadSettings(QSettings* settings) +{ + settings->beginGroup(SettingGroup_Channels); + unsigned size = settings->beginReadArray(SG_Channels_Channel); + + for (unsigned ci = 0; ci < size; ci++) + { + settings->setArrayIndex(ci); + + ChannelInfo chanInfo; + chanInfo.name = settings->value(SG_Channels_Name, + QString(tr("Channel %1")).arg(ci+1)).toString(); + chanInfo.color = settings->value(SG_Channels_Color, colors[ci % 8]).value(); + chanInfo.visibility = settings->value(SG_Channels_Visible, true).toBool(); + + if ((int) ci >= infos.size()) + { + infos.append(chanInfo); + } + else + { + infos[ci] = chanInfo; + + auto roles = QVector({ + Qt::DisplayRole, Qt::EditRole, Qt::ForegroundRole, Qt::CheckStateRole}); + + emit dataChanged(index(ci, 0), index(ci, COLUMN_COUNT-1), roles); + } + } + + settings->endArray(); + settings->endGroup(); +} diff --git a/src/channelinfomodel.h b/src/channelinfomodel.h --- a/src/channelinfomodel.h +++ b/src/channelinfomodel.h @@ -22,6 +22,7 @@ #include #include +#include class ChannelInfoModel : public QAbstractTableModel { @@ -46,6 +47,10 @@ public: QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; void setNumOfChannels(unsigned number); + /// Stores all channel info into a `QSettings` + void saveSettings(QSettings* settings); + /// Loads all channel info from a `QSettings`. + void loadSettings(QSettings* settings); private: struct ChannelInfo diff --git a/src/channelmanager.cpp b/src/channelmanager.cpp --- a/src/channelmanager.cpp +++ b/src/channelmanager.cpp @@ -169,27 +169,10 @@ void ChannelManager::addChannelData(unsi void ChannelManager::saveSettings(QSettings* settings) { - settings->beginGroup(SettingGroup_Channels); - settings->beginWriteArray(SG_Channels_Channel); - for (unsigned i = 0; i < numOfChannels(); i++) - { - settings->setArrayIndex(i); - settings->setValue(SG_Channels_Name, channelName(i)); - } - settings->endArray(); - settings->endGroup(); + _infoModel.saveSettings(settings); } void ChannelManager::loadSettings(QSettings* settings) { - settings->beginGroup(SettingGroup_Channels); - settings->beginReadArray(SG_Channels_Channel); - for (unsigned i = 0; i < numOfChannels(); i++) - { - settings->setArrayIndex(i); - // TODO: fix load settings - // setChannelName(i, settings->value(SG_Channels_Name, channelName(i)).toString()); - } - settings->endArray(); - settings->endGroup(); + _infoModel.loadSettings(settings); } diff --git a/src/setting_defines.h b/src/setting_defines.h --- a/src/setting_defines.h +++ b/src/setting_defines.h @@ -70,6 +70,8 @@ const char SG_CustomFrame_DebugMode[] = // channel manager keys const char SG_Channels_Channel[] = "channel"; const char SG_Channels_Name[] = "name"; +const char SG_Channels_Color[] = "color"; +const char SG_Channels_Visible[] = "visible"; // plot settings keys const char SG_Plot_NumOfSamples[] = "numOfSamples";