Fix carla-control related issues
[cadence.git] / src / digitalpeakmeter.py
blob1685c562bba27dccfd4d1dd72db8b37df4f22cef
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
4 # Imports (Global)
5 from PyQt4.QtCore import qCritical, Qt, QRectF, QTimer, QSize
6 from PyQt4.QtGui import QColor, QLinearGradient, QPainter, QWidget
8 # Simple Audio Meter
9 class DigitalPeakMeter(QWidget):
10 HORIZONTAL = 1
11 VERTICAL = 2
13 GREEN = 1
14 BLUE = 2
16 def __init__(self, parent=None):
17 super(DigitalPeakMeter, self).__init__(parent)
19 self.n_channels = 0
20 self.bg_color = QColor("#111111")
22 self.base_color = QColor("#5DE73D")
23 self.base_colorT = QColor(15, 110, 15, 100)
24 self.orientation = self.VERTICAL
26 self.meter_gradient = QLinearGradient(0, 0, 1, 1)
28 self.setOrientation(self.VERTICAL)
29 self.setChannels(2)
31 self.paint_timer = QTimer()
32 self.paint_timer.setInterval(60)
33 self.paint_timer.timeout.connect(self.repaint)
34 self.paint_timer.start()
36 def minimumSizeHint(self):
37 return QSize(30, 30)
39 def sizeHint(self):
40 return QSize(self.width_, self.height_)
42 def setColor(self, color):
43 if (color == self.GREEN):
44 self.base_color = QColor("#5DE73D")
45 self.base_colorT = QColor(15, 110, 15, 100)
46 elif (color == self.BLUE):
47 self.base_color = QColor("#52EEF8")
48 self.base_colorT = QColor(15, 15, 110, 100)
49 else:
50 return
52 self.setOrientation(self.orientation)
54 def setOrientation(self, orientation):
55 self.orientation = orientation
57 if (self.orientation == self.HORIZONTAL):
58 self.meter_gradient.setColorAt(0.0, self.base_color)
59 self.meter_gradient.setColorAt(0.2, self.base_color)
60 self.meter_gradient.setColorAt(0.4, self.base_color)
61 self.meter_gradient.setColorAt(0.6, self.base_color)
62 self.meter_gradient.setColorAt(0.8, Qt.yellow)
63 self.meter_gradient.setColorAt(1.0, Qt.red)
65 elif (self.orientation == self.VERTICAL):
66 self.meter_gradient.setColorAt(0.0, Qt.red)
67 self.meter_gradient.setColorAt(0.2, Qt.yellow)
68 self.meter_gradient.setColorAt(0.4, self.base_color)
69 self.meter_gradient.setColorAt(0.6, self.base_color)
70 self.meter_gradient.setColorAt(0.8, self.base_color)
71 self.meter_gradient.setColorAt(1.0, self.base_color)
73 self.checkSizes()
75 def setChannels(self, channels):
76 self.n_channels = channels
77 self.channels_data = []
78 self.last_max_data = []
80 if (channels > 0):
81 for i in range(channels):
82 self.channels_data.append(0.0)
83 self.last_max_data.append(self.height_)
85 def setRefreshRate(self, rate):
86 self.paint_timer.stop()
87 self.paint_timer.setInterval(rate)
88 self.paint_timer.start()
90 def displayMeter(self, meter_n, level):
91 if (meter_n > self.n_channels):
92 qCritical("DigitalPeakMeter::displayMeter(%i, %f) - Invalid meter number" % (meter_n, level))
93 return
95 if (level < 0.0):
96 level = -level
97 elif (level > 1.0):
98 level = 1.0
100 self.channels_data[meter_n-1] = level
102 def checkSizes(self):
103 self.width_ = self.width()
104 self.height_ = self.height()
105 self.meter_size = 0
107 if (self.orientation == self.HORIZONTAL):
108 self.meter_gradient.setFinalStop(self.width_, 0)
109 if (self.n_channels > 0):
110 self.meter_size = self.height_/self.n_channels
112 elif (self.orientation == self.VERTICAL):
113 self.meter_gradient.setFinalStop(0, self.height_)
114 if (self.n_channels > 0):
115 self.meter_size = self.width_/self.n_channels
117 def paintEvent(self, event):
118 painter = QPainter(self)
120 painter.setPen(Qt.black)
121 painter.setBrush(Qt.black)
122 painter.drawRect(0, 0, self.width_, self.height_)
124 meter_x = 0
126 for i in range(self.n_channels):
127 level = self.channels_data[i]
129 if (level == self.last_max_data[i]):
130 continue
132 if (self.orientation == self.HORIZONTAL):
133 value = self.width_*level
134 elif (self.orientation == self.VERTICAL):
135 value = self.height_-(self.height_*level)
136 else:
137 value = 0
139 # Don't bounce the meter so much
140 value = (self.last_max_data[i]+value)/2
141 #value = (self.last_max_data[i]+self.last_max_data[i]+value)/3
143 if (value < 0):
144 value = 0
146 painter.setPen(self.bg_color)
147 painter.setBrush(self.meter_gradient)
149 if (self.orientation == self.HORIZONTAL):
150 painter.drawRect(0, meter_x, value, self.meter_size)
151 elif (self.orientation == self.VERTICAL):
152 painter.drawRect(meter_x, value, self.meter_size, self.height_)
154 meter_x += self.meter_size
155 self.last_max_data[i] = value
157 if (self.orientation == self.HORIZONTAL):
158 lsmall = self.width_
159 lfull = self.height_-1
160 elif (self.orientation == self.VERTICAL):
161 lsmall = self.height_
162 lfull = self.width_-1
163 else:
164 return
166 painter.setBrush(QColor(0, 0, 0, 0))
168 if (self.orientation == self.HORIZONTAL):
169 # Base
170 painter.setPen(self.base_colorT)
171 painter.drawLine(lsmall/4, 1, lsmall/4, lfull)
172 painter.drawLine(lsmall/2, 1, lsmall/2, lfull)
174 # Yellow
175 painter.setPen(QColor(110, 110, 15, 100))
176 painter.drawLine(lsmall/1.4, 1, lsmall/1.4, lfull)
177 painter.drawLine(lsmall/1.2, 1, lsmall/1.2, lfull)
179 # Orange
180 painter.setPen(QColor(180, 110, 15, 100))
181 painter.drawLine(lsmall/1.1, 1, lsmall/1.1, lfull)
183 # Red
184 painter.setPen(QColor(110, 15, 15, 100))
185 painter.drawLine(lsmall/1.04, 1, lsmall/1.04, lfull)
187 elif (self.orientation == self.VERTICAL):
188 # Base
189 painter.setPen(self.base_colorT)
190 painter.drawLine(1, lsmall-(lsmall/4), lfull, lsmall-(lsmall/4))
191 painter.drawLine(1, lsmall-(lsmall/2), lfull, lsmall-(lsmall/2))
193 # Yellow
194 painter.setPen(QColor(110, 110, 15, 100))
195 painter.drawLine(1, lsmall-(lsmall/1.4), lfull, lsmall-(lsmall/1.4))
196 painter.drawLine(1, lsmall-(lsmall/1.2), lfull, lsmall-(lsmall/1.2))
198 # Orange
199 painter.setPen(QColor(180, 110, 15, 100))
200 painter.drawLine(1, lsmall-(lsmall/1.1), lfull, lsmall-(lsmall/1.1))
202 # Red
203 painter.setPen(QColor(110, 15, 15, 100))
204 painter.drawLine(1, lsmall-(lsmall/1.04), lfull, lsmall-(lsmall/1.04))
206 def resizeEvent(self, event):
207 QTimer.singleShot(0, self.checkSizes)
208 return QWidget.resizeEvent(self, event)