X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fview%2Fviewport.cpp;h=83df7aa4d1eaaa9543add3896e2b6363457ba200;hb=e9e4e5e7ea46132262fbd53f708dafc039b3b24f;hp=84092ee451ba77caea5a9661687ff2a8befd9ad5;hpb=36e7001de1e6620deeb93fa77c2ec6c4ebc4b3ea;p=pulseview.git diff --git a/pv/view/viewport.cpp b/pv/view/viewport.cpp index 84092ee4..83df7aa4 100644 --- a/pv/view/viewport.cpp +++ b/pv/view/viewport.cpp @@ -32,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; @@ -42,51 +45,67 @@ 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); +} - connect(&view_, SIGNAL(signals_moved()), - this, SLOT(on_signals_moved())); +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; } 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, pp); - } + for (const shared_ptr t : time_items) + t->paint_mid(p, pp); for (const shared_ptr r : row_items) r->paint_mid(p, pp); for (const shared_ptr r : row_items) r->paint_fore(p, pp); - - if (view_.cursors_shown()) - view_.cursors()->draw_viewport_foreground(p, rect()); + for (const shared_ptr t : time_items) + t->paint_fore(p, pp); p.end(); } @@ -217,10 +236,5 @@ bool Viewport::touchEvent(QTouchEvent *event) return true; } -void Viewport::on_signals_moved() -{ - update(); -} - } // namespace view } // namespace pv