swift
levelmeter.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2015 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 // Class based on qt example: Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies)
4 
5 #include "gui/levelmeter.h"
6 
7 #include <QPainter>
8 #include <QRect>
9 #include <QSizePolicy>
10 #include <QTimer>
11 #include <Qt>
12 #include <QtGlobal>
13 
14 namespace swift::gui
15 {
16  CLevelMeter::CLevelMeter(QWidget *parent)
17  : QFrame(parent), m_redrawTimer(new QTimer(this)), m_lowColor(Qt::gray), m_highColor(Qt::green),
18  m_peakColor(255, 200, 200, 255)
19  {
20  this->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
21  this->setMinimumWidth(30);
22 
23  connect(m_redrawTimer, &QTimer::timeout, this, &CLevelMeter::redrawTimerExpired);
24  m_redrawTimer->start(RedrawInterval);
25  m_redrawTimer->setObjectName("CLevelMeter");
26  }
27 
29 
31  {
32  m_level = 0.0;
33  m_peakLevel = 0.0;
34  this->update();
35  }
36 
37  void CLevelMeter::levelChanged(double level)
38  {
39  m_level = level;
40  if (level > m_peakLevel)
41  {
42  m_peakLevel = level;
43  m_peakLevelChanged.start();
44  }
45  }
46 
47  void CLevelMeter::redrawTimerExpired()
48  {
49  // decay
50  if (m_peakLevelChanged.elapsed() > PeakHoldLevelDuration)
51  {
52  m_peakLevel -= DecayValue;
53  if (m_peakLevel < m_level || m_peakLevel < 0) { m_peakLevel = 0.0; }
54  }
55  this->update();
56  }
57 
58  void CLevelMeter::paintEvent(QPaintEvent *event)
59  {
60  Q_UNUSED(event)
61 
62  QPainter painter(this);
63  QRect bar = this->contentsRect();
64  painter.fillRect(bar, Qt::transparent);
65  const int w = bar.width();
66  const int left = rect().left();
67  const int level = qRound(m_level * w);
68 
69  bar.setLeft(left);
70  bar.setRight(level);
71  painter.fillRect(bar, m_peakLevel >= High ? m_highColor : m_lowColor);
72 
73  if (m_peakLevel > m_level)
74  {
75  const int peak = qRound(m_peakLevel * w);
76  bar.setLeft(level);
77  bar.setRight(peak);
78  painter.fillRect(bar, m_peakColor);
79  }
80  }
81 
82 } // namespace swift::gui
void paintEvent(QPaintEvent *event)
Definition: levelmeter.cpp:58
void levelChanged(double level)
Values.
Definition: levelmeter.cpp:37
virtual ~CLevelMeter()
Destructor.
Definition: levelmeter.cpp:28
CLevelMeter(QWidget *parent=nullptr)
Constructor.
Definition: levelmeter.cpp:16
void reset()
Clean up.
Definition: levelmeter.cpp:30
GUI related classes.