X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fview%2Frowitem.cpp;h=07540c1b157437375a3e3ce95bb97eaee8e7a152;hp=fe194bf72ea3b8e9be963dba40dd2beb5d7f8929;hb=dbf74f26f6bd9fd5277f090fea8e4f5506c19911;hpb=23935421086ebf58cfe68228971ded327a6155a1 diff --git a/pv/view/rowitem.cpp b/pv/view/rowitem.cpp index fe194bf7..07540c1b 100644 --- a/pv/view/rowitem.cpp +++ b/pv/view/rowitem.cpp @@ -20,68 +20,115 @@ #include -#include "view.h" +#include "view.hpp" -#include "rowitem.h" +#include "rowitem.hpp" namespace pv { namespace view { RowItem::RowItem() : - _view(NULL), - _v_offset(0) + owner_(nullptr), + layout_v_offset_(0), + visual_v_offset_(0), + v_offset_animation_(this, "visual_v_offset") { } -int RowItem::get_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); } -void RowItem::set_view(View *view) +int RowItem::visual_v_offset() const { - assert(view); + return visual_v_offset_; +} - if (_view) - disconnect(_view, SIGNAL(hover_point_changed()), - this, SLOT(on_hover_point_changed())); +void RowItem::set_visual_v_offset(int v_offset) +{ + visual_v_offset_ = v_offset; - _view = view; + if (owner_) + owner_->row_item_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; - connect(view, SIGNAL(hover_point_changed()), - this, SLOT(on_hover_point_changed())); + if (owner_) { + owner_->row_item_appearance_changed(true, true); + owner_->extents_changed(false, true); + } +} + +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 +{ + return owner_; } -int RowItem::get_y() const +void RowItem::set_owner(RowItemOwner *owner) { - assert(_view); - return _v_offset + _view->v_offset(); + 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; + } } -void RowItem::paint_back(QPainter &p, int left, int right) +int RowItem::get_visual_y() const { - (void)p; - (void)left; - (void)right; + assert(owner_); + return visual_v_offset_ + owner_->owner_visual_v_offset(); } -void RowItem::paint_mid(QPainter &p, int left, int right) +void RowItem::drag_by(const QPoint &delta) { - (void)p; - (void)left; - (void)right; + force_to_v_offset(drag_point_.y() + delta.y() - + owner_->owner_visual_v_offset()); } -void RowItem::paint_fore(QPainter &p, int left, int right) +QPoint RowItem::point(const QRect &rect) const { - (void)p; - (void)left; - (void)right; + return QPoint(rect.right(), get_visual_y()); } void RowItem::hover_point_changed()