From 201fa1d89a359490c7983f9f923e8be6c65ecd69 Mon Sep 17 00:00:00 2001 From: Vesa Date: Wed, 12 Feb 2014 13:21:55 +0200 Subject: [PATCH] Waveshaper: added bg image for graph, made graph larger Graph widget: added new functionality - ability to draw straight lines with shift-click --- include/graph.h | 10 +- plugins/waveshaper/wavegraph.png | Bin 0 -> 43390 bytes plugins/waveshaper/waveshaper.cpp | 6 +- .../waveshaper/waveshaper_control_dialog.cpp | 21 +++- plugins/waveshaper/waveshaper_controls.cpp | 10 +- src/gui/widgets/graph.cpp | 105 +++++++++++++----- 6 files changed, 111 insertions(+), 41 deletions(-) create mode 100644 plugins/waveshaper/wavegraph.png diff --git a/include/graph.h b/include/graph.h index 20437996e..3e9a2d2d3 100644 --- a/include/graph.h +++ b/include/graph.h @@ -49,11 +49,15 @@ public: NumGraphStyles }; - graph( QWidget * _parent, graphStyle _style = graph::LinearStyle ); + graph( QWidget * _parent, graphStyle _style = graph::LinearStyle, + int _width = 132, + int _height = 104 + ); virtual ~graph(); void setForeground( const QPixmap & _pixmap ); + void setGraphColor( const QColor ); inline graphModel * model() @@ -65,6 +69,7 @@ public: { return m_graphStyle; } + inline void setGraphStyle( graphStyle _s ) { @@ -88,7 +93,8 @@ protected slots: private: virtual void modelChanged(); - void changeSampleAt(int _x, int _y); + void changeSampleAt( int _x, int _y ); + void drawLineAt( int _x, int _y, int _lastx ); QPixmap m_foreground; diff --git a/plugins/waveshaper/wavegraph.png b/plugins/waveshaper/wavegraph.png new file mode 100644 index 0000000000000000000000000000000000000000..18d99a81e0bed94e8259855ddcba4bf8301a897e GIT binary patch literal 43390 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 30 ); + tl->addStrut( 204 ); - graph * waveGraph = new graph( this, graph::LinearStyle ); + graph * waveGraph = new graph( this, graph::NearestStyle, 204, 204 ); waveGraph -> setModel( &_controls -> m_wavegraphModel ); + + waveGraph -> setAutoFillBackground( true ); - tl -> addWidget( waveGraph ); + pal = QPalette(); + pal.setBrush( backgroundRole(), + PLUGIN_NAME::getIconPixmap("wavegraph") ); + waveGraph->setPalette( pal ); + waveGraph->setGraphColor( QColor( 170, 255, 255 ) ); +// waveGraph -> setMinimumSize( 204, 204); +// waveGraph -> resize( 204, 204); + + waveGraph -> setMaximumSize( 204, 204 ); + + tl -> setSizeConstraint( QLayout::SetNoConstraint ); + tl -> addWidget( waveGraph ); + QHBoxLayout * l = new QHBoxLayout; knob * inputKnob = new knob( knobBright_26, this); diff --git a/plugins/waveshaper/waveshaper_controls.cpp b/plugins/waveshaper/waveshaper_controls.cpp index 6455c9653..40c60a895 100644 --- a/plugins/waveshaper/waveshaper_controls.cpp +++ b/plugins/waveshaper/waveshaper_controls.cpp @@ -37,7 +37,7 @@ waveShaperControls::waveShaperControls( waveShaperEffect * _eff ) : m_effect( _eff ), m_inputModel( 1.0f, 0.0f, 2.0f, 0.01f, this, tr( "Input gain" ) ), m_outputModel( 1.0f, 0.0f, 2.0f, 0.01f, this, tr( "Output gain" ) ), - m_wavegraphModel( 0.0f, 1.0f, 100, this ) + m_wavegraphModel( 0.0f, 1.0f, 200, this ) { connect( &m_inputModel, SIGNAL( dataChanged() ), this, SLOT( changeInput() ) ); @@ -115,13 +115,13 @@ void waveShaperControls::saveSettings( QDomDocument & _doc, void waveShaperControls::setDefaultShape() { - float shp [100] = { }; - for ( int i = 0; i<100; i++) + float shp [200] = { }; + for ( int i = 0; i<200; i++) { - shp[i] = ((float)i + 1.0f) / 100.0f; + shp[i] = ((float)i + 1.0f) / 200.0f; } - m_wavegraphModel.setLength( 100 ); + m_wavegraphModel.setLength( 200 ); m_wavegraphModel.setSamples( (float*)&shp ); } diff --git a/src/gui/widgets/graph.cpp b/src/gui/widgets/graph.cpp index dc0246eb0..9c3877467 100644 --- a/src/gui/widgets/graph.cpp +++ b/src/gui/widgets/graph.cpp @@ -34,7 +34,8 @@ #include "engine.h" -graph::graph( QWidget * _parent, graphStyle _style ) : +graph::graph( QWidget * _parent, graphStyle _style, int _width, + int _height ) : QWidget( _parent ), /* TODO: size, background? */ ModelView( new graphModel( -1.0, 1.0, 128, NULL, true ), this ), @@ -43,7 +44,7 @@ graph::graph( QWidget * _parent, graphStyle _style ) : m_mouseDown = false; m_graphColor = QColor( 0xFF, 0xAA, 0x00 ); - resize( 132, 104 ); + resize( _width, _height ); setAcceptDrops( true ); setCursor( Qt::CrossCursor ); @@ -76,7 +77,7 @@ void graph::setGraphColor( QColor _graphcol ) /* void graph::loadSampleFromFile( const QString & _filename ) { - + int i; // zero sample_shape @@ -84,7 +85,7 @@ void graph::loadSampleFromFile( const QString & _filename ) { samplePointer[i] = 0; } - + // load user shape sampleBuffer buffer( _filename ); @@ -154,25 +155,73 @@ void graph::mousePressEvent( QMouseEvent * _me ) { if( _me->button() == Qt::LeftButton ) { - // toggle mouse state - m_mouseDown = true; + if ( !( _me->modifiers() & Qt::ShiftModifier ) ) + { + // toggle mouse state + m_mouseDown = true; - // get position - int x = _me->x(); - int y = _me->y(); + // get position + int x = _me->x(); + int y = _me->y(); - changeSampleAt( x, y ); + changeSampleAt( x, y ); + + // toggle mouse state + m_mouseDown = true; + setCursor( Qt::BlankCursor ); + m_lastCursorX = x; + } + else + { + //when shift-clicking, draw a line from last position to current + //position + int x = _me->x(); + int y = _me->y(); + + drawLineAt( x, y, m_lastCursorX ); + + setCursor( Qt::BlankCursor ); + m_lastCursorX = x; + } - // toggle mouse state - m_mouseDown = true; - setCursor( Qt::BlankCursor ); - m_lastCursorX = x; } } +void graph::drawLineAt( int _x, int _y, int _lastx ) +{ + float minVal = model()->minValue(); + float maxVal = model()->maxValue(); + if ( width() <= 4 ) + { + return; + } + float xscale = static_cast( model()->length() ) / + ( width()-4 ); -void graph::changeSampleAt(int _x, int _y) + //consider border + _x -= 2; + _y -= 2; + _lastx -= 2; + + float range = minVal - maxVal; + float val = ( _y*range/( height()-4 ) ) + maxVal; + float lastval = model() -> m_samples[ (int)( _lastx * xscale ) ]; + + // calculate line drawing variables + int linelen = qAbs( _x - _lastx ) + 1; + int xstep = _x > _lastx ? -1 : 1; + float ystep = ( lastval - val ) / linelen; + + // draw a line + for ( int i = 0; i < linelen; i++ ) + { + int x = (_x + (i * xstep)); // get x value + model()->setSampleAt( (int)( x * xscale ), val + (i * ystep)); + } +} + +void graph::changeSampleAt( int _x, int _y ) { float minVal = model()->minValue(); float maxVal = model()->maxValue(); @@ -208,7 +257,7 @@ void graph::mouseReleaseEvent( QMouseEvent * _me ) setCursor( Qt::CrossCursor ); update(); } -} +} @@ -237,15 +286,15 @@ void graph::paintEvent( QPaintEvent * ) for( int i=0; i < length; i++ ) { // Needs to be rewritten - p.drawLine(2+static_cast(i*xscale), + p.drawLine(2+static_cast(i*xscale), 2+static_cast( ( (*samps)[i] - maxVal ) * yscale ), - 2+static_cast((i+1)*xscale), + 2+static_cast((i+1)*xscale), 2+static_cast( ( (*samps)[i+1] - maxVal ) * yscale ) ); } // Draw last segment wrapped around - p.drawLine(2+static_cast(length*xscale), + p.drawLine(2+static_cast(length*xscale), 2+static_cast( ( (*samps)[length] - maxVal ) * yscale ), width()-2, 2+static_cast( ( (*samps)[0] - maxVal ) * yscale ) ); @@ -257,19 +306,19 @@ void graph::paintEvent( QPaintEvent * ) case graph::NearestStyle: for( int i=0; i < length; i++ ) { - p.drawLine(2+static_cast(i*xscale), + p.drawLine(2+static_cast(i*xscale), 2+static_cast( ( (*samps)[i] - maxVal ) * yscale ), - 2+static_cast((i+1)*xscale), + 2+static_cast((i+1)*xscale), 2+static_cast( ( (*samps)[i] - maxVal ) * yscale ) ); - p.drawLine(2+static_cast((i+1)*xscale), + p.drawLine(2+static_cast((i+1)*xscale), 2+static_cast( ( (*samps)[i] - maxVal ) * yscale ), - 2+static_cast((i+1)*xscale), + 2+static_cast((i+1)*xscale), 2+static_cast( ( (*samps)[i+1] - maxVal ) * yscale ) ); } - p.drawLine(2+static_cast(length*xscale), + p.drawLine(2+static_cast(length*xscale), 2+static_cast( ( (*samps)[length] - maxVal ) * yscale ), width()-2, 2+static_cast( ( (*samps)[length] - maxVal ) * yscale ) ); @@ -281,7 +330,7 @@ void graph::paintEvent( QPaintEvent * ) // draw Pointer - if( m_mouseDown ) + if( m_mouseDown ) { QPoint cursor = mapFromGlobal( QCursor::pos() ); p.setPen( QColor( 0xAA, 0xFF, 0x00, 0x70 ) ); @@ -369,7 +418,7 @@ void graphModel::setRange( float _min, float _max ) if( !m_samples.isEmpty() ) { - // Trim existing values + // Trim existing values for( int i=0; i < length(); i++ ) { m_samples[i] = fmaxf( _min, fminf( m_samples[i], _max ) ); @@ -512,7 +561,7 @@ void graphModel::smooth() m_samples[0] = ( temp[0] + temp[length()-1] ) * 0.5f; for ( int i=1; i < length(); i++ ) { - m_samples[i] = ( temp[i-1] + temp[i] ) * 0.5f; + m_samples[i] = ( temp[i-1] + temp[i] ) * 0.5f; } emit samplesChanged(0, length()-1); @@ -539,7 +588,7 @@ void graphModel::normalize() if( max != 1.0f ) { emit samplesChanged( 0, length()-1 ); } -} +}