modified file 'mixxx/src/controlvaluedelegate.cpp' --- mixxx/src/controlvaluedelegate.cpp 2011-11-06 09:28:08.000000000 +0530 +++ mixxx/src/controlvaluedelegate.cpp 2011-12-06 01:51:30.000000000 +0530 @@ -25,6 +25,9 @@ { if (m_channelControlValues.isEmpty()) //List is static/shared across all objects, so only fill once. { + m_channelControlValues.append("zoom_waveform"); + m_channelControlValues.append("zoom_waveform_in"); + m_channelControlValues.append("zoom_waveform_out"); m_channelControlValues.append("beatsync"); m_channelControlValues.append("cue_default"); m_channelControlValues.append("filterHigh"); === modified file 'mixxx/src/engine/ratecontrol.cpp' --- mixxx/src/engine/ratecontrol.cpp 2011-11-06 09:28:08.000000000 +0530 +++ mixxx/src/engine/ratecontrol.cpp 2011-12-06 02:51:18.000000000 +0530 @@ -44,6 +44,9 @@ m_pRateDir = new ControlObject(ConfigKey(_group, "rate_dir")); m_pRateRange = new ControlObject(ConfigKey(_group, "rateRange")); m_pRateSlider = new ControlPotmeter(ConfigKey(_group, "rate"), -1.f, 1.f); + + // CO to control waveform zooming + m_pZoomWaveform = new ControlPotmeter(ConfigKey(_group, "zoom_waveform"), -0.969f, 0.800f); // Search rate. Rate used when searching in sound. This overrules the // playback rate @@ -117,6 +120,17 @@ this, SLOT(slotControlRateTempUpSmall(double)), Qt::DirectConnection); + // Waveform zoom change buttons + buttonZoomWaveformIn = new ControlPushButton(ConfigKey(_group,"zoom_waveform_in")); + connect(buttonZoomWaveformIn, SIGNAL(valueChanged(double)), + this, SLOT(slotControlZoomWaveformIn(double)), + Qt::DirectConnection); + + buttonZoomWaveformOut = new ControlPushButton(ConfigKey(_group,"zoom_waveform_out")); + connect(buttonZoomWaveformOut, SIGNAL(valueChanged(double)), + this, SLOT(slotControlZoomWaveformOut(double)), + Qt::DirectConnection); + // We need the sample rate so we can guesstimate something close // what latency is. m_pSampleRate = ControlObject::getControl(ConfigKey("[Master]","samplerate")); @@ -167,6 +181,8 @@ delete m_pRateRange; delete m_pRateDir; + delete m_pZoomWaveform; + delete m_pRateSearch; delete m_pReverseButton; @@ -181,6 +197,8 @@ delete buttonRatePermDownSmall; delete buttonRatePermUp; delete buttonRatePermUpSmall; + delete buttonZoomWaveformIn; + delete buttonZoomWaveformOut; delete m_pWheel; delete m_pScratch; @@ -334,6 +352,18 @@ } } +void RateControl::slotControlZoomWaveformIn(double) +{ + if (!buttonZoomWaveformIn->get()) + m_pZoomWaveform->set(m_pZoomWaveform->get()-.03); +} + +void RateControl::slotControlZoomWaveformOut(double) +{ + if (!buttonZoomWaveformOut->get()) + m_pZoomWaveform->set(m_pZoomWaveform->get()+.03); +} + double RateControl::getRawRate() { return m_pRateSlider->get() * m_pRateRange->get() * === modified file 'mixxx/src/engine/ratecontrol.h' --- mixxx/src/engine/ratecontrol.h 2011-11-06 09:28:08.000000000 +0530 +++ mixxx/src/engine/ratecontrol.h 2011-12-06 02:51:12.000000000 +0530 @@ -66,6 +66,8 @@ void slotControlFastForward(double); void slotControlFastBack(double); void slotControlVinyl(double); + void slotControlZoomWaveformIn(double); + void slotControlZoomWaveformOut(double); private: double getJogFactor(); @@ -91,9 +93,11 @@ *buttonRateTempUp, *buttonRateTempUpSmall; ControlPushButton *buttonRatePermDown, *buttonRatePermDownSmall, *buttonRatePermUp, *buttonRatePermUpSmall; + ControlPushButton *buttonZoomWaveformIn, *buttonZoomWaveformOut; ControlObject *m_pRateDir, *m_pRateRange; ControlPotmeter* m_pRateSlider; ControlPotmeter* m_pRateSearch; + ControlPotmeter* m_pZoomWaveform; ControlPushButton* m_pReverseButton; ControlObject* m_pBackButton; ControlObject* m_pForwardButton; === modified file 'mixxx/src/waveform/waveformrenderer.cpp' --- mixxx/src/waveform/waveformrenderer.cpp 2011-11-28 19:50:49.000000000 +0530 +++ mixxx/src/waveform/waveformrenderer.cpp 2011-12-08 01:43:36.000000000 +0530 @@ -533,7 +533,7 @@ fetchWaveformFromTrack(); } - m_pRenderBackground->draw(pPainter, pEvent, m_pSampleBuffer, playpos, rateAdjust); + m_pRenderBackground->draw(pPainter, pEvent, m_pSampleBuffer, playpos); pPainter->setPen(signalColor); @@ -548,15 +548,15 @@ // Draw the center horizontal line under the signal. pPainter->drawLine(QLine(0,0,m_iWidth,0)); - m_pRenderSignal->draw(pPainter, pEvent, m_pSampleBuffer, playpos, rateAdjust); + m_pRenderSignal->draw(pPainter, pEvent, m_pSampleBuffer, playpos); // Draw various markers. - m_pRenderBeat->draw(pPainter, pEvent, m_pSampleBuffer, playpos, rateAdjust); + m_pRenderBeat->draw(pPainter, pEvent, m_pSampleBuffer, playpos); QListIterator iter(m_renderObjects); while (iter.hasNext()) { RenderObject* ro = iter.next(); - ro->draw(pPainter, pEvent, m_pSampleBuffer, playpos, rateAdjust); + ro->draw(pPainter, pEvent, m_pSampleBuffer, playpos); } pPainter->setPen(colorMarker); === modified file 'mixxx/src/waveform/renderobject.h' --- mixxx/src/waveform/renderobject.h 2011-11-06 09:28:08.000000000 +0530 +++ mixxx/src/waveform/renderobject.h 2011-12-06 11:39:39.000000000 +0530 @@ -19,8 +19,7 @@ virtual void resize(int w, int h) = 0; virtual void setup(QDomNode node) = 0; virtual void draw(QPainter *pPainter, QPaintEvent *pEvent, - QVector *buffer, double playpos, - double rateAdjust) = 0; + QVector *buffer, double playpos) = 0; virtual void newTrack(TrackPointer pTrack) = 0; }; === modified file 'mixxx/src/waveform/waveformrenderbackground.cpp' --- mixxx/src/waveform/waveformrenderbackground.cpp 2011-11-06 09:28:08.000000000 +0530 +++ mixxx/src/waveform/waveformrenderbackground.cpp 2011-11-30 19:28:33.000000000 +0530 @@ -47,7 +47,7 @@ } void WaveformRenderBackground::draw(QPainter *pPainter, QPaintEvent *pEvent, - QVector *buffer, double dPlayPos, double rateAdjust) { + QVector *buffer, double dPlayPos) { if(m_bRepaintBackground) { generatePixmap(); } === modified file 'mixxx/src/waveform/waveformrenderbackground.h' --- mixxx/src/waveform/waveformrenderbackground.h 2011-11-06 09:28:08.000000000 +0530 +++ mixxx/src/waveform/waveformrenderbackground.h 2011-11-30 19:28:33.000000000 +0530 @@ -23,7 +23,7 @@ void resize(int w, int h); void setup(QDomNode node); - void draw(QPainter *pPainter, QPaintEvent *event, QVector *buffer, double playPos, double rateAdjust); + void draw(QPainter *pPainter, QPaintEvent *event, QVector *buffer, double playPos); void newTrack(TrackPointer pTrack); private: === modified file 'mixxx/src/waveform/waveformrenderbeat.cpp' --- mixxx/src/waveform/waveformrenderbeat.cpp 2011-11-06 09:28:08.000000000 +0530 +++ mixxx/src/waveform/waveformrenderbeat.cpp 2011-11-30 19:28:33.000000000 +0530 @@ -27,7 +27,13 @@ m_dSamplesPerDownsample(-1), m_iNumSamples(0), m_iSampleRate(0), - m_bBeatActive(false) { + m_bBeatActive(false), + zoom(0){ + + m_pZoomWaveform = new ControlObjectThreadMain(ControlObject::getControl(ConfigKey(group, "zoom_waveform"))); + connect(m_pZoomWaveform, SIGNAL(valueChanged(double)), + this, SLOT(slotUpdateZoom(double))); + m_pTrackSamples = new ControlObjectThreadMain( ControlObject::getControl(ConfigKey(group,"track_samples"))); slotUpdateTrackSamples(m_pTrackSamples->get()); @@ -50,6 +56,7 @@ WaveformRenderBeat::~WaveformRenderBeat() { delete m_pTrackSamples; delete m_pBeatActive; + delete m_pZoomWaveform; qDebug() << this << "~WaveformRenderBeat()"; } @@ -80,6 +87,10 @@ m_bBeatActive = beatActive > 0; } +void WaveformRenderBeat::slotUpdateZoom(double newZoom) { + zoom = newZoom; +} + void WaveformRenderBeat::resize(int w, int h) { m_iWidth = w; m_iHeight = h; @@ -102,7 +113,7 @@ } void WaveformRenderBeat::draw(QPainter *pPainter, QPaintEvent *event, - QVector *buffer, double dPlayPos, double rateAdjust) { + QVector *buffer, double dPlayPos) { slotUpdateTrackSamples(m_pTrackSamples->get()); if(m_iSampleRate <= 0 || m_iNumSamples == 0) @@ -130,7 +141,7 @@ // Therefore, sample s is a beat if it satisfies s % 60f/b == 0. // where s is a /mono/ sample - double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel()*(1.0+rateAdjust); + double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel()*(1.0+zoom); QPen marksPen(colorMarks); marksPen.setWidth(subpixelsPerPixel*1.5); @@ -147,8 +158,8 @@ double halfh = m_iHeight/2; // basePos and endPos are in samples - double basePos = iCurPos - m_dSamplesPerPixel * m_iWidth * (1.0+rateAdjust); - double endPos = basePos + (2 * m_iWidth) * m_dSamplesPerPixel * (1.0+rateAdjust); + double basePos = iCurPos - m_dSamplesPerPixel * m_iWidth * (1.0+zoom); + double endPos = basePos + (2 * m_iWidth) * m_dSamplesPerPixel * (1.0+zoom); m_beatList.clear(); === modified file 'mixxx/src/waveform/waveformrenderbeat.h' --- mixxx/src/waveform/waveformrenderbeat.h 2011-11-06 09:28:08.000000000 +0530 +++ mixxx/src/waveform/waveformrenderbeat.h 2011-11-30 19:28:33.000000000 +0530 @@ -25,19 +25,21 @@ void resize(int w, int h); void setup(QDomNode node); void draw(QPainter *pPainter, QPaintEvent *event, QVector *buffer, - double playPos, double rateAdjust); + double playPos); void newTrack(TrackPointer pTrack); private slots: void slotUpdateTrackSamples(double samples); void slotUpdateBeatActive(double beatActive); void slotUpdateTrackSampleRate(double sampleRate); + void slotUpdateZoom(double newZoom); private: WaveformRenderer *m_pParent; ControlObjectThreadMain* m_pTrackSamples; ControlObjectThreadMain *m_pTrackSampleRate; ControlObjectThreadMain* m_pBeatActive; + ControlObjectThreadMain* m_pZoomWaveform; TrackPointer m_pTrack; int m_iWidth, m_iHeight; QColor colorMarks; @@ -48,6 +50,7 @@ int m_iSampleRate; bool m_bBeatActive; BeatList m_beatList; + float zoom; }; #endif === modified file 'mixxx/src/waveform/waveformrendermark.cpp' --- mixxx/src/waveform/waveformrendermark.cpp 2011-11-06 09:28:08.000000000 +0530 +++ mixxx/src/waveform/waveformrendermark.cpp 2011-12-06 11:44:59.000000000 +0530 @@ -29,7 +29,15 @@ m_bHasCustomPixmap(false), m_dSamplesPerDownsample(-1), m_iNumSamples(0), - m_iSampleRate(-1) { + m_iSampleRate(-1), + zoom(0) + { + + m_pZoomWaveform = new ControlObjectThreadMain( + ControlObject::getControl(ConfigKey(m_pGroup, "zoom_waveform"))); + connect(m_pZoomWaveform, SIGNAL(valueChanged(double)), + this, SLOT(slotUpdateZoom(double))); + m_pTrackSamples = new ControlObjectThreadMain( ControlObject::getControl(ConfigKey(pGroup, "track_samples"))); slotUpdateTrackSamples(m_pTrackSamples->get()); @@ -48,6 +56,7 @@ delete m_pTrackSamples; delete m_pTrackSampleRate; delete m_pMarkPoint; + delete m_pZoomWaveform; } void WaveformRenderMark::slotUpdateMarkPoint(double v) { @@ -73,6 +82,11 @@ m_dSamplesPerDownsample = n; } +// slot to control zooming of waveform +void WaveformRenderMark::slotUpdateZoom(double newZoom) { + zoom = newZoom; +} + void WaveformRenderMark::resize(int w, int h) { m_iWidth = w; m_iHeight = h; @@ -149,8 +163,8 @@ void WaveformRenderMark::draw(QPainter *pPainter, QPaintEvent *event, - QVector *buffer, double dPlayPos, - double rateAdjust) { + QVector *buffer, double dPlayPos + ) { if (m_iSampleRate == -1 || m_iSampleRate == 0 || m_iNumSamples == 0) return; @@ -158,7 +172,7 @@ if (buffer == NULL) return; - double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel()*(1.0+rateAdjust); + double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel()* (1.0+zoom); pPainter->save(); pPainter->scale(1.0/subpixelsPerPixel,1.0); === modified file 'mixxx/src/waveform/waveformrendermark.h' --- mixxx/src/waveform/waveformrendermark.h 2011-11-06 09:28:08.000000000 +0530 +++ mixxx/src/waveform/waveformrendermark.h 2011-11-30 19:28:35.000000000 +0530 @@ -27,13 +27,14 @@ void resize(int w, int h); void setup(QDomNode node); void draw(QPainter *pPainter, QPaintEvent *event, - QVector *buffer, double playPos, double rateAdjust); + QVector *buffer, double playPos); void newTrack(TrackPointer pTrack); public slots: void slotUpdateMarkPoint(double mark); void slotUpdateTrackSamples(double samples); void slotUpdateTrackSampleRate(double sampleRate); + void slotUpdateZoom(double newZoom); private: void setupMarkPixmap(); @@ -49,6 +50,7 @@ ControlObjectThreadMain *m_pMarkPoint; ControlObjectThreadMain *m_pTrackSamples; ControlObjectThreadMain *m_pTrackSampleRate; + ControlObjectThreadMain *m_pZoomWaveform; int m_iMarkPoint; int m_iWidth, m_iHeight; @@ -63,6 +65,7 @@ int m_iNumSamples; int m_iSampleRate; + float zoom; }; #endif === modified file 'mixxx/src/waveform/waveformrendermarkrange.cpp' --- mixxx/src/waveform/waveformrendermarkrange.cpp 2011-11-06 09:28:08.000000000 +0530 +++ mixxx/src/waveform/waveformrendermarkrange.cpp 2011-11-30 19:28:35.000000000 +0530 @@ -184,8 +184,8 @@ void WaveformRenderMarkRange::draw(QPainter *pPainter, QPaintEvent *event, - QVector *buffer, double dPlayPos, - double rateAdjust) { + QVector *buffer, double dPlayPos + ) { if (m_iSampleRate == -1 || m_iSampleRate == 0 || m_iNumSamples == 0) return; @@ -197,7 +197,7 @@ if (m_iMarkStartPoint == -1 || m_iMarkEndPoint == -1) return; - double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel()*(1.0+rateAdjust); + double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel(); pPainter->save(); pPainter->scale(1.0/subpixelsPerPixel,1.0); === modified file 'mixxx/src/waveform/waveformrendermarkrange.h' --- mixxx/src/waveform/waveformrendermarkrange.h 2011-11-06 09:28:08.000000000 +0530 +++ mixxx/src/waveform/waveformrendermarkrange.h 2011-11-30 19:28:35.000000000 +0530 @@ -28,7 +28,7 @@ void resize(int w, int h); void setup(QDomNode node); void draw(QPainter *pPainter, QPaintEvent *event, - QVector *buffer, double playPos, double rateAdjust); + QVector *buffer, double playPos); void newTrack(TrackPointer pTrack); public slots: === modified file 'mixxx/src/waveform/waveformrendersignal.cpp' --- mixxx/src/waveform/waveformrendersignal.cpp 2011-11-06 09:28:08.000000000 +0530 +++ mixxx/src/waveform/waveformrendersignal.cpp 2011-12-06 11:47:09.000000000 +0530 @@ -23,7 +23,15 @@ m_fGain(1), m_lines(0), m_pTrack(NULL), - signalColor(255,255,255) { + signalColor(255,255,255), + zoom(0) + { + + m_pZoomWaveform = new ControlObjectThreadMain( + ControlObject::getControl(ConfigKey(group, "zoom_waveform"))); + connect(m_pZoomWaveform, SIGNAL(valueChanged(double)), + this, SLOT(slotUpdateZoom(double))); + m_pGain = new ControlObjectThreadMain( ControlObject::getControl(ConfigKey(group, "total_gain"))); if (m_pGain != NULL) { @@ -35,6 +43,12 @@ WaveformRenderSignal::~WaveformRenderSignal() { qDebug() << this << "~WaveformRenderSignal()"; delete m_pGain; + delete m_pZoomWaveform; +} + +// slot to control zooming of waveform +void WaveformRenderSignal::slotUpdateZoom(double newZoom) { + zoom = newZoom; } void WaveformRenderSignal::resize(int w, int h) { @@ -57,8 +71,8 @@ void WaveformRenderSignal::draw(QPainter *pPainter, QPaintEvent *event, - QVector *buffer, double dPlayPos, - double rateAdjust) { + QVector *buffer, double dPlayPos + ) { if (buffer == NULL) { return; } @@ -76,9 +90,11 @@ pPainter->setPen(signalColor); - const double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel() * (1.0 + rateAdjust); + double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel() * (1.0 + zoom); + double subpixelsPerPixelNoZoom = subpixelsPerPixel / (1 + zoom); int subpixelWidth = int(m_iWidth * subpixelsPerPixel); + int subpixelWidthNoZoom = int(m_iWidth * subpixelsPerPixelNoZoom); // If the array is not large enough, expand it. // Amortize the cost of this by requesting a factor of 2 more. @@ -111,22 +127,26 @@ // Some of the pre-roll is on screen. Draw little triangles to indicate // where the pre-roll is located. - if (iCurPos < 2*halfw) { + int halfwNoZoom = subpixelWidthNoZoom/2; + iCurPos /= 1+zoom; + if (iCurPos < 2*halfwNoZoom) { double start_index = 0; - int end_index = (halfw - iCurPos/2); + int end_index = (halfwNoZoom - iCurPos/2); QPolygonF polygon; const int polyWidth = 80; polygon << QPointF(0, 0) - << QPointF(-polyWidth/subpixelsPerPixel, -m_iHeight/5) - << QPointF(-polyWidth/subpixelsPerPixel, m_iHeight/5); - polygon.translate(end_index/subpixelsPerPixel, 0); + << QPointF(-polyWidth/subpixelsPerPixelNoZoom, -m_iHeight/5) + << QPointF(-polyWidth/subpixelsPerPixelNoZoom, m_iHeight/5); + polygon.translate(end_index/subpixelsPerPixelNoZoom, 0); int index = end_index; while (index > start_index) { pPainter->drawPolygon(polygon); - polygon.translate(-polyWidth/subpixelsPerPixel, 0); + polygon.translate(-polyWidth/subpixelsPerPixelNoZoom, 0); index -= polyWidth; } } pPainter->restore(); + + } === modified file 'mixxx/src/waveform/waveformrendersignal.h' --- mixxx/src/waveform/waveformrendersignal.h 2011-11-06 09:28:09.000000000 +0530 +++ mixxx/src/waveform/waveformrendersignal.h 2011-11-30 19:28:35.000000000 +0530 @@ -28,17 +28,20 @@ void resize(int w, int h); void setup(QDomNode node); - void draw(QPainter *pPainter, QPaintEvent *event, QVector *buffer, double playPos, double rateAdjust); + void draw(QPainter *pPainter, QPaintEvent *event, QVector *buffer, double playPos); void newTrack(TrackPointer pTrack); public slots: void slotUpdateGain(double gain); + void slotUpdateZoom(double newZoom); private: float m_fGain; + float zoom; WaveformRenderer *m_pParent; ControlObjectThreadMain *m_pGain; + ControlObjectThreadMain* m_pZoomWaveform; int m_iWidth, m_iHeight; QVector m_lines; === modified file 'mixxx/src/waveform/waveformrendersignalpixmap.cpp' --- mixxx/src/waveform/waveformrendersignalpixmap.cpp 2011-11-06 09:28:09.000000000 +0530 +++ mixxx/src/waveform/waveformrendersignalpixmap.cpp 2011-11-30 19:28:35.000000000 +0530 @@ -46,16 +46,16 @@ signalColor = WSkinColor::getCorrectColor(signalColor); } -void WaveformRenderSignalPixmap::draw(QPainter *pPainter, QPaintEvent *event, QVector *buffer, double dPlayPos, double rateAdjust) { +void WaveformRenderSignalPixmap::draw(QPainter *pPainter, QPaintEvent *event, QVector *buffer, double dPlayPos) { if(buffer == NULL) return; - updatePixmap(buffer, dPlayPos, rateAdjust); + updatePixmap(buffer, dPlayPos); pPainter->drawPixmap(m_screenPixmap.rect(), m_screenPixmap, event->rect()); } -void WaveformRenderSignalPixmap::updatePixmap(QVector *buffer, double dPlayPos, double rateAdjust) { +void WaveformRenderSignalPixmap::updatePixmap(QVector *buffer, double dPlayPos) { int numBufferSamples = buffer->size(); @@ -67,7 +67,7 @@ if((iCurPos % 2) != 0) iCurPos--; - double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel() * (1.0 + rateAdjust); + double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel(); int subpixelWidth = int(m_iWidth * subpixelsPerPixel); int pixelsToDraw = iCurPos - m_iLastPlaypos; === modified file 'mixxx/src/waveform/waveformrendersignalpixmap.h' --- mixxx/src/waveform/waveformrendersignalpixmap.h 2011-11-06 09:28:09.000000000 +0530 +++ mixxx/src/waveform/waveformrendersignalpixmap.h 2011-11-30 19:28:35.000000000 +0530 @@ -28,11 +28,11 @@ void resize(int w, int h); void setup(QDomNode node); - void draw(QPainter *pPainter, QPaintEvent *event, QVector *buffer, double playPos, double rateAdjust); + void draw(QPainter *pPainter, QPaintEvent *event, QVector *buffer, double playPos); void newTrack(TrackPointer pTrack); private: - void updatePixmap(QVector *buffer, double playPos, double rateAdjust); + void updatePixmap(QVector *buffer, double playPos); WaveformRenderer *m_pParent; int m_iWidth, m_iHeight; === modified file 'mixxx/src/widget/wglwaveformviewer.cpp' --- mixxx/src/widget/wglwaveformviewer.cpp 2011-11-06 09:28:09.000000000 +0530 +++ mixxx/src/widget/wglwaveformviewer.cpp 2011-11-30 20:12:29.000000000 +0530 @@ -15,6 +15,9 @@ #include "controlobjectthreadmain.h" #include "sharedglcontext.h" +// HACK: remove this after Control 2.0 is here +#include "controlpotmeter.h" + WGLWaveformViewer::WGLWaveformViewer( const char *group, WaveformRenderer *pWaveformRenderer, @@ -29,6 +32,13 @@ Q_ASSERT(m_pWaveformRenderer); m_pGroup = group; + + zoomAccumulate = 0; + + m_pZoomWaveform = new ControlObjectThreadMain( + ControlObject::getControl(ConfigKey(group, "zoom_waveform"))); + connect(m_pZoomWaveform, SIGNAL(valueChanged(double)), + this, SLOT(slotUpdateZoom(double))); m_pScratchEnable = new ControlObjectThreadMain( ControlObject::getControl(ConfigKey(group, "scratch_position_enable"))); @@ -51,6 +61,21 @@ m_painting = false; + // HACK until we have Control 2.0. + ControlPotmeter* cpo = dynamic_cast(ControlObject::getControl( + ConfigKey(group, "zoom_waveform"))); // for getMax/getMin + if (cpo != NULL){ + zoomMin = cpo->getMin(); + zoomMax = cpo->getMax(); + } + else { + zoomMin = 0; + zoomMax = 0; + } + + + + setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); } @@ -120,9 +145,34 @@ // unused, stops a bad connect from happening } +void WGLWaveformViewer::slotUpdateZoom(double newZoom) { + zoomAccumulate = newZoom; +} + + bool WGLWaveformViewer::eventFilter(QObject *o, QEvent *e) { QMouseEvent* m = dynamic_cast(e); + + // Captures mouse wheel events for waveform zooming + if(e->type() == QEvent::Wheel) { + QWheelEvent *w = (QWheelEvent*)e; + + if (w->delta() > 0) + zoomAccumulate += 0.03; + else + zoomAccumulate -= 0.03; + + if (zoomAccumulate < zoomMin) + zoomAccumulate = zoomMin; + + if (zoomAccumulate > zoomMax) + zoomAccumulate = zoomMax; + + m_pZoomWaveform->slotSet(zoomAccumulate); + } + if(e->type() == QEvent::MouseButtonPress) { + m_iMouseStart = m->x(); if(m->button() == Qt::LeftButton) { m_bScratching = true; @@ -132,6 +182,10 @@ // Set the cursor to a hand while the mouse is down. setCursor(Qt::ClosedHandCursor); } + else if(m->button() == Qt::RightButton) { + zoomAccumulate = 0; + m_pZoomWaveform->slotSet(zoomAccumulate); + } } else if(e->type() == QEvent::MouseMove) { // Only send signals for mouse moving if the left button is pressed if (m_iMouseStart != -1 && m_bScratching) { @@ -146,7 +200,7 @@ double rateAdjust = m_pRateDir->get() * math_min(0.99, m_pRate->get() * m_pRateRange->get()); double targetPosition = (m_iMouseStart - curX) * - samplesPerPixel * (1 + rateAdjust); + samplesPerPixel * (1 + rateAdjust) * (1.0 + zoomAccumulate); //qDebug() << "Target:" << targetPosition; m_pScratch->slotSet(targetPosition); } === modified file 'mixxx/src/widget/wglwaveformviewer.h' --- mixxx/src/widget/wglwaveformviewer.h 2011-11-06 09:28:09.000000000 +0530 +++ mixxx/src/widget/wglwaveformviewer.h 2011-11-30 19:28:35.000000000 +0530 @@ -39,6 +39,7 @@ public slots: void setValue(double); void refresh(); + void slotUpdateZoom(double newZoom); signals: void valueChangedLeftDown(double); @@ -63,12 +64,15 @@ ControlObjectThreadMain* m_pRate; ControlObjectThreadMain* m_pRateRange; ControlObjectThreadMain* m_pRateDir; + ControlObjectThreadMain* m_pZoomWaveform; bool m_bScratching; bool m_painting; QMutex m_paintMutex; const char *m_pGroup; + float zoomAccumulate; + float zoomMax, zoomMin; }; #endif