2 # -*- coding: utf-8 -*-
5 from PyQt4
.QtCore
import qCritical
, Qt
, QRectF
, QTimer
, QSize
6 from PyQt4
.QtGui
import QColor
, QLinearGradient
, QPainter
, QWidget
9 class DigitalPeakMeter(QWidget
):
16 def __init__(self
, parent
=None):
17 super(DigitalPeakMeter
, self
).__init
__(parent
)
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
)
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
):
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)
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
)
75 def setChannels(self
, channels
):
76 self
.n_channels
= channels
77 self
.channels_data
= []
78 self
.last_max_data
= []
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
))
100 self
.channels_data
[meter_n
-1] = level
102 def checkSizes(self
):
103 self
.width_
= self
.width()
104 self
.height_
= self
.height()
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_
)
126 for i
in range(self
.n_channels
):
127 level
= self
.channels_data
[i
]
129 if (level
== self
.last_max_data
[i
]):
132 if (self
.orientation
== self
.HORIZONTAL
):
133 value
= self
.width_
*level
134 elif (self
.orientation
== self
.VERTICAL
):
135 value
= self
.height_
-(self
.height_
*level
)
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
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
):
159 lfull
= self
.height_
-1
160 elif (self
.orientation
== self
.VERTICAL
):
161 lsmall
= self
.height_
162 lfull
= self
.width_
-1
166 painter
.setBrush(QColor(0, 0, 0, 0))
168 if (self
.orientation
== self
.HORIZONTAL
):
170 painter
.setPen(self
.base_colorT
)
171 painter
.drawLine(lsmall
/4, 1, lsmall
/4, lfull
)
172 painter
.drawLine(lsmall
/2, 1, lsmall
/2, lfull
)
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
)
180 painter
.setPen(QColor(180, 110, 15, 100))
181 painter
.drawLine(lsmall
/1.1, 1, lsmall
/1.1, lfull
)
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
):
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))
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))
199 painter
.setPen(QColor(180, 110, 15, 100))
200 painter
.drawLine(1, lsmall
-(lsmall
/1.1), lfull
, lsmall
-(lsmall
/1.1))
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
)