2020-08-31 04:03:41 +08:00
|
|
|
#include "tracemarkermodel.h"
|
|
|
|
#include "unit.h"
|
|
|
|
#include <QComboBox>
|
|
|
|
#include <QApplication>
|
2020-10-20 23:03:49 +08:00
|
|
|
#include "CustomWidgets/siunitedit.h"
|
|
|
|
#include <QDebug>
|
2020-08-31 04:03:41 +08:00
|
|
|
|
|
|
|
TraceMarkerModel::TraceMarkerModel(TraceModel &model, QObject *parent)
|
|
|
|
: QAbstractTableModel(parent),
|
|
|
|
model(model)
|
|
|
|
{
|
|
|
|
markers.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
TraceMarker *TraceMarkerModel::createDefaultMarker()
|
|
|
|
{
|
|
|
|
// find lowest free number
|
|
|
|
int number = 0;
|
|
|
|
bool used;
|
|
|
|
do {
|
|
|
|
number++;
|
|
|
|
used = false;
|
|
|
|
for(auto m : markers) {
|
2020-10-20 03:21:04 +08:00
|
|
|
if(m->getNumber() == number) {
|
2020-08-31 04:03:41 +08:00
|
|
|
used = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} while (used);
|
2020-10-20 23:03:49 +08:00
|
|
|
auto marker = new TraceMarker(this, number);
|
2020-10-20 03:21:04 +08:00
|
|
|
marker->setFrequency(2150000000);
|
2020-08-31 04:03:41 +08:00
|
|
|
marker->assignTrace(model.trace(0));
|
|
|
|
return marker;
|
|
|
|
}
|
|
|
|
|
|
|
|
void TraceMarkerModel::addMarker(TraceMarker *t)
|
|
|
|
{
|
|
|
|
beginInsertRows(QModelIndex(), markers.size(), markers.size());
|
|
|
|
markers.push_back(t);
|
|
|
|
endInsertRows();
|
|
|
|
connect(t, &TraceMarker::dataChanged, this, &TraceMarkerModel::markerDataChanged);
|
|
|
|
connect(t, &TraceMarker::deleted, this, qOverload<TraceMarker*>(&TraceMarkerModel::removeMarker));
|
|
|
|
emit markerAdded(t);
|
|
|
|
}
|
|
|
|
|
|
|
|
void TraceMarkerModel::removeMarker(unsigned int index, bool delete_marker)
|
|
|
|
{
|
|
|
|
if (index < markers.size()) {
|
|
|
|
beginRemoveRows(QModelIndex(), index, index);
|
|
|
|
if(delete_marker) {
|
2020-09-12 05:07:15 +08:00
|
|
|
// disconnect from deleted signal prior to deleting the marker. Otherwise a second (possibly non-existent) will be erased from the list
|
|
|
|
disconnect(markers[index], &TraceMarker::deleted, this, qOverload<TraceMarker*>(&TraceMarkerModel::removeMarker));
|
2020-08-31 04:03:41 +08:00
|
|
|
delete markers[index];
|
|
|
|
}
|
|
|
|
markers.erase(markers.begin() + index);
|
|
|
|
endRemoveRows();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void TraceMarkerModel::removeMarker(TraceMarker *m)
|
|
|
|
{
|
|
|
|
auto it = std::find(markers.begin(), markers.end(), m);
|
|
|
|
if(it != markers.end()) {
|
|
|
|
removeMarker(it - markers.begin(), false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-21 20:06:20 +08:00
|
|
|
void TraceMarkerModel::markerDataChanged(TraceMarker *m)
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
2020-10-20 23:03:49 +08:00
|
|
|
auto row = find(markers.begin(), markers.end(), m) - markers.begin();
|
2020-09-21 20:06:20 +08:00
|
|
|
if(m->editingFrequeny) {
|
|
|
|
// only update the other columns, do not override editor data
|
2020-10-20 23:03:49 +08:00
|
|
|
emit dataChanged(index(row, ColIndexData), index(row, ColIndexData));
|
2020-09-21 20:06:20 +08:00
|
|
|
} else {
|
2020-10-21 01:15:06 +08:00
|
|
|
emit dataChanged(index(row, ColIndexSettings), index(row, ColIndexData));
|
2020-09-21 20:06:20 +08:00
|
|
|
}
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
TraceMarker *TraceMarkerModel::marker(int index)
|
|
|
|
{
|
|
|
|
return markers.at(index);
|
|
|
|
}
|
|
|
|
|
|
|
|
int TraceMarkerModel::rowCount(const QModelIndex &) const
|
|
|
|
{
|
|
|
|
return markers.size();
|
|
|
|
}
|
|
|
|
|
|
|
|
int TraceMarkerModel::columnCount(const QModelIndex &) const
|
|
|
|
{
|
2020-10-20 23:03:49 +08:00
|
|
|
return ColIndexLast;
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
QVariant TraceMarkerModel::data(const QModelIndex &index, int role) const
|
|
|
|
{
|
|
|
|
auto marker = markers[index.row()];
|
|
|
|
switch(index.column()) {
|
|
|
|
case ColIndexNumber:
|
|
|
|
switch(role) {
|
2020-10-20 03:21:04 +08:00
|
|
|
case Qt::DisplayRole: return QVariant((unsigned int)marker->getNumber()); break;
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
case ColIndexTrace:
|
|
|
|
switch(role) {
|
|
|
|
case Qt::DisplayRole:
|
2020-10-20 03:21:04 +08:00
|
|
|
if(marker->getTrace()) {
|
|
|
|
return marker->getTrace()->name();
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2020-10-21 01:15:06 +08:00
|
|
|
case ColIndexSettings:
|
2020-08-31 04:03:41 +08:00
|
|
|
switch(role) {
|
2020-10-21 01:15:06 +08:00
|
|
|
case Qt::DisplayRole: return marker->readableSettings(); break;
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
case ColIndexData:
|
|
|
|
switch(role) {
|
|
|
|
case Qt::DisplayRole: return marker->readableData(); break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return QVariant();
|
|
|
|
}
|
|
|
|
|
|
|
|
QVariant TraceMarkerModel::headerData(int section, Qt::Orientation orientation, int role) const
|
|
|
|
{
|
|
|
|
if(orientation == Qt::Horizontal && role == Qt::DisplayRole) {
|
|
|
|
switch(section) {
|
|
|
|
case ColIndexNumber: return "#"; break;
|
|
|
|
case ColIndexTrace: return "Trace"; break;
|
2020-10-20 23:03:49 +08:00
|
|
|
case ColIndexType: return "Type"; break;
|
2020-10-21 01:15:06 +08:00
|
|
|
case ColIndexSettings: return "Settings"; break;
|
2020-08-31 04:03:41 +08:00
|
|
|
case ColIndexData: return "Data"; break;
|
|
|
|
default: return QVariant(); break;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return QVariant();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TraceMarkerModel::setData(const QModelIndex &index, const QVariant &value, int)
|
|
|
|
{
|
|
|
|
if((unsigned int) index.row() >= markers.size()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
auto m = markers[index.row()];
|
|
|
|
switch(index.column()) {
|
2020-10-20 23:03:49 +08:00
|
|
|
case ColIndexNumber: {
|
|
|
|
m->setNumber(value.toInt());
|
|
|
|
}
|
|
|
|
break;
|
2020-08-31 04:03:41 +08:00
|
|
|
case ColIndexTrace: {
|
|
|
|
auto trace = qvariant_cast<Trace*>(value);
|
|
|
|
m->assignTrace(trace);
|
|
|
|
}
|
|
|
|
break;
|
2020-10-21 01:15:06 +08:00
|
|
|
case ColIndexSettings: {
|
|
|
|
m->adjustSettings(value.toDouble());
|
2020-08-31 04:03:41 +08:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
Qt::ItemFlags TraceMarkerModel::flags(const QModelIndex &index) const
|
|
|
|
{
|
|
|
|
int flags = Qt::NoItemFlags;
|
|
|
|
switch(index.column()) {
|
2020-10-20 23:03:49 +08:00
|
|
|
case ColIndexNumber: flags |= Qt::ItemIsEnabled | Qt::ItemIsEditable; break;
|
2020-08-31 04:03:41 +08:00
|
|
|
case ColIndexTrace: flags |= Qt::ItemIsEnabled | Qt::ItemIsEditable; break;
|
2020-10-20 23:03:49 +08:00
|
|
|
case ColIndexType: flags |= Qt::ItemIsEnabled | Qt::ItemIsEditable; break;
|
2020-10-21 01:15:06 +08:00
|
|
|
case ColIndexSettings: flags |= Qt::ItemIsEnabled | Qt::ItemIsEditable; break;
|
2020-08-31 04:03:41 +08:00
|
|
|
case ColIndexData: flags |= Qt::ItemIsEnabled; break;
|
|
|
|
}
|
|
|
|
return (Qt::ItemFlags) flags;
|
|
|
|
}
|
|
|
|
|
2020-10-20 23:03:49 +08:00
|
|
|
std::vector<TraceMarker *> TraceMarkerModel::getMarkers()
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
|
|
|
return markers;
|
|
|
|
}
|
|
|
|
|
2020-10-20 23:03:49 +08:00
|
|
|
std::vector<TraceMarker *> TraceMarkerModel::getMarkers(Trace *t)
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
|
|
|
std::vector<TraceMarker*> attachedMarkers;
|
|
|
|
for(auto m : markers) {
|
2020-10-20 03:21:04 +08:00
|
|
|
if(m->getTrace() == t) {
|
2020-08-31 04:03:41 +08:00
|
|
|
attachedMarkers.push_back(m);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return attachedMarkers;
|
|
|
|
}
|
|
|
|
|
|
|
|
TraceModel &TraceMarkerModel::getModel()
|
|
|
|
{
|
|
|
|
return model;
|
|
|
|
}
|
|
|
|
|
2020-10-20 23:03:49 +08:00
|
|
|
void TraceMarkerModel::updateMarkers()
|
|
|
|
{
|
|
|
|
for(auto m : markers) {
|
|
|
|
m->update();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
QWidget *MarkerTraceDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
|
|
|
auto model = (TraceMarkerModel*) index.model();
|
|
|
|
auto c = new QComboBox(parent);
|
|
|
|
connect(c, qOverload<int>(&QComboBox::currentIndexChanged), [c](int) {
|
|
|
|
c->clearFocus();
|
|
|
|
});
|
|
|
|
auto traces = model->getModel().getTraces();
|
|
|
|
for(auto t : traces) {
|
|
|
|
c->addItem(t->name(), QVariant::fromValue<Trace*>(t));
|
|
|
|
}
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
2020-10-20 23:03:49 +08:00
|
|
|
void MarkerTraceDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
|
|
|
auto model = (TraceMarkerModel*) index.model();
|
2020-10-20 23:03:49 +08:00
|
|
|
auto marker = model->getMarkers()[index.row()];
|
2020-08-31 04:03:41 +08:00
|
|
|
auto c = (QComboBox*) editor;
|
|
|
|
for(int i=0;i<c->count();i++) {
|
|
|
|
if(qvariant_cast<Trace*>(c->itemData(i)) == marker->trace()) {
|
|
|
|
c->setCurrentIndex(i);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-20 23:03:49 +08:00
|
|
|
void MarkerTraceDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
|
|
|
auto markerModel = (TraceMarkerModel*) model;
|
|
|
|
auto c = (QComboBox*) editor;
|
|
|
|
markerModel->setData(index, c->itemData(c->currentIndex()));
|
|
|
|
}
|
2020-09-21 20:06:20 +08:00
|
|
|
|
2020-10-21 01:15:06 +08:00
|
|
|
QWidget *MarkerSettingsDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
|
2020-09-21 20:06:20 +08:00
|
|
|
{
|
|
|
|
auto model = (TraceMarkerModel*) index.model();
|
2020-10-20 23:03:49 +08:00
|
|
|
auto marker = model->getMarkers()[index.row()];
|
2020-09-21 20:06:20 +08:00
|
|
|
marker->editingFrequeny = true;
|
2020-10-20 23:03:49 +08:00
|
|
|
auto e = marker->getSettingsEditor();
|
|
|
|
e->setParent(parent);
|
2020-10-21 01:15:06 +08:00
|
|
|
connect(e, &SIUnitEdit::valueUpdated, this, &MarkerSettingsDelegate::commitData);
|
2020-10-20 23:03:49 +08:00
|
|
|
return e;
|
2020-09-21 20:06:20 +08:00
|
|
|
}
|
|
|
|
|
2020-10-21 01:15:06 +08:00
|
|
|
void MarkerSettingsDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
|
2020-09-21 20:06:20 +08:00
|
|
|
{
|
|
|
|
auto markerModel = (TraceMarkerModel*) model;
|
2020-10-20 23:03:49 +08:00
|
|
|
auto marker = markerModel->getMarkers()[index.row()];
|
2020-09-21 20:06:20 +08:00
|
|
|
marker->editingFrequeny = false;
|
2020-10-20 23:03:49 +08:00
|
|
|
auto si = (SIUnitEdit*) editor;
|
|
|
|
markerModel->setData(index, si->value());
|
|
|
|
}
|
|
|
|
|
|
|
|
QWidget *MarkerTypeDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
|
|
|
|
{
|
|
|
|
auto model = (TraceMarkerModel*) index.model();
|
|
|
|
auto marker = model->getMarkers()[index.row()];
|
|
|
|
auto editor = marker->getTypeEditor(const_cast<MarkerTypeDelegate*>(this));
|
|
|
|
editor->setParent(parent);
|
|
|
|
// connect(editor, &QWidget::focusC)
|
|
|
|
return editor;
|
|
|
|
}
|
|
|
|
|
|
|
|
void MarkerTypeDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
|
|
|
|
{
|
|
|
|
auto markerModel = (TraceMarkerModel*) model;
|
|
|
|
auto marker = markerModel->getMarkers()[index.row()];
|
|
|
|
marker->updateTypeFromEditor(editor);
|
2020-09-21 20:06:20 +08:00
|
|
|
}
|