From 991f497a6199fbc06d958c5e3df0c22d187905ce Mon Sep 17 00:00:00 2001 From: dreamsourcelabTAI Date: Thu, 16 Mar 2023 19:47:36 +0800 Subject: [PATCH] fix: The cursor line can't show when data is empty --- DSView/pv/dialogs/decoderoptionsdlg.cpp | 4 +- DSView/pv/dialogs/regionoptions.cpp | 7 +- DSView/pv/dock/measuredock.cpp | 50 ++++--- DSView/pv/sigsession.cpp | 4 +- DSView/pv/view/analogsignal.cpp | 7 +- DSView/pv/view/dsosignal.cpp | 6 +- DSView/pv/view/mathtrace.cpp | 6 +- DSView/pv/view/ruler.cpp | 82 +++++++---- DSView/pv/view/timemarker.cpp | 2 +- DSView/pv/view/viewport.cpp | 172 +++++++++++++++--------- DSView/pv/view/viewport.h | 1 + 11 files changed, 227 insertions(+), 114 deletions(-) diff --git a/DSView/pv/dialogs/decoderoptionsdlg.cpp b/DSView/pv/dialogs/decoderoptionsdlg.cpp index fbb8c41a..0b62c613 100644 --- a/DSView/pv/dialogs/decoderoptionsdlg.cpp +++ b/DSView/pv/dialogs/decoderoptionsdlg.cpp @@ -136,7 +136,9 @@ void DecoderOptionsDlg::load_options_view() if (view) { int num = 1; - for (auto c : view->get_cursorList()){ + auto &cursor_list = view->get_cursorList(); + + for (auto c : cursor_list){ //tr QString curCursor = L_S(STR_PAGE_DLG, S_ID(IDS_DLG_CURSOR), "Cursor") + QString::number(num); diff --git a/DSView/pv/dialogs/regionoptions.cpp b/DSView/pv/dialogs/regionoptions.cpp index 92ad3fe7..c4d2ea72 100644 --- a/DSView/pv/dialogs/regionoptions.cpp +++ b/DSView/pv/dialogs/regionoptions.cpp @@ -50,16 +50,19 @@ RegionOptions::RegionOptions(view::View *view, SigSession *session, QWidget *par _end_comboBox = new DsComboBox(this); _start_comboBox->addItem(RegionStart); _end_comboBox->addItem(RegionEnd); + if (_view) { int index = 1; - for(std::list::iterator i = _view->get_cursorList().begin(); - i != _view->get_cursorList().end(); i++) { + auto &cursor_list = _view->get_cursorList(); + + for(auto i = cursor_list.begin(); i != cursor_list.end(); i++) { QString curCursor = L_S(STR_PAGE_DLG, S_ID(IDS_DLG_CURSOR), "Cursor")+QString::number(index); _start_comboBox->addItem(curCursor); _end_comboBox->addItem(curCursor); index++; } } + hlayout->addWidget(new QLabel("Start: ", this)); hlayout->addWidget(_start_comboBox); hlayout->addWidget(new QLabel(" ", this)); diff --git a/DSView/pv/dock/measuredock.cpp b/DSView/pv/dock/measuredock.cpp index 46f508ec..e7296636 100644 --- a/DSView/pv/dock/measuredock.cpp +++ b/DSView/pv/dock/measuredock.cpp @@ -245,8 +245,9 @@ void MeasureDock::cursor_update() int index = 1; QString iconPath = GetIconPath(); - for(std::list::iterator i = _view.get_cursorList().begin(); - i != _view.get_cursorList().end(); i++) { + auto &cursor_list = _view.get_cursorList(); + + for(auto i = cursor_list.begin();i != cursor_list.end(); i++) { QString curCursor = QString::number(index); QToolButton *del_btn = new QToolButton(_widget); @@ -286,8 +287,9 @@ void MeasureDock::cursor_moving() //TimeMarker* grabbed_marker = _view.get_ruler()->get_grabbed_cursor(); if (_view.cursors_shown()) { int index = 0; - for(std::list::iterator i = _view.get_cursorList().begin(); - i != _view.get_cursorList().end(); i++) { + auto &cursor_list = _view.get_cursorList(); + + for(auto i = cursor_list.begin(); i != cursor_list.end(); i++) { QString _cur_text = _view.get_cm_time(index) + "/" + QString::number(_view.get_cursor_samples(index)); _curpos_label_list.at(index)->setText(_cur_text); //_curvalue_label_list.at(index)->setText(_view.get_cm_value(index)); @@ -470,7 +472,9 @@ void MeasureDock::del_edge_measure() void MeasureDock::show_all_coursor() { - if (_view.get_cursorList().empty()) { + auto &cursor_list = _view.get_cursorList(); + + if (cursor_list.empty()) { dialogs::DSMessageBox msg(this); msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_INFORMATION), "Information")); msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_PLEASE_INSERT_CURSOR), @@ -490,8 +494,8 @@ void MeasureDock::show_all_coursor() int index = 0; QGridLayout *glayout = new QGridLayout(&cursor_dlg); - for(std::list::iterator i = _view.get_cursorList().begin(); - i != _view.get_cursorList().end(); i++) { + + for(auto i = cursor_list.begin(); i != cursor_list.end(); i++) { QPushButton *cursor_btn = new QPushButton(QString::number(index+1), &cursor_dlg); set_cursor_btn_color(cursor_btn); glayout->addWidget(cursor_btn, index/4, index%4, 1, 1); @@ -525,8 +529,9 @@ void MeasureDock::set_se_cursor() const view::Cursor* MeasureDock::find_cousor(int index) { int cur_index = 1; - for(std::list::iterator i = _view.get_cursorList().begin(); - i != _view.get_cursorList().end(); i++) { + auto &cursor_list = _view.get_cursorList(); + + for(auto i = cursor_list.begin(); i != cursor_list.end(); i++) { if (cur_index == index) { return (*i); } @@ -538,6 +543,9 @@ const view::Cursor* MeasureDock::find_cousor(int index) void MeasureDock::update_dist() { int dist_index = 0; + + auto &cursor_list = _view.get_cursorList(); + for (QVector::Iterator i = _dist_s_btn_vec.begin(); i != _dist_s_btn_vec.end(); i++) { bool start_ret, end_ret; @@ -545,14 +553,14 @@ void MeasureDock::update_dist() const unsigned int end = _dist_e_btn_vec[dist_index]->text().toInt(&end_ret) - 1; if (start_ret) { - if (start + 1 > _view.get_cursorList().size()) { + if (start + 1 > cursor_list.size()) { (*i)->setText(" "); set_cursor_btn_color((*i)); start_ret = false; } } if (end_ret) { - if (end + 1 > _view.get_cursorList().size()) { + if (end + 1 > cursor_list.size()) { _dist_e_btn_vec[dist_index]->setText(" "); set_cursor_btn_color(_dist_e_btn_vec[dist_index]); end_ret = false; @@ -578,6 +586,8 @@ void MeasureDock::update_dist() void MeasureDock::update_edge() { int edge_index = 0; + auto &cursor_list = _view.get_cursorList(); + for (QVector::Iterator i = _edge_s_btn_vec.begin(); i != _edge_s_btn_vec.end(); i++) { bool start_ret, end_ret; @@ -585,14 +595,14 @@ void MeasureDock::update_edge() const unsigned int end = _edge_e_btn_vec[edge_index]->text().toInt(&end_ret) - 1; if (start_ret) { - if (start + 1 > _view.get_cursorList().size()) { + if (start + 1 > cursor_list.size()) { (*i)->setText(" "); set_cursor_btn_color((*i)); start_ret = false; } } if (end_ret) { - if (end + 1 > _view.get_cursorList().size()) { + if (end + 1 > cursor_list.size()) { _edge_e_btn_vec[edge_index]->setText(" "); set_cursor_btn_color(_edge_e_btn_vec[edge_index]); end_ret = false; @@ -668,13 +678,19 @@ void MeasureDock::del_cursor() { int del_index = 0; Cursor* cursor = NULL; - for (QVector ::const_iterator i = _cursor_del_btn_vec.begin(); - i != _cursor_del_btn_vec.end(); i++) { + auto &cursor_list = _view.get_cursorList(); + + for (auto i = _cursor_del_btn_vec.begin(); + i != _cursor_del_btn_vec.end(); i++) + { + if ((*i)->isChecked()) { int cur_index = 0; - std::list::iterator ite = _view.get_cursorList().begin(); + auto ite = cursor_list.begin(); + while (cur_index++ != del_index) ite++; + cursor = *ite; break; } @@ -683,7 +699,7 @@ void MeasureDock::del_cursor() if (cursor) _view.del_cursor(cursor); - if (_view.get_cursorList().empty()) + if (cursor_list.empty()) _view.show_cursors(false); cursor_update(); diff --git a/DSView/pv/sigsession.cpp b/DSView/pv/sigsession.cpp index 29f3ce39..0421f074 100644 --- a/DSView/pv/sigsession.cpp +++ b/DSView/pv/sigsession.cpp @@ -214,6 +214,8 @@ namespace pv // Release the old device. _device_agent.release(); + _device_status = ST_INIT; + if (ds_active_device(dev_handle) != SR_OK) { dsv_err("%s", "Switch device error!"); @@ -227,8 +229,6 @@ namespace pv else dsv_info("Switch to device \"%s\" done.", _device_agent.name().toUtf8().data()); - _device_status = ST_INIT; - clear_all_decoder(); _view_data->clear(); diff --git a/DSView/pv/view/analogsignal.cpp b/DSView/pv/view/analogsignal.cpp index 874fd3cf..66c6984f 100644 --- a/DSView/pv/view/analogsignal.cpp +++ b/DSView/pv/view/analogsignal.cpp @@ -658,14 +658,17 @@ void AnalogSignal::paint_hover_measure(QPainter &p, QColor fore, QColor back) p.drawText(hover_rect, Qt::AlignCenter | Qt::AlignTop | Qt::TextDontClip, hover_str); } - auto i = _view->get_cursorList().begin(); - while (i != _view->get_cursorList().end()) { + auto &cursor_list = _view->get_cursorList(); + auto i = cursor_list.begin(); + + while (i != cursor_list.end()) { float pt_value; const QPointF pt = get_point((*i)->index(), pt_value); if (pt == QPointF(-1, -1)) { i++; continue; } + QString pt_str = get_voltage(hw_offset - pt_value, 2); if (pt.y() <= top || pt.y() >= bottom) pt_str += "/out"; diff --git a/DSView/pv/view/dsosignal.cpp b/DSView/pv/view/dsosignal.cpp index 867a92d9..3cc837eb 100644 --- a/DSView/pv/view/dsosignal.cpp +++ b/DSView/pv/view/dsosignal.cpp @@ -1292,8 +1292,10 @@ void DsoSignal::paint_hover_measure(QPainter &p, QColor fore, QColor back) p.drawText(hover_rect, Qt::AlignCenter | Qt::AlignTop | Qt::TextDontClip, hover_str); } - auto i = _view->get_cursorList().begin(); - while (i != _view->get_cursorList().end()) { + auto &cursor_list = _view->get_cursorList(); + auto i = cursor_list.begin(); + + while (i != cursor_list.end()) { float pt_value; const QPointF pt = get_point((*i)->index(), pt_value); if (pt == QPointF(-1, -1)) { diff --git a/DSView/pv/view/mathtrace.cpp b/DSView/pv/view/mathtrace.cpp index 7154adc4..836f0601 100644 --- a/DSView/pv/view/mathtrace.cpp +++ b/DSView/pv/view/mathtrace.cpp @@ -419,8 +419,10 @@ void MathTrace::paint_hover_measure(QPainter &p, QColor fore, QColor back) p.drawText(hover_rect, Qt::AlignCenter | Qt::AlignTop | Qt::TextDontClip, hover_str); } - auto i = _view->get_cursorList().begin(); - while (i != _view->get_cursorList().end()) { + auto &cursor_list = _view->get_cursorList(); + auto i = cursor_list.begin(); + + while (i != cursor_list.end()) { float pt_value; const QPointF pt = get_point((*i)->index(), pt_value); QString pt_str = get_voltage(pt_value, 2); diff --git a/DSView/pv/view/ruler.cpp b/DSView/pv/view/ruler.cpp index 3a83ed92..73f99902 100644 --- a/DSView/pv/view/ruler.cpp +++ b/DSView/pv/view/ruler.cpp @@ -239,20 +239,25 @@ void Ruler::mousePressEvent(QMouseEvent *event) { if (event->button() & Qt::LeftButton) { bool visible; - if (!_cursor_sel_visible & !_view.get_cursorList().empty()) { + auto &cursor_list = _view.get_cursorList(); + + if (!_cursor_sel_visible && cursor_list.size()) { _view.show_cursors(true); - auto i = _view.get_cursorList().begin(); - while (i != _view.get_cursorList().end()) { + auto i = cursor_list.begin(); + + while (i != cursor_list.end()) { const QRect cursor_rect((*i)->get_label_rect(rect(), visible)); if ((*i)->get_close_rect(cursor_rect).contains(event->pos())) { _view.del_cursor(*i); - if (_view.get_cursorList().empty()) { + + if (cursor_list.empty()) { _cursor_sel_visible = false; _view.show_cursors(false); } _hitCursor = true; break; } + if (cursor_rect.contains(event->pos())) { set_grabbed_cursor(*i); _cursor_sel_visible = false; @@ -269,31 +274,40 @@ void Ruler::mousePressEvent(QMouseEvent *event) void Ruler::mouseReleaseEvent(QMouseEvent *event) { bool updatedCursor = false; + if (event->button() & Qt::LeftButton) { if (!_hitCursor && !_grabbed_marker) { if (!_cursor_go_visible) { if (!_cursor_sel_visible) { _cursor_sel_x = event->pos().x(); _cursor_sel_visible = true; - } else { + } + else { int overCursor; + auto &cursor_list = _view.get_cursorList(); uint64_t index = _view.pixel2index(_cursor_sel_x); overCursor = in_cursor_sel_rect(event->pos()); + if (overCursor == 0) { - _view.add_cursor(CursorColor[_view.get_cursorList().size() % 8], index); + _view.add_cursor(CursorColor[cursor_list.size() % 8], index); _view.show_cursors(true); updatedCursor = true; - } else if (overCursor > 0) { - auto i = _view.get_cursorList().begin(); - while (--overCursor != 0) - i++; + } + else if (overCursor > 0) { + auto i = cursor_list.begin(); + + while (--overCursor != 0){ + i++; + } + (*i)->set_index(index); updatedCursor = true; _view.cursor_moved(); } _cursor_sel_visible = false; } - } else { + } + else { int overCursor; overCursor = in_cursor_sel_rect(event->pos()); if (overCursor > 0) { @@ -325,13 +339,19 @@ void Ruler::mouseReleaseEvent(QMouseEvent *event) } else { int overCursor; overCursor = in_cursor_sel_rect(event->pos()); + auto &cursor_list = _view.get_cursorList(); + if (overCursor > 0) { - auto i = _view.get_cursorList().begin(); - while (--overCursor != 0) + auto i = cursor_list.begin(); + + while (--overCursor != 0){ i++; + } + _view.del_cursor(*i); } - if (_view.get_cursorList().empty()) { + + if (cursor_list.empty()) { _cursor_sel_visible = false; _view.show_cursors(false); } @@ -455,15 +475,19 @@ void Ruler::draw_logic_tick_mark(QPainter &p) } while (x < rect().right()); // Draw the cursors - if (!_view.get_cursorList().empty()) { - auto i = _view.get_cursorList().begin(); + auto &cursor_list = _view.get_cursorList(); + + if (cursor_list.size()) { + auto i = cursor_list.begin(); int index = 1; - while (i != _view.get_cursorList().end()) { + + while (i != cursor_list.end()) { (*i)->paint_label(p, rect(), prefix, index, _view.session().is_stopped_status()); index++; i++; } } + if (_view.trig_cursor_shown()) { _view.get_trig_cursor()->paint_fix_label(p, rect(), prefix, 'T', _view.get_trig_cursor()->colour(), false); } @@ -573,10 +597,13 @@ void Ruler::draw_osc_tick_mark(QPainter &p) } while (x < rect().right()); // Draw the cursors - if (!_view.get_cursorList().empty()) { - auto i = _view.get_cursorList().begin(); + auto &cursor_list = _view.get_cursorList(); + + if (!cursor_list.empty()) { + auto i = cursor_list.begin(); int index = 1; - while (i != _view.get_cursorList().end()) { + + while (i != cursor_list.end()) { (*i)->paint_label(p, rect(), prefix, index, _view.session().is_stopped_status()); index++; i++; @@ -637,19 +664,24 @@ void Ruler::draw_cursor_sel(QPainter &p) }; p.drawPolygon((_cursor_go_visible ? del_points : points), countof(points)); - if (!_view.get_cursorList().empty()) { + auto &cursor_list = _view.get_cursorList(); + + if (!cursor_list.empty()) { int index = 1; - auto i = _view.get_cursorList().begin(); - while (i != _view.get_cursorList().end()) { + auto i = cursor_list.begin(); + + while (i != cursor_list.end()) { const QRectF cursorRect = get_cursor_sel_rect(index); p.setPen(QPen(Qt::black, 1, Qt::DotLine)); p.drawLine(cursorRect.left(), cursorRect.top() + 3, cursorRect.left(), cursorRect.bottom() - 3); p.setPen(QPen(Qt::NoPen)); + if (in_cursor_sel_rect(pos) == index) p.setBrush(View::Orange); else p.setBrush(CursorColor[(index - 1)%8]); + p.drawRect(cursorRect); p.setPen(Qt::black); p.drawText(cursorRect, Qt::AlignCenter | Qt::AlignVCenter, QString::number(index)); @@ -664,7 +696,9 @@ int Ruler::in_cursor_sel_rect(QPointF pos) if (_cursor_sel_x == -1) return -1; - for (unsigned int i = 0; i < _view.get_cursorList().size() + 1; i++) { + auto &cursor_list = _view.get_cursorList(); + + for (unsigned int i = 0; i < cursor_list.size() + 1; i++) { const QRectF cursorRect = get_cursor_sel_rect(i); if (cursorRect.contains(pos)) return i; diff --git a/DSView/pv/view/timemarker.cpp b/DSView/pv/view/timemarker.cpp index ad8aa705..2a494f27 100644 --- a/DSView/pv/view/timemarker.cpp +++ b/DSView/pv/view/timemarker.cpp @@ -61,6 +61,7 @@ bool TimeMarker::grabbed() { return _grabbed; } + void TimeMarker::set_grabbed(bool grabbed) { _grabbed = grabbed; @@ -83,7 +84,6 @@ void TimeMarker::paint(QPainter &p, const QRect &rect, const bool highlight, int if (x <= rect.right()) { QColor color = (order == -1) ? _colour : Ruler::CursorColor[order%8]; p.setPen((_grabbed | highlight) ? QPen(color.lighter(), 2, Qt::DashLine) : QPen(color, 1, Qt::DashLine)); - //p.drawLine(QPoint(x, rect.top()), QPoint(x, rect.bottom())); p.drawLine(QPoint(x, 0), QPoint(x, rect.bottom())); } } diff --git a/DSView/pv/view/viewport.cpp b/DSView/pv/view/viewport.cpp index 2a58a8de..b0a42df3 100644 --- a/DSView/pv/view/viewport.cpp +++ b/DSView/pv/view/viewport.cpp @@ -172,8 +172,12 @@ void Viewport::doPaint() if (_view.session().get_device()->get_work_mode() == LOGIC || _view.session().is_instant()) - { - if (_view.session().is_stopped_status()) + { + if (_view.session().is_init_status()) + { + paintCursors(p); + } + else if (_view.session().is_stopped_status()) { paintSignals(p, fore, back); } @@ -208,6 +212,28 @@ void Viewport::doPaint() p.end(); } +void Viewport::paintCursors(QPainter &p) +{ + const QRect xrect = _view.get_view_rect(); + auto &cursor_list = _view.get_cursorList(); + + if (_view.cursors_shown() && _type == TIME_VIEW) { + auto i = cursor_list.begin(); + int index = 0; + + while (i != cursor_list.end()) { + const int64_t cursorX = _view.index2pixel((*i)->index()); + if (xrect.contains(_view.hover_point().x(), _view.hover_point().y()) && + qAbs(cursorX - _view.hover_point().x()) <= HitCursorMargin) + (*i)->paint(p, xrect, 1, index, _view.session().is_stopped_status()); + else + (*i)->paint(p, xrect, 0, index, _view.session().is_stopped_status()); + i++; + index++; + } + } +} + void Viewport::paintSignals(QPainter &p, QColor fore, QColor back) { std::vector traces; @@ -245,28 +271,17 @@ void Viewport::paintSignals(QPainter &p, QColor fore, QColor back) } // plot cursors - //const QRect xrect = QRect(rect().left(), rect().top(), _view.get_view_width(), rect().height()); + paintCursors(p); + const QRect xrect = _view.get_view_rect(); - if (_view.cursors_shown() && _type == TIME_VIEW) { - auto i = _view.get_cursorList().begin(); - int index = 0; - while (i != _view.get_cursorList().end()) { - const int64_t cursorX = _view.index2pixel((*i)->index()); - if (xrect.contains(_view.hover_point().x(), _view.hover_point().y()) && - qAbs(cursorX - _view.hover_point().x()) <= HitCursorMargin) - (*i)->paint(p, xrect, 1, index, _view.session().is_stopped_status()); - else - (*i)->paint(p, xrect, 0, index, _view.session().is_stopped_status()); - i++; - index++; - } - } if (_view.xcursors_shown() && _type == TIME_VIEW) { - auto i = _view.get_xcursorList().begin(); + auto &xcursor_list = _view.get_xcursorList(); + auto i = xcursor_list.begin(); int index = 0; bool hovered = false; - while (i != _view.get_xcursorList().end()) { + + while (i != xcursor_list.end()) { const double cursorX = xrect.left() + (*i)->value(XCursor::XCur_Y)*xrect.width(); const double cursorY0 = xrect.top() + (*i)->value(XCursor::XCur_X0)*xrect.height(); const double cursorY1 = xrect.top() + (*i)->value(XCursor::XCur_X1)*xrect.height(); @@ -275,22 +290,27 @@ void Viewport::paintSignals(QPainter &p, QColor fore, QColor back) (*i)->get_map_rect(xrect).contains(_view.hover_point()))) { (*i)->paint(p, xrect, XCursor::XCur_All, index); hovered = true; - } else if(!hovered && xrect.contains(_view.hover_point())) { + } + else if(!hovered && xrect.contains(_view.hover_point())) { if (qAbs(cursorX - _view.hover_point().x()) <= HitCursorMargin && _view.hover_point().y() > min(cursorY0, cursorY1) && _view.hover_point().y() < max(cursorY0, cursorY1)) { (*i)->paint(p, xrect, XCursor::XCur_Y, index); hovered = true; - } else if (qAbs(cursorY0 - _view.hover_point().y()) <= HitCursorMargin) { + } + else if (qAbs(cursorY0 - _view.hover_point().y()) <= HitCursorMargin) { (*i)->paint(p, xrect, XCursor::XCur_X0, index); hovered = true; - } else if (qAbs(cursorY1 - _view.hover_point().y()) <= HitCursorMargin) { + } + else if (qAbs(cursorY1 - _view.hover_point().y()) <= HitCursorMargin) { (*i)->paint(p, xrect, XCursor::XCur_X1, index); hovered = true; - } else { + } + else { (*i)->paint(p, xrect, XCursor::XCur_None, index); } - } else { + } + else { (*i)->paint(p, xrect, XCursor::XCur_None, index); } @@ -556,7 +576,8 @@ void Viewport::mousePressEvent(QMouseEvent *event) else if (_view.session().get_device()->get_work_mode() == DSO) { if (_hover_hit) { const int64_t index = _view.pixel2index(event->pos().x()); - _view.add_cursor(view::Ruler::CursorColor[_view.get_cursorList().size() % 8], index); + auto &cursor_list = _view.get_cursorList(); + _view.add_cursor(view::Ruler::CursorColor[cursor_list.size() % 8], index); _view.show_cursors(true); } } @@ -590,13 +611,17 @@ void Viewport::mousePressEvent(QMouseEvent *event) _action_type = CURS_MOVE; } } + if (_action_type == NO_ACTION && _view.cursors_shown()) { - auto i = _view.get_cursorList().begin(); - while (i != _view.get_cursorList().end()) { + auto &cursor_list = _view.get_cursorList(); + auto i = cursor_list.begin(); + + while (i != cursor_list.end()) { const int64_t cursorX = _view.index2pixel((*i)->index()); if ((*i)->grabbed()) { _view.get_ruler()->rel_grabbed_cursor(); - } else if (qAbs(cursorX - event->pos().x()) <= HitCursorMargin) { + } + else if (qAbs(cursorX - event->pos().x()) <= HitCursorMargin) { _view.get_ruler()->set_grabbed_cursor(*i); _action_type = CURS_MOVE; break; @@ -604,18 +629,20 @@ void Viewport::mousePressEvent(QMouseEvent *event) i++; } } + if (_action_type == NO_ACTION && _view.xcursors_shown()) { - auto i = _view.get_xcursorList().begin(); + auto &xcursor_list = _view.get_xcursorList(); + auto i = xcursor_list.begin(); const QRect xrect = _view.get_view_rect(); - while (i != _view.get_xcursorList().end()) { + while (i != xcursor_list.end()) { const double cursorX = xrect.left() + (*i)->value(XCursor::XCur_Y)*xrect.width(); const double cursorY0 = xrect.top() + (*i)->value(XCursor::XCur_X0)*xrect.height(); const double cursorY1 = xrect.top() + (*i)->value(XCursor::XCur_X1)*xrect.height(); if ((*i)->get_close_rect(xrect).contains(_view.hover_point())) { _view.del_xcursor(*i); - if (_view.get_xcursorList().empty()) + if (xcursor_list.empty()) _view.show_xcursors(false); break; } @@ -636,6 +663,7 @@ void Viewport::mousePressEvent(QMouseEvent *event) sig_looped = true; } } + s++; if (s == sigs.end()) { if (no_dsoSig) { @@ -751,9 +779,11 @@ void Viewport::mouseMoveEvent(QMouseEvent *event) _curs_moved = true; } else { if (_view.xcursors_shown()) { - auto i = _view.get_xcursorList().begin(); + auto &xcursor_list = _view.get_xcursorList(); + auto i = xcursor_list.begin(); const QRect xrect = _view.get_view_rect(); - while (i != _view.get_xcursorList().end()) { + + while (i != xcursor_list.end()) { if ((*i)->grabbed() != XCursor::XCur_None) { if ((*i)->grabbed() == XCursor::XCur_Y) { double rate = (_view.hover_point().x() - xrect.left()) * 1.0 / xrect.width(); @@ -878,7 +908,8 @@ void Viewport::mouseReleaseEvent(QMouseEvent *event) } } } - } else if (_view.session().get_device()->get_work_mode() == DSO) { + } + else if (_view.session().get_device()->get_work_mode() == DSO) { // priority 0 if (_action_type == NO_ACTION && _hover_hit) { _action_type = DSO_YM; @@ -889,7 +920,8 @@ void Viewport::mouseReleaseEvent(QMouseEvent *event) _dso_ym_start = event->pos().y(); } } - } else if (_action_type == DSO_YM) { + } + else if (_action_type == DSO_YM) { if (event->button() == Qt::LeftButton) { _dso_ym_end = event->pos().y(); _action_type = NO_ACTION; @@ -897,7 +929,8 @@ void Viewport::mouseReleaseEvent(QMouseEvent *event) _action_type = NO_ACTION; _dso_ym_valid = false; } - } else if (_action_type == DSO_TRIG_MOVE) { + } + else if (_action_type == DSO_TRIG_MOVE) { if (_dso_trig_moved && event->button() == Qt::LeftButton) { _drag_sig = NULL; _action_type = NO_ACTION; @@ -910,13 +943,14 @@ void Viewport::mouseReleaseEvent(QMouseEvent *event) t->select(false); } } - - } else if (_action_type == DSO_XM_STEP0) { + } + else if (_action_type == DSO_XM_STEP0) { if (event->button() == Qt::LeftButton) { _action_type = DSO_XM_STEP1; _dso_xm_valid = true; } - } else if (_action_type == DSO_XM_STEP1) { + } + else if (_action_type == DSO_XM_STEP1) { if (event->button() == Qt::LeftButton) { _dso_xm_index[1] = _view.pixel2index(event->pos().x()); const uint64_t max_index = max(_dso_xm_index[0], _dso_xm_index[1]); @@ -924,11 +958,13 @@ void Viewport::mouseReleaseEvent(QMouseEvent *event) _dso_xm_index[1] = max_index; _action_type = DSO_XM_STEP2; - } else if (event->button() == Qt::RightButton) { + } + else if (event->button() == Qt::RightButton) { clear_dso_xm(); measure_updated(); } - } else if (_action_type == DSO_XM_STEP2) { + } + else if (_action_type == DSO_XM_STEP2) { if (event->button() == Qt::LeftButton) { _dso_xm_index[2] = _view.pixel2index(event->pos().x()); uint64_t max_index = max(_dso_xm_index[1], _dso_xm_index[2]); @@ -940,11 +976,13 @@ void Viewport::mouseReleaseEvent(QMouseEvent *event) _dso_xm_index[1] = max_index; _action_type = NO_ACTION; - } else if (event->button() == Qt::RightButton) { + } + else if (event->button() == Qt::RightButton) { clear_dso_xm(); measure_updated(); } - } else if (_action_type == CURS_MOVE) { + } + else if (_action_type == CURS_MOVE) { if (_curs_moved && event->button() == Qt::LeftButton) { _action_type = NO_ACTION; _view.get_ruler()->rel_grabbed_cursor(); @@ -953,44 +991,54 @@ void Viewport::mouseReleaseEvent(QMouseEvent *event) } if (_xcurs_moved && event->button() == Qt::LeftButton) { _action_type = NO_ACTION; - auto i = _view.get_xcursorList().begin(); - while (i != _view.get_xcursorList().end()) { + auto &xcursor_list = _view.get_xcursorList(); + auto i = xcursor_list.begin(); + + while (i != xcursor_list.end()) { (*i)->rel_grabbed(); i++; } + _xcurs_moved = false; } - } else if (_action_type == LOGIC_EDGE) { + } + else if (_action_type == LOGIC_EDGE) { _action_type = NO_ACTION; _edge_rising = 0; _edge_falling = 0; - } else if (_action_type == LOGIC_JUMP) { + } + else if (_action_type == LOGIC_JUMP) { _action_type = NO_ACTION; _edge_rising = 0; _edge_falling = 0; _edge_hit = false; - } else if (_action_type == LOGIC_MOVE) { + } + else if (_action_type == LOGIC_MOVE) { if (_mouse_down_point == event->pos()) { _drag_strength = 0; _drag_timer.stop(); _action_type = NO_ACTION; - } else { + } + else { const double strength = _drag_strength*DragTimerInterval*1.0/_elapsed_time.elapsed(); if (_elapsed_time.elapsed() < 200 && abs(_drag_strength) < MinorDragOffsetUp && abs(strength) > MinorDragRateUp) { _drag_timer.start(DragTimerInterval); - } else if (_elapsed_time.elapsed() < 200 && + } + else if (_elapsed_time.elapsed() < 200 && abs(strength) > DragTimerInterval) { _drag_strength = strength * 5; _drag_timer.start(DragTimerInterval); - } else { + } + else { _drag_strength = 0; _drag_timer.stop(); _action_type = NO_ACTION; } } - } else if (_action_type == LOGIC_ZOOM) { + } + else if (_action_type == LOGIC_ZOOM) { if (event->pos().x() != _mouse_down_point.x()) { int64_t newOffset = _view.offset() + (min(event->pos().x(), _mouse_down_point.x())); const double newScale = max(min(_view.scale() * abs(event->pos().x() - _mouse_down_point.x()) / _view.get_view_width(), @@ -1014,7 +1062,7 @@ void Viewport::mouseDoubleClickEvent(QMouseEvent *event) int mode = _view.session().get_device()->get_work_mode(); - if (mode == LOGIC && _view.session().is_stopped_status()) + if (mode == LOGIC)// && _view.session().is_stopped_status()) { if (event->button() == Qt::RightButton) { if (_view.scale() == _view.get_maxscale()) @@ -1052,7 +1100,8 @@ void Viewport::mouseDoubleClickEvent(QMouseEvent *event) index = _view.pixel2index(curX); } - _view.add_cursor(view::Ruler::CursorColor[_view.get_cursorList().size() % 8], index); + auto &cursor_list = _view.get_cursorList(); + _view.add_cursor(view::Ruler::CursorColor[cursor_list.size() % 8], index); _view.show_cursors(true); } @@ -1080,7 +1129,8 @@ void Viewport::mouseDoubleClickEvent(QMouseEvent *event) uint64_t index; const double curX = event->pos().x(); index = _view.pixel2index(curX); - _view.add_cursor(view::Ruler::CursorColor[_view.get_cursorList().size() % 8], index); + auto &cursor_list = _view.get_cursorList(); + _view.add_cursor(view::Ruler::CursorColor[cursor_list.size() % 8], index); _view.show_cursors(true); } } @@ -1680,12 +1730,10 @@ void Viewport::paintMeasure(QPainter &p, QColor fore, QColor back) QString delta_text = _view.get_index_delta(_edge_start, _edge_end) + "/" + QString::number(delta); QFontMetrics fm = this->fontMetrics(); - // const int rectW = fm.width(delta_text) + 60; + const int rectW = fm.boundingRect(delta_text).width() + 60; - const int rectH = fm.height() + 10; - //const int rectY = (_cur_aftY >= _cur_preY) ? _cur_preY_top : _cur_preY_bottom; - //const int rectX = (_cur_aftX >= _cur_preX) ? _cur_preX : _cur_preX - rectW; + const int rectY = (height() - _view.hover_point().y() < rectH + 20) ? _view.hover_point().y() - 10 - rectH : _view.hover_point().y() + 20; const int rectX = (width() - _view.hover_point().x() < rectW) ? _view.hover_point().x() - rectW : _view.hover_point().x(); QRectF jump_rect = QRectF(rectX, rectY, rectW, rectH); @@ -1816,14 +1864,16 @@ void Viewport::add_cursor_y() uint64_t index; //const double curX = _menu_pos.x(); index = _view.pixel2index(_cur_preX); - _view.add_cursor(view::Ruler::CursorColor[_view.get_cursorList().size() % 8], index); + auto &cursor_list = _view.get_cursorList(); + _view.add_cursor(view::Ruler::CursorColor[cursor_list.size() % 8], index); _view.show_cursors(true); } void Viewport::add_cursor_x() { double ypos = (_cur_preY - _view.get_view_rect().top()) * 1.0 / _view.get_view_height(); - _view.add_xcursor(view::Ruler::CursorColor[_view.get_cursorList().size() % 8], ypos, ypos); + auto &cursor_list = _view.get_cursorList(); + _view.add_xcursor(view::Ruler::CursorColor[cursor_list.size() % 8], ypos, ypos); _view.show_xcursors(true); } diff --git a/DSView/pv/view/viewport.h b/DSView/pv/view/viewport.h index c5c60838..165a0b2f 100644 --- a/DSView/pv/view/viewport.h +++ b/DSView/pv/view/viewport.h @@ -125,6 +125,7 @@ private: void paintSignals(QPainter& p, QColor fore, QColor back); void paintProgress(QPainter& p, QColor fore, QColor back); void paintMeasure(QPainter &p, QColor fore, QColor back); + void paintCursors(QPainter &p); void measure(); void start_trigger_timer(int msec);