X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fview%2Fanalogsignal.cpp;h=63e759f97ed7411922b70e2af4946dd2df643ad9;hp=4479885da72589eb678b45ad7f45d16830b8fc18;hb=80067e4944e111bfa8d6b399812dddaa29d5a4ab;hpb=fdfd5b3e246a4d4a8bcf7dbb25a6179cc86c9569 diff --git a/pv/view/analogsignal.cpp b/pv/view/analogsignal.cpp index 4479885d..63e759f9 100644 --- a/pv/view/analogsignal.cpp +++ b/pv/view/analogsignal.cpp @@ -31,7 +31,6 @@ #include #include #include -#include #include #include "analogsignal.hpp" @@ -40,9 +39,9 @@ #include "pv/data/logic.hpp" #include "pv/data/logicsegment.hpp" #include "pv/data/signalbase.hpp" -#include "pv/view/view.hpp" -#include "pv/view/logicsignal.hpp" #include "pv/globalsettings.hpp" +#include "pv/view/logicsignal.hpp" +#include "pv/view/view.hpp" #include @@ -176,7 +175,7 @@ void AnalogSignal::scale_handle_drag_release() update_scale(); } -void AnalogSignal::paint_back(QPainter &p, const ViewItemPaintParams &pp) +void AnalogSignal::paint_back(QPainter &p, ViewItemPaintParams &pp) { if (base_->enabled()) { Trace::paint_back(p, pp); @@ -184,7 +183,7 @@ void AnalogSignal::paint_back(QPainter &p, const ViewItemPaintParams &pp) } } -void AnalogSignal::paint_mid(QPainter &p, const ViewItemPaintParams &pp) +void AnalogSignal::paint_mid(QPainter &p, ViewItemPaintParams &pp) { assert(base_->analog_data()); assert(owner_); @@ -237,7 +236,7 @@ void AnalogSignal::paint_mid(QPainter &p, const ViewItemPaintParams &pp) } } -void AnalogSignal::paint_fore(QPainter &p, const ViewItemPaintParams &pp) +void AnalogSignal::paint_fore(QPainter &p, ViewItemPaintParams &pp) { if (!enabled()) return; @@ -264,13 +263,19 @@ void AnalogSignal::paint_grid(QPainter &p, int y, int left, int right) { p.setRenderHint(QPainter::Antialiasing, false); + GlobalSettings settings; + const bool show_analog_minor_grid = + settings.value(GlobalSettings::Key_View_ShowAnalogMinorGrid).toBool(); + if (pos_vdivs_ > 0) { p.setPen(QPen(GridMajorColor, 1, Qt::DashLine)); for (int i = 1; i <= pos_vdivs_; i++) { const float dy = i * div_height_; p.drawLine(QLineF(left, y - dy, right, y - dy)); } + } + if ((pos_vdivs_ > 0) && show_analog_minor_grid) { p.setPen(QPen(GridMinorColor, 1, Qt::DashLine)); for (int i = 0; i < pos_vdivs_; i++) { const float dy = i * div_height_; @@ -289,7 +294,9 @@ void AnalogSignal::paint_grid(QPainter &p, int y, int left, int right) const float dy = i * div_height_; p.drawLine(QLineF(left, y + dy, right, y + dy)); } + } + if ((pos_vdivs_ > 0) && show_analog_minor_grid) { p.setPen(QPen(GridMinorColor, 1, Qt::DashLine)); for (int i = 0; i < neg_vdivs_; i++) { const float dy = i * div_height_; @@ -412,7 +419,7 @@ void AnalogSignal::paint_envelope(QPainter &p, delete[] e.samples; } -void AnalogSignal::paint_logic_mid(QPainter &p, const ViewItemPaintParams &pp) +void AnalogSignal::paint_logic_mid(QPainter &p, ViewItemPaintParams &pp) { QLineF *line; @@ -422,7 +429,7 @@ void AnalogSignal::paint_logic_mid(QPainter &p, const ViewItemPaintParams &pp) const int y = get_visual_y(); - if (!base_->enabled()) + if (!base_->enabled() || !base_->logic_data()) return; const int signal_margin = @@ -435,6 +442,7 @@ void AnalogSignal::paint_logic_mid(QPainter &p, const ViewItemPaintParams &pp) const deque< shared_ptr > &segments = base_->logic_data()->logic_segments(); + if (segments.empty()) return; @@ -560,7 +568,7 @@ void AnalogSignal::update_conversion_type() owner_->row_item_appearance_changed(false, true); } -void AnalogSignal::perform_autoranging(bool force_update) +void AnalogSignal::perform_autoranging(bool keep_divs, bool force_update) { const deque< shared_ptr > &segments = base_->analog_data()->analog_segments(); @@ -583,18 +591,31 @@ void AnalogSignal::perform_autoranging(bool force_update) prev_min = min; prev_max = max; - // Use all divs for the positive range if there are no negative values - if ((min == 0) && (neg_vdivs_ > 0)) { - pos_vdivs_ += neg_vdivs_; - neg_vdivs_ = 0; - } + // If we're allowed to alter the div assignment... + if (!keep_divs) { + // Use all divs for the positive range if there are no negative values + if ((min == 0) && (neg_vdivs_ > 0)) { + pos_vdivs_ += neg_vdivs_; + neg_vdivs_ = 0; + } - // Split up the divs if there are negative values but no negative divs - if ((min < 0) && (neg_vdivs_ == 0)) { - neg_vdivs_ = pos_vdivs_ / 2; - pos_vdivs_ -= neg_vdivs_; + // Split up the divs if there are negative values but no negative divs + if ((min < 0) && (neg_vdivs_ == 0)) { + neg_vdivs_ = pos_vdivs_ / 2; + pos_vdivs_ -= neg_vdivs_; + } } + // If there is still no positive div when we need it, add one + // (this can happen when pos_vdivs==neg_vdivs==0) + if ((max > 0) && (pos_vdivs_ == 0)) + pos_vdivs_ = 1; + + // If there is still no negative div when we need it, add one + // (this can happen when pos_vdivs was 0 or 1 when trying to split) + if ((min < 0) && (neg_vdivs_ == 0)) + neg_vdivs_ = 1; + double min_value_per_div; if ((pos_vdivs_ > 0) && (neg_vdivs_ > 0)) min_value_per_div = std::max(max / pos_vdivs_, -min / neg_vdivs_); @@ -621,19 +642,19 @@ void AnalogSignal::populate_popup_form(QWidget *parent, QFormLayout *form) QFormLayout *const layout = new QFormLayout; // Add the number of vdivs - QSpinBox *pvdiv_sb = new QSpinBox(parent); - pvdiv_sb->setRange(0, MaximumVDivs); - pvdiv_sb->setValue(pos_vdivs_); - connect(pvdiv_sb, SIGNAL(valueChanged(int)), + pvdiv_sb_ = new QSpinBox(parent); + pvdiv_sb_->setRange(0, MaximumVDivs); + pvdiv_sb_->setValue(pos_vdivs_); + connect(pvdiv_sb_, SIGNAL(valueChanged(int)), this, SLOT(on_pos_vdivs_changed(int))); - layout->addRow(tr("Number of pos vertical divs"), pvdiv_sb); + layout->addRow(tr("Number of pos vertical divs"), pvdiv_sb_); - QSpinBox *nvdiv_sb = new QSpinBox(parent); - nvdiv_sb->setRange(0, MaximumVDivs); - nvdiv_sb->setValue(neg_vdivs_); - connect(nvdiv_sb, SIGNAL(valueChanged(int)), + nvdiv_sb_ = new QSpinBox(parent); + nvdiv_sb_->setRange(0, MaximumVDivs); + nvdiv_sb_->setValue(neg_vdivs_); + connect(nvdiv_sb_, SIGNAL(valueChanged(int)), this, SLOT(on_neg_vdivs_changed(int))); - layout->addRow(tr("Number of neg vertical divs"), nvdiv_sb); + layout->addRow(tr("Number of neg vertical divs"), nvdiv_sb_); // Add the vertical resolution resolution_cb_ = new QComboBox(parent); @@ -700,7 +721,7 @@ void AnalogSignal::populate_popup_form(QWidget *parent, QFormLayout *form) void AnalogSignal::on_samples_added() { - perform_autoranging(); + perform_autoranging(false, false); if (owner_) { // Call order is important, otherwise the lazy event handler won't work @@ -711,10 +732,27 @@ void AnalogSignal::on_samples_added() void AnalogSignal::on_pos_vdivs_changed(int vdivs) { + if (vdivs == pos_vdivs_) + return; + pos_vdivs_ = vdivs; - if (autoranging_) - perform_autoranging(true); + // There has to be at least one div, positive or negative + if ((neg_vdivs_ == 0) && (pos_vdivs_ == 0)) { + pos_vdivs_ = 1; + if (pvdiv_sb_) + pvdiv_sb_->setValue(pos_vdivs_); + } + + if (autoranging_) { + perform_autoranging(true, true); + + // It could be that a positive or negative div was added, so update + if (pvdiv_sb_) { + pvdiv_sb_->setValue(pos_vdivs_); + nvdiv_sb_->setValue(neg_vdivs_); + } + } if (owner_) { // Call order is important, otherwise the lazy event handler won't work @@ -725,10 +763,27 @@ void AnalogSignal::on_pos_vdivs_changed(int vdivs) void AnalogSignal::on_neg_vdivs_changed(int vdivs) { + if (vdivs == neg_vdivs_) + return; + neg_vdivs_ = vdivs; - if (autoranging_) - perform_autoranging(true); + // There has to be at least one div, positive or negative + if ((neg_vdivs_ == 0) && (pos_vdivs_ == 0)) { + pos_vdivs_ = 1; + if (pvdiv_sb_) + pvdiv_sb_->setValue(pos_vdivs_); + } + + if (autoranging_) { + perform_autoranging(true, true); + + // It could be that a positive or negative div was added, so update + if (pvdiv_sb_) { + pvdiv_sb_->setValue(pos_vdivs_); + nvdiv_sb_->setValue(neg_vdivs_); + } + } if (owner_) { // Call order is important, otherwise the lazy event handler won't work @@ -751,7 +806,7 @@ void AnalogSignal::on_autoranging_changed(int state) autoranging_ = (state == Qt::Checked); if (autoranging_) - perform_autoranging(true); + perform_autoranging(false, true); if (owner_) { // Call order is important, otherwise the lazy event handler won't work