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 39c290df..b98f2e85 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 f992d9f1..cea8ab5c 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 34938e73..00a82175 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 e10d1817..29d4215b 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 cea8ab5c..a6f27ca9 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 91f98b58..be438a85 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();