108 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			108 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // Simple bargraph dB meter | ||
|  | // Implemented by Edson Pereira PY2SDR | ||
|  | // | ||
|  | 
 | ||
|  | #include "signalmeter.h" | ||
|  | 
 | ||
|  | #include <QVBoxLayout> | ||
|  | #include <QHBoxLayout> | ||
|  | #include <QLabel> | ||
|  | #include <QPainter> | ||
|  | #include <QFontMetrics> | ||
|  | #include <QDebug> | ||
|  | 
 | ||
|  | #include <meterwidget.h> | ||
|  | 
 | ||
|  | #include "moc_signalmeter.cpp" | ||
|  | 
 | ||
|  | #define MAXDB 90 | ||
|  | 
 | ||
|  | class Scale final | ||
|  |   : public QWidget | ||
|  | { | ||
|  | public: | ||
|  |   explicit Scale (QWidget * parent = 0) | ||
|  |     : QWidget {parent} | ||
|  |   { | ||
|  |     setSizePolicy (QSizePolicy::Minimum, QSizePolicy::MinimumExpanding); | ||
|  |   } | ||
|  | 
 | ||
|  |   QSize sizeHint () const override | ||
|  |   { | ||
|  |     return minimumSizeHint (); | ||
|  |   } | ||
|  | 
 | ||
|  |   QSize minimumSizeHint () const override | ||
|  |   { | ||
|  |     QFontMetrics font_metrics {font (), nullptr}; | ||
|  |     return {tick_length + text_indent + font_metrics.width ("00+"), (font_metrics.height () + line_spacing) * range}; | ||
|  |   } | ||
|  | 
 | ||
|  | protected: | ||
|  |   void paintEvent (QPaintEvent * event) override | ||
|  |   { | ||
|  |     QWidget::paintEvent (event); | ||
|  | 
 | ||
|  |     QPainter p {this}; | ||
|  |     auto const& target = contentsRect (); | ||
|  |     QFontMetrics font_metrics {p.font (), this}; | ||
|  |     auto font_offset = font_metrics.ascent () / 2; | ||
|  |     p.drawLine (target.left (), target.top () + font_offset, target.left (), target.bottom () - font_offset - font_metrics.descent ()); | ||
|  |     for (int i = 0; i <= range; ++i) | ||
|  |       { | ||
|  |         p.save (); | ||
|  |         p.translate (target.left () | ||
|  |                      , target.top () + font_offset + i * (target.height () - font_metrics.ascent () - font_metrics.descent ()) / range); | ||
|  |         p.drawLine (0, 0, tick_length, 0); | ||
|  | 	if((i%2==1)) { | ||
|  | 	  auto text = QString::number ((range - i) * scale); | ||
|  | 	  p.drawText (tick_length + text_indent, font_offset, text); | ||
|  | 	} | ||
|  |         p.restore (); | ||
|  |       } | ||
|  |   } | ||
|  | 
 | ||
|  | private: | ||
|  |   static int constexpr tick_length {4}; | ||
|  |   static int constexpr text_indent {2}; | ||
|  |   static int constexpr line_spacing {0}; | ||
|  |   static int constexpr range {MAXDB/10}; | ||
|  |   static int constexpr scale {10}; | ||
|  | }; | ||
|  | 
 | ||
|  | SignalMeter::SignalMeter (QWidget * parent) | ||
|  |   : QFrame {parent} | ||
|  | { | ||
|  |   auto outer_layout = new QVBoxLayout; | ||
|  |   outer_layout->setSpacing (0); | ||
|  | 
 | ||
|  |   auto inner_layout = new QHBoxLayout; | ||
|  |   inner_layout->setContentsMargins (9, 0, 9, 0); | ||
|  |   inner_layout->setSpacing (0); | ||
|  | 
 | ||
|  |   m_meter = new MeterWidget; | ||
|  |   m_meter->setSizePolicy (QSizePolicy::Minimum, QSizePolicy::Minimum); | ||
|  |   inner_layout->addWidget (m_meter); | ||
|  | 
 | ||
|  |   m_scale = new Scale; | ||
|  |   inner_layout->addWidget (m_scale); | ||
|  | 
 | ||
|  |   m_reading = new QLabel(this); | ||
|  | 
 | ||
|  |   outer_layout->addLayout (inner_layout); | ||
|  |   outer_layout->addWidget (m_reading); | ||
|  |   setLayout (outer_layout); | ||
|  | } | ||
|  | 
 | ||
|  | void SignalMeter::setValue(float value, float valueMax) | ||
|  | { | ||
|  |   if(value<0) value=0; | ||
|  |   QFontMetrics font_metrics {m_scale->font (), nullptr}; | ||
|  |   m_meter->setContentsMargins (0, font_metrics.ascent () / 2, 0, font_metrics.ascent () / 2 + font_metrics.descent ()); | ||
|  |   m_meter->setValue(int(value)); | ||
|  |   m_meter->set_sigPeak(valueMax); | ||
|  |   QString t; | ||
|  |   t.sprintf("%d dB",int(value+0.5)); | ||
|  |   m_reading->setText(t); | ||
|  | } |