+ // Having saved the data to srzip overrides the current device. This is
+ // a crappy hack around the fact that saving e.g. an imported file to
+ // srzip would require changing the underlying libsigrok device
+ if (!save_path_.isEmpty()) {
+ QFileInfo fi = QFileInfo(QDir(save_path_), name_);
+ settings.setValue("device_type", "sessionfile");
+ settings.beginGroup("device");
+ settings.setValue("filename", fi.absoluteFilePath());
+ settings.endGroup();
+ } else {
+ shared_ptr<devices::SessionFile> sessionfile_device =
+ dynamic_pointer_cast<devices::SessionFile>(device_);
+
+ if (sessionfile_device) {
+ settings.setValue("device_type", "sessionfile");
+ settings.beginGroup("device");
+ settings.setValue("filename", QString::fromStdString(
+ sessionfile_device->full_name()));
+ settings.endGroup();
+ }
+
+ shared_ptr<devices::InputFile> inputfile_device =
+ dynamic_pointer_cast<devices::InputFile>(device_);
+
+ if (inputfile_device) {
+ settings.setValue("device_type", "inputfile");
+ settings.beginGroup("device");
+ inputfile_device->save_meta_to_settings(settings);
+ settings.endGroup();
+ }
+ }
+
+ save_setup(settings);
+ }
+}
+
+void Session::restore_setup(QSettings &settings)
+{
+ // Restore channels
+ for (shared_ptr<data::SignalBase> base : signalbases_) {
+ settings.beginGroup(base->internal_name());
+ base->restore_settings(settings);
+ settings.endGroup();
+ }
+
+ // Restore generated signals
+ int gen_signal_count = settings.value("generated_signals").toInt();
+
+ for (int i = 0; i < gen_signal_count; i++) {
+ settings.beginGroup("generated_signal" + QString::number(i));
+ SignalBase::ChannelType type = (SignalBase::ChannelType)settings.value("type").toInt();
+ shared_ptr<data::SignalBase> signal;
+
+ if (type == SignalBase::MathChannel)
+ signal = make_shared<data::MathSignal>(*this);
+ else
+ qWarning() << tr("Can't restore generated signal of unknown type %1 (%2)") \
+ .arg((int)type) \
+ .arg(settings.value("name").toString());
+
+ if (signal) {
+ add_generated_signal(signal);
+ signal->restore_settings(settings);
+ }
+
+ settings.endGroup();
+ }
+
+ // Restore decoders
+#ifdef ENABLE_DECODE
+ int decode_signal_count = settings.value("decode_signals").toInt();
+
+ for (int i = 0; i < decode_signal_count; i++) {
+ settings.beginGroup("decode_signal" + QString::number(i));
+ shared_ptr<data::DecodeSignal> signal = add_decode_signal();
+ signal->restore_settings(settings);
+ settings.endGroup();
+ }
+#endif
+
+ // Restore views
+ int views = settings.value("views").toInt();
+
+ for (int i = 0; i < views; i++) {
+ settings.beginGroup("view" + QString::number(i));
+
+ if (i > 0) {
+ views::ViewType type = (views::ViewType)settings.value("type").toInt();
+ add_view(type, this);
+ views_.back()->restore_settings(settings);
+ } else
+ main_view_->restore_settings(settings);
+
+ settings.endGroup();
+ }
+
+ // Restore meta objects like markers and cursors
+ int meta_objs = settings.value("meta_objs").toInt();
+
+ for (int i = 0; i < meta_objs; i++) {
+ settings.beginGroup("meta_obj" + QString::number(i));
+
+ shared_ptr<views::ViewBase> vb;
+ shared_ptr<views::trace::View> tv;
+ if (settings.contains("assoc_view"))
+ vb = views_.at(settings.value("assoc_view").toInt());
+
+ if (vb)
+ tv = dynamic_pointer_cast<views::trace::View>(vb);
+
+ const QString type = settings.value("type").toString();
+
+ if ((type == "time_marker") && tv) {
+ Timestamp ts = GlobalSettings::restore_timestamp(settings, "time");
+ shared_ptr<views::trace::Flag> flag = tv->add_flag(ts);
+ flag->set_text(settings.value("text").toString());
+ }
+
+ if ((type == "selection") && tv) {
+ Timestamp start = GlobalSettings::restore_timestamp(settings, "start_time");
+ Timestamp end = GlobalSettings::restore_timestamp(settings, "end_time");
+ tv->set_cursors(start, end);
+ tv->show_cursors();
+ }
+
+ settings.endGroup();
+ }
+}
+
+void Session::restore_settings(QSettings &settings)
+{
+ shared_ptr<devices::Device> device;
+
+ const QString device_type = settings.value("device_type").toString();
+
+ if (device_type == "hardware") {
+ map<string, string> dev_info;
+ list<string> key_list;
+
+ // Re-select last used device if possible but only if it's not demo
+ settings.beginGroup("device");
+ key_list.emplace_back("vendor");
+ key_list.emplace_back("model");
+ key_list.emplace_back("version");
+ key_list.emplace_back("serial_num");
+ key_list.emplace_back("connection_id");
+
+ for (string key : key_list) {
+ const QString k = QString::fromStdString(key);
+ if (!settings.contains(k))
+ continue;
+
+ const string value = settings.value(k).toString().toStdString();
+ if (!value.empty())
+ dev_info.insert(make_pair(key, value));
+ }