X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fviews%2Ftrace%2Fview.cpp;h=52a13255cef585253b747812dac554d0b7349772;hp=972b379d9dad1682318da2be20aa021999c2f109;hb=9510aea0fca1c7438be30a4f43988c001b5f0b11;hpb=28ceff251c776bcf99eafae691e70a521af15957 diff --git a/pv/views/trace/view.cpp b/pv/views/trace/view.cpp index 972b379d..52a13255 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; @@ -130,6 +129,7 @@ View::View(Session &session, bool is_main_view, QWidget *parent) : 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), @@ -213,9 +213,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); @@ -257,6 +254,9 @@ void View::add_signal(const shared_ptr signal) { ViewBase::add_signalbase(signal->base()); signals_.insert(signal); + + connect(signal->base().get(), SIGNAL(name_changed(const QString&)), + this, SLOT(on_signal_name_changed())); } #ifdef ENABLE_DECODE @@ -270,6 +270,9 @@ void View::add_decode_signal(shared_ptr signal) shared_ptr d( new DecodeTrace(session_, signal, decode_traces_.size())); decode_traces_.push_back(d); + + connect(signal.get(), SIGNAL(name_changed(const QString&)), + this, SLOT(on_signal_name_changed())); } void View::remove_decode_signal(shared_ptr signal) @@ -360,6 +363,9 @@ void View::restore_settings(QSettings &settings) settings_restored_ = true; suppress_zoom_to_fit_after_acq_ = true; + + // Update the ruler so that it uses the new scale + calculate_tick_spacing(); } vector< shared_ptr > View::time_items() const @@ -881,7 +887,7 @@ void View::set_scroll_default() set_v_offset(extents.first); } -bool View::header_was_shrunk() const +void View::determine_if_header_was_shrunk() { const int header_pane_width = splitter_->sizes().front(); const int header_width = header_->extended_size_hint().width(); @@ -889,11 +895,19 @@ bool View::header_was_shrunk() const // Allow for a slight margin of error so that we also accept // slight differences when e.g. a label name change increased // the overall width - return (header_pane_width < (header_width - 10)); + header_was_shrunk_ = (header_pane_width < (header_width - 10)); } void View::expand_header_to_fit() { + // Setting the maximum width of the header widget doesn't work as + // expected because the splitter would allow the user to make the + // pane wider than that, creating empty space as a result. + // To make this work, we stricly enforce the maximum width by + // expanding the header unless the user shrunk it on purpose. + // As we're then setting the width of the header pane, we set the + // splitter to the maximum allowed position. + int splitter_area_width = 0; for (int w : splitter_->sizes()) splitter_area_width += w; @@ -1006,11 +1020,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 @@ -1048,6 +1062,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) @@ -1078,16 +1102,18 @@ void View::extents_changed(bool horz, bool vert) lazy_event_handler_.start(); } +void View::on_signal_name_changed() +{ + if (!header_was_shrunk_) + expand_header_to_fit(); +} + void View::on_splitter_moved() { - // Setting the maximum width of the header widget doesn't work as - // expected because the splitter would allow the user to make the - // pane wider than that, creating empty space as a result. - // To make this work, we stricly enforce the maximum width by - // expanding the header unless the user shrunk it on purpose. - // As we're then setting the width of the header pane, we set the - // splitter to the maximum allowed position. - if (!header_was_shrunk()) + // The header can only shrink when the splitter is moved manually + determine_if_header_was_shrunk(); + + if (!header_was_shrunk_) expand_header_to_fit(); } @@ -1316,7 +1342,7 @@ void View::capture_state_updated(int state) // 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) - 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_); @@ -1354,6 +1380,16 @@ void View::capture_state_updated(int state) } } +void View::on_segment_changed(int segment) +{ + current_segment_ = segment - 1; + + for (shared_ptr signal : signals_) + signal->set_current_segment(current_segment_); + + viewport_->update(); +} + void View::perform_delayed_view_update() { if (always_zoom_to_fit_) { @@ -1389,14 +1425,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