Save/restore view states and signal settings
[pulseview.git] / pv / view / view.cpp
index 7e47140c6bf2f3d4335df419e8cea74dd8976ecf..c69e75caec10594ba3122aa31a8344a2e5dd5b3a 100644 (file)
 #include <cassert>
 #include <climits>
 #include <cmath>
+#include <iostream>
 #include <iterator>
 #include <mutex>
 #include <unordered_set>
 
+#include <boost/archive/text_iarchive.hpp>
+#include <boost/archive/text_oarchive.hpp>
+#include <boost/serialization/serialization.hpp>
 #include <boost/thread/locks.hpp>
 
 #include <QApplication>
@@ -201,6 +205,30 @@ void View::add_signal(const shared_ptr<view::Signal> signal)
        signals_.insert(signal);
 }
 
+#ifdef ENABLE_DECODE
+void View::clear_decode_traces()
+{
+       decode_traces_.clear();
+}
+
+void View::add_decode_trace(shared_ptr<data::SignalBase> signalbase)
+{
+       shared_ptr<view::DecodeTrace> d(
+               new view::DecodeTrace(session_, signalbase, decode_traces_.size()));
+       decode_traces_.push_back(d);
+}
+
+void View::remove_decode_trace(shared_ptr<data::SignalBase> signalbase)
+{
+       for (auto i = decode_traces_.begin(); i != decode_traces_.end(); i++)
+               if ((*i)->base() == signalbase) {
+                       decode_traces_.erase(i);
+                       signals_changed();
+                       return;
+               }
+}
+#endif
+
 View* View::view()
 {
        return this;
@@ -221,6 +249,45 @@ const Viewport* View::viewport() const
        return viewport_;
 }
 
+void View::save_settings(QSettings &settings) const
+{
+       settings.setValue("scale", scale_);
+
+       std::stringstream ss;
+       boost::archive::text_oarchive oa(ss);
+       oa << boost::serialization::make_nvp("offset", offset_);
+       settings.setValue("offset", QString::fromStdString(ss.str()));
+
+       for (shared_ptr<view::Signal> signal : signals_) {
+               settings.beginGroup(signal->base()->internal_name());
+               signal->save_settings(settings);
+               settings.endGroup();
+       }
+}
+
+void View::restore_settings(QSettings &settings)
+{
+       if (settings.contains("scale"))
+               set_scale(settings.value("scale").toDouble());
+
+       if (settings.contains("offset")) {
+               util::Timestamp offset;
+               std::stringstream ss;
+               ss << settings.value("offset").toString().toStdString();
+
+               boost::archive::text_iarchive ia(ss);
+               ia >> boost::serialization::make_nvp("offset", offset);
+
+               set_offset(offset);
+       }
+
+       for (shared_ptr<view::Signal> signal : signals_) {
+               settings.beginGroup(signal->base()->internal_name());
+               signal->restore_settings(settings);
+               settings.endGroup();
+       }
+}
+
 vector< shared_ptr<TimeItem> > View::time_items() const
 {
        const vector<shared_ptr<Flag>> f(flags());
@@ -967,9 +1034,7 @@ void View::signals_changed()
        set< shared_ptr<Trace> > traces(signals_.begin(), signals_.end());
 
 #ifdef ENABLE_DECODE
-       const vector< shared_ptr<DecodeTrace> > decode_traces(
-               session().get_decode_signals());
-       traces.insert(decode_traces.begin(), decode_traces.end());
+       traces.insert(decode_traces_.begin(), decode_traces_.end());
 #endif
 
        set< shared_ptr<Trace> > add_traces;