Fix #1203 by catching the boost exception thrown on error
[pulseview.git] / pv / views / trace / view.cpp
index 35b6807dfc75c11ba825831c1552ee17fe490f5a..8eb3b8dedcd7388555e4574ae4d79501a6a512b6 100644 (file)
@@ -79,7 +79,6 @@ using std::make_pair;
 using std::make_shared;
 using std::min;
 using std::pair;
-using std::placeholders::_1;
 using std::set;
 using std::set_difference;
 using std::shared_ptr;
@@ -197,10 +196,9 @@ View::View(Session &session, bool is_main_view, QWidget *parent) :
 
        // Set up settings and event handlers
        GlobalSettings settings;
-       coloured_bg_ = settings.value(GlobalSettings::Key_View_ColouredBG).toBool();
+       colored_bg_ = settings.value(GlobalSettings::Key_View_ColoredBG).toBool();
 
-       GlobalSettings::register_change_handler(GlobalSettings::Key_View_TriggerIsZeroTime,
-               bind(&View::on_settingViewTriggerIsZeroTime_changed, this, _1));
+       GlobalSettings::add_change_handler(this);
 
        connect(scrollarea_->horizontalScrollBar(), SIGNAL(valueChanged(int)),
                this, SLOT(h_scroll_value_changed(int)));
@@ -239,6 +237,11 @@ View::View(Session &session, bool is_main_view, QWidget *parent) :
        set_segment_display_mode(segment_display_mode_);
 }
 
+View::~View()
+{
+       GlobalSettings::remove_change_handler(this);
+}
+
 Session& View::session()
 {
        return session_;
@@ -364,10 +367,13 @@ void View::restore_settings(QSettings &settings)
                stringstream ss;
                ss << settings.value("ruler_shift").toString().toStdString();
 
-               boost::archive::text_iarchive ia(ss);
-               ia >> boost::serialization::make_nvp("ruler_shift", shift);
-
-               ruler_shift_ = shift;
+               try {
+                       boost::archive::text_iarchive ia(ss);
+                       ia >> boost::serialization::make_nvp("ruler_shift", shift);
+                       ruler_shift_ = shift;
+               } catch (boost::archive::archive_exception) {
+                       qDebug() << "Could not restore the view ruler shift";
+               }
        }
 
        if (settings.contains("offset")) {
@@ -375,11 +381,14 @@ void View::restore_settings(QSettings &settings)
                stringstream ss;
                ss << settings.value("offset").toString().toStdString();
 
-               boost::archive::text_iarchive ia(ss);
-               ia >> boost::serialization::make_nvp("offset", offset);
-
-               // This also updates ruler_offset_
-               set_offset(offset);
+               try {
+                       boost::archive::text_iarchive ia(ss);
+                       ia >> boost::serialization::make_nvp("offset", offset);
+                       // This also updates ruler_offset_
+                       set_offset(offset);
+               } catch (boost::archive::archive_exception) {
+                       qDebug() << "Could not restore the view offset";
+               }
        }
 
        if (settings.contains("splitter_state"))
@@ -558,8 +567,10 @@ void View::set_current_segment(uint32_t segment_id)
 
        for (shared_ptr<Signal> signal : signals_)
                signal->set_current_segment(current_segment_);
+#ifdef ENABLE_DECODE
        for (shared_ptr<DecodeTrace> dt : decode_traces_)
                dt->set_current_segment(current_segment_);
+#endif
 
        vector<util::Timestamp> triggers = session_.get_triggers(current_segment_);
 
@@ -769,15 +780,15 @@ void View::enable_show_analog_minor_grid(bool state)
        viewport_->update();
 }
 
-void View::enable_coloured_bg(bool state)
+void View::enable_colored_bg(bool state)
 {
-       coloured_bg_ = state;
+       colored_bg_ = state;
        viewport_->update();
 }
 
-bool View::coloured_bg() const
+bool View::colored_bg() const
 {
-       return coloured_bg_;
+       return colored_bg_;
 }
 
 bool View::cursors_shown() const
@@ -861,6 +872,12 @@ void View::restack_all_trace_tree_items()
                i->animate_to_layout_v_offset();
 }
 
+void View::on_setting_changed(const QString &key, const QVariant &value)
+{
+       if (key == GlobalSettings::Key_View_TriggerIsZeroTime)
+               on_settingViewTriggerIsZeroTime_changed(value);
+}
+
 void View::trigger_event(int segment_id, util::Timestamp location)
 {
        // TODO This doesn't work if we're showing multiple segments at once
@@ -941,7 +958,7 @@ void View::calculate_tick_spacing()
                                (ScaleUnits[unit++] + tp_margin);
                } while (tp_with_margin < min_period && unit < countof(ScaleUnits));
 
-               minor_tick_count_ = (unit == 2) ? (4) : (5);
+               minor_tick_count_ = (unit == 2) ? 4 : 5;
                tick_period = order_decimal * ScaleUnits[unit - 1];
                tick_prefix = static_cast<pv::util::SIPrefix>(
                        (order - pv::util::exponent(pv::util::SIPrefix::yocto)) / 3);