From: Soeren Apel Date: Wed, 5 Jul 2017 20:28:12 +0000 (+0200) Subject: Fix #236 by introducing "zoom-to-fit when acquisition stops" option X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=commitdiff_plain;h=28ceff251c776bcf99eafae691e70a521af15957 Fix #236 by introducing "zoom-to-fit when acquisition stops" option --- diff --git a/pv/dialogs/settings.cpp b/pv/dialogs/settings.cpp index b74264ac..d3ed1f4e 100644 --- a/pv/dialogs/settings.cpp +++ b/pv/dialogs/settings.cpp @@ -153,6 +153,10 @@ QWidget *Settings::get_view_settings_form(QWidget *parent) const SLOT(on_view_alwaysZoomToFit_changed(int))); trace_view_layout->addRow(tr("Constantly perform &zoom-to-fit during capture"), cb); + cb = create_checkbox(GlobalSettings::Key_View_ZoomToFitAfterAcq, + SLOT(on_view_zoomToFitAfterAcq_changed(int))); + trace_view_layout->addRow(tr("Perform a zoom-to-&fit when acquisition stops"), cb); + cb = create_checkbox(GlobalSettings::Key_View_StickyScrolling, SLOT(on_view_stickyScrolling_changed(int))); trace_view_layout->addRow(tr("Always keep &newest samples at the right edge during capture"), cb); @@ -382,6 +386,12 @@ void Settings::on_view_alwaysZoomToFit_changed(int state) settings.setValue(GlobalSettings::Key_View_AlwaysZoomToFit, state ? true : false); } +void Settings::on_view_zoomToFitAfterAcq_changed(int state) +{ + GlobalSettings settings; + settings.setValue(GlobalSettings::Key_View_ZoomToFitAfterAcq, state ? true : false); +} + void Settings::on_view_colouredBG_changed(int state) { GlobalSettings settings; diff --git a/pv/dialogs/settings.hpp b/pv/dialogs/settings.hpp index 0ae98e00..d981c8bd 100644 --- a/pv/dialogs/settings.hpp +++ b/pv/dialogs/settings.hpp @@ -51,6 +51,7 @@ public: private Q_SLOTS: void on_page_changed(QListWidgetItem *current, QListWidgetItem *previous); void on_view_alwaysZoomToFit_changed(int state); + void on_view_zoomToFitAfterAcq_changed(int state); void on_view_colouredBG_changed(int state); void on_view_stickyScrolling_changed(int state); void on_view_showSamplingPoints_changed(int state); diff --git a/pv/globalsettings.cpp b/pv/globalsettings.cpp index 0a41f31d..7fd1249c 100644 --- a/pv/globalsettings.cpp +++ b/pv/globalsettings.cpp @@ -26,6 +26,7 @@ using std::multimap; namespace pv { const QString GlobalSettings::Key_View_AlwaysZoomToFit = "View_AlwaysZoomToFit"; +const QString GlobalSettings::Key_View_ZoomToFitAfterAcq = "View_ZoomToFitAfterAcq"; const QString GlobalSettings::Key_View_ColouredBG = "View_ColouredBG"; const QString GlobalSettings::Key_View_StickyScrolling = "View_StickyScrolling"; const QString GlobalSettings::Key_View_ShowSamplingPoints = "View_ShowSamplingPoints"; @@ -44,6 +45,10 @@ GlobalSettings::GlobalSettings() : void GlobalSettings::set_defaults_where_needed() { + // Enable zoom-to-fit after acquisition by default + if (!contains(Key_View_ZoomToFitAfterAcq)) + setValue(Key_View_ZoomToFitAfterAcq, true); + // Enable coloured trace backgrounds by default if (!contains(Key_View_ColouredBG)) setValue(Key_View_ColouredBG, true); diff --git a/pv/globalsettings.hpp b/pv/globalsettings.hpp index f6a6141f..b2b3626e 100644 --- a/pv/globalsettings.hpp +++ b/pv/globalsettings.hpp @@ -39,6 +39,7 @@ class GlobalSettings : public QSettings public: static const QString Key_View_AlwaysZoomToFit; + static const QString Key_View_ZoomToFitAfterAcq; static const QString Key_View_ColouredBG; static const QString Key_View_StickyScrolling; static const QString Key_View_ShowSamplingPoints; diff --git a/pv/views/trace/view.cpp b/pv/views/trace/view.cpp index 6218c2ef..972b379d 100644 --- a/pv/views/trace/view.cpp +++ b/pv/views/trace/view.cpp @@ -142,7 +142,10 @@ View::View(Session &session, bool is_main_view, QWidget *parent) : trigger_markers_(), hover_point_(-1, -1), scroll_needs_defaults_(true), - saved_v_offset_(0) + saved_v_offset_(0), + scale_at_acq_start_(0), + offset_at_acq_start_(0), + suppress_zoom_to_fit_after_acq_(false) { QVBoxLayout *root_layout = new QVBoxLayout(this); root_layout->setContentsMargins(0, 0, 0, 0); @@ -356,6 +359,7 @@ void View::restore_settings(QSettings &settings) } settings_restored_ = true; + suppress_zoom_to_fit_after_acq_ = true; } vector< shared_ptr > View::time_items() const @@ -1299,15 +1303,19 @@ void View::signals_changed() void View::capture_state_updated(int state) { + GlobalSettings settings; + if (state == Session::Running) { set_time_unit(util::TimeUnit::Samples); trigger_markers_.clear(); + scale_at_acq_start_ = scale_; + offset_at_acq_start_ = offset_; + // Activate "always zoom to fit" if the setting is enabled and we're // the main view of this session (other trace views may be used for // zooming and we don't want to mess them up) - GlobalSettings settings; bool state = settings.value(GlobalSettings::Key_View_AlwaysZoomToFit).toBool(); if (is_main_view_ && state) { always_zoom_to_fit_ = true; @@ -1330,6 +1338,19 @@ void View::capture_state_updated(int state) always_zoom_to_fit_ = false; always_zoom_to_fit_changed(always_zoom_to_fit_); } + + bool zoom_to_fit_after_acq = + settings.value(GlobalSettings::Key_View_ZoomToFitAfterAcq).toBool(); + + // Only perform zoom-to-fit if the user hasn't altered the viewport and + // we didn't restore settings in the meanwhile + if (zoom_to_fit_after_acq && + !suppress_zoom_to_fit_after_acq_ && + (scale_ == scale_at_acq_start_) && + (offset_ == offset_at_acq_start_)) + zoom_fit(false); // We're stopped, so the GUI state doesn't matter + + suppress_zoom_to_fit_after_acq_ = false; } } diff --git a/pv/views/trace/view.hpp b/pv/views/trace/view.hpp index 5be95957..a42f964e 100644 --- a/pv/views/trace/view.hpp +++ b/pv/views/trace/view.hpp @@ -454,6 +454,16 @@ private: // A nonzero value indicates the v offset to restore. See View::resizeEvent() int saved_v_offset_; + + // These are used to determine whether the view was altered after acq started + double scale_at_acq_start_; + pv::util::Timestamp offset_at_acq_start_; + + // Used to suppress performing a "zoom to fit" when the session stops. This + // is needed when the view's settings are restored before acquisition ends. + // In that case we want to keep the restored settings, not have a "zoom to fit" + // mess them up. + bool suppress_zoom_to_fit_after_acq_; }; } // namespace trace