]> sigrok.org Git - pulseview.git/blobdiff - pv/views/trace/analogsignal.cpp
Rework the callback mechanism for the global settings
[pulseview.git] / pv / views / trace / analogsignal.cpp
index 90e441e09f125392c5ccd215e0b2441b55f3c026..bbc23fb70074bace6adc25e304d70d50583de3dd 100644 (file)
@@ -118,8 +118,7 @@ AnalogSignal::AnalogSignal(
        connect(analog_data, SIGNAL(min_max_changed(float, float)),
                this, SLOT(on_min_max_changed(float, float)));
 
-       GlobalSettings::register_change_handler(GlobalSettings::Key_View_ConversionThresholdDispMode,
-               bind(&AnalogSignal::on_settingViewConversionThresholdDispMode_changed, this, _1));
+       GlobalSettings::add_change_handler(this);
 
        GlobalSettings gs;
        conversion_threshold_disp_mode_ =
@@ -131,6 +130,11 @@ AnalogSignal::AnalogSignal(
        update_scale();
 }
 
+AnalogSignal::~AnalogSignal()
+{
+       GlobalSettings::remove_change_handler(this);
+}
+
 shared_ptr<pv::data::SignalData> AnalogSignal::data() const
 {
        return base_->analog_data();
@@ -206,6 +210,12 @@ void AnalogSignal::scale_handle_drag_release()
        update_scale();
 }
 
+void AnalogSignal::on_setting_changed(const QString &key, const QVariant &value)
+{
+       if (key == GlobalSettings::Key_View_ConversionThresholdDispMode)
+               on_settingViewConversionThresholdDispMode_changed(value);
+}
+
 void AnalogSignal::paint_back(QPainter &p, ViewItemPaintParams &pp)
 {
        if (!base_->enabled())
@@ -658,11 +668,12 @@ shared_ptr<pv::data::AnalogSegment> AnalogSignal::get_analog_segment_to_paint()
                if (segment_display_mode_ == ShowLastSegmentOnly)
                        segment = segments.back();
 
-               if (segment_display_mode_ == ShowSingleSegmentOnly) {
+               if ((segment_display_mode_ == ShowSingleSegmentOnly) ||
+                               (segment_display_mode_ == ShowLastCompleteSegmentOnly)) {
                        try {
                                segment = segments.at(current_segment_);
                        } catch (out_of_range) {
-                               qDebug() << "Current analog segment out of range for signal" << base_->name();
+                               qDebug() << "Current analog segment out of range for signal" << base_->name() << ":" << current_segment_;
                        }
                }
        }
@@ -681,11 +692,12 @@ shared_ptr<pv::data::LogicSegment> AnalogSignal::get_logic_segment_to_paint() co
                if (segment_display_mode_ == ShowLastSegmentOnly)
                        segment = segments.back();
 
-               if (segment_display_mode_ == ShowSingleSegmentOnly) {
+               if ((segment_display_mode_ == ShowSingleSegmentOnly) ||
+                               (segment_display_mode_ == ShowLastCompleteSegmentOnly)) {
                        try {
                                segment = segments.at(current_segment_);
                        } catch (out_of_range) {
-                               qDebug() << "Current logic segment out of range for signal" << base_->name();
+                               qDebug() << "Current logic segment out of range for signal" << base_->name() << ":" << current_segment_;
                        }
                }
        }