]> sigrok.org Git - pulseview.git/blobdiff - pv/view/tracegroup.cpp
Header: Added group/ungroup key-combos
[pulseview.git] / pv / view / tracegroup.cpp
index f5263e3facc92ddc5805eaa92ac7f757e145f633..765f0973229739e4cf7114333c2d58da70f3d1aa 100644 (file)
@@ -116,7 +116,7 @@ QRectF TraceGroup::label_rect(int right) const
 {
        QRectF rect;
        for (const shared_ptr<RowItem> r : child_items())
-               if (r)
+               if (r && r->enabled())
                        rect = rect.united(r->label_rect(right));
 
        return QRectF(rect.x() - Width - Padding, rect.y(),
@@ -150,30 +150,78 @@ pv::widgets::Popup* TraceGroup::create_popup(QWidget *parent)
        return NULL;
 }
 
-int TraceGroup::owner_v_offset() const
+int TraceGroup::owner_visual_v_offset() const
 {
-       return v_offset() + _owner->owner_v_offset();
+       return _owner ? visual_v_offset() + _owner->owner_visual_v_offset() : 0;
 }
 
-void TraceGroup::update_viewport()
+void TraceGroup::restack_items()
 {
-       if (_owner)
-               _owner->update_viewport();
+       vector< shared_ptr<RowItem> > items(
+               child_items().begin(), child_items().end());
+
+       // Sort by the centre line of the extents
+       stable_sort(items.begin(), items.end(),
+               [](const shared_ptr<RowItem> &a, const shared_ptr<RowItem> &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<RowItem> 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;
+       }
 }
 
-void TraceGroup::on_ungroup()
+unsigned int TraceGroup::depth() const
+{
+       return _owner ? _owner->depth() + 1 : 0;
+}
+
+void TraceGroup::ungroup()
 {
        const vector< shared_ptr<RowItem> > items(
                child_items().begin(), child_items().end());
        clear_child_items();
 
-       for (shared_ptr<RowItem> r : items) {
+       for (shared_ptr<RowItem> r : items)
                _owner->add_child_item(r);
-               r->set_v_offset(r->v_offset() + v_offset());
-       }
 
        _owner->remove_child_item(shared_from_this());
-       appearance_changed();
+}
+
+void TraceGroup::on_ungroup()
+{
+       ungroup();
+}
+
+void TraceGroup::appearance_changed(bool label, bool content)
+{
+       if (_owner)
+               _owner->appearance_changed(label, content);
+}
+
+void TraceGroup::extents_changed(bool horz, bool vert)
+{
+       if (_owner)
+               _owner->extents_changed(horz, vert);
 }
 
 } // namespace view