]> sigrok.org Git - pulseview.git/commitdiff
Fix #540 by introducing a method to reset the view state
authorSoeren Apel <redacted>
Wed, 30 May 2018 21:16:57 +0000 (23:16 +0200)
committerSoeren Apel <redacted>
Wed, 30 May 2018 22:34:05 +0000 (00:34 +0200)
pv/session.cpp
pv/views/trace/view.cpp
pv/views/trace/view.hpp
pv/views/viewbase.cpp
pv/views/viewbase.hpp

index 7df73d63d5ba43660eb666ec1a91322046002442..fba49be8900139f5405b7e4f6d461d235004aa8f 100644 (file)
@@ -397,12 +397,13 @@ void Session::set_device(shared_ptr<devices::Device> device)
        name_ = default_name_;
        name_changed();
 
-       // Remove all stored data
+       // Remove all stored data and reset all views
        for (shared_ptr<views::ViewBase> view : views_) {
                view->clear_signals();
 #ifdef ENABLE_DECODE
                view->clear_decode_signals();
 #endif
+               view->reset_view_state();
        }
        for (const shared_ptr<data::SignalData> d : all_signal_data_)
                d->clear();
index 8eb3b8dedcd7388555e4574ae4d79501a6a512b6..d559b0af5f6bcde346d3cef0b84f31fd80278505 100644 (file)
@@ -124,31 +124,11 @@ bool CustomScrollArea::viewportEvent(QEvent *event)
 
 View::View(Session &session, bool is_main_view, QWidget *parent) :
        ViewBase(session, is_main_view, parent),
+
+       // Note: Place defaults in View::reset_view_state(), not here
        splitter_(new QSplitter()),
-       segment_display_mode_(Trace::ShowLastSegmentOnly),
-       segment_selectable_(false),
-       scale_(1e-3),
-       offset_(0),
-       ruler_offset_(0),
-       updating_scroll_(false),
-       settings_restored_(false),
-       header_was_shrunk_(false),
-       sticky_scrolling_(false), // Default setting is set in MainWindow::setup_ui()
-       always_zoom_to_fit_(false),
-       tick_period_(0),
-       tick_prefix_(pv::util::SIPrefix::yocto),
-       tick_precision_(0),
-       time_unit_(util::TimeUnit::Time),
-       show_cursors_(false),
-       cursors_(new CursorPair(*this)),
-       next_flag_text_('A'),
-       trigger_markers_(),
-       hover_point_(-1, -1),
-       scroll_needs_defaults_(true),
-       saved_v_offset_(0),
-       scale_at_acq_start_(0),
-       offset_at_acq_start_(0),
-       suppress_zoom_to_fit_after_acq_(false)
+       header_was_shrunk_(false),  // The splitter remains unchanged after a reset, so this goes here
+       sticky_scrolling_(false)  // Default setting is set in MainWindow::setup_ui()
 {
        QVBoxLayout *root_layout = new QVBoxLayout(this);
        root_layout->setContentsMargins(0, 0, 0, 0);
@@ -230,11 +210,7 @@ View::View(Session &session, bool is_main_view, QWidget *parent) :
        ruler_->raise();
        header_->raise();
 
-       // Update the zoom state
-       calculate_tick_spacing();
-
-       // Make sure the standard bar's segment selector is in sync
-       set_segment_display_mode(segment_display_mode_);
+       reset_view_state();
 }
 
 View::~View()
@@ -242,6 +218,44 @@ View::~View()
        GlobalSettings::remove_change_handler(this);
 }
 
+void View::reset_view_state()
+{
+       ViewBase::reset_view_state();
+
+       segment_display_mode_ = Trace::ShowLastSegmentOnly;
+       segment_selectable_ = false;
+       scale_ = 1e-3;
+       offset_ = 0;
+       ruler_offset_ = 0;
+       updating_scroll_ = false;
+       settings_restored_ = false;
+       always_zoom_to_fit_ = false;
+       tick_period_ = 0;
+       tick_prefix_ = pv::util::SIPrefix::yocto;
+       tick_precision_ = 0;
+       time_unit_ = util::TimeUnit::Time;
+       show_cursors_ = false;
+       cursors_ = make_shared<CursorPair>(*this);
+       next_flag_text_ = 'A';
+       trigger_markers_.clear();
+       hover_point_ = QPoint(-1, -1);
+       scroll_needs_defaults_ = true;
+       saved_v_offset_ = 0;
+       scale_at_acq_start_ = 0;
+       offset_at_acq_start_ = 0;
+       suppress_zoom_to_fit_after_acq_ = false;
+
+       show_cursors_ = false;
+       cursors_.reset();
+       flags_.clear();
+
+       // Update the zoom state
+       calculate_tick_spacing();
+
+       // Make sure the standard bar's segment selector is in sync
+       set_segment_display_mode(segment_display_mode_);
+}
+
 Session& View::session()
 {
        return session_;
@@ -422,9 +436,12 @@ vector< shared_ptr<TimeItem> > View::time_items() const
 {
        const vector<shared_ptr<Flag>> f(flags());
        vector<shared_ptr<TimeItem>> items(f.begin(), f.end());
-       items.push_back(cursors_);
-       items.push_back(cursors_->first());
-       items.push_back(cursors_->second());
+
+       if (cursors_) {
+               items.push_back(cursors_);
+               items.push_back(cursors_->first());
+               items.push_back(cursors_->second());
+       }
 
        for (auto trigger_marker : trigger_markers_)
                items.push_back(trigger_marker);
@@ -805,11 +822,14 @@ void View::show_cursors(bool show)
 
 void View::centre_cursors()
 {
-       const double time_width = scale_ * viewport_->width();
-       cursors_->first()->set_time(offset_ + time_width * 0.4);
-       cursors_->second()->set_time(offset_ + time_width * 0.6);
-       ruler_->update();
-       viewport_->update();
+       if (cursors_) {
+               const double time_width = scale_ * viewport_->width();
+               cursors_->first()->set_time(offset_ + time_width * 0.4);
+               cursors_->second()->set_time(offset_ + time_width * 0.6);
+
+               ruler_->update();
+               viewport_->update();
+       }
 }
 
 shared_ptr<CursorPair> View::cursors() const
index 8c41fd9e40692e504c9db06c39a26f4aa5a92f6d..a9e5564f1838d404b104e960f71e240aa25f1244 100644 (file)
@@ -105,6 +105,12 @@ public:
 
        ~View();
 
+       /**
+        * Resets the view to its default state after construction. It does however
+        * not reset the signal bases or any other connections with the session.
+        */
+       virtual void reset_view_state();
+
        Session& session();
        const Session& session() const;
 
index 11ff7a273b6af3a2892fdfcf6c7287f2f99d12c6..c463ecc2d1a8dc16792a2c25a58f45836b8caaf7 100644 (file)
@@ -36,10 +36,9 @@ namespace views {
 const int ViewBase::MaxViewAutoUpdateRate = 25; // No more than 25 Hz
 
 ViewBase::ViewBase(Session &session, bool is_main_view, QWidget *parent) :
+       // Note: Place defaults in ViewBase::reset_view_state(), not here
        session_(session),
-       is_main_view_(is_main_view),
-       ruler_shift_(0),
-       current_segment_(0)
+       is_main_view_(is_main_view)
 {
        (void)parent;
 
@@ -56,6 +55,12 @@ ViewBase::ViewBase(Session &session, bool is_main_view, QWidget *parent) :
        delayed_view_updater_.setInterval(1000 / MaxViewAutoUpdateRate);
 }
 
+void ViewBase::reset_view_state()
+{
+       ruler_shift_ = 0;
+       current_segment_ = 0;
+}
+
 Session& ViewBase::session()
 {
        return session_;
index 923d47fb515c2b5d96111f3ec0f074b0e1b339d8..b524c1797d0d1478ba4bd1eac36ee538a400d69a 100644 (file)
@@ -65,6 +65,12 @@ private:
 public:
        explicit ViewBase(Session &session, bool is_main_view = false, QWidget *parent = nullptr);
 
+       /**
+        * Resets the view to its default state after construction. It does however
+        * not reset the signal bases or any other connections with the session.
+        */
+       virtual void reset_view_state();
+
        Session& session();
        const Session& session() const;