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.h - class automatableSlider, a QSlider with automation
* AutomatableSlider.h - class AutomatableSlider, a QSlider with automation
*
* Copyright (c) 2006-2008 Javier Serrano Polo <jasp00/at/users.sourceforge.net>
*

View File

@@ -64,6 +64,7 @@ public:
Q_PROPERTY( QColor peakGreen READ peakGreen WRITE setPeakGreen )
Q_PROPERTY( QColor peakRed READ peakRed WRITE setPeakRed )
Fader( FloatModel * _model, const QString & _name, QWidget * _parent );
Fader( FloatModel * _model, const QString & _name, QWidget * _parent, QPixmap * back, QPixmap * leds, QPixmap * knob );
virtual ~Fader();
void setPeak_L( float fPeak );
@@ -76,6 +77,11 @@ public:
QColor peakRed() const;
void setPeakGreen( const QColor & c );
void setPeakRed( const QColor & c );
void setDisplayConversion( bool b )
{
m_displayConversion = b;
}
private:
virtual void contextMenuEvent( QContextMenuEvent * _me );
@@ -112,6 +118,12 @@ private:
static QPixmap * s_back;
static QPixmap * s_leds;
static QPixmap * s_knob;
QPixmap * m_back;
QPixmap * m_leds;
QPixmap * m_knob;
bool m_displayConversion;
int m_moveStartPoint;
float m_startValue;

View File

@@ -140,6 +140,7 @@ static inline float fastRandf( float range )
{
static const float fast_rand_ratio = 1.0f / FAST_RAND_MAX;
return fast_rand() * range * fast_rand_ratio;
}
//! @brief Takes advantage of fmal() function if present in hardware
static inline long double fastFmal( long double a, long double b, long double c )

View File

@@ -46,7 +46,7 @@ DelayControlsDialog::DelayControlsDialog( DelayControls *controls ) :
sampleDelayKnob->setLabel( tr( "Delay" ) );
sampleDelayKnob->setHintText( tr( "Delay Time" ) + " ", " s" );
knob * feedbackKnob = new knob( knobBright_26, this );
Knob * feedbackKnob = new Knob( knobBright_26, this );
feedbackKnob->move( 63,10 );
feedbackKnob->setVolumeKnob( true) ;
feedbackKnob->setModel( &controls->m_feedbackModel);

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;