X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fview%2Frowitem.cpp;h=7bf52124dac7159fed013600579d07d8d62dc284;hb=2a21747e9daac2a45cd9a5ceb9a351f9775c5704;hp=c78f9eef2cba0af4f22b4d9dca555801c98f7fc4;hpb=bd9a1f175057487cff3cb3cc62bc9595e19945be;p=pulseview.git diff --git a/pv/view/rowitem.cpp b/pv/view/rowitem.cpp index c78f9ee..7bf5212 100644 --- a/pv/view/rowitem.cpp +++ b/pv/view/rowitem.cpp @@ -29,18 +29,59 @@ namespace view { RowItem::RowItem() : _owner(NULL), - _v_offset(0) + _layout_v_offset(0), + _visual_v_offset(0), + _v_offset_animation(this, "visual_v_offset") { } -int RowItem::v_offset() const +int RowItem::layout_v_offset() const { - return _v_offset; + return _layout_v_offset; } -void RowItem::set_v_offset(int v_offset) +void RowItem::set_layout_v_offset(int v_offset) { - _v_offset = v_offset; + if (_layout_v_offset == v_offset) + return; + + _layout_v_offset = v_offset; + + if (_owner) + _owner->extents_changed(false, true); +} + +int RowItem::visual_v_offset() const +{ + return _visual_v_offset; +} + +void RowItem::set_visual_v_offset(int v_offset) +{ + _visual_v_offset = v_offset; + + if (_owner) + _owner->appearance_changed(true, true); +} + +void RowItem::force_to_v_offset(int v_offset) +{ + _v_offset_animation.stop(); + _layout_v_offset = _visual_v_offset = v_offset; +} + +void RowItem::animate_to_layout_v_offset() +{ + if (_visual_v_offset == _layout_v_offset || + (_v_offset_animation.endValue() == _layout_v_offset && + _v_offset_animation.state() == QAbstractAnimation::Running)) + return; + + _v_offset_animation.setDuration(100); + _v_offset_animation.setStartValue(_visual_v_offset); + _v_offset_animation.setEndValue(_layout_v_offset); + _v_offset_animation.setEasingCurve(QEasingCurve::OutQuad); + _v_offset_animation.start(); } RowItemOwner* RowItem::owner() const @@ -50,14 +91,33 @@ RowItemOwner* RowItem::owner() const void RowItem::set_owner(RowItemOwner *owner) { - assert((_owner && !owner) || (!_owner && owner)); + assert(_owner || owner); + _v_offset_animation.stop(); + + if (_owner) { + const int owner_offset = _owner->owner_visual_v_offset(); + _layout_v_offset += owner_offset; + _visual_v_offset += owner_offset; + } + _owner = owner; + + if (_owner) { + const int owner_offset = _owner->owner_visual_v_offset(); + _layout_v_offset -= owner_offset; + _visual_v_offset -= owner_offset; + } } -int RowItem::get_y() const +int RowItem::get_visual_y() const { assert(_owner); - return _v_offset + _owner->owner_v_offset(); + return _visual_v_offset + _owner->owner_visual_v_offset(); +} + +QPoint RowItem::point() const +{ + return QPoint(0, visual_v_offset()); } void RowItem::paint_back(QPainter &p, int left, int right)