X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fview%2Fview.cpp;h=3f0fe9d1dc9991febf113d45f02f5dc6189c0ace;hp=dbae983389691a013ca86f36619ff5f5bfe8723a;hb=cef5997ee1e08d713663d2ae02c839a315f41409;hpb=d001f416aec37d5b13b804dec9ee9e1c011ffabb diff --git a/pv/view/view.cpp b/pv/view/view.cpp index dbae9833..3f0fe9d1 100644 --- a/pv/view/view.cpp +++ b/pv/view/view.cpp @@ -60,7 +60,6 @@ using boost::shared_mutex; using pv::data::SignalData; using pv::data::Segment; -using pv::util::format_time; using pv::util::TimeUnit; using pv::util::Timestamp; @@ -103,7 +102,7 @@ View::View(Session &session, QWidget *parent) : updating_scroll_(false), sticky_scrolling_(false), // Default setting is set in MainWindow::setup_ui() always_zoom_to_fit_(false), - tick_period_(0.0), + tick_period_(0), tick_prefix_(pv::util::SIPrefix::yocto), tick_precision_(0), time_unit_(util::TimeUnit::Time), @@ -211,11 +210,27 @@ double View::scale() const return scale_; } +void View::set_scale(double scale) +{ + if (scale_ != scale) { + scale_ = scale; + Q_EMIT scale_changed(); + } +} + const Timestamp& View::offset() const { return offset_; } +void View::set_offset(const pv::util::Timestamp& offset) +{ + if (offset_ != offset) { + offset_ = offset; + Q_EMIT offset_changed(); + } +} + int View::owner_visual_v_offset() const { return -verticalScrollBar()->sliderPosition(); @@ -238,21 +253,53 @@ pv::util::SIPrefix View::tick_prefix() const return tick_prefix_; } +void View::set_tick_prefix(pv::util::SIPrefix tick_prefix) +{ + if (tick_prefix_ != tick_prefix) { + tick_prefix_ = tick_prefix; + Q_EMIT tick_prefix_changed(); + } +} + unsigned int View::tick_precision() const { return tick_precision_; } -double View::tick_period() const +void View::set_tick_precision(unsigned tick_precision) +{ + if (tick_precision_ != tick_precision) { + tick_precision_ = tick_precision; + Q_EMIT tick_precision_changed(); + } +} + +const pv::util::Timestamp& View::tick_period() const { return tick_period_; } +void View::set_tick_period(const pv::util::Timestamp& tick_period) +{ + if (tick_period_ != tick_period) { + tick_period_ = tick_period; + Q_EMIT tick_period_changed(); + } +} + TimeUnit View::time_unit() const { return time_unit_; } +void View::set_time_unit(pv::util::TimeUnit time_unit) +{ + if (time_unit_ != time_unit) { + time_unit_ = time_unit; + Q_EMIT time_unit_changed(); + } +} + void View::zoom(double steps) { zoom(steps, viewport_->width() / 2); @@ -335,15 +382,14 @@ void View::set_scale_offset(double scale, const Timestamp& offset) } } - scale_ = scale; - offset_ = offset; + set_scale(scale); + set_offset(offset); calculate_tick_spacing(); update_scroll(); ruler_->update(); viewport_->update(); - scale_offset_changed(); } set< shared_ptr > View::get_visible_data() const @@ -458,13 +504,13 @@ void View::update_viewport() header_->update(); } -void View::restack_all_row_items() +void View::restack_all_trace_tree_items() { // Make a list of owners that is sorted from deepest first const auto owners = list_row_item_owners(); - vector< RowItemOwner* > sorted_owners(owners.begin(), owners.end()); + vector< TraceTreeItemOwner* > sorted_owners(owners.begin(), owners.end()); sort(sorted_owners.begin(), sorted_owners.end(), - [](const RowItemOwner* a, const RowItemOwner *b) { + [](const TraceTreeItemOwner* a, const TraceTreeItemOwner *b) { return a->depth() > b->depth(); }); // Restack the items recursively @@ -472,8 +518,10 @@ void View::restack_all_row_items() o->restack_items(); // Animate the items to their destination - for (const auto &r : *this) - r->animate_to_layout_v_offset(); + const vector< shared_ptr > items( + list_by_type()); + for (const auto &i : items) + i->animate_to_layout_v_offset(); } void View::get_scroll_layout(double &length, Timestamp &offset) const @@ -510,11 +558,19 @@ void View::calculate_tick_spacing() QFontMetrics m(QApplication::font()); + // Copies of the member variables with the same name, used in the calculation + // and written back afterwards, so that we don't emit signals all the time + // during the calculation. + pv::util::Timestamp tick_period = tick_period_; + pv::util::SIPrefix tick_prefix = tick_prefix_; + unsigned tick_precision = tick_precision_; + do { const double min_period = scale_ * min_width; const int order = (int)floorf(log10f(min_period)); - const double order_decimal = pow(10.0, order); + const pv::util::Timestamp order_decimal = + pow(pv::util::Timestamp(10), order); // Allow for a margin of error so that a scale unit of 1 can be used. // Otherwise, for a SU of 1 the tick period will almost always be below @@ -525,29 +581,33 @@ void View::calculate_tick_spacing() unsigned int unit = 0; do { - tp_with_margin = order_decimal * (ScaleUnits[unit++] + tp_margin); + tp_with_margin = order_decimal.convert_to() * + (ScaleUnits[unit++] + tp_margin); } while (tp_with_margin < min_period && unit < countof(ScaleUnits)); - tick_period_ = order_decimal * ScaleUnits[unit - 1]; - tick_prefix_ = static_cast( + tick_period = order_decimal * ScaleUnits[unit - 1]; + tick_prefix = static_cast( (order - pv::util::exponent(pv::util::SIPrefix::yocto)) / 3); // Precision is the number of fractional digits required, not // taking the prefix into account (and it must never be negative) - tick_precision_ = std::max((int)ceil(log10f(1 / tick_period_)), 0); + tick_precision = std::max(ceil(log10(1 / tick_period)).convert_to(), 0); - tick_period_width = tick_period_ / scale_; + tick_period_width = (tick_period / scale_).convert_to(); - const QString label_text = - format_time(max_time, tick_prefix_, time_unit_, tick_precision_); + const QString label_text = Ruler::format_time_with_distance( + tick_period, max_time, tick_prefix, time_unit_, tick_precision); label_width = m.boundingRect(0, 0, INT_MAX, INT_MAX, Qt::AlignLeft | Qt::AlignTop, label_text).width() + MinValueSpacing; min_width += SpacingIncrement; - } while (tick_period_width < label_width); + + set_tick_period(tick_period); + set_tick_prefix(tick_prefix); + set_tick_precision(tick_precision); } void View::update_scroll() @@ -562,7 +622,7 @@ void View::update_scroll() get_scroll_layout(length, offset); length = max(length - areaSize.width(), 0.0); - int major_tick_distance = tick_period_ / scale_; + int major_tick_distance = (tick_period_ / scale_).convert_to(); horizontalScrollBar()->setPageStep(areaSize.width() / 2); horizontalScrollBar()->setSingleStep(major_tick_distance); @@ -614,15 +674,15 @@ QRectF View::label_rect(const QRectF &rect) return QRectF(); } -RowItemOwner* View::find_prevalent_trace_group( +TraceTreeItemOwner* View::find_prevalent_trace_group( const shared_ptr &group, const unordered_map, shared_ptr > &signal_map) { assert(group); - unordered_set owners; - vector owner_list; + unordered_set owners; + vector owner_list; // Make a set and a list of all the owners for (const auto &channel : group->channels()) { @@ -630,18 +690,18 @@ RowItemOwner* View::find_prevalent_trace_group( if (iter == signal_map.end()) continue; - RowItemOwner *const o = (*iter).second->owner(); + TraceTreeItemOwner *const o = (*iter).second->owner(); owner_list.push_back(o); owners.insert(o); } // Iterate through the list of owners, and find the most prevalent size_t max_prevalence = 0; - RowItemOwner *prevalent_owner = nullptr; - for (RowItemOwner *owner : owners) { + TraceTreeItemOwner *prevalent_owner = nullptr; + for (TraceTreeItemOwner *owner : owners) { const size_t prevalence = std::count_if( owner_list.begin(), owner_list.end(), - [&](RowItemOwner *o) { return o == owner; }); + [&](TraceTreeItemOwner *o) { return o == owner; }); if (prevalence > max_prevalence) { max_prevalence = prevalence; prevalent_owner = owner; @@ -692,7 +752,7 @@ void View::determine_time_unit() const vector< shared_ptr > segments = data->segments(); if (!segments.empty()) if (segments[0]->samplerate()) { - time_unit_ = util::TimeUnit::Time; + set_time_unit(util::TimeUnit::Time); break; } } @@ -767,8 +827,8 @@ void View::time_item_appearance_changed(bool label, bool content) void View::extents_changed(bool horz, bool vert) { sticky_events_ |= - (horz ? RowItemHExtentsChanged : 0) | - (vert ? RowItemVExtentsChanged : 0); + (horz ? TraceTreeItemHExtentsChanged : 0) | + (vert ? TraceTreeItemVExtentsChanged : 0); lazy_event_handler_.start(); } @@ -786,12 +846,12 @@ void View::h_scroll_value_changed(int value) const int range = horizontalScrollBar()->maximum(); if (range < MaxScrollValue) - offset_ = scale_ * value; + set_offset(scale_ * value); else { double length = 0; Timestamp offset; get_scroll_layout(length, offset); - offset_ = scale_ * length * value / MaxScrollValue; + set_offset(scale_ * length * value / MaxScrollValue); } ruler_->update(); @@ -806,7 +866,7 @@ void View::v_scroll_value_changed() void View::signals_changed() { - vector< shared_ptr > new_top_level_items; + vector< shared_ptr > new_top_level_items; const auto device = session_.device(); if (!device) @@ -817,7 +877,9 @@ void View::signals_changed() // Make a list of traces that are being added, and a list of traces // that are being removed - const set> prev_traces = list_by_type(); + const vector> prev_trace_list = list_by_type(); + const set> prev_traces( + prev_trace_list.begin(), prev_trace_list.end()); shared_lock lock(session_.signals_mutex()); const unordered_set< shared_ptr > &sigs(session_.signals()); @@ -855,7 +917,7 @@ void View::signals_changed() continue; // Find best trace group to add to - RowItemOwner *owner = find_prevalent_trace_group( + TraceTreeItemOwner *owner = find_prevalent_trace_group( group, signal_map); // If there is no trace group, create one @@ -905,7 +967,7 @@ void View::signals_changed() // Remove any removed traces for (shared_ptr trace : remove_traces) { - RowItemOwner *const owner = trace->owner(); + TraceTreeItemOwner *const owner = trace->owner(); assert(owner); owner->remove_child_item(trace); } @@ -933,7 +995,7 @@ void View::signals_changed() void View::capture_state_updated(int state) { if (state == Session::Running) - time_unit_ = util::TimeUnit::Samples; + set_time_unit(util::TimeUnit::Samples); if (state == Session::Stopped) { // After acquisition has stopped we need to re-calculate the ticks once @@ -975,7 +1037,7 @@ void View::perform_delayed_view_update() const QSize areaSize = viewport_->size(); length = max(length - areaSize.width(), 0.0); - offset_ = scale_ * length; + set_offset(scale_ * length); } determine_time_unit(); @@ -986,10 +1048,10 @@ void View::perform_delayed_view_update() void View::process_sticky_events() { - if (sticky_events_ & RowItemHExtentsChanged) + if (sticky_events_ & TraceTreeItemHExtentsChanged) update_layout(); - if (sticky_events_ & RowItemVExtentsChanged) { - restack_all_row_items(); + if (sticky_events_ & TraceTreeItemVExtentsChanged) { + restack_all_trace_tree_items(); update_scroll(); } @@ -999,7 +1061,7 @@ void View::process_sticky_events() void View::on_hover_point_changed() { - for (shared_ptr r : *this) + for (shared_ptr r : *this) r->hover_point_changed(); }