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),
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();

View File

@ -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<double> data;

View File

@ -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;

View File

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

View File

@ -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()

View File

@ -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;

View File

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

View File

@ -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;

View File

@ -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;
// }

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
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