X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fviews%2Ftrace%2Fview.cpp;h=bda056acbdec6c4a3a6521d22075507651b1dfde;hp=dbc0d2030c1a2859dc02bf05440a493a47647bcb;hb=f0f9c8566ba4992e3a3b71afd521da3278f37b7b;hpb=1573bf16ba50d1c023ad3a9ce596f0ab6eaeacff diff --git a/pv/views/trace/view.cpp b/pv/views/trace/view.cpp index dbc0d203..bda056ac 100644 --- a/pv/views/trace/view.cpp +++ b/pv/views/trace/view.cpp @@ -73,7 +73,6 @@ using pv::util::Timestamp; using std::back_inserter; using std::copy_if; using std::count_if; -using std::dynamic_pointer_cast; using std::inserter; using std::max; using std::make_pair; @@ -142,7 +141,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); @@ -180,6 +182,8 @@ View::View(Session &session, bool is_main_view, QWidget *parent) : splitter_->setHandleWidth(1); // Don't show a visible rubber band splitter_->setCollapsible(0, false); // Prevent the header from collapsing splitter_->setCollapsible(1, false); // Prevent the traces from collapsing + splitter_->setStretchFactor(0, 0); // Prevent the panes from being resized + splitter_->setStretchFactor(1, 1); // when the entire view is resized splitter_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); viewport_->installEventFilter(this); @@ -208,9 +212,6 @@ View::View(Session &session, bool is_main_view, QWidget *parent) : connect(splitter_, SIGNAL(splitterMoved(int, int)), this, SLOT(on_splitter_moved())); - connect(this, SIGNAL(hover_point_changed()), - this, SLOT(on_hover_point_changed())); - connect(&lazy_event_handler_, SIGNAL(timeout()), this, SLOT(process_sticky_events())); lazy_event_handler_.setSingleShot(true); @@ -260,17 +261,17 @@ void View::clear_decode_signals() decode_traces_.clear(); } -void View::add_decode_signal(shared_ptr signalbase) +void View::add_decode_signal(shared_ptr signal) { shared_ptr d( - new DecodeTrace(session_, signalbase, decode_traces_.size())); + new DecodeTrace(session_, signal, decode_traces_.size())); decode_traces_.push_back(d); } -void View::remove_decode_signal(shared_ptr signalbase) +void View::remove_decode_signal(shared_ptr signal) { for (auto i = decode_traces_.begin(); i != decode_traces_.end(); i++) - if ((*i)->base() == signalbase) { + if ((*i)->base() == signal) { decode_traces_.erase(i); signals_changed(); return; @@ -354,6 +355,7 @@ void View::restore_settings(QSettings &settings) } settings_restored_ = true; + suppress_zoom_to_fit_after_acq_ = true; } vector< shared_ptr > View::time_items() const @@ -1000,11 +1002,11 @@ bool View::eventFilter(QObject *object, QEvent *event) else hover_point_ = QPoint(-1, -1); - hover_point_changed(); + update_hover_point(); } else if (type == QEvent::Leave) { hover_point_ = QPoint(-1, -1); - hover_point_changed(); + update_hover_point(); } else if (type == QEvent::Show) { // This is somewhat of a hack, unfortunately. We cannot use @@ -1042,6 +1044,16 @@ void View::resizeEvent(QResizeEvent* event) update_layout(); } +void View::update_hover_point() +{ + const vector> trace_tree_items( + list_by_type()); + for (shared_ptr r : trace_tree_items) + r->hover_point_changed(hover_point_); + + hover_point_changed(hover_point_); +} + void View::row_item_appearance_changed(bool label, bool content) { if (label) @@ -1297,16 +1309,20 @@ 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(); + bool state = settings.value(GlobalSettings::Key_View_ZoomToFitDuringAcq).toBool(); if (is_main_view_ && state) { always_zoom_to_fit_ = true; always_zoom_to_fit_changed(always_zoom_to_fit_); @@ -1328,6 +1344,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; } } @@ -1366,14 +1395,6 @@ void View::process_sticky_events() sticky_events_ = 0; } -void View::on_hover_point_changed() -{ - const vector> trace_tree_items( - list_by_type()); - for (shared_ptr r : trace_tree_items) - r->hover_point_changed(); -} - } // namespace trace } // namespace views } // namespace pv