Fix #236 by introducing "zoom-to-fit when acquisition stops" option
authorSoeren Apel <soeren@apelpie.net>
Wed, 5 Jul 2017 20:28:12 +0000 (22:28 +0200)
committerUwe Hermann <uwe@hermann-uwe.de>
Wed, 5 Jul 2017 22:37:08 +0000 (00:37 +0200)
pv/dialogs/settings.cpp
pv/dialogs/settings.hpp
pv/globalsettings.cpp
pv/globalsettings.hpp
pv/views/trace/view.cpp
pv/views/trace/view.hpp

index b74264ac2cbd89301a83ea25dc4a58d92e932a64..d3ed1f4eb086e639096bacd896c25f889b92ea95 100644 (file)
@@ -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;
index 0ae98e002ca8af56a6a1b7f734ece4bad2875c1c..d981c8bd74cfa12f29759da662e10f3dd1450f2e 100644 (file)
@@ -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);
index 0a41f31d722315406b2efe1e7170ae9b24769059..7fd1249cfd5d4fd525251ea03dca6b58186f76ff 100644 (file)
@@ -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);
index f6a6141fca7ad18ccd1e9276e4eea0789a2dead1..b2b3626ed05febc0e7c7b51c9491a75aa826a496 100644 (file)
@@ -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;
index 6218c2efae76d05dbedbee741bb870a014086bfd..972b379d9dad1682318da2be20aa021999c2f109 100644 (file)
@@ -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<TimeItem> > 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;
        }
 }
 
index 5be959579eb7eba521f454df21b4f16d1f2f1b4c..a42f964e0a173126b2cba892b7c803ae82cf8d89 100644 (file)
@@ -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