From 37b9fed4c6b2878c814130cc11013ec918fb8ded Mon Sep 17 00:00:00 2001 From: Soeren Apel Date: Thu, 7 Apr 2016 22:02:50 +0200 Subject: [PATCH] AnalogSignal: Implement vertical grid --- pv/view/analogsignal.cpp | 47 +++++++++++++++++++++++++++++++++++----- pv/view/analogsignal.hpp | 7 +++++- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/pv/view/analogsignal.cpp b/pv/view/analogsignal.cpp index 30cf5abf..b340de67 100644 --- a/pv/view/analogsignal.cpp +++ b/pv/view/analogsignal.cpp @@ -25,6 +25,8 @@ #include #include +#include + #include "analogsignal.hpp" #include "pv/data/analog.hpp" #include "pv/data/analogsegment.hpp" @@ -43,8 +45,6 @@ using sigrok::Channel; namespace pv { namespace view { -const int AnalogSignal::NominalHeight = 80; - const QColor AnalogSignal::SignalColours[4] = { QColor(0xC4, 0xA0, 0x00), // Yellow QColor(0x87, 0x20, 0x7A), // Magenta @@ -52,6 +52,9 @@ const QColor AnalogSignal::SignalColours[4] = { QColor(0x4E, 0x9A, 0x06) // Green }; +const QColor AnalogSignal::GridMajorColor = QColor(0xB0, 0xB0, 0xB0); +const QColor AnalogSignal::GridMinorColor = QColor(0xD0, 0xD0, 0xD0); + const float AnalogSignal::EnvelopeThreshold = 256.0f; AnalogSignal::AnalogSignal( @@ -61,7 +64,9 @@ AnalogSignal::AnalogSignal( Signal(session, channel), data_(data), scale_index_(0), - scale_index_drag_offset_(0) + scale_index_drag_offset_(0), + div_height_(3 * QFontMetrics(QApplication::font()).height()), + vdivs_(1) { set_colour(SignalColours[channel_->index() % countof(SignalColours)]); } @@ -78,20 +83,24 @@ shared_ptr AnalogSignal::analog_data() const std::pair AnalogSignal::v_extents() const { - const int h = NominalHeight / 2; + const int h = vdivs_ * div_height_; return make_pair(-h, h); } int AnalogSignal::scale_handle_offset() const { + const int h = vdivs_ * div_height_; + return ((scale_index_drag_offset_ - scale_index_) * - NominalHeight / 4) - NominalHeight / 2; + h / 4) - h / 2; } void AnalogSignal::scale_handle_dragged(int offset) { + const int h = vdivs_ * div_height_; + scale_index_ = scale_index_drag_offset_ - - (offset + NominalHeight / 2) / (NominalHeight / 4); + (offset + h / 2) / (h / 4); } void AnalogSignal::scale_handle_drag_release() @@ -117,6 +126,8 @@ void AnalogSignal::paint_mid(QPainter &p, const ViewItemPaintParams &pp) if (!channel_->enabled()) return; + paint_grid(p, y, pp.left(), pp.right()); + const deque< shared_ptr > &segments = data_->analog_segments(); if (segments.empty()) @@ -148,6 +159,30 @@ void AnalogSignal::paint_mid(QPainter &p, const ViewItemPaintParams &pp) pixels_offset, samples_per_pixel); } +void AnalogSignal::paint_grid(QPainter &p, int y, int left, int right) +{ + p.setPen(QPen(GridMajorColor, 0.5, Qt::DashLine)); + for (int i = 1; i <= vdivs_; i++) { + const int dy = i * div_height_; + p.drawLine(QLineF(left, y - dy, right, y - dy)); + p.drawLine(QLineF(left, y + dy, right, y + dy)); + } + + p.setPen(QPen(GridMinorColor, 0.5, Qt::DashLine)); + for (int i = 0; i < vdivs_; i++) { + const int dy = i * div_height_; + const float dy25 = dy + (0.25 * div_height_); + const float dy50 = dy + (0.50 * div_height_); + const float dy75 = dy + (0.75 * div_height_); + p.drawLine(QLineF(left, y - dy25, right, y - dy25)); + p.drawLine(QLineF(left, y + dy25, right, y + dy25)); + p.drawLine(QLineF(left, y - dy50, right, y - dy50)); + p.drawLine(QLineF(left, y + dy50, right, y + dy50)); + p.drawLine(QLineF(left, y - dy75, right, y - dy75)); + p.drawLine(QLineF(left, y + dy75, right, y + dy75)); + } +} + void AnalogSignal::paint_trace(QPainter &p, const shared_ptr &segment, int y, int left, const int64_t start, const int64_t end, diff --git a/pv/view/analogsignal.hpp b/pv/view/analogsignal.hpp index 06867a55..dd2b31dc 100644 --- a/pv/view/analogsignal.hpp +++ b/pv/view/analogsignal.hpp @@ -37,8 +37,8 @@ namespace view { class AnalogSignal : public Signal { private: - static const int NominalHeight; static const QColor SignalColours[4]; + static const QColor GridMajorColor, GridMinorColor; static const float EnvelopeThreshold; @@ -90,6 +90,8 @@ public: void paint_mid(QPainter &p, const ViewItemPaintParams &pp); private: + void paint_grid(QPainter &p, int y, int left, int right); + void paint_trace(QPainter &p, const std::shared_ptr &segment, int y, int left, const int64_t start, const int64_t end, @@ -110,6 +112,9 @@ private: int scale_index_; int scale_index_drag_offset_; + + int div_height_; + int vdivs_; // divs per positive/negative side }; } // namespace view -- 2.30.2