From 117cdea32c47df0689666e75c71a3a79a24e290c Mon Sep 17 00:00:00 2001 From: Joel Holdsworth Date: Tue, 18 Nov 2014 18:44:27 +0000 Subject: [PATCH] DecodeTrace: Simplified and reduced calls to View --- pv/view/decodetrace.cpp | 109 ++++++++++++++++------------------------ pv/view/decodetrace.h | 8 +-- 2 files changed, 44 insertions(+), 73 deletions(-) diff --git a/pv/view/decodetrace.cpp b/pv/view/decodetrace.cpp index 5ee8645..be96217 100644 --- a/pv/view/decodetrace.cpp +++ b/pv/view/decodetrace.cpp @@ -548,103 +548,78 @@ pair DecodeTrace::get_sample_range(int x_start, int x_end) c return make_pair(start, end); } -bool DecodeTrace::hover_point_is_over_trace() +int DecodeTrace::get_row_at_point(const QPoint &point) { - assert(_view); - assert(_row_height); - - // Note: if _row_height is valid then _cur_row_headings is valid, too, - // as both are set in paint_mid(). - - // Note: hp.x will be 0 if the cursor is above the header area, - // so we set trace.left to 1 to exclude this. - - QRect trace(1, get_y() - (_row_height/2), - _view->width(), _row_height * _visible_rows.size()); - - // Note: We don't need to check for _row_height being 0 here but - // we do it anyway to be more robust. - - return _row_height && enabled() && trace.contains(_view->hover_point()); -} - -int DecodeTrace::get_row_at_hover_point() -{ - assert(_view); - assert(_row_height); - assert(_decoder_stack); + if (!_row_height) + return -1; - QPoint hp = _view->hover_point(); - int hover_row = (hp.y() - get_y() + (_row_height/2)) / _row_height; + const int row = (point.y() - get_y() + _row_height / 2) / _row_height; + if (row < 0 || row >= (int)_visible_rows.size()) + return -1; - return min(hover_row, (int)_visible_rows.size() - 1); + return row; } -const QString DecodeTrace::get_annotation_at_hover_point() +const QString DecodeTrace::get_annotation_at_point(const QPoint &point) { using namespace pv::data::decode; - assert(_view); - QPoint hp = _view->hover_point(); - - pair sample_range = get_sample_range(hp.x(), hp.x() + 1); + if (!enabled()) + return QString(); - const int hover_row = get_row_at_hover_point(); + const pair sample_range = + get_sample_range(point.x(), point.x() + 1); + const int row = get_row_at_point(point); + if (row < 0) + return QString(); vector annotations; assert(_decoder_stack); - _decoder_stack->get_annotation_subset(annotations, _visible_rows[hover_row], + _decoder_stack->get_annotation_subset(annotations, _visible_rows[row], sample_range.first, sample_range.second); return (annotations.empty()) ? QString() : annotations[0].annotations().front(); } -void DecodeTrace::show_hover_annotation() +void DecodeTrace::hide_hover_annotation() { - QString ann = get_annotation_at_hover_point(); + QToolTip::hideText(); +} + +void DecodeTrace::hover_point_changed() +{ + QPoint hp = _view->hover_point(); + QString ann = get_annotation_at_point(hp); assert(_view); assert(_row_height); - if (!ann.isEmpty()) { - const int hover_row = get_row_at_hover_point(); - - QFontMetrics m(QToolTip::font()); - const QRect text_size = m.boundingRect(QRect(), 0, ann); + if (ann.isEmpty()) { + hide_hover_annotation(); + return; + } - // This is OS-specific and unfortunately we can't query it, so - // use an approximation to at least try to minimize the error. - const int padding = 8; + const int hover_row = get_row_at_point(hp); - // Make sure the tool tip doesn't overlap with the mouse cursor. - // If it did, the tool tip would constantly hide and re-appear. - // We also push it up by one row so that it appears above the - // decode trace, not below. - QPoint hp = _view->hover_point(); + QFontMetrics m(QToolTip::font()); + const QRect text_size = m.boundingRect(QRect(), 0, ann); - hp.setX(hp.x() - (text_size.width() / 2) - padding); + // This is OS-specific and unfortunately we can't query it, so + // use an approximation to at least try to minimize the error. + const int padding = 8; - hp.setY(get_y() - (_row_height / 2) + (hover_row * _row_height) - - _row_height - text_size.height()); + // Make sure the tool tip doesn't overlap with the mouse cursor. + // If it did, the tool tip would constantly hide and re-appear. + // We also push it up by one row so that it appears above the + // decode trace, not below. + hp.setX(hp.x() - (text_size.width() / 2) - padding); - QToolTip::showText(_view->viewport()->mapToGlobal(hp), ann); - } else - hide_hover_annotation(); -} + hp.setY(get_y() - (_row_height / 2) + (hover_row * _row_height) + - _row_height - text_size.height()); -void DecodeTrace::hide_hover_annotation() -{ - QToolTip::hideText(); -} - -void DecodeTrace::hover_point_changed() -{ - if (hover_point_is_over_trace()) - show_hover_annotation(); - else - hide_hover_annotation(); + QToolTip::showText(_view->viewport()->mapToGlobal(hp), ann); } void DecodeTrace::create_decoder_form(int index, diff --git a/pv/view/decodetrace.h b/pv/view/decodetrace.h index 9e0faac..0ff75de 100644 --- a/pv/view/decodetrace.h +++ b/pv/view/decodetrace.h @@ -154,13 +154,9 @@ private: */ std::pair get_sample_range(int x_start, int x_end) const; - bool hover_point_is_over_trace(); + int get_row_at_point(const QPoint &point); - int get_row_at_hover_point(); - - const QString get_annotation_at_hover_point(); - - void show_hover_annotation(); + const QString get_annotation_at_point(const QPoint &point); void hide_hover_annotation(); -- 2.30.2