Visibility setting for markers

This commit is contained in:
Jan Käberich 2022-07-09 14:31:41 +02:00
parent 80eaf5bce7
commit 29544066bb
10 changed files with 70 additions and 4 deletions

View File

@ -24,6 +24,7 @@ Marker::Marker(MarkerModel *model, int number, Marker *parent, QString descr)
parentTrace(nullptr), parentTrace(nullptr),
position(1000000000), position(1000000000),
number(number), number(number),
visible(true),
data(0), data(0),
type(Type::Manual), type(Type::Manual),
description(descr), description(descr),
@ -680,7 +681,7 @@ void Marker::traceDataChanged()
void Marker::updateSymbol() void Marker::updateSymbol()
{ {
if(isVisible()) { if(isDisplayedMarker()) {
constexpr int width = 15, height = 15; constexpr int width = 15, height = 15;
symbol = QPixmap(width, height); symbol = QPixmap(width, height);
symbol.fill(Qt::transparent); symbol.fill(Qt::transparent);
@ -1056,7 +1057,7 @@ double Marker::toDecibel()
return Util::SparamTodB(data); return Util::SparamTodB(data);
} }
bool Marker::isVisible() bool Marker::isDisplayedMarker()
{ {
switch(type) { switch(type) {
case Type::Manual: case Type::Manual:
@ -1119,6 +1120,7 @@ nlohmann::json Marker::toJSON()
{ {
nlohmann::json j; nlohmann::json j;
j["trace"] = parentTrace->toHash(); j["trace"] = parentTrace->toHash();
j["visible"] = visible;
j["type"] = typeToString(type).toStdString(); j["type"] = typeToString(type).toStdString();
j["number"] = number; j["number"] = number;
j["position"] = position; j["position"] = position;
@ -1160,6 +1162,7 @@ void Marker::fromJSON(nlohmann::json j)
} }
number = j.value("number", 1); number = j.value("number", 1);
position = j.value("position", 0.0); position = j.value("position", 0.0);
visible = j.value("visible", true);
unsigned int hash = j["trace"]; unsigned int hash = j["trace"];
// find correct trace // find correct trace
@ -1484,6 +1487,19 @@ void Marker::adjustSettings(double value)
update(); update();
} }
bool Marker::isVisible()
{
return visible;
}
bool Marker::setVisible(bool visible)
{
if(this->visible != visible) {
this->visible = visible;
emit visibilityChanged(this);
}
}
QMenu *Marker::getContextMenu() { QMenu *Marker::getContextMenu() {
if(parent) { if(parent) {
return parent->getContextMenu(); return parent->getContextMenu();

View File

@ -95,6 +95,8 @@ public:
void updateTypeFromEditor(QWidget *c); void updateTypeFromEditor(QWidget *c);
SIUnitEdit* getSettingsEditor(); SIUnitEdit* getSettingsEditor();
void adjustSettings(double value); void adjustSettings(double value);
bool isVisible();
bool setVisible(bool visible);
QMenu *getContextMenu(); QMenu *getContextMenu();
@ -128,6 +130,7 @@ signals:
void positionChanged(double pos); void positionChanged(double pos);
void deleted(Marker *m); void deleted(Marker *m);
void dataChanged(Marker *m); void dataChanged(Marker *m);
void visibilityChanged(Marker *m);
void symbolChanged(Marker *m); void symbolChanged(Marker *m);
void typeChanged(Marker *m); void typeChanged(Marker *m);
void assignedDeltaChanged(Marker *m); void assignedDeltaChanged(Marker *m);
@ -170,7 +173,7 @@ private:
void deleteHelperMarkers(); void deleteHelperMarkers();
void setType(Type t); void setType(Type t);
double toDecibel(); double toDecibel();
bool isVisible(); bool isDisplayedMarker();
void setTableFormat(Format f); void setTableFormat(Format f);
@ -178,6 +181,7 @@ private:
Trace *parentTrace; Trace *parentTrace;
double position; double position;
int number; int number;
bool visible;
// Frequency domain: S parameter // Frequency domain: S parameter
// Time domain: impulse response // Time domain: impulse response
std::complex<double> data; std::complex<double> data;

View File

@ -95,6 +95,11 @@ void MarkerModel::addMarker(Marker *t)
auto modelIndex = createIndex(row, 0, root); auto modelIndex = createIndex(row, 0, root);
beginRemoveRows(modelIndex, 0, m->getHelperMarkers().size() - 1); 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) { connect(t, &Marker::endRemoveHelperMarkers, [=](Marker *m) {
endRemoveRows(); endRemoveRows();
markerDataChanged(m); markerDataChanged(m);
@ -222,7 +227,8 @@ int MarkerModel::columnCount(const QModelIndex &) const
QVariant MarkerModel::data(const QModelIndex &index, int role) const QVariant MarkerModel::data(const QModelIndex &index, int role) const
{ {
auto marker = markerFromIndex(index); auto marker = markerFromIndex(index);
if(role == Qt::DisplayRole) { switch(role) {
case Qt::DisplayRole:
switch(index.column()) { switch(index.column()) {
case ColIndexNumber: case ColIndexNumber:
return QString::number(marker->getNumber()) + marker->getSuffix(); return QString::number(marker->getNumber()) + marker->getSuffix();
@ -243,6 +249,16 @@ QVariant MarkerModel::data(const QModelIndex &index, int role) const
case ColIndexData: case ColIndexData:
return marker->readableData(); 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(); return QVariant();
} }
@ -254,6 +270,7 @@ QVariant MarkerModel::headerData(int section, Qt::Orientation orientation, int r
case Qt::DecorationRole: case Qt::DecorationRole:
switch(section) { switch(section) {
case ColIndexGroup: return QIcon(":/icons/chainlink.png"); case ColIndexGroup: return QIcon(":/icons/chainlink.png");
case ColIndexVisible: return QIcon(":/icons/visible.svg");
} }
break; break;
case Qt::DisplayRole: case Qt::DisplayRole:
@ -311,6 +328,7 @@ Qt::ItemFlags MarkerModel::flags(const QModelIndex &index) const
int flags = Qt::ItemIsSelectable; int flags = Qt::ItemIsSelectable;
switch(index.column()) { switch(index.column()) {
case ColIndexNumber: flags |= Qt::ItemIsEnabled | Qt::ItemIsEditable; break; case ColIndexNumber: flags |= Qt::ItemIsEnabled | Qt::ItemIsEditable; break;
case ColIndexVisible: flags |= Qt::ItemIsEnabled; break;
case ColIndexGroup: flags |= Qt::ItemIsEnabled; break; case ColIndexGroup: flags |= Qt::ItemIsEnabled; break;
case ColIndexTrace: flags |= Qt::ItemIsEnabled | Qt::ItemIsEditable; break; case ColIndexTrace: flags |= Qt::ItemIsEnabled | Qt::ItemIsEditable; break;
case ColIndexType: flags |= Qt::ItemIsEnabled | Qt::ItemIsEditable; break; case ColIndexType: flags |= Qt::ItemIsEnabled | Qt::ItemIsEditable; break;

View File

@ -54,6 +54,7 @@ public:
enum { enum {
ColIndexNumber, ColIndexNumber,
ColIndexVisible,
ColIndexGroup, ColIndexGroup,
ColIndexTrace, ColIndexTrace,
ColIndexType, ColIndexType,

View File

@ -33,6 +33,7 @@ MarkerWidget::MarkerWidget(MarkerModel &model, QWidget *parent) :
ui->treeView->setColumnWidth(MarkerModel::ColIndexNumber, 60); ui->treeView->setColumnWidth(MarkerModel::ColIndexNumber, 60);
ui->treeView->setColumnWidth(MarkerModel::ColIndexGroup, 20); ui->treeView->setColumnWidth(MarkerModel::ColIndexGroup, 20);
ui->treeView->setColumnWidth(MarkerModel::ColIndexVisible, 20);
ui->treeView->setColumnWidth(MarkerModel::ColIndexTrace, 60); ui->treeView->setColumnWidth(MarkerModel::ColIndexTrace, 60);
ui->treeView->setColumnWidth(MarkerModel::ColIndexType, 120); ui->treeView->setColumnWidth(MarkerModel::ColIndexType, 120);
@ -93,6 +94,12 @@ MarkerWidget::MarkerWidget(MarkerModel &model, QWidget *parent) :
updatePersistentEditors(); updatePersistentEditors();
}); });
connect(&model, &MarkerModel::setupLoadComplete, this, &MarkerWidget::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() MarkerWidget::~MarkerWidget()

View File

@ -299,16 +299,24 @@ void Trace::addMarker(Marker *m)
{ {
markers.insert(m); markers.insert(m);
connect(m, &Marker::dataFormatChanged, this, &Trace::markerFormatChanged); connect(m, &Marker::dataFormatChanged, this, &Trace::markerFormatChanged);
connect(m, &Marker::visibilityChanged, this, &Trace::markerVisibilityChanged);
emit markerAdded(m); emit markerAdded(m);
} }
void Trace::removeMarker(Marker *m) void Trace::removeMarker(Marker *m)
{ {
disconnect(m, &Marker::dataFormatChanged, this, &Trace::markerFormatChanged); disconnect(m, &Marker::dataFormatChanged, this, &Trace::markerFormatChanged);
disconnect(m, &Marker::visibilityChanged, this, &Trace::markerVisibilityChanged);
markers.erase(m); markers.erase(m);
emit markerRemoved(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 double Trace::getReferenceImpedance() const
{ {
return reference_impedance; return reference_impedance;

View File

@ -167,6 +167,9 @@ signals:
void markerRemoved(Marker *m); void markerRemoved(Marker *m);
void markerFormatChanged(Marker *m); void markerFormatChanged(Marker *m);
private slots:
void markerVisibilityChanged(Marker *m);
private: private:
QString _name; QString _name;
QColor _color; QColor _color;

View File

@ -197,6 +197,9 @@ void TracePlot::paintEvent(QPaintEvent *event)
auto tmarkers = t.first->getMarkers(); auto tmarkers = t.first->getMarkers();
for(auto m : tmarkers) { for(auto m : tmarkers) {
if(!m->isVisible()) {
continue;
}
if(!markerVisible(m->getPosition())) { if(!markerVisible(m->getPosition())) {
// marker not visible with current plot settings // marker not visible with current plot settings
continue; continue;

View File

@ -386,6 +386,9 @@ void TraceSmithChart::draw(QPainter &p) {
// only draw markers if the trace has at least one point // only draw markers if the trace has at least one point
auto markers = t.first->getMarkers(); auto markers = t.first->getMarkers();
for(auto m : markers) { for(auto m : markers) {
if(!m->isVisible()) {
continue;
}
// if (m->isTimeDomain()) { // if (m->isTimeDomain()) {
// continue; // continue;
// } // }

View File

@ -505,6 +505,9 @@ void TraceXYPlot::draw(QPainter &p)
// only draw markers on primary YAxis and if the trace has at least one point // only draw markers on primary YAxis and if the trace has at least one point
auto markers = t->getMarkers(); auto markers = t->getMarkers();
for(auto m : markers) { for(auto m : markers) {
if(!m->isVisible()) {
continue;
}
double xPosition = m->getPosition(); double xPosition = m->getPosition();
if (xPosition < xAxis.getRangeMin() || xPosition > xAxis.getRangeMax()) { if (xPosition < xAxis.getRangeMin() || xPosition > xAxis.getRangeMax()) {
// marker not in graph range // marker not in graph range