Changeset 1708

Show
Ignore:
Timestamp:
11/15/09 07:45:56 (13 years ago)
Author:
arnonym
Message:

Add a context menu with some predefined values and a spinbox for direct entry of custom values.

And display the values in dB. The calculation is currently fixed on the values of the DICE, for more flexibility the dbus-interface needs an extension. Then the range and the definition of 0 dB could be device-dependant.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libffado/support/mixer-qt4/ffado/widgets/matrixmixer.py

    r1706 r1708  
    2020 
    2121from PyQt4 import QtGui, QtCore, Qt 
    22 import dbus, math 
     22import dbus, math, decimal 
    2323 
    2424import logging 
     
    3535        #print "ColorForNumber.getColor( %g )" % (n) 
    3636        keys = self.colors.keys() 
     37        keys.sort() 
    3738        low = keys[-1] 
    3839        high = keys[-1] 
     
    5556    def __init__(self, input, output, value, parent): 
    5657        QtGui.QAbstractSlider.__init__(self, parent) 
    57         log.debug("MixerNode.__init__( %i, %i, %i, %s )" % (input, output, value, str(parent)) ) 
     58        #log.debug("MixerNode.__init__( %i, %i, %i, %s )" % (input, output, value, str(parent)) ) 
    5859 
    5960        self.pos = QtCore.QPointF(0, 0) 
     
    6667 
    6768        self.bgcolors = ColorForNumber() 
    68         self.bgcolors.addColor(0.0*65535, QtGui.QColor(  0,   0,   0)) 
    69         self.bgcolors.addColor(0.1*65535, QtGui.QColor(  0,   0, 128)) 
    70         self.bgcolors.addColor(0.8*65535, QtGui.QColor(255, 255,   0)) 
    71         self.bgcolors.addColor(1.0*65535, QtGui.QColor(255,   0,   0)) 
     69        self.bgcolors.addColor(             0.0, QtGui.QColor(  0,   0,   0)) 
     70        self.bgcolors.addColor(             1.0, QtGui.QColor(  0,   0, 128)) 
     71        self.bgcolors.addColor(   math.pow(2,6), QtGui.QColor(  0, 255,   0)) 
     72        self.bgcolors.addColor(  math.pow(2,14), QtGui.QColor(255, 255,   0)) 
     73        self.bgcolors.addColor(math.pow(2,16)-1, QtGui.QColor(255,   0,   0)) 
     74 
     75        self.setContextMenuPolicy(Qt.Qt.ActionsContextMenu) 
     76        self.mapper = QtCore.QSignalMapper(self) 
     77        self.connect(self.mapper, QtCore.SIGNAL("mapped(const QString&)"), self.directValues) 
     78 
     79        self.spinbox = QtGui.QDoubleSpinBox(self) 
     80        self.spinbox.setRange(-40, 12) 
     81        self.spinbox.setSuffix(" dB") 
     82        self.connect(self.spinbox, QtCore.SIGNAL("valueChanged(const QString&)"), self.directValues) 
     83        action = QtGui.QWidgetAction(self) 
     84        action.setDefaultWidget(self.spinbox) 
     85        self.addAction(action) 
     86 
     87        for text in ["3 dB", "0 dB", "-3 dB", "-20 dB", "-inf dB"]: 
     88            action = QtGui.QAction(text, self) 
     89            self.connect(action, QtCore.SIGNAL("triggered()"), self.mapper, QtCore.SLOT("map()")) 
     90            self.mapper.setMapping(action, text) 
     91            self.addAction(action) 
     92 
     93    def directValues(self,text): 
     94        #log.debug("MixerNode.directValues( '%s' )" % text) 
     95        text = text.split(" ")[0].replace(",",".") 
     96        n = pow(10, (float(text)/20)) * pow(2,14) 
     97        #log.debug("%g" % n) 
     98        self.setValue(n) 
    7299 
    73100    def mousePressEvent(self, ev): 
     
    85112            self.setValue( self.tmpvalue - math.copysign(pow(abs(change), 2), change) ) 
    86113            ev.accept() 
    87         pass 
    88114 
    89115    def mouseReleaseEvent(self, ev): 
     
    103129        color = self.bgcolors.getColor(v) 
    104130        p.fillRect(rect, color) 
    105         if color.valueF() < 0.5
     131        if color.valueF() < 0.6
    106132            p.setPen(QtGui.QColor(255, 255, 255)) 
    107133        else: 
    108134            p.setPen(QtGui.QColor(0, 0, 0)) 
    109         p.drawText(rect, Qt.Qt.AlignCenter, str(self.value())) 
     135        lv=decimal.Decimal('-Infinity') 
     136        if v != 0: 
     137            lv = 20 * math.log10(v * 1.0 / math.pow(2,14)) 
     138            #log.debug("new value is %g dB" % lv) 
     139        p.drawText(rect, Qt.Qt.AlignCenter, "%.2g dB" % lv) 
    110140 
    111141    def internalValueChanged(self, value): 
    112142        #log.debug("MixerNode.internalValueChanged( %i )" % value) 
     143        if value is not 0: 
     144            dB = 20 * math.log10(value / math.pow(2,14)) 
     145            if self.spinbox.value() is not dB: 
     146                self.spinbox.setValue(dB) 
    113147        self.emit(QtCore.SIGNAL("valueChanged"), (self.input, self.output, value) ) 
     148        self.update() 
    114149 
    115150 
     
    125160        layout.addWidget(self.lbl, 0, 0, 1, 2) 
    126161 
    127         self.btnHide = QtGui.QToolButton(self) 
    128         self.btnHide.setText("Hide") 
    129         self.btnHide.setCheckable(True) 
    130         self.connect(self.btnHide, QtCore.SIGNAL("clicked(bool)"), self.hideChannel) 
    131         layout.addWidget(self.btnHide, 1, 0) 
     162        #self.btnHide = QtGui.QToolButton(self) 
     163        #self.btnHide.setText("Hide") 
     164        #self.btnHide.setCheckable(True) 
     165        #self.connect(self.btnHide, QtCore.SIGNAL("clicked(bool)"), self.hideChannel) 
     166        #layout.addWidget(self.btnHide, 1, 0) 
    132167 
    133168    def hideChannel(self, hide): 
     
    143178        self.interface = dbus.Interface(self.dev, dbus_interface="org.ffado.Control.Element.MatrixMixer") 
    144179 
    145         palette = self.palette() 
    146         palette.setColor(QtGui.QPalette.Window, palette.color(QtGui.QPalette.Window).darker()); 
    147         self.setPalette(palette) 
     180        #palette = self.palette() 
     181        #palette.setColor(QtGui.QPalette.Window, palette.color(QtGui.QPalette.Window).darker()); 
     182        #self.setPalette(palette) 
    148183 
    149184        rows = self.interface.getColCount() 
     
    206241 
    207242    def valueChanged(self, n): 
    208         log.debug("MatrixNode.valueChanged( %s )" % str(n)) 
     243        #log.debug("MatrixNode.valueChanged( %s )" % str(n)) 
    209244        self.interface.setValue(n[1], n[0], n[2]) 
    210245