X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fview%2Ftracegroup.cpp;h=272fc1a1e3b341823e82133c099d4f35f392c617;hp=f5263e3facc92ddc5805eaa92ac7f757e145f633;hb=5c5ce7574062e0d3ad4f7d9dde70b482315d54fb;hpb=1dc835a4b49104f5b4c9695e91e6ffb7a48d7c23 diff --git a/pv/view/tracegroup.cpp b/pv/view/tracegroup.cpp index f5263e3f..272fc1a1 100644 --- a/pv/view/tracegroup.cpp +++ b/pv/view/tracegroup.cpp @@ -26,7 +26,7 @@ #include #include -#include "tracegroup.h" +#include "tracegroup.hpp" using std::pair; using std::shared_ptr; @@ -42,7 +42,7 @@ const QColor TraceGroup::LineColour(QColor(0x55, 0x57, 0x53)); TraceGroup::~TraceGroup() { - _owner = nullptr; + owner_ = nullptr; clear_child_items(); } @@ -52,28 +52,28 @@ bool TraceGroup::enabled() const [](const shared_ptr &r) { return r->enabled(); }); } -pv::SigSession& TraceGroup::session() +pv::Session& TraceGroup::session() { - assert(_owner); - return _owner->session(); + assert(owner_); + return owner_->session(); } -const pv::SigSession& TraceGroup::session() const +const pv::Session& TraceGroup::session() const { - assert(_owner); - return _owner->session(); + assert(owner_); + return owner_->session(); } pv::view::View* TraceGroup::view() { - assert(_owner); - return _owner->view(); + assert(owner_); + return owner_->view(); } const pv::view::View* TraceGroup::view() const { - assert(_owner); - return _owner->view(); + assert(owner_); + return owner_->view(); } pair TraceGroup::v_extents() const @@ -116,7 +116,7 @@ QRectF TraceGroup::label_rect(int right) const { QRectF rect; for (const shared_ptr 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 > items( + child_items().begin(), child_items().end()); + + // Sort by the centre line of the extents + stable_sort(items.begin(), items.end(), + [](const shared_ptr &a, const shared_ptr &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 r : items) { + const pair 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 > items( child_items().begin(), child_items().end()); clear_child_items(); - for (shared_ptr r : items) { - _owner->add_child_item(r); - r->set_v_offset(r->v_offset() + v_offset()); - } + for (shared_ptr r : items) + owner_->add_child_item(r); + + owner_->remove_child_item(shared_from_this()); +} - _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