jtdx/meterwidget.cpp

73 lines
1.6 KiB
C++
Raw Permalink Normal View History

2020-02-21 18:31:53 +02:00
// last time modified by Igor UA3DJY on 20200221
2020-02-21 11:05:07 +02:00
// Simple bargraph meter
// Implemented by Edson Pereira PY2SDR
#include "meterwidget.h"
#include <QPainter>
#include <QPolygon>
#include "moc_meterwidget.cpp"
MeterWidget::MeterWidget(QWidget * parent)
: QWidget {parent}
, m_signal {0}
, m_sigPeak {0}
{
for ( int i = 0; i < 10; i++ ) {
signalQueue.enqueue(0);
}
}
void MeterWidget::setValue(int value)
{
m_signal = value;
signalQueue.enqueue(value);
signalQueue.dequeue();
// Get signal peak
int tmp = 0;
for (int i = 0; i < signalQueue.size(); ++i) {
if (signalQueue.at(i) > tmp)
tmp = signalQueue.at(i);
}
m_sigPeak = tmp;
update();
}
QSize MeterWidget::sizeHint () const
{
return {10, 100};
}
void MeterWidget::paintEvent (QPaintEvent * event)
{
QWidget::paintEvent (event);
// Sanitize
m_signal = m_signal < 0 ? 0 : m_signal;
2020-06-16 10:04:29 +03:00
m_signal = m_signal > 186 ? 186 : m_signal;
2020-02-21 11:05:07 +02:00
QPainter p {this};
p.setPen (Qt::NoPen);
auto const& target = contentsRect ();
2020-02-21 18:31:53 +02:00
QRect r {QPoint {target.left (), static_cast<int> (target.top () + target.height () - m_signal/200. * target.height ())}
2020-02-21 11:05:07 +02:00
, QPoint {target.right (), target.bottom ()}};
p.setBrush (QColor {255, 180, 0});
2020-02-21 18:18:11 +02:00
if (m_signal > 185 || m_signal < 30) {p.setBrush(QColor {255, 150, 150});}
2020-02-21 11:05:07 +02:00
p.drawRect (r);
if (m_sigPeak)
{
// Draw peak hold indicator
2020-06-16 10:04:29 +03:00
auto peak = static_cast<int> (target.top () + target.height () - m_sigPeak / 200. * target.height ());
2020-02-21 11:05:07 +02:00
p.setBrush (Qt::black);
p.translate (target.left (), peak);
p.drawPolygon (QPolygon {{{0, -4}, {0, 4}, {target.width (), 0}}});
}
}