X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fview%2Fanalogsignal.cpp;h=106735567c78e11363a2c0d9cda6d750c0b1f937;hp=5777628747cd550b8b3624567b3a65407c8fe07f;hb=17c7f31c7bb674d5017a8de66a5816e34542abb8;hpb=6c0df7c482e0351f7b0cb0b8cbe0d92f77f08980 diff --git a/pv/view/analogsignal.cpp b/pv/view/analogsignal.cpp index 57776287..10673556 100644 --- a/pv/view/analogsignal.cpp +++ b/pv/view/analogsignal.cpp @@ -31,7 +31,6 @@ #include #include #include -#include #include #include "analogsignal.hpp" @@ -569,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(); @@ -592,16 +591,33 @@ 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 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; + owner_->extents_changed(false, true); + } + + // 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_ = pos_vdivs_ / 2; - pos_vdivs_ -= neg_vdivs_; + neg_vdivs_ = 1; + owner_->extents_changed(false, true); } double min_value_per_div; @@ -630,19 +646,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); @@ -709,21 +725,35 @@ 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 - owner_->extents_changed(false, true); + if (owner_) owner_->row_item_appearance_changed(false, true); - } } 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 @@ -734,10 +764,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 @@ -760,7 +807,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