Introduce pv::data::SignalBase
[pulseview.git] / pv / view / view.cpp
index 758e7118d8e94f2cee90f8334774056b8decc2b2..e7308ddf69f0586064b0112e2586d07eab423957 100644 (file)
@@ -527,13 +527,6 @@ const QPoint& View::hover_point() const
        return hover_point_;
 }
 
-void View::update_viewport()
-{
-       assert(viewport_);
-       viewport_->update();
-       header_->update();
-}
-
 void View::restack_all_trace_tree_items()
 {
        // Make a list of owners that is sorted from deepest first
@@ -744,22 +737,9 @@ void View::update_layout()
        update_scroll();
 }
 
-void View::paint_label(QPainter &p, const QRect &rect, bool hover)
-{
-       (void)p;
-       (void)rect;
-       (void)hover;
-}
-
-QRectF View::label_rect(const QRectF &rect)
-{
-       (void)rect;
-       return QRectF();
-}
-
 TraceTreeItemOwner* View::find_prevalent_trace_group(
        const shared_ptr<sigrok::ChannelGroup> &group,
-       const unordered_map<shared_ptr<sigrok::Channel>, shared_ptr<Signal> >
+       const unordered_map<shared_ptr<data::SignalBase>, shared_ptr<Signal> >
                &signal_map)
 {
        assert(group);
@@ -769,13 +749,13 @@ TraceTreeItemOwner* View::find_prevalent_trace_group(
 
        // Make a set and a list of all the owners
        for (const auto &channel : group->channels()) {
-               const auto iter = signal_map.find(channel);
-               if (iter == signal_map.end())
-                       continue;
-
-               TraceTreeItemOwner *const o = (*iter).second->owner();
-               owner_list.push_back(o);
-               owners.insert(o);
+               for (auto entry : signal_map) {
+                       if (entry.first->channel() == channel) {
+                               TraceTreeItemOwner *const o = (entry.second)->owner();
+                               owner_list.push_back(o);
+                               owners.insert(o);
+                       }
+               }
        }
 
        // Iterate through the list of owners, and find the most prevalent
@@ -796,24 +776,24 @@ TraceTreeItemOwner* View::find_prevalent_trace_group(
 
 vector< shared_ptr<Trace> > View::extract_new_traces_for_channels(
        const vector< shared_ptr<sigrok::Channel> > &channels,
-       const unordered_map<shared_ptr<sigrok::Channel>, shared_ptr<Signal> >
+       const unordered_map<shared_ptr<data::SignalBase>, shared_ptr<Signal> >
                &signal_map,
        set< shared_ptr<Trace> > &add_list)
 {
        vector< shared_ptr<Trace> > filtered_traces;
 
        for (const auto &channel : channels) {
-               const auto map_iter = signal_map.find(channel);
-               if (map_iter == signal_map.end())
-                       continue;
-
-               shared_ptr<Trace> trace = (*map_iter).second;
-               const auto list_iter = add_list.find(trace);
-               if (list_iter == add_list.end())
-                       continue;
-
-               filtered_traces.push_back(trace);
-               add_list.erase(list_iter);
+               for (auto entry : signal_map) {
+                       if (entry.first->channel() == channel) {
+                               shared_ptr<Trace> trace = entry.second;
+                               const auto list_iter = add_list.find(trace);
+                               if (list_iter == add_list.end())
+                                       continue;
+
+                               filtered_traces.push_back(trace);
+                               add_list.erase(list_iter);
+                       }
+               }
        }
 
        return filtered_traces;
@@ -959,8 +939,8 @@ void View::signals_changed()
        if (!session_.device()) {
                reset_scroll();
        } else {
-               assert(sr_dev);
                sr_dev = session_.device()->device();
+               assert(sr_dev);
                channels = sr_dev->channels();
        }
 
@@ -993,7 +973,7 @@ void View::signals_changed()
                inserter(remove_traces, remove_traces.begin()));
 
        // Make a look-up table of sigrok Channels to pulseview Signals
-       unordered_map<shared_ptr<sigrok::Channel>, shared_ptr<Signal> >
+       unordered_map<shared_ptr<data::SignalBase>, shared_ptr<Signal> >
                signal_map;
        for (const shared_ptr<Signal> &sig : sigs)
                signal_map[sig->channel()] = sig;
@@ -1038,13 +1018,15 @@ void View::signals_changed()
                                        offset += extents.second;
                        }
 
-                       // Assign proper vertical offsets to each channel in the group
-                       new_trace_group->restack_items();
+                       if (new_trace_group) {
+                               // Assign proper vertical offsets to each channel in the group
+                               new_trace_group->restack_items();
 
-                       // If this is a new group, enqueue it in the new top level
-                       // items list
-                       if (!new_traces_in_group.empty() && new_trace_group)
-                               new_top_level_items.push_back(new_trace_group);
+                               // If this is a new group, enqueue it in the new top level
+                               // items list
+                               if (!new_traces_in_group.empty())
+                                       new_top_level_items.push_back(new_trace_group);
+                       }
                }
 
        // Enqueue the remaining logic channels in a group
@@ -1085,20 +1067,26 @@ void View::signals_changed()
 
        // Remove any empty trace groups
        for (shared_ptr<TraceGroup> group : list_by_type<TraceGroup>())
-               if (group->child_items().size() == 0)
+               if (group->child_items().size() == 0) {
                        remove_child_item(group);
+                       group.reset();
+               }
 
        // Add and position the pending top levels items
        for (auto item : new_top_level_items) {
+               add_child_item(item);
+
                // Position the item after the last item or at the top if there is none
                int offset = v_extents().second;
+               const pair<int, int> extents = item->v_extents();
+
+               if (item->enabled())
+                       offset += -extents.first;
 
-               add_child_item(item);
                item->force_to_v_offset(offset);
 
-               const pair<int, int> extents = item->v_extents();
                if (item->enabled())
-                       offset += (extents.second - extents.first);
+                       offset += extents.second;
        }
 
        update_layout();