+TraceTreeItemOwner* View::find_prevalent_trace_group(
+ const shared_ptr<sigrok::ChannelGroup> &group,
+ const unordered_map<shared_ptr<data::SignalBase>, shared_ptr<Signal> >
+ &signal_map)
+{
+ assert(group);
+
+ unordered_set<TraceTreeItemOwner*> owners;
+ vector<TraceTreeItemOwner*> owner_list;
+
+ // Make a set and a list of all the owners
+ for (const auto &channel : group->channels()) {
+ 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
+ size_t max_prevalence = 0;
+ TraceTreeItemOwner *prevalent_owner = nullptr;
+ for (TraceTreeItemOwner *owner : owners) {
+ const size_t prevalence = count_if(
+ owner_list.begin(), owner_list.end(),
+ [&](TraceTreeItemOwner *o) { return o == owner; });
+ if (prevalence > max_prevalence) {
+ max_prevalence = prevalence;
+ prevalent_owner = owner;
+ }
+ }
+
+ return prevalent_owner;
+}
+
+vector< shared_ptr<Trace> > View::extract_new_traces_for_channels(
+ const vector< shared_ptr<sigrok::Channel> > &channels,
+ 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) {
+ 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;
+}
+
+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) {
+ // Check all signals but...
+ for (const shared_ptr<Signal> signal : signals_) {
+ const shared_ptr<SignalData> data = signal->data();
+
+ // ...only check first segment of each
+ const vector< shared_ptr<Segment> > segments = data->segments();
+ if (!segments.empty())
+ if (segments[0]->samplerate()) {
+ set_time_unit(util::TimeUnit::Time);
+ break;
+ }
+ }
+ }
+}
+
+bool View::eventFilter(QObject *object, QEvent *event)
+{
+ const QEvent::Type type = event->type();
+ if (type == QEvent::MouseMove) {
+
+ const QMouseEvent *const mouse_event = (QMouseEvent*)event;
+ if (object == viewport_)
+ hover_point_ = mouse_event->pos();
+ else if (object == ruler_)
+ hover_point_ = QPoint(mouse_event->x(), 0);
+ else if (object == header_)
+ hover_point_ = QPoint(0, mouse_event->y());
+ else
+ hover_point_ = QPoint(-1, -1);
+
+ hover_point_changed();
+
+ } else if (type == QEvent::Leave) {
+ hover_point_ = QPoint(-1, -1);
+ hover_point_changed();
+ }
+
+ return QObject::eventFilter(object, event);
+}
+
+void View::resizeEvent(QResizeEvent*)
+{
+ update_layout();
+
+ // This is somewhat of a hack, unfortunately. We cannot use
+ // set_v_offset() from within restore_settings() as the view
+ // at that point is neither visible nor properly sized.
+ // This is the least intrusive workaround I could come up
+ // with: set the vertical offset (or scroll defaults) when
+ // the view is visible and resized to its final size.
+ // Resize events that are sent when the view is not visible
+ // must be ignored as they have wrong sizes, potentially
+ // preventing the v offset from being set successfully.
+
+ if (isVisible())
+ size_finalized_ = true;
+
+ if (size_finalized_ && saved_v_offset_) {
+ set_v_offset(saved_v_offset_);
+ saved_v_offset_ = 0;
+ }
+
+ if (size_finalized_ && scroll_needs_defaults_)
+ set_scroll_default();
+}
+
+void View::row_item_appearance_changed(bool label, bool content)
+{
+ if (label)
+ header_->update();
+ if (content)
+ viewport_->update();
+}
+
+void View::time_item_appearance_changed(bool label, bool content)
+{
+ if (label)
+ ruler_->update();
+ if (content)
+ viewport_->update();
+}
+
+void View::extents_changed(bool horz, bool vert)
+{
+ sticky_events_ |=
+ (horz ? TraceTreeItemHExtentsChanged : 0) |
+ (vert ? TraceTreeItemVExtentsChanged : 0);
+ lazy_event_handler_.start();
+}
+