From 29544066bba80ced4ca43464665a05c83fd74676 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20K=C3=A4berich?= Date: Sat, 9 Jul 2022 14:31:41 +0200 Subject: [PATCH] Visibility setting for markers --- .../PC_Application/Traces/Marker/marker.cpp | 20 +++++++++++++++++-- .../PC_Application/Traces/Marker/marker.h | 6 +++++- .../Traces/Marker/markermodel.cpp | 20 ++++++++++++++++++- .../Traces/Marker/markermodel.h | 1 + .../Traces/Marker/markerwidget.cpp | 7 +++++++ Software/PC_Application/Traces/trace.cpp | 8 ++++++++ Software/PC_Application/Traces/trace.h | 3 +++ Software/PC_Application/Traces/traceplot.cpp | 3 +++ .../PC_Application/Traces/tracesmithchart.cpp | 3 +++ .../PC_Application/Traces/tracexyplot.cpp | 3 +++ 10 files changed, 70 insertions(+), 4 deletions(-) diff --git a/Software/PC_Application/Traces/Marker/marker.cpp b/Software/PC_Application/Traces/Marker/marker.cpp index 4ea29b0..948197b 100644 --- a/Software/PC_Application/Traces/Marker/marker.cpp +++ b/Software/PC_Application/Traces/Marker/marker.cpp @@ -24,6 +24,7 @@ Marker::Marker(MarkerModel *model, int number, Marker *parent, QString descr) parentTrace(nullptr), position(1000000000), number(number), + visible(true), data(0), type(Type::Manual), description(descr), @@ -680,7 +681,7 @@ void Marker::traceDataChanged() void Marker::updateSymbol() { - if(isVisible()) { + if(isDisplayedMarker()) { constexpr int width = 15, height = 15; symbol = QPixmap(width, height); symbol.fill(Qt::transparent); @@ -1056,7 +1057,7 @@ double Marker::toDecibel() return Util::SparamTodB(data); } -bool Marker::isVisible() +bool Marker::isDisplayedMarker() { switch(type) { case Type::Manual: @@ -1119,6 +1120,7 @@ nlohmann::json Marker::toJSON() { nlohmann::json j; j["trace"] = parentTrace->toHash(); + j["visible"] = visible; j["type"] = typeToString(type).toStdString(); j["number"] = number; j["position"] = position; @@ -1160,6 +1162,7 @@ void Marker::fromJSON(nlohmann::json j) } number = j.value("number", 1); position = j.value("position", 0.0); + visible = j.value("visible", true); unsigned int hash = j["trace"]; // find correct trace @@ -1484,6 +1487,19 @@ void Marker::adjustSettings(double value) update(); } +bool Marker::isVisible() +{ + return visible; +} + +bool Marker::setVisible(bool visible) +{ + if(this->visible != visible) { + this->visible = visible; + emit visibilityChanged(this); + } +} + QMenu *Marker::getContextMenu() { if(parent) { return parent->getContextMenu(); diff --git a/Software/PC_Application/Traces/Marker/marker.h b/Software/PC_Application/Traces/Marker/marker.h index db9ffe2..17c71d1 100644 --- a/Software/PC_Application/Traces/Marker/marker.h +++ b/Software/PC_Application/Traces/Marker/marker.h @@ -95,6 +95,8 @@ public: void updateTypeFromEditor(QWidget *c); SIUnitEdit* getSettingsEditor(); void adjustSettings(double value); + bool isVisible(); + bool setVisible(bool visible); QMenu *getContextMenu(); @@ -128,6 +130,7 @@ signals: void positionChanged(double pos); void deleted(Marker *m); void dataChanged(Marker *m); + void visibilityChanged(Marker *m); void symbolChanged(Marker *m); void typeChanged(Marker *m); void assignedDeltaChanged(Marker *m); @@ -170,7 +173,7 @@ private: void deleteHelperMarkers(); void setType(Type t); double toDecibel(); - bool isVisible(); + bool isDisplayedMarker(); void setTableFormat(Format f); @@ -178,6 +181,7 @@ private: Trace *parentTrace; double position; int number; + bool visible; // Frequency domain: S parameter // Time domain: impulse response std::complex data; diff --git a/Software/PC_Application/Traces/Marker/markermodel.cpp b/Software/PC_Application/Traces/Marker/markermodel.cpp index 4787be9..0038ef5 100644 --- a/Software/PC_Application/Traces/Marker/markermodel.cpp +++ b/Software/PC_Application/Traces/Marker/markermodel.cpp @@ -95,6 +95,11 @@ void MarkerModel::addMarker(Marker *t) auto modelIndex = createIndex(row, 0, root); beginRemoveRows(modelIndex, 0, m->getHelperMarkers().size() - 1); }); + connect(t, &Marker::visibilityChanged, [=](Marker *m) { + auto row = find(markers.begin(), markers.end(), m) - markers.begin(); + auto index = createIndex(row, (int) ColIndexVisible, root); + emit dataChanged(index, index); + }); connect(t, &Marker::endRemoveHelperMarkers, [=](Marker *m) { endRemoveRows(); markerDataChanged(m); @@ -222,7 +227,8 @@ int MarkerModel::columnCount(const QModelIndex &) const QVariant MarkerModel::data(const QModelIndex &index, int role) const { auto marker = markerFromIndex(index); - if(role == Qt::DisplayRole) { + switch(role) { + case Qt::DisplayRole: switch(index.column()) { case ColIndexNumber: return QString::number(marker->getNumber()) + marker->getSuffix(); @@ -243,6 +249,16 @@ QVariant MarkerModel::data(const QModelIndex &index, int role) const case ColIndexData: return marker->readableData(); } + break; + case Qt::DecorationRole: + switch(index.column()) { + case ColIndexVisible: + if(marker->isVisible()) { + return QIcon(":/icons/visible.svg"); + } else { + return QIcon(":/icons/invisible.svg"); + } + } } return QVariant(); } @@ -254,6 +270,7 @@ QVariant MarkerModel::headerData(int section, Qt::Orientation orientation, int r case Qt::DecorationRole: switch(section) { case ColIndexGroup: return QIcon(":/icons/chainlink.png"); + case ColIndexVisible: return QIcon(":/icons/visible.svg"); } break; case Qt::DisplayRole: @@ -311,6 +328,7 @@ Qt::ItemFlags MarkerModel::flags(const QModelIndex &index) const int flags = Qt::ItemIsSelectable; switch(index.column()) { case ColIndexNumber: flags |= Qt::ItemIsEnabled | Qt::ItemIsEditable; break; + case ColIndexVisible: flags |= Qt::ItemIsEnabled; break; case ColIndexGroup: flags |= Qt::ItemIsEnabled; break; case ColIndexTrace: flags |= Qt::ItemIsEnabled | Qt::ItemIsEditable; break; case ColIndexType: flags |= Qt::ItemIsEnabled | Qt::ItemIsEditable; break; diff --git a/Software/PC_Application/Traces/Marker/markermodel.h b/Software/PC_Application/Traces/Marker/markermodel.h index 8847ae2..2fba1e3 100644 --- a/Software/PC_Application/Traces/Marker/markermodel.h +++ b/Software/PC_Application/Traces/Marker/markermodel.h @@ -54,6 +54,7 @@ public: enum { ColIndexNumber, + ColIndexVisible, ColIndexGroup, ColIndexTrace, ColIndexType, diff --git a/Software/PC_Application/Traces/Marker/markerwidget.cpp b/Software/PC_Application/Traces/Marker/markerwidget.cpp index 2274d10..516eecc 100644 --- a/Software/PC_Application/Traces/Marker/markerwidget.cpp +++ b/Software/PC_Application/Traces/Marker/markerwidget.cpp @@ -33,6 +33,7 @@ MarkerWidget::MarkerWidget(MarkerModel &model, QWidget *parent) : ui->treeView->setColumnWidth(MarkerModel::ColIndexNumber, 60); ui->treeView->setColumnWidth(MarkerModel::ColIndexGroup, 20); + ui->treeView->setColumnWidth(MarkerModel::ColIndexVisible, 20); ui->treeView->setColumnWidth(MarkerModel::ColIndexTrace, 60); ui->treeView->setColumnWidth(MarkerModel::ColIndexType, 120); @@ -93,6 +94,12 @@ MarkerWidget::MarkerWidget(MarkerModel &model, QWidget *parent) : updatePersistentEditors(); }); connect(&model, &MarkerModel::setupLoadComplete, this, &MarkerWidget::updatePersistentEditors); + connect(ui->treeView, &QTreeView::clicked, [&](const QModelIndex &index){ + if(index.column() == (int) MarkerModel::ColIndexVisible) { + auto marker = model.markerFromIndex(index); + marker->setVisible(!marker->isVisible()); + } + }); } MarkerWidget::~MarkerWidget() diff --git a/Software/PC_Application/Traces/trace.cpp b/Software/PC_Application/Traces/trace.cpp index 74365db..1152783 100644 --- a/Software/PC_Application/Traces/trace.cpp +++ b/Software/PC_Application/Traces/trace.cpp @@ -299,16 +299,24 @@ void Trace::addMarker(Marker *m) { markers.insert(m); connect(m, &Marker::dataFormatChanged, this, &Trace::markerFormatChanged); + connect(m, &Marker::visibilityChanged, this, &Trace::markerVisibilityChanged); emit markerAdded(m); } void Trace::removeMarker(Marker *m) { disconnect(m, &Marker::dataFormatChanged, this, &Trace::markerFormatChanged); + disconnect(m, &Marker::visibilityChanged, this, &Trace::markerVisibilityChanged); markers.erase(m); emit markerRemoved(m); } +void Trace::markerVisibilityChanged(Marker *m) +{ + // trigger replot by pretending that trace visibility also changed + emit visibilityChanged(this); +} + double Trace::getReferenceImpedance() const { return reference_impedance; diff --git a/Software/PC_Application/Traces/trace.h b/Software/PC_Application/Traces/trace.h index efeeaf7..17802f1 100644 --- a/Software/PC_Application/Traces/trace.h +++ b/Software/PC_Application/Traces/trace.h @@ -167,6 +167,9 @@ signals: void markerRemoved(Marker *m); void markerFormatChanged(Marker *m); +private slots: + void markerVisibilityChanged(Marker *m); + private: QString _name; QColor _color; diff --git a/Software/PC_Application/Traces/traceplot.cpp b/Software/PC_Application/Traces/traceplot.cpp index 3ba9497..34a157f 100644 --- a/Software/PC_Application/Traces/traceplot.cpp +++ b/Software/PC_Application/Traces/traceplot.cpp @@ -197,6 +197,9 @@ void TracePlot::paintEvent(QPaintEvent *event) auto tmarkers = t.first->getMarkers(); for(auto m : tmarkers) { + if(!m->isVisible()) { + continue; + } if(!markerVisible(m->getPosition())) { // marker not visible with current plot settings continue; diff --git a/Software/PC_Application/Traces/tracesmithchart.cpp b/Software/PC_Application/Traces/tracesmithchart.cpp index 43545e6..9f8cf4e 100644 --- a/Software/PC_Application/Traces/tracesmithchart.cpp +++ b/Software/PC_Application/Traces/tracesmithchart.cpp @@ -386,6 +386,9 @@ void TraceSmithChart::draw(QPainter &p) { // only draw markers if the trace has at least one point auto markers = t.first->getMarkers(); for(auto m : markers) { + if(!m->isVisible()) { + continue; + } // if (m->isTimeDomain()) { // continue; // } diff --git a/Software/PC_Application/Traces/tracexyplot.cpp b/Software/PC_Application/Traces/tracexyplot.cpp index fc4a748..4d0a58d 100644 --- a/Software/PC_Application/Traces/tracexyplot.cpp +++ b/Software/PC_Application/Traces/tracexyplot.cpp @@ -505,6 +505,9 @@ void TraceXYPlot::draw(QPainter &p) // only draw markers on primary YAxis and if the trace has at least one point auto markers = t->getMarkers(); for(auto m : markers) { + if(!m->isVisible()) { + continue; + } double xPosition = m->getPosition(); if (xPosition < xAxis.getRangeMin() || xPosition > xAxis.getRangeMax()) { // marker not in graph range