From 7717b5528d4c3cc937b2ca90787d0a5a3af94a3c Mon Sep 17 00:00:00 2001 From: Ramon Felder Date: Tue, 6 Sep 2022 11:32:00 +0200 Subject: [PATCH 1/3] Clear settings before saving a session setup When a QSettings object is created with an already existing file, all settings are copied from that file. This leads to orphaned entries in the file when overwriting an existing settings file, unless the QSettings object is explicitly cleared before adding the new entries. --- pv/toolbars/mainbar.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/pv/toolbars/mainbar.cpp b/pv/toolbars/mainbar.cpp index 39c290dfb..b98f2e853 100644 --- a/pv/toolbars/mainbar.cpp +++ b/pv/toolbars/mainbar.cpp @@ -866,6 +866,7 @@ void MainBar::on_actionSaveSetup_triggered() return; QSettings settings_storage(file_name, QSettings::IniFormat); + settings_storage.clear(); session_.save_setup(settings_storage); } From e58e0922576300d4be00c052407934faa7481fd4 Mon Sep 17 00:00:00 2001 From: Ramon Felder Date: Tue, 6 Sep 2022 16:07:36 +0200 Subject: [PATCH 2/3] Remove old generated and decode signals when restoring a session setup from a file --- pv/session.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pv/session.cpp b/pv/session.cpp index f992d9f1f..cea8ab5cc 100644 --- a/pv/session.cpp +++ b/pv/session.cpp @@ -382,6 +382,20 @@ void Session::restore_setup(QSettings &settings) settings.endGroup(); } + // Remove generated signals and decoders + for (shared_ptr base : vector< shared_ptr >(signalbases_)) { +#ifdef ENABLE_DECODE + if (base->is_decode_signal()) { + shared_ptr ds = dynamic_pointer_cast(base); + assert(ds); + remove_decode_signal(ds); + } else +#endif + if (base->is_generated()) { + remove_generated_signal(base); + } + } + // Restore generated signals int gen_signal_count = settings.value("generated_signals").toInt(); From 0141f339741acc61b61ae91450f07f989322fb19 Mon Sep 17 00:00:00 2001 From: Ramon Felder Date: Thu, 8 Sep 2022 22:04:30 +0200 Subject: [PATCH 3/3] Remove old UI elements when restoring a session setup Before view are restored from a session setup file, all old views, except the base view, are removed from the session and UI. The main view is reset to its initial state, removing time markers and selection. --- pv/mainwindow.cpp | 7 +++++++ pv/mainwindow.hpp | 1 + pv/session.cpp | 17 ++++++++++++----- pv/session.hpp | 1 + 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/pv/mainwindow.cpp b/pv/mainwindow.cpp index 34938e736..00a82175c 100644 --- a/pv/mainwindow.cpp +++ b/pv/mainwindow.cpp @@ -335,6 +335,8 @@ shared_ptr MainWindow::add_session() connect(session.get(), SIGNAL(add_view(ViewType, Session*)), this, SLOT(on_add_view(ViewType, Session*))); + connect(session.get(), SIGNAL(remove_view(shared_ptr)), + this, SLOT(on_remove_view(shared_ptr))); connect(session.get(), SIGNAL(name_changed()), this, SLOT(on_session_name_changed())); connect(session.get(), SIGNAL(device_changed()), @@ -717,6 +719,11 @@ void MainWindow::on_add_view(views::ViewType type, Session *session) add_view(type, *s); } +void MainWindow::on_remove_view(shared_ptr view) +{ + remove_view(view); +} + void MainWindow::on_focus_changed() { shared_ptr view = get_active_view(); diff --git a/pv/mainwindow.hpp b/pv/mainwindow.hpp index e10d1817f..29d4215b8 100644 --- a/pv/mainwindow.hpp +++ b/pv/mainwindow.hpp @@ -120,6 +120,7 @@ public Q_SLOTS: private Q_SLOTS: void on_add_view(ViewType type, Session *session); + void on_remove_view(shared_ptr view); void on_focus_changed(); void on_focused_session_changed(shared_ptr session); diff --git a/pv/session.cpp b/pv/session.cpp index cea8ab5cc..a6f27ca9f 100644 --- a/pv/session.cpp +++ b/pv/session.cpp @@ -375,11 +375,11 @@ void Session::save_settings(QSettings &settings) const void Session::restore_setup(QSettings &settings) { - // Restore channels - for (shared_ptr base : signalbases_) { - settings.beginGroup(base->internal_name()); - base->restore_settings(settings); - settings.endGroup(); + // Reset main view, remove all other views + main_view_->reset_view_state(); + for (auto &v : vector< shared_ptr >(views_)) { + if (v != main_view_) + remove_view(v); } // Remove generated signals and decoders @@ -396,6 +396,13 @@ void Session::restore_setup(QSettings &settings) } } + // Restore channels + for (shared_ptr 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(); diff --git a/pv/session.hpp b/pv/session.hpp index 91f98b581..be438a856 100644 --- a/pv/session.hpp +++ b/pv/session.hpp @@ -264,6 +264,7 @@ class Session : public QObject void data_received(); void add_view(ViewType type, Session *session); + void remove_view(shared_ptr view); public Q_SLOTS: void on_data_saved();