From: Soeren Apel Date: Wed, 30 May 2018 21:16:57 +0000 (+0200) Subject: Fix #540 by introducing a method to reset the view state X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=5a20644617a727e5893cd1df3f105135c1ebdedd;p=pulseview.git Fix #540 by introducing a method to reset the view state --- diff --git a/pv/session.cpp b/pv/session.cpp index 7df73d63..fba49be8 100644 --- a/pv/session.cpp +++ b/pv/session.cpp @@ -397,12 +397,13 @@ void Session::set_device(shared_ptr device) name_ = default_name_; name_changed(); - // Remove all stored data + // Remove all stored data and reset all views for (shared_ptr view : views_) { view->clear_signals(); #ifdef ENABLE_DECODE view->clear_decode_signals(); #endif + view->reset_view_state(); } for (const shared_ptr d : all_signal_data_) d->clear(); diff --git a/pv/views/trace/view.cpp b/pv/views/trace/view.cpp index 8eb3b8de..d559b0af 100644 --- a/pv/views/trace/view.cpp +++ b/pv/views/trace/view.cpp @@ -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(*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 > View::time_items() const { const vector> f(flags()); vector> 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 View::cursors() const diff --git a/pv/views/trace/view.hpp b/pv/views/trace/view.hpp index 8c41fd9e..a9e5564f 100644 --- a/pv/views/trace/view.hpp +++ b/pv/views/trace/view.hpp @@ -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; diff --git a/pv/views/viewbase.cpp b/pv/views/viewbase.cpp index 11ff7a27..c463ecc2 100644 --- a/pv/views/viewbase.cpp +++ b/pv/views/viewbase.cpp @@ -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_; diff --git a/pv/views/viewbase.hpp b/pv/views/viewbase.hpp index 923d47fb..b524c179 100644 --- a/pv/views/viewbase.hpp +++ b/pv/views/viewbase.hpp @@ -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;