diff --git a/DSView/pv/view/cursor.cpp b/DSView/pv/view/cursor.cpp index 62ec0861c4c3668c3801c0d1b75982752ad5b04b..7c136567254ab235d5adca337197ccd159c2fee1 100755 --- a/DSView/pv/view/cursor.cpp +++ b/DSView/pv/view/cursor.cpp @@ -85,7 +85,7 @@ QRect Cursor::get_close_rect(const QRect &rect) const } void Cursor::paint_label(QPainter &p, const QRect &rect, - unsigned int prefix, int index) + unsigned int prefix, int index, bool has_hoff) { assert(index > 0); @@ -93,7 +93,7 @@ void Cursor::paint_label(QPainter &p, const QRect &rect, bool visible; compute_text_size(p, prefix); - const QRect r(get_label_rect(rect, visible)); + const QRect r(get_label_rect(rect, visible, has_hoff)); if (!visible) return; const QRect close(get_close_rect(r)); @@ -153,8 +153,9 @@ void Cursor::paint_fix_label(QPainter &p, const QRect &rect, p.drawPolygon(points, countof(points)); p.setPen(Qt::white); - p.drawText(r, Qt::AlignCenter | Qt::AlignVCenter, - Ruler::format_real_time(_index, _view.session().cur_snap_samplerate())); + if (has_hoff) + p.drawText(r, Qt::AlignCenter | Qt::AlignVCenter, + Ruler::format_real_time(_index, _view.session().cur_snap_samplerate())); const QRect arrowRect = QRect(r.bottomLeft().x(), r.bottomLeft().y(), r.width(), ArrowSize); p.drawText(arrowRect, Qt::AlignCenter | Qt::AlignVCenter, label); diff --git a/DSView/pv/view/cursor.h b/DSView/pv/view/cursor.h index 87a3e2cadf19757c069c064ae825da25d06800ee..0248c9ce97af7b8df20d14bb4bf81ff14170d774 100755 --- a/DSView/pv/view/cursor.h +++ b/DSView/pv/view/cursor.h @@ -74,8 +74,8 @@ public: * @param rect The rectangle of the ruler client area. * @param prefix The index of the SI prefix to use. */ - void paint_label(QPainter &p, const QRect &rect, - unsigned int prefix, int index); + void paint_label(QPainter &p, const QRect &rect, + unsigned int prefix, int index, bool has_hoff); void paint_fix_label(QPainter &p, const QRect &rect, unsigned int prefix, QChar label, QColor color, bool has_hoff); diff --git a/DSView/pv/view/ruler.cpp b/DSView/pv/view/ruler.cpp index bce27f35d1e0208811828fcc9964772580ee891b..3e38bac32d5282d466c23cff614872d393c8a6f9 100755 --- a/DSView/pv/view/ruler.cpp +++ b/DSView/pv/view/ruler.cpp @@ -175,7 +175,10 @@ void Ruler::paintEvent(QPaintEvent*) style()->drawPrimitive(QStyle::PE_Widget, &o, &p, this); // Draw tick mark - draw_logic_tick_mark(p); + if (_view.session().get_device()->dev_inst()->mode == DSO) + draw_osc_tick_mark(p); + else + draw_logic_tick_mark(p); p.setRenderHint(QPainter::Antialiasing, true); // Draw the hover mark @@ -340,11 +343,126 @@ void Ruler::draw_logic_tick_mark(QPainter &p) // Find tick spacing, and number formatting that does not cause // value to collide. - if (_view.session().get_device()->dev_inst()->mode == DSO) { - _min_period = _view.session().get_device()->get_time_base() * std::pow(10.0, -9.0); - } else { - _min_period = cur_period_scale * abs_min_period; + _min_period = cur_period_scale * abs_min_period; + + const int order = (int)floorf(log10f(scale * _view.get_view_width())); + //const double order_decimal = pow(10, order); + const unsigned int prefix = (order - FirstSIPrefixPower) / 3; + _cur_prefix = prefix; + assert(prefix < countof(SIPrefixes)); + typical_width = p.boundingRect(0, 0, INT_MAX, INT_MAX, + AlignLeft | AlignTop, format_time(offset * scale, + prefix)).width() + MinValueSpacing; + do + { + tick_period += _min_period; + + } while(typical_width > tick_period / scale); + + const int text_height = p.boundingRect(0, 0, INT_MAX, INT_MAX, + AlignLeft | AlignTop, "8").height(); + + // Draw the tick marks + QColor fore(QWidget::palette().color(QWidget::foregroundRole())); + fore.setAlpha(View::ForeAlpha); + p.setPen(fore); + + const double minor_tick_period = tick_period / MinPeriodScale; + const int minor_order = (int)floorf(log10f(minor_tick_period)); + //const double minor_order_decimal = pow(10, minor_order); + const unsigned int minor_prefix = (minor_order - FirstSIPrefixPower) / 3; + assert(minor_prefix < countof(SIPrefixes)); + + const double first_major_division = + floor(offset * scale / tick_period); + const double first_minor_division = + floor(offset * scale / minor_tick_period + 1); + const double t0 = first_major_division * tick_period; + + int division = (int)round(first_minor_division - + first_major_division * MinPeriodScale) - 1; + + const int major_tick_y1 = text_height + ValueMargin * 3; + const int tick_y2 = height(); + const int minor_tick_y1 = (major_tick_y1 + tick_y2) / 2; + + int x; + + const double inc_text_width = p.boundingRect(0, 0, INT_MAX, INT_MAX, + AlignLeft | AlignTop, + format_time(minor_tick_period, + minor_prefix)).width() + MinValueSpacing; + do { + const double t = t0 + division * minor_tick_period; + const double major_t = t0 + floor(division / MinPeriodScale) * tick_period; + + x = t / scale - offset; + + if (division % MinPeriodScale == 0) + { + // Draw a major tick + p.drawText(x, 2 * ValueMargin, 0, text_height, + AlignCenter | AlignTop | TextDontClip, + format_time(t, prefix)); + p.drawLine(QPoint(x, major_tick_y1), + QPoint(x, tick_y2)); + } + else + { + // Draw a minor tick + if (minor_tick_period / scale > 2 * typical_width) + p.drawText(x, 2 * ValueMargin, 0, text_height, + AlignCenter | AlignTop | TextDontClip, + format_time(t, prefix)); + //else if ((tick_period / scale > width() / 4) && (minor_tick_period / scale > inc_text_width)) + else if (minor_tick_period / scale > 1.1 * inc_text_width || + tick_period / scale > _view.get_view_width()) + p.drawText(x, 2 * ValueMargin, 0, minor_tick_y1 + ValueMargin, + AlignCenter | AlignTop | TextDontClip, + format_time(t - major_t, minor_prefix)); + p.drawLine(QPoint(x, minor_tick_y1), + QPoint(x, tick_y2)); + } + + division++; + + } while (x < rect().right()); + + // Draw the cursors + if (!_view.get_cursorList().empty()) { + list<Cursor*>::iterator i = _view.get_cursorList().begin(); + int index = 1; + while (i != _view.get_cursorList().end()) { + (*i)->paint_label(p, rect(), prefix, index, _view.session().get_capture_state() == SigSession::Stopped); + index++; + i++; + } } + if (_view.trig_cursor_shown()) { + _view.get_trig_cursor()->paint_fix_label(p, rect(), prefix, 'T', _view.get_trig_cursor()->colour(), false); + } + if (_view.search_cursor_shown()) { + _view.get_search_cursor()->paint_fix_label(p, rect(), prefix, 'S', _view.get_search_cursor()->colour(), true); + } +} + +void Ruler::draw_osc_tick_mark(QPainter &p) +{ + using namespace Qt; + + const double MinValueSpacing = 16.0; + const int ValueMargin = 5; + + double typical_width; + double tick_period = 0; + double scale = _view.scale(); + //int64_t offset = _view.offset(); + int64_t offset = 0; + + // Find tick spacing, and number formatting that does not cause + // value to collide. + _min_period = _view.session().get_device()->get_time_base() * std::pow(10.0, -9.0); + const int order = (int)floorf(log10f(scale * _view.get_view_width())); //const double order_decimal = pow(10, order); const unsigned int prefix = (order - FirstSIPrefixPower) / 3; @@ -433,7 +551,7 @@ void Ruler::draw_logic_tick_mark(QPainter &p) list<Cursor*>::iterator i = _view.get_cursorList().begin(); int index = 1; while (i != _view.get_cursorList().end()) { - (*i)->paint_label(p, rect(), prefix, index); + (*i)->paint_label(p, rect(), prefix, index, _view.session().get_capture_state() == SigSession::Stopped); index++; i++; } diff --git a/DSView/pv/view/ruler.h b/DSView/pv/view/ruler.h index 63dff2318b600bbfb8ce0f4be1e98d97237d1e5f..f3cf204d9922aa221bab45c7c268272b115648c8 100755 --- a/DSView/pv/view/ruler.h +++ b/DSView/pv/view/ruler.h @@ -79,6 +79,7 @@ private: private: void draw_logic_tick_mark(QPainter &p); + void draw_osc_tick_mark(QPainter &p); /** * Draw a hover arrow under the cursor position. */ diff --git a/DSView/pv/view/timemarker.h b/DSView/pv/view/timemarker.h index 5e68f83b6847540ba5782f3305a88e6877a8b9cf..7a5425b8a01ebdebe74c0aa0de288febf2f10951 100755 --- a/DSView/pv/view/timemarker.h +++ b/DSView/pv/view/timemarker.h @@ -101,7 +101,7 @@ public: * @param prefix The SI prefix to paint time value with. */ virtual void paint_label(QPainter &p, const QRect &rect, - unsigned int prefix, int index) = 0; + unsigned int prefix, int index, bool has_hoff) = 0; signals: void time_changed(); diff --git a/DSView/pv/view/viewport.cpp b/DSView/pv/view/viewport.cpp index a1d405c2ee9eabf8ac8aa31628ad32cd27033d4b..b83d96109dd5ee953cfaa4fefca79d34a53861be 100755 --- a/DSView/pv/view/viewport.cpp +++ b/DSView/pv/view/viewport.cpp @@ -245,9 +245,9 @@ void Viewport::paintSignals(QPainter &p, QColor fore, QColor back) 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); + (*i)->paint(p, xrect, 1, index, _view.session().get_capture_state() == SigSession::Stopped); else - (*i)->paint(p, xrect, 0, index); + (*i)->paint(p, xrect, 0, index, _view.session().get_capture_state() == SigSession::Stopped); i++; index++; }