X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fview%2Fviewport.cpp;h=0e89f3ad96fc6b983d3ed1d9d8fe2cb495e59f2b;hb=1c91f1a230ac7f61ad0c2ed9718d12514353b629;hp=a94ada93faac055aae26761941e515b3318288a7;hpb=f65cd27bdbf70644052dd43dac4bbe9403f4dfee;p=pulseview.git diff --git a/pv/view/viewport.cpp b/pv/view/viewport.cpp index a94ada9..0e89f3a 100644 --- a/pv/view/viewport.cpp +++ b/pv/view/viewport.cpp @@ -24,6 +24,7 @@ #include "signal.hpp" #include "view.hpp" +#include "viewitempaintparams.hpp" #include "viewport.hpp" #include @@ -31,8 +32,11 @@ #include using std::abs; +using std::back_inserter; +using std::copy; using std::max; using std::min; +using std::none_of; using std::shared_ptr; using std::stable_sort; using std::vector; @@ -41,70 +45,115 @@ namespace pv { namespace view { Viewport::Viewport(View &parent) : - QWidget(&parent), - view_(parent), + ViewWidget(parent), mouse_down_valid_(false), pinch_zoom_active_(false) { - setAttribute(Qt::WA_AcceptTouchEvents, true); - - setMouseTracking(true); setAutoFillBackground(true); setBackgroundRole(QPalette::Base); +} + +shared_ptr Viewport::get_mouse_over_item(const QPoint &pt) +{ + const vector< shared_ptr > items(this->items()); + for (auto i = items.rbegin(); i != items.rend(); i++) + if ((*i)->enabled() && + (*i)->hit_box_rect(rect()).contains(pt)) + return *i; + return nullptr; +} + +vector< shared_ptr > Viewport::items() +{ + vector< shared_ptr > items(view_.begin(), view_.end()); + const vector< shared_ptr > time_items(view_.time_items()); + copy(time_items.begin(), time_items.end(), back_inserter(items)); + return items; +} + +bool Viewport::touch_event(QTouchEvent *event) +{ + QList touchPoints = event->touchPoints(); + + if (touchPoints.count() != 2) { + pinch_zoom_active_ = false; + return false; + } + + const QTouchEvent::TouchPoint &touchPoint0 = touchPoints.first(); + const QTouchEvent::TouchPoint &touchPoint1 = touchPoints.last(); + + if (!pinch_zoom_active_ || + (event->touchPointStates() & Qt::TouchPointPressed)) { + pinch_offset0_ = view_.offset() + view_.scale() * touchPoint0.pos().x(); + pinch_offset1_ = view_.offset() + view_.scale() * touchPoint1.pos().x(); + pinch_zoom_active_ = true; + } - connect(&view_, SIGNAL(signals_moved()), - this, SLOT(on_signals_moved())); + double w = touchPoint1.pos().x() - touchPoint0.pos().x(); + if (abs(w) >= 1.0) { + const double scale = + fabs((pinch_offset1_ - pinch_offset0_) / w); + double offset = pinch_offset0_ - touchPoint0.pos().x() * scale; + if (scale > 0) + view_.set_scale_offset(scale, offset); + } + + if (event->touchPointStates() & Qt::TouchPointReleased) { + pinch_zoom_active_ = false; + + if (touchPoint0.state() & Qt::TouchPointReleased) { + // Primary touch released + mouse_down_valid_ = false; + } else { + // Update the mouse down fields so that continued + // dragging with the primary touch will work correctly + mouse_down_point_ = touchPoint0.pos().toPoint(); + mouse_down_offset_ = view_.offset(); + mouse_down_valid_ = true; + } + } + + return true; } void Viewport::paintEvent(QPaintEvent*) { vector< shared_ptr > row_items(view_.begin(), view_.end()); + assert(none_of(row_items.begin(), row_items.end(), + [](const shared_ptr &r) { return !r; })); + stable_sort(row_items.begin(), row_items.end(), [](const shared_ptr &a, const shared_ptr &b) { return a->visual_v_offset() < b->visual_v_offset(); }); + const vector< shared_ptr > time_items(view_.time_items()); + assert(none_of(time_items.begin(), time_items.end(), + [](const shared_ptr &t) { return !t; })); + QPainter p(this); p.setRenderHint(QPainter::Antialiasing); - if (view_.cursors_shown()) - view_.cursors().draw_viewport_background(p, rect()); + const ViewItemPaintParams pp(rect(), view_.scale(), view_.offset()); - // Plot the signal + for (const shared_ptr t : time_items) + t->paint_back(p, pp); for (const shared_ptr r : row_items) - { - assert(r); - r->paint_back(p, 0, width()); - } + r->paint_back(p, pp); + for (const shared_ptr t : time_items) + t->paint_mid(p, pp); for (const shared_ptr r : row_items) - r->paint_mid(p, 0, width()); + r->paint_mid(p, pp); for (const shared_ptr r : row_items) - r->paint_fore(p, 0, width()); - - if (view_.cursors_shown()) - view_.cursors().draw_viewport_foreground(p, rect()); + r->paint_fore(p, pp); + for (const shared_ptr t : time_items) + t->paint_fore(p, pp); p.end(); } -bool Viewport::event(QEvent *event) -{ - switch (event->type()) { - case QEvent::TouchBegin: - case QEvent::TouchUpdate: - case QEvent::TouchEnd: - if (touchEvent(static_cast(event))) - return true; - break; - - default: - break; - } - - return QWidget::event(event); -} - void Viewport::mousePressEvent(QMouseEvent *event) { assert(event); @@ -167,57 +216,5 @@ void Viewport::wheelEvent(QWheelEvent *event) } } -bool Viewport::touchEvent(QTouchEvent *event) -{ - QList touchPoints = event->touchPoints(); - - if (touchPoints.count() != 2) { - pinch_zoom_active_ = false; - return false; - } - - const QTouchEvent::TouchPoint &touchPoint0 = touchPoints.first(); - const QTouchEvent::TouchPoint &touchPoint1 = touchPoints.last(); - - if (!pinch_zoom_active_ || - (event->touchPointStates() & Qt::TouchPointPressed)) { - pinch_offset0_ = view_.offset() + view_.scale() * touchPoint0.pos().x(); - pinch_offset1_ = view_.offset() + view_.scale() * touchPoint1.pos().x(); - pinch_zoom_active_ = true; - } - - double w = touchPoint1.pos().x() - touchPoint0.pos().x(); - if (abs(w) >= 1.0) { - double scale = (pinch_offset1_ - pinch_offset0_) / w; - if (scale < 0) - scale = -scale; - double offset = pinch_offset0_ - touchPoint0.pos().x() * scale; - if (scale > 0) - view_.set_scale_offset(scale, offset); - } - - if (event->touchPointStates() & Qt::TouchPointReleased) { - pinch_zoom_active_ = false; - - if (touchPoint0.state() & Qt::TouchPointReleased) { - // Primary touch released - mouse_down_valid_ = false; - } else { - // Update the mouse down fields so that continued - // dragging with the primary touch will work correctly - mouse_down_point_ = touchPoint0.pos().toPoint(); - mouse_down_offset_ = view_.offset(); - mouse_down_valid_ = true; - } - } - - return true; -} - -void Viewport::on_signals_moved() -{ - update(); -} - } // namespace view } // namespace pv