X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fview%2Fview.cpp;h=99a28e4d7ee187b805490699ace737428cc31e1f;hp=9de93f3479e5ea07697b2e57ee785b3bfbf81916;hb=34ec096859764f71c210ec7c271fcac2b96374cc;hpb=3ccf0f7f5b1b31ac628a983a2becee6f4c4c1507 diff --git a/pv/view/view.cpp b/pv/view/view.cpp index 9de93f34..99a28e4d 100644 --- a/pv/view/view.cpp +++ b/pv/view/view.cpp @@ -32,6 +32,8 @@ #include #include +#include + #include #include #include @@ -63,6 +65,8 @@ using pv::data::Segment; using pv::util::TimeUnit; using pv::util::Timestamp; +using std::back_inserter; +using std::copy_if; using std::deque; using std::dynamic_pointer_cast; using std::inserter; @@ -70,6 +74,7 @@ using std::list; using std::lock_guard; using std::max; using std::make_pair; +using std::make_shared; using std::min; using std::pair; using std::set; @@ -394,8 +399,7 @@ void View::set_scale_offset(double scale, const Timestamp& offset) set< shared_ptr > View::get_visible_data() const { - shared_lock lock(session().signals_mutex()); - const unordered_set< shared_ptr > &sigs(session().signals()); + const unordered_set< shared_ptr > sigs(session().signals()); // Make a set of all the visible data objects set< shared_ptr > visible_data; @@ -504,13 +508,17 @@ 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()); + const vector> items( + list_by_type()); + set< TraceTreeItemOwner* > owners; + for (const auto &r : items) + owners.insert(r->owner()); + 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 @@ -518,8 +526,8 @@ 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(); + for (const auto &i : items) + i->animate_to_layout_v_offset(); } void View::get_scroll_layout(double &length, Timestamp &offset) const @@ -672,15 +680,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()) { @@ -688,18 +696,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; @@ -739,8 +747,7 @@ void View::determine_time_unit() { // Check whether we know the sample rate and hence can use time as the unit if (time_unit_ == util::TimeUnit::Samples) { - shared_lock lock(session().signals_mutex()); - const unordered_set< shared_ptr > &sigs(session().signals()); + const unordered_set< shared_ptr > sigs(session().signals()); // Check all signals but... for (const shared_ptr signal : sigs) { @@ -825,8 +832,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(); } @@ -864,7 +871,9 @@ void View::v_scroll_value_changed() void View::signals_changed() { - vector< shared_ptr > new_top_level_items; + using sigrok::Channel; + + vector< shared_ptr > new_top_level_items; const auto device = session_.device(); if (!device) @@ -873,12 +882,16 @@ void View::signals_changed() shared_ptr sr_dev = device->device(); assert(sr_dev); + const vector< shared_ptr > channels( + sr_dev->channels()); + // 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()); + const unordered_set< shared_ptr > sigs(session_.signals()); set< shared_ptr > traces(sigs.begin(), sigs.end()); @@ -913,7 +926,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 @@ -950,9 +963,23 @@ void View::signals_changed() new_top_level_items.push_back(new_trace_group); } + // Enqueue the remaining logic channels in a group + vector< shared_ptr > logic_channels; + copy_if(channels.begin(), channels.end(), back_inserter(logic_channels), + [](const shared_ptr& c) { + return c->type() == sigrok::ChannelType::LOGIC; }); + const vector< shared_ptr > non_grouped_logic_signals = + extract_new_traces_for_channels(logic_channels, + signal_map, add_traces); + const shared_ptr non_grouped_trace_group( + make_shared()); + for (shared_ptr trace : non_grouped_logic_signals) + non_grouped_trace_group->add_child_item(trace); + new_top_level_items.push_back(non_grouped_trace_group); + // Enqueue the remaining channels as free ungrouped traces const vector< shared_ptr > new_top_level_signals = - extract_new_traces_for_channels(sr_dev->channels(), + extract_new_traces_for_channels(channels, signal_map, add_traces); new_top_level_items.insert(new_top_level_items.end(), new_top_level_signals.begin(), new_top_level_signals.end()); @@ -963,7 +990,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); } @@ -1044,10 +1071,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(); } @@ -1057,7 +1084,9 @@ void View::process_sticky_events() void View::on_hover_point_changed() { - for (shared_ptr r : *this) + const vector> trace_tree_items( + list_by_type()); + for (shared_ptr r : trace_tree_items) r->hover_point_changed(); }