]> sigrok.org Git - pulseview.git/blobdiff - pv/view/view.cpp
Save/restore view states and signal settings
[pulseview.git] / pv / view / view.cpp
index a7dcc20bf94194c8011e12e64ae5e027344ef4d0..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>
@@ -186,6 +190,45 @@ const Session& View::session() const
        return session_;
 }
 
+std::unordered_set< std::shared_ptr<view::Signal> > View::signals() const
+{
+       return signals_;
+}
+
+void View::clear_signals()
+{
+       signals_.clear();
+}
+
+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;
@@ -206,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());
@@ -397,11 +479,9 @@ void View::set_scale_offset(double scale, const Timestamp& offset)
 
 set< shared_ptr<SignalData> > View::get_visible_data() const
 {
-       const unordered_set< shared_ptr<Signal> > sigs(session().signals());
-
        // Make a set of all the visible data objects
        set< shared_ptr<SignalData> > visible_data;
-       for (const shared_ptr<Signal> sig : sigs)
+       for (const shared_ptr<Signal> sig : signals_)
                if (sig->enabled())
                        visible_data.insert(sig->data());
 
@@ -739,7 +819,7 @@ void View::update_layout()
 
 TraceTreeItemOwner* View::find_prevalent_trace_group(
        const shared_ptr<sigrok::ChannelGroup> &group,
-       const unordered_map<shared_ptr<sigrok::Channel>, shared_ptr<Signal> >
+       const unordered_map<shared_ptr<data::SignalBase>, shared_ptr<Signal> >
                &signal_map)
 {
        assert(group);
@@ -749,13 +829,13 @@ TraceTreeItemOwner* View::find_prevalent_trace_group(
 
        // Make a set and a list of all the owners
        for (const auto &channel : group->channels()) {
-               const auto iter = signal_map.find(channel);
-               if (iter == signal_map.end())
-                       continue;
-
-               TraceTreeItemOwner *const o = (*iter).second->owner();
-               owner_list.push_back(o);
-               owners.insert(o);
+               for (auto entry : signal_map) {
+                       if (entry.first->channel() == channel) {
+                               TraceTreeItemOwner *const o = (entry.second)->owner();
+                               owner_list.push_back(o);
+                               owners.insert(o);
+                       }
+               }
        }
 
        // Iterate through the list of owners, and find the most prevalent
@@ -776,24 +856,24 @@ TraceTreeItemOwner* View::find_prevalent_trace_group(
 
 vector< shared_ptr<Trace> > View::extract_new_traces_for_channels(
        const vector< shared_ptr<sigrok::Channel> > &channels,
-       const unordered_map<shared_ptr<sigrok::Channel>, shared_ptr<Signal> >
+       const unordered_map<shared_ptr<data::SignalBase>, shared_ptr<Signal> >
                &signal_map,
        set< shared_ptr<Trace> > &add_list)
 {
        vector< shared_ptr<Trace> > filtered_traces;
 
        for (const auto &channel : channels) {
-               const auto map_iter = signal_map.find(channel);
-               if (map_iter == signal_map.end())
-                       continue;
-
-               shared_ptr<Trace> trace = (*map_iter).second;
-               const auto list_iter = add_list.find(trace);
-               if (list_iter == add_list.end())
-                       continue;
-
-               filtered_traces.push_back(trace);
-               add_list.erase(list_iter);
+               for (auto entry : signal_map) {
+                       if (entry.first->channel() == channel) {
+                               shared_ptr<Trace> trace = entry.second;
+                               const auto list_iter = add_list.find(trace);
+                               if (list_iter == add_list.end())
+                                       continue;
+
+                               filtered_traces.push_back(trace);
+                               add_list.erase(list_iter);
+                       }
+               }
        }
 
        return filtered_traces;
@@ -803,10 +883,8 @@ void View::determine_time_unit()
 {
        // Check whether we know the sample rate and hence can use time as the unit
        if (time_unit_ == util::TimeUnit::Samples) {
-               const unordered_set< shared_ptr<Signal> > sigs(session().signals());
-
                // Check all signals but...
-               for (const shared_ptr<Signal> signal : sigs) {
+               for (const shared_ptr<Signal> signal : signals_) {
                        const shared_ptr<SignalData> data = signal->data();
 
                        // ...only check first segment of each
@@ -938,6 +1016,7 @@ void View::signals_changed()
 
        if (!session_.device()) {
                reset_scroll();
+               signals_.clear();
        } else {
                sr_dev = session_.device()->device();
                assert(sr_dev);
@@ -952,14 +1031,10 @@ void View::signals_changed()
        const set<shared_ptr<Trace>> prev_traces(
                prev_trace_list.begin(), prev_trace_list.end());
 
-       const unordered_set< shared_ptr<Signal> > sigs(session_.signals());
-
-       set< shared_ptr<Trace> > traces(sigs.begin(), sigs.end());
+       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;
@@ -973,10 +1048,10 @@ void View::signals_changed()
                inserter(remove_traces, remove_traces.begin()));
 
        // Make a look-up table of sigrok Channels to pulseview Signals
-       unordered_map<shared_ptr<sigrok::Channel>, shared_ptr<Signal> >
+       unordered_map<shared_ptr<data::SignalBase>, shared_ptr<Signal> >
                signal_map;
-       for (const shared_ptr<Signal> &sig : sigs)
-               signal_map[sig->channel()] = sig;
+       for (const shared_ptr<Signal> &sig : signals_)
+               signal_map[sig->base()] = sig;
 
        // Populate channel groups
        if (sr_dev)