+ verticalScrollBar()->setSingleStep(areaSize.height() / 8);
+
+ const pair<int, int> extents = v_extents();
+ verticalScrollBar()->setRange(extents.first - (areaSize.height() / 2),
+ extents.second - (areaSize.height() / 2));
+}
+
+void View::update_layout()
+{
+ setViewportMargins(
+ header_->sizeHint().width() - pv::view::Header::BaselineOffset,
+ ruler_->sizeHint().height(), 0, 0);
+ ruler_->setGeometry(viewport_->x(), 0,
+ viewport_->width(), ruler_->extended_size_hint().height());
+ header_->setGeometry(0, viewport_->y(),
+ header_->extended_size_hint().width(), viewport_->height());
+ 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> >
+ &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()) {
+ 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);
+ }
+
+ // 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 = std::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<sigrok::Channel>, 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);
+ }
+
+ 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) {
+ const unordered_set< shared_ptr<Signal> > sigs(session().signals());
+
+ // Check all signals but...
+ for (const shared_ptr<Signal> signal : sigs) {
+ 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;
+ }
+ }
+ }