# HG changeset patch # User Hasan Yavuz ÖZDERYA # Date 2016-12-31 09:37:37 # Node ID a8a13a36dd17619e781a9b70a6ddcd402863fa9f # Parent 1399cc9872eb95b8552a4064c489b371d9239f1e adding channelinfomodel implemented as a draft diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,6 +103,7 @@ add_executable(${PROGRAM_NAME} WIN32 src/tooltipfilter.cpp src/sneakylineedit.cpp src/channelmanager.cpp + src/channelinfomodel.cpp src/framebufferseries.cpp src/numberformatbox.cpp src/endiannessbox.cpp diff --git a/src/channelinfomodel.cpp b/src/channelinfomodel.cpp new file mode 100644 --- /dev/null +++ b/src/channelinfomodel.cpp @@ -0,0 +1,115 @@ +/* + Copyright © 2017 Hasan Yavuz Özderya + + This file is part of serialplot. + + serialplot 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. + + serialplot 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 serialplot. If not, see . +*/ + +#include "channelinfomodel.h" + +/// name + visibility +enum ChannelInfoColumn +{ + COLUMN_NAME = 0, + COLUMN_VISIBILITY, + COLUMN_COUNT +}; + +ChannelInfoModel::ChannelInfoModel(unsigned numberOfChannels, QObject* parent) : + QAbstractTableModel(parent) +{ + _numOfChannels = 0; + setNumOfChannels(numberOfChannels); +} + +int ChannelInfoModel::rowCount(const QModelIndex &parent) const +{ + return _numOfChannels; +} + +int ChannelInfoModel::columnCount(const QModelIndex & parent) const +{ + return COLUMN_COUNT; +} + +QVariant ChannelInfoModel::data(const QModelIndex &index, int role) const +{ + // TODO: check role parameter + + if (index.row() < (int) _numOfChannels) + { + if (index.column() == COLUMN_NAME) + { + return QVariant(infos[index.row()].name); + } + else if (index.column() == COLUMN_VISIBILITY) + { + return QVariant(infos[index.row()].visibility); + } + } + + // invalid index + return QVariant(); +} + +bool ChannelInfoModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + // TODO: check role + + if (index.row() < (int) _numOfChannels) + { + if (index.column() == COLUMN_NAME) + { + infos[index.row()].name = value.toString(); + return true; + } + else if (index.column() == COLUMN_VISIBILITY) + { + infos[index.row()].visibility = value.toBool(); + return true; + } + } + + // invalid index + return false; +} + +void ChannelInfoModel::setNumOfChannels(unsigned number) +{ + if (number == _numOfChannels) return; + + // we create channel info but never remove channel info to + // remember user entered info + if ((int) number > infos.length()) + { + for (unsigned ci = _numOfChannels; ci < number; ci++) + { + infos.append({QString("Channel %d").arg(ci), true}); + } + } + + // make sure newly available channels are visible, we don't + // remember visibility option intentionally so that user doesn't + // get confused + if (number > _numOfChannels) + { + for (unsigned ci = _numOfChannels; ci < number; ci++) + { + infos[ci].visibility = true; + } + } + + _numOfChannels = number; +} diff --git a/src/channelinfomodel.h b/src/channelinfomodel.h new file mode 100644 --- /dev/null +++ b/src/channelinfomodel.h @@ -0,0 +1,57 @@ +/* + Copyright © 2017 Hasan Yavuz Özderya + + This file is part of serialplot. + + serialplot 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. + + serialplot 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 serialplot. If not, see . +*/ + +#ifndef CHANNELINFOMODEL_H +#define CHANNELINFOMODEL_H + +#include +#include + +class ChannelInfoModel : public QAbstractTableModel +{ + Q_OBJECT + +public: + explicit ChannelInfoModel(unsigned numberOfChannels, QObject *parent = 0); + + // implemented from QAbstractItemModel + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + + void setNumOfChannels(unsigned number); + +private: + struct ChannelInfo + { + QString name; + bool visibility; + }; + + unsigned _numOfChannels; ///< @note this is not necessarily the length of `infos` + + /** + * Channel info is added here but never removed so that we can + * remember user entered names. + */ + QList infos; +}; + +#endif // CHANNELINFOMODEL_H diff --git a/src/main.cpp b/src/main.cpp --- a/src/main.cpp +++ b/src/main.cpp @@ -24,6 +24,9 @@ #include "tooltipfilter.h" #include "version.h" +// test code +#include +#include "channelinfomodel.h" MainWindow* pMainWindow; @@ -50,5 +53,14 @@ int main(int argc, char *argv[]) qDebug() << "Revision" << VERSION_REVISION; w.show(); + + // test code + ChannelInfoModel cim(5, &a); + QTableView tv; + + tv.setModel(&cim); + + tv.show(); + return a.exec(); }