]> sigrok.org Git - pulseview.git/blobdiff - pv/views/trace/tracetreeitemowner.cpp
Backport recent changes from mainline.
[pulseview.git] / pv / views / trace / tracetreeitemowner.cpp
index a65c621737cfccfc453bbc9718b22b31212ff1e3..ccf9b9123637ea498abfe800145eca070f03d211 100644 (file)
@@ -89,7 +89,7 @@ pair<int, int> TraceTreeItemOwner::v_extents() const
        bool has_children = false;
 
        pair<int, int> extents(INT_MAX, INT_MIN);
-       for (const shared_ptr<TraceTreeItem> t : trace_tree_child_items()) {
+       for (const shared_ptr<TraceTreeItem>& t : trace_tree_child_items()) {
                assert(t);
                if (!t->enabled())
                        continue;
@@ -112,6 +112,36 @@ pair<int, int> TraceTreeItemOwner::v_extents() const
 
 void TraceTreeItemOwner::restack_items()
 {
+       vector<shared_ptr<TraceTreeItem>> items(trace_tree_child_items());
+
+       // Sort by the centre line of the extents
+       stable_sort(items.begin(), items.end(),
+               [](const shared_ptr<TraceTreeItem> &a, const shared_ptr<TraceTreeItem> &b) {
+                       const auto aext = a->v_extents();
+                       const auto bext = b->v_extents();
+                       return a->layout_v_offset() +
+                                       (aext.first + aext.second) / 2 <
+                               b->layout_v_offset() +
+                                       (bext.first + bext.second) / 2;
+               });
+
+       int total_offset = 0;
+       for (shared_ptr<TraceTreeItem> r : items) {
+               const pair<int, int> extents = r->v_extents();
+               if (extents.first == 0 && extents.second == 0)
+                       continue;
+
+               // We position disabled traces, so that they are close to the
+               // animation target positon should they be re-enabled
+               if (r->enabled())
+                       total_offset += -extents.first;
+
+               if (!r->dragging())
+                       r->set_layout_v_offset(total_offset);
+
+               if (r->enabled())
+                       total_offset += extents.second;
+       }
 }
 
 } // namespace trace