Fader: add a way to disable the x100 display conversion so the fader widget can be used with arbitrary values

Also it can now be used with alternate pixmaps
This commit is contained in:
Vesa
2014-12-10 06:55:59 +02:00
parent 150b16bd15
commit 170f60c8e0
6 changed files with 90 additions and 26 deletions

View File

@@ -1,5 +1,5 @@
/*
* AutomatableSlider.cpp - implementation of class automatableSlider
* AutomatableSlider.cpp - implementation of class AutomatableSlider
*
* Copyright (c) 2006-2007 Javier Serrano Polo <jasp00/at/users.sourceforge.net>
* Copyright (c) 2007-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>

View File

@@ -74,6 +74,7 @@ Fader::Fader( FloatModel * _model, const QString & _name, QWidget * _parent ) :
m_persistentPeak_R( 0.0 ),
m_fMinPeak( 0.01f ),
m_fMaxPeak( 1.1 ),
m_displayConversion( true ),
m_moveStartPoint( -1 ),
m_startValue( 0 ),
m_peakGreen( 0, 0, 0 ),
@@ -95,7 +96,11 @@ Fader::Fader( FloatModel * _model, const QString & _name, QWidget * _parent ) :
{
s_knob = new QPixmap( embed::getIconPixmap( "fader_knob" ) );
}
m_back = s_back;
m_leds = s_leds;
m_knob = s_knob;
setWindowTitle( _name );
setAttribute( Qt::WA_OpaquePaintEvent, false );
setMinimumSize( 23, 116 );
@@ -105,6 +110,39 @@ Fader::Fader( FloatModel * _model, const QString & _name, QWidget * _parent ) :
}
Fader::Fader( FloatModel * model, const QString & name, QWidget * parent, QPixmap * back, QPixmap * leds, QPixmap * knob ) :
QWidget( parent ),
FloatModelView( model, this ),
m_model( model ),
m_fPeakValue_L( 0.0 ),
m_fPeakValue_R( 0.0 ),
m_persistentPeak_L( 0.0 ),
m_persistentPeak_R( 0.0 ),
m_fMinPeak( 0.01f ),
m_fMaxPeak( 1.1 ),
m_displayConversion( false ),
m_moveStartPoint( -1 ),
m_startValue( 0 ),
m_peakGreen( 0, 0, 0 ),
m_peakRed( 0, 0, 0 )
{
if( s_textFloat == NULL )
{
s_textFloat = new TextFloat;
}
m_back = back;
m_leds = leds;
m_knob = knob;
setWindowTitle( name );
setAttribute( Qt::WA_OpaquePaintEvent, false );
setMinimumSize( m_back->width(), m_back->height() );
setMaximumSize( m_back->width(), m_back->height() );
resize( m_back->width(), m_back->height() );
setModel( model );
}
Fader::~Fader()
{
@@ -172,19 +210,33 @@ void Fader::mousePressEvent( QMouseEvent* mouseEvent )
void Fader::mouseDoubleClickEvent( QMouseEvent* mouseEvent )
{
bool ok;
float newValue;
// TODO: dbV handling
int newValue = QInputDialog::getInt( this, windowTitle(),
tr( "Please enter a new value between %1 and %2:" ).
arg( model()->minValue()*100 ).
arg( model()->maxValue()*100 ),
model()->value()*100,
model()->minValue()*100,
model()->maxValue()*100, 1, &ok );
if( m_displayConversion )
{
newValue = QInputDialog::getDouble( this, windowTitle(),
tr( "Please enter a new value between %1 and %2:" ).
arg( model()->minValue() * 100 ).
arg( model()->maxValue() * 100 ),
model()->value() * 100,
model()->minValue() * 100,
model()->maxValue() * 100, 4, &ok ) * 0.01f;
}
else
{
newValue = QInputDialog::getDouble( this, windowTitle(),
tr( "Please enter a new value between %1 and %2:" ).
arg( model()->minValue() ).
arg( model()->maxValue() ),
model()->value(),
model()->minValue(),
model()->maxValue(), 4, &ok );
}
if( ok )
{
model()->setValue( newValue / 100.0f );
model()->setValue( newValue );
}
}
@@ -265,25 +317,24 @@ void Fader::setPeak_R( float fPeak )
// update tooltip showing value and adjust position while changing fader value
void Fader::updateTextFloat()
{
if( ConfigManager::inst()->value( "app", "displaydbv" ).toInt() )
if( ConfigManager::inst()->value( "app", "displaydbv" ).toInt() && m_displayConversion )
{
s_textFloat->setText( QString("Volume: %1 dBV").
arg( 20.0 * log10( model()->value() ), 3, 'f', 2 ) );
}
else
{
s_textFloat->setText( QString("Volume: %1 %").arg( m_model->value() * 100 ) );
s_textFloat->setText( QString("Volume: %1 %").arg( m_displayConversion ? m_model->value() * 100 : m_model->value() ) );
}
s_textFloat->moveGlobal( this, QPoint( width() - ( *s_knob ).width() - 5, knobPosY() - 46 ) );
s_textFloat->moveGlobal( this, QPoint( width() - ( *m_knob ).width() - 5, knobPosY() - 46 ) );
}
inline int Fader::calculateDisplayPeak( float fPeak )
{
int peak = (int)( 116 - ( fPeak / ( m_fMaxPeak - m_fMinPeak ) ) * 116.0 );
int peak = (int)( m_back->height() - ( fPeak / ( m_fMaxPeak - m_fMinPeak ) ) * m_back->height() );
if ( peak > 116 ) return 116;
else return peak;
return qMin( peak, m_back->height() );
}
void Fader::paintEvent( QPaintEvent * ev)
@@ -291,7 +342,7 @@ void Fader::paintEvent( QPaintEvent * ev)
QPainter painter(this);
// background
painter.drawPixmap( ev->rect(), *s_back, ev->rect() );
painter.drawPixmap( ev->rect(), *m_back, ev->rect() );
// peak leds
@@ -299,28 +350,28 @@ void Fader::paintEvent( QPaintEvent * ev)
int peak_L = calculateDisplayPeak( m_fPeakValue_L - m_fMinPeak );
int persistentPeak_L = qMax<int>( 3, calculateDisplayPeak( m_persistentPeak_L - m_fMinPeak ) );
painter.drawPixmap( QRect( 0, peak_L, 11, 116 - peak_L ), *s_leds, QRect( 0, peak_L, 11, 116 - peak_L ) );
painter.drawPixmap( QRect( 0, peak_L, 11, 116 - peak_L ), *m_leds, QRect( 0, peak_L, 11, 116 - peak_L ) );
if( m_persistentPeak_L > 0.05 )
{
painter.fillRect( QRect( 2, persistentPeak_L, 7, 1 ), ( m_persistentPeak_L < 1.0 )
? peakGreen()
? peakGreen()
: peakRed() );
}
int peak_R = calculateDisplayPeak( m_fPeakValue_R - m_fMinPeak );
int persistentPeak_R = qMax<int>( 3, calculateDisplayPeak( m_persistentPeak_R - m_fMinPeak ) );
painter.drawPixmap( QRect( 11, peak_R, 11, 116 - peak_R ), *s_leds, QRect( 11, peak_R, 11, 116 - peak_R ) );
painter.drawPixmap( QRect( 11, peak_R, 11, 116 - peak_R ), *m_leds, QRect( 11, peak_R, 11, 116 - peak_R ) );
if( m_persistentPeak_R > 0.05 )
{
painter.fillRect( QRect( 14, persistentPeak_R, 7, 1 ), ( m_persistentPeak_R < 1.0 )
? peakGreen()
? peakGreen()
: peakRed() );
}
// knob
painter.drawPixmap( 0, knobPosY() - ( *s_knob ).height(), *s_knob );
painter.drawPixmap( 0, knobPosY() - ( *m_knob ).height(), *s_knob );
}
@@ -333,12 +384,12 @@ QColor Fader::peakRed() const
{
return m_peakRed;
}
void Fader::setPeakGreen( const QColor & c )
{
m_peakGreen = c;
}
void Fader::setPeakRed( const QColor & c )
{
m_peakRed = c;