=== modified file 'mixxx/src/engine/enginemaster.cpp' --- mixxx/src/engine/enginemaster.cpp 2011-11-07 03:28:09 +0000 +++ mixxx/src/engine/enginemaster.cpp 2011-11-26 15:02:38 +0000 @@ -94,6 +94,9 @@ m_pBypassEq = new ControlPushButton(ConfigKey(group, "bypass_eq")); m_pBypassEq->setToggleButton(true); + m_pWaveformZoomFactor = new ControlObject(ConfigKey(group, "waveform_zoom_factor")); + m_pWaveformZoomFactor->set(1.0); + //set up input passthrough o //TODO: we should set up n passthroughs for n decks m_passthrough.append(new ControlPushButton(ConfigKey("[Channel1]","inputpassthrough"))); === modified file 'mixxx/src/engine/enginemaster.h' --- mixxx/src/engine/enginemaster.h 2011-10-16 14:16:54 +0000 +++ mixxx/src/engine/enginemaster.h 2011-11-26 15:02:38 +0000 @@ -146,6 +146,7 @@ ControlObject* m_pHeadVolume; ControlObject* m_pMasterSampleRate; ControlObject* m_pMasterLatency; + ControlObject* m_pWaveformZoomFactor; ControlPotmeter* m_pMasterRate; ControlPushButton *m_pBypassEq; EngineClipping *clipping, *head_clipping; === modified file 'mixxx/src/waveform/waveformrenderbeat.cpp' --- mixxx/src/waveform/waveformrenderbeat.cpp 2011-10-30 15:10:10 +0000 +++ mixxx/src/waveform/waveformrenderbeat.cpp 2011-11-26 15:02:38 +0000 @@ -130,7 +130,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 = (float)m_pParent->getSubpixelsPerPixel()*(1.0+rateAdjust) * m_pParent->getZoomFactor(); pPainter->save(); pPainter->scale(1.0/subpixelsPerPixel,1.0); === modified file 'mixxx/src/waveform/waveformrenderer.cpp' --- mixxx/src/waveform/waveformrenderer.cpp 2011-10-19 19:46:20 +0000 +++ mixxx/src/waveform/waveformrenderer.cpp 2011-11-26 15:02:38 +0000 @@ -23,7 +23,7 @@ #define INTERPOLATION 0 -#define DEFAULT_SUBPIXELS_PER_PIXEL 4 +#define DEFAULT_SUBPIXELS_PER_PIXEL 10 #define DEFAULT_PIXELS_PER_SECOND 100 #define RATE_INCREMENT 0.015 @@ -64,6 +64,7 @@ m_dRateRange(0), m_dRateDir(0), m_iRateAdjusting(0), + m_dZoomFactor(1.0), m_iDupes(0), m_dPlayPosAdjust(0), m_iLatency(0), @@ -115,7 +116,15 @@ connect(m_pRateDir, SIGNAL(valueChanged(double)), this, SLOT(slotUpdateRateDir(double))); } - + + m_pWaveformZoomFactor = new ControlObjectThreadMain( + ControlObject::getControl(ConfigKey("[Master]","waveform_zoom_factor"))); + if (m_pWaveformZoomFactor) { + connect(m_pWaveformZoomFactor, SIGNAL(valueChanged(double)), + this, SLOT(slotUpdateZoomFactor(double))); + m_dZoomFactor = m_pWaveformZoomFactor->get(); + } + if(0) start(); } @@ -208,6 +217,10 @@ m_iLatency = v; } +void WaveformRenderer::slotUpdateZoomFactor(double v) { + m_dZoomFactor = v; +} + void WaveformRenderer::resize(int w, int h) { m_iWidth = w; m_iHeight = h; @@ -550,8 +563,12 @@ m_pRenderSignal->draw(pPainter, pEvent, m_pSampleBuffer, playpos, rateAdjust); - // Draw various markers. - m_pRenderBeat->draw(pPainter, pEvent, m_pSampleBuffer, playpos, rateAdjust); + //beats get all weird when we are zoomed out, so don't draw them + if (m_dZoomFactor <= 1.0) + { + // Draw various markers. + m_pRenderBeat->draw(pPainter, pEvent, m_pSampleBuffer, playpos, rateAdjust); + } QListIterator iter(m_renderObjects); while (iter.hasNext()) { @@ -598,3 +615,7 @@ int WaveformRenderer::getSubpixelsPerPixel() { return m_iSubpixelsPerPixel; } + +double WaveformRenderer::getZoomFactor() { + return m_dZoomFactor; +} === modified file 'mixxx/src/waveform/waveformrenderer.h' --- mixxx/src/waveform/waveformrenderer.h 2011-10-04 16:48:30 +0000 +++ mixxx/src/waveform/waveformrenderer.h 2011-11-26 15:02:38 +0000 @@ -37,6 +37,7 @@ void precomputePixmap(); int getSubpixelsPerPixel(); int getPixelsPerSecond(); + double getZoomFactor(); public slots: void slotNewTrack(TrackPointer pTrack); @@ -46,6 +47,7 @@ void slotUpdateRate(double rate); void slotUpdateRateRange(double rate_range); void slotUpdateRateDir(double rate_dir); + void slotUpdateZoomFactor(double zoom_factor); protected: void run(); @@ -63,6 +65,7 @@ QTime m_playPosTime, m_playPosTimeOld; double m_dPlayPos, m_dPlayPosOld, m_dTargetRate, m_dRate, m_dRateRange, m_dRateDir; int m_iRateAdjusting; + double m_dZoomFactor; int m_iDupes; double m_dPlayPosAdjust; int m_iLatency; @@ -76,6 +79,7 @@ ControlObjectThreadMain *m_pRate; ControlObjectThreadMain *m_pRateRange; ControlObjectThreadMain *m_pRateDir; + ControlObjectThreadMain *m_pWaveformZoomFactor; ControlObject *m_pCOVisualResample; === modified file 'mixxx/src/waveform/waveformrendermark.cpp' --- mixxx/src/waveform/waveformrendermark.cpp 2011-10-30 15:10:10 +0000 +++ mixxx/src/waveform/waveformrendermark.cpp 2011-11-26 15:02:38 +0000 @@ -157,7 +157,7 @@ if (buffer == NULL) return; - double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel()*(1.0+rateAdjust); + double subpixelsPerPixel = (float)m_pParent->getSubpixelsPerPixel()*(1.0+rateAdjust) * m_pParent->getZoomFactor(); pPainter->save(); pPainter->scale(1.0/subpixelsPerPixel,1.0); === modified file 'mixxx/src/waveform/waveformrendermarkrange.cpp' --- mixxx/src/waveform/waveformrendermarkrange.cpp 2011-10-30 15:10:10 +0000 +++ mixxx/src/waveform/waveformrendermarkrange.cpp 2011-11-26 15:02:38 +0000 @@ -197,7 +197,7 @@ if (m_iMarkStartPoint == -1 || m_iMarkEndPoint == -1) return; - double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel()*(1.0+rateAdjust); + double subpixelsPerPixel = (float)m_pParent->getSubpixelsPerPixel()*(1.0+rateAdjust) * m_pParent->getZoomFactor(); pPainter->save(); pPainter->scale(1.0/subpixelsPerPixel,1.0); === modified file 'mixxx/src/waveform/waveformrendersignal.cpp' --- mixxx/src/waveform/waveformrendersignal.cpp 2011-10-29 19:47:52 +0000 +++ mixxx/src/waveform/waveformrendersignal.cpp 2011-11-26 15:02:38 +0000 @@ -76,7 +76,7 @@ pPainter->setPen(signalColor); - const double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel() * (1.0 + rateAdjust); + const double subpixelsPerPixel = (float)m_pParent->getSubpixelsPerPixel() * (1.0 + rateAdjust) * m_pParent->getZoomFactor(); int subpixelWidth = int(m_iWidth * subpixelsPerPixel); @@ -109,23 +109,27 @@ // Only draw lines that we have provided pPainter->drawLines(lineData, subpixelWidth); - // Some of the pre-roll is on screen. Draw little triangles to indicate - // where the pre-roll is located. - if (iCurPos < 2*halfw) { - double start_index = 0; - int end_index = (halfw - 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); + //don't draw preroll if we are way zoomed out + if (m_pParent->getZoomFactor() <= 2) + { + // Some of the pre-roll is on screen. Draw little triangles to indicate + // where the pre-roll is located. + if (iCurPos < 2*halfw) { + double start_index = 0; + int end_index = (halfw - 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); - int index = end_index; - while (index > start_index) { - pPainter->drawPolygon(polygon); - polygon.translate(-polyWidth/subpixelsPerPixel, 0); - index -= polyWidth; + int index = end_index; + while (index > start_index) { + pPainter->drawPolygon(polygon); + polygon.translate(-polyWidth/subpixelsPerPixel, 0); + index -= polyWidth; + } } } pPainter->restore(); === modified file 'mixxx/src/waveform/waveformrendersignalpixmap.cpp' --- mixxx/src/waveform/waveformrendersignalpixmap.cpp 2011-03-27 06:22:41 +0000 +++ mixxx/src/waveform/waveformrendersignalpixmap.cpp 2011-11-26 15:02:38 +0000 @@ -67,7 +67,7 @@ if((iCurPos % 2) != 0) iCurPos--; - double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel() * (1.0 + rateAdjust); + double subpixelsPerPixel = (float)m_pParent->getSubpixelsPerPixel() * (1.0 + rateAdjust) * m_pParent->getZoomFactor(); int subpixelWidth = int(m_iWidth * subpixelsPerPixel); int pixelsToDraw = iCurPos - m_iLastPlaypos; === modified file 'mixxx/src/waveformviewerfactory.cpp' --- mixxx/src/waveformviewerfactory.cpp 2011-05-13 13:35:38 +0000 +++ mixxx/src/waveformviewerfactory.cpp 2011-11-26 15:02:38 +0000 @@ -4,6 +4,7 @@ #include #include "configobject.h" +#include "controlobject.h" #include "waveformviewerfactory.h" #include "sharedglcontext.h" === modified file 'mixxx/src/widget/wglwaveformviewer.cpp' --- mixxx/src/widget/wglwaveformviewer.cpp 2011-10-21 22:24:05 +0000 +++ mixxx/src/widget/wglwaveformviewer.cpp 2011-11-26 15:02:38 +0000 @@ -45,6 +45,8 @@ ControlObject::getControl(ConfigKey(m_pGroup, "rateRange"))); m_pRateDir = new ControlObjectThreadMain( ControlObject::getControl(ConfigKey(m_pGroup, "rate_dir"))); + m_pWaveformZoomFactor = new ControlObjectThreadMain( + ControlObject::getControl(ConfigKey("[Master]", "waveform_zoom_factor"))); setAcceptDrops(true); @@ -133,6 +135,10 @@ // Set the cursor to a hand while the mouse is down. setCursor(Qt::ClosedHandCursor); } + //reset zoom on right click + else if (m->button() == Qt::RightButton) { + m_pWaveformZoomFactor->slotSet(1.0); + } } else if(e->type() == QEvent::MouseMove) { // Only send signals for mouse moving if the left button is pressed if (m_iMouseStart != -1 && m_bScratching) { @@ -141,7 +147,7 @@ // Adjusts for one-to-one movement. Track sample rate in hundreds of // samples times two is the number of samples per pixel. rryan // 4/2011 - double samplesPerPixel = m_pTrackSampleRate->get() / 100.0 * 2; + double samplesPerPixel = m_pTrackSampleRate->get() / 100.0 * 2 * m_pWaveformZoomFactor->get(); // To take care of one one movement when zoom changes with pitch double rateAdjust = m_pRateDir->get() * @@ -160,6 +166,15 @@ setCursor(Qt::ArrowCursor); } m_iMouseStart = -1; + } else if(e->type() == QEvent::Wheel) { + QWheelEvent* w = dynamic_cast(e); + if (w->orientation() == Qt::Vertical) + { + double new_zoom = m_pWaveformZoomFactor->get() - (m_pWaveformZoomFactor->get() * (float)w->delta()) / 1200.0; + new_zoom = math_max(new_zoom, 0.05); + new_zoom = math_min(new_zoom, 6.0); + m_pWaveformZoomFactor->slotSet(new_zoom); + } } else { return QObject::eventFilter(o,e); } === modified file 'mixxx/src/widget/wglwaveformviewer.h' --- mixxx/src/widget/wglwaveformviewer.h 2011-10-19 19:46:20 +0000 +++ mixxx/src/widget/wglwaveformviewer.h 2011-11-26 15:02:38 +0000 @@ -64,6 +64,7 @@ ControlObjectThreadMain* m_pRate; ControlObjectThreadMain* m_pRateRange; ControlObjectThreadMain* m_pRateDir; + ControlObjectThreadMain* m_pWaveformZoomFactor; bool m_bScratching; bool m_painting;