#include <mutex>
#include <unordered_set>
+#include <boost/thread/locks.hpp>
+
#include <QApplication>
#include <QEvent>
#include <QFontMetrics>
using pv::data::SignalData;
using pv::data::Segment;
-using pv::util::format_time;
using pv::util::TimeUnit;
using pv::util::Timestamp;
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<shared_ptr<TraceTreeItem>> items(
+ list_by_type<TraceTreeItem>());
+ 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
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
tick_period_width = (tick_period / scale_).convert_to<double>();
- 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() +
return QRectF();
}
-RowItemOwner* View::find_prevalent_trace_group(
+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<RowItemOwner*> owners;
- vector<RowItemOwner*> owner_list;
+ unordered_set<TraceTreeItemOwner*> owners;
+ vector<TraceTreeItemOwner*> owner_list;
// Make a set and a list of all the owners
for (const auto &channel : group->channels()) {
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;
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();
}
void View::signals_changed()
{
- vector< shared_ptr<RowItem> > new_top_level_items;
+ vector< shared_ptr<TraceTreeItem> > new_top_level_items;
const auto device = session_.device();
if (!device)
// Make a list of traces that are being added, and a list of traces
// that are being removed
- const set<shared_ptr<Trace>> prev_traces = list_by_type<Trace>();
+ const vector<shared_ptr<Trace>> prev_trace_list = list_by_type<Trace>();
+ const set<shared_ptr<Trace>> prev_traces(
+ prev_trace_list.begin(), prev_trace_list.end());
shared_lock<shared_mutex> lock(session_.signals_mutex());
const unordered_set< shared_ptr<Signal> > &sigs(session_.signals());
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
// Remove any removed traces
for (shared_ptr<Trace> trace : remove_traces) {
- RowItemOwner *const owner = trace->owner();
+ TraceTreeItemOwner *const owner = trace->owner();
assert(owner);
owner->remove_child_item(trace);
}
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();
}
void View::on_hover_point_changed()
{
- for (shared_ptr<RowItem> r : *this)
+ const vector<shared_ptr<TraceTreeItem>> trace_tree_items(
+ list_by_type<TraceTreeItem>());
+ for (shared_ptr<TraceTreeItem> r : trace_tree_items)
r->hover_point_changed();
}