=== modified file 'mixxx/res/skins/Collusion (1280)/skin.xml'
--- mixxx/res/skins/Collusion (1280)/skin.xml 2009-02-07 08:42:10 +0000
+++ mixxx/res/skins/Collusion (1280)/skin.xml 2009-11-18 00:45:30 +0000
@@ -1056,8 +1056,23 @@
#d1d1d1
#48839b
#48839b
- #222222
- true
+
+ cue_point
+ CUE
+
+
+ loop_start_position
+ loop_end_position
+ loop_enabled
+
+
+ loop_start_position
+ IN
+
+
+ loop_end_position
+ OUT
+
@@ -1069,8 +1084,23 @@
#d1d1d1
#9b4848
#9b4848
- #222222
- true
+
+ cue_point
+ CUE
+
+
+ loop_start_position
+ loop_end_position
+ loop_enabled
+
+
+ loop_start_position
+ IN
+
+
+ loop_end_position
+ OUT
+
=== modified file 'mixxx/res/skins/Collusion (1280-WS)/skin.xml'
--- mixxx/res/skins/Collusion (1280-WS)/skin.xml 2009-02-07 08:42:10 +0000
+++ mixxx/res/skins/Collusion (1280-WS)/skin.xml 2009-11-18 00:45:30 +0000
@@ -1056,8 +1056,23 @@
#d1d1d1
#48839b
#48839b
- #222222
- true
+
+ cue_point
+ CUE
+
+
+ loop_start_position
+ loop_end_position
+ loop_enabled
+
+
+ loop_start_position
+ IN
+
+
+ loop_end_position
+ OUT
+
@@ -1069,8 +1084,23 @@
#d1d1d1
#9b4848
#9b4848
- #222222
- true
+
+ cue_point
+ CUE
+
+
+ loop_start_position
+ loop_end_position
+ loop_enabled
+
+
+ loop_start_position
+ IN
+
+
+ loop_end_position
+ OUT
+
=== modified file 'mixxx/res/skins/hercules/skin.xml'
--- mixxx/res/skins/hercules/skin.xml 2009-02-07 08:42:10 +0000
+++ mixxx/res/skins/hercules/skin.xml 2009-11-18 00:45:30 +0000
@@ -199,6 +199,23 @@
#0000ff
#ffffff
true
+
+ cue_point
+ CUE
+
+
+ loop_start_position
+ loop_end_position
+ loop_enabled
+
+
+ loop_start_position
+ IN
+
+
+ loop_end_position
+ OUT
+
@@ -214,6 +231,23 @@
#ff0000
#ffffff
true
+
+ cue_point
+ CUE
+
+
+ loop_start_position
+ loop_end_position
+ loop_enabled
+
+
+ loop_start_position
+ IN
+
+
+ loop_end_position
+ OUT
+
=== modified file 'mixxx/res/skins/nCut/skin.xml'
--- mixxx/res/skins/nCut/skin.xml 2009-02-07 08:42:10 +0000
+++ mixxx/res/skins/nCut/skin.xml 2009-11-18 00:45:30 +0000
@@ -1109,6 +1109,23 @@
#ffffff
#ff0000
#404040
+
+ cue_point
+ CUE
+
+
+ loop_start_position
+ loop_end_position
+ loop_enabled
+
+
+ loop_start_position
+ IN
+
+
+ loop_end_position
+ OUT
+
@@ -1123,6 +1140,23 @@
#ffffff
#ff0000
#404040
+
+ cue_point
+ CUE
+
+
+ loop_start_position
+ loop_end_position
+ loop_enabled
+
+
+ loop_start_position
+ IN
+
+
+ loop_end_position
+ OUT
+
=== modified file 'mixxx/res/skins/outlineNetbook/skin.xml'
--- mixxx/res/skins/outlineNetbook/skin.xml 2009-10-03 09:01:50 +0000
+++ mixxx/res/skins/outlineNetbook/skin.xml 2009-11-18 00:45:30 +0000
@@ -1111,8 +1111,23 @@
#00ff00
#0000f0
#0000ff
- #ffffff
- true
+
+ cue_point
+ CUE
+
+
+ loop_start_position
+ loop_end_position
+ loop_enabled
+
+
+ loop_start_position
+ IN
+
+
+ loop_end_position
+ OUT
+
@@ -1124,8 +1139,23 @@
#00ff00
#f00000
#ff0000
- #ffffff
- true
+
+ cue_point
+ CUE
+
+
+ loop_start_position
+ loop_end_position
+ loop_enabled
+
+
+ loop_start_position
+ IN
+
+
+ loop_end_position
+ OUT
+
=== modified file 'mixxx/res/skins/outlineSmall/skin.xml'
--- mixxx/res/skins/outlineSmall/skin.xml 2009-03-17 13:49:05 +0000
+++ mixxx/res/skins/outlineSmall/skin.xml 2009-11-18 00:45:30 +0000
@@ -17,7 +17,7 @@
-50
-
+
5pm (Classic Mixxx)
@@ -983,8 +983,23 @@
#00ff00
#0000f0
#0000ff
- #ffffff
- true
+
+ cue_point
+ CUE
+
+
+ loop_start_position
+ loop_end_position
+ loop_enabled
+
+
+ loop_start_position
+ IN
+
+
+ loop_end_position
+ OUT
+
@@ -996,8 +1011,23 @@
#00ff00
#f00000
#ff0000
- #ffffff
- true
+
+ cue_point
+ CUE
+
+
+ loop_start_position
+ loop_end_position
+ loop_enabled
+
+
+ loop_start_position
+ IN
+
+
+ loop_end_position
+ OUT
+
=== modified file 'mixxx/res/skins/traditional/skin.xml'
--- mixxx/res/skins/traditional/skin.xml 2009-02-07 08:42:10 +0000
+++ mixxx/res/skins/traditional/skin.xml 2009-11-18 00:45:30 +0000
@@ -630,6 +630,23 @@
#0000ff
#ff0000
#404040
+
+ cue_point
+ CUE
+
+
+ loop_start_position
+ loop_end_position
+ loop_enabled
+
+
+ loop_start_position
+ IN
+
+
+ loop_end_position
+ OUT
+
@@ -641,6 +658,23 @@
#0000ff
#ff0000
#404040
+
+ cue_point
+ CUE
+
+
+ loop_start_position
+ loop_end_position
+ loop_enabled
+
+
+ loop_start_position
+ IN
+
+
+ loop_end_position
+ OUT
+
=== modified file 'mixxx/src/SConscript'
--- mixxx/src/SConscript 2009-11-18 00:14:40 +0000
+++ mixxx/src/SConscript 2009-11-18 00:45:31 +0000
@@ -434,11 +434,13 @@
widget/wwaveformviewer.cpp
widget/wglwaveformviewer.cpp
waveformviewerfactory.cpp
+ waveform/renderobject.cpp
waveform/waveformrenderer.cpp
waveform/waveformrenderbackground.cpp
waveform/waveformrendersignal.cpp
waveform/waveformrendersignalpixmap.cpp
waveform/waveformrendermark.cpp
+ waveform/waveformrendermarkrange.cpp
waveform/waveformrenderbeat.cpp
=== modified file 'mixxx/src/cachingreader.cpp'
--- mixxx/src/cachingreader.cpp 2009-10-19 01:18:59 +0000
+++ mixxx/src/cachingreader.cpp 2009-11-18 00:45:31 +0000
@@ -299,6 +299,7 @@
int CachingReader::read(int sample, int num_samples, CSAMPLE* buffer) {
// Check for bogus sample numbers
Q_ASSERT(sample >= 0);
+ Q_ASSERT(sample % 2 == 0);
Q_ASSERT(num_samples >= 0);
// If asked to read 0 samples, don't do anything. (this is a perfectly
=== modified file 'mixxx/src/configobject.cpp'
--- mixxx/src/configobject.cpp 2009-09-10 05:17:56 +0000
+++ mixxx/src/configobject.cpp 2009-11-18 00:45:31 +0000
@@ -46,6 +46,15 @@
item = i;
}
+// static
+ConfigKey ConfigKey::parseCommaSeparated(QString key) {
+ ConfigKey configKey;
+ int comma = key.indexOf(",");
+ configKey.group = key.left(comma);
+ configKey.item = key.mid(comma+1);
+ return configKey;
+}
+
ConfigValue::ConfigValue()
{
}
@@ -325,7 +334,7 @@
qConfigPath = CFStringGetCStringPtr(macPath, CFStringGetSystemEncoding());
qConfigPath.append("/Contents/Resources/"); //XXX this should really use QDir, this entire function should
#endif
- }
+ }
if (qConfigPath.length() == 0) qCritical() << "qConfigPath is empty, this can not be so -- did our developer forget to define one of __UNIX__, __WINDOWS__, __APPLE__??";
// If the directory does not end with a "/", add one
if (!qConfigPath.endsWith("/"))
=== modified file 'mixxx/src/configobject.h'
--- mixxx/src/configobject.h 2009-04-11 20:16:51 +0000
+++ mixxx/src/configobject.h 2009-11-18 00:45:31 +0000
@@ -48,7 +48,7 @@
public:
ConfigKey();
ConfigKey(QString g, QString i);
-
+ static ConfigKey parseCommaSeparated(QString key);
QString group, item;
};
=== modified file 'mixxx/src/engine/loopingcontrol.cpp'
--- mixxx/src/engine/loopingcontrol.cpp 2009-10-18 21:14:48 +0000
+++ mixxx/src/engine/loopingcontrol.cpp 2009-11-18 00:45:31 +0000
@@ -37,6 +37,10 @@
this, SLOT(slotReloopExit(double)));
m_pReloopExitButton->set(0);
+
+ m_pCOLoopEnabled = new ControlObject(ConfigKey(_group, "loop_enabled"));
+ m_pCOLoopEnabled->set(0.0f);
+
m_pCOLoopStartPosition =
new ControlObject(ConfigKey(_group, "loop_start_position"));
m_pCOLoopStartPosition->set(kNoTrigger);
@@ -156,8 +160,10 @@
m_iLoopEndSample = m_iCurrentSample;
m_pCOLoopEndPosition->set(m_iLoopEndSample);
if (m_iLoopStartSample != -1 &&
- m_iLoopEndSample != -1)
+ m_iLoopEndSample != -1) {
m_bLoopingEnabled = true;
+ m_pCOLoopEnabled->set(1.0f);
+ }
//qDebug() << "set loop_out to " << m_iLoopStartSample;
}
}
@@ -167,11 +173,14 @@
// If we're looping, stop looping
if (m_bLoopingEnabled) {
m_bLoopingEnabled = false;
+ m_pCOLoopEnabled->set(0.0f);
//qDebug() << "reloop_exit looping off";
} else {
// If we're not looping, jump to the loop-in point and start looping
- if (m_iLoopStartSample != -1 && m_iLoopEndSample != -1)
+ if (m_iLoopStartSample != -1 && m_iLoopEndSample != -1) {
m_bLoopingEnabled = true;
+ m_pCOLoopEnabled->set(1.0f);
+ }
//qDebug() << "reloop_exit looping on";
}
}
@@ -181,6 +190,7 @@
int newpos = pos;
if (newpos == -1.0f) {
m_bLoopingEnabled = false;
+ m_pCOLoopEnabled->set(0.0f);
}
if (newpos >= 0 && !even(newpos)) {
newpos--;
@@ -192,6 +202,7 @@
int newpos = pos;
if (newpos == -1.0f) {
m_bLoopingEnabled = false;
+ m_pCOLoopEnabled->set(0.0f);
}
if (newpos >= 0 && !even(newpos)) {
newpos--;
=== modified file 'mixxx/src/engine/loopingcontrol.h'
--- mixxx/src/engine/loopingcontrol.h 2009-10-18 21:14:48 +0000
+++ mixxx/src/engine/loopingcontrol.h 2009-11-18 00:45:31 +0000
@@ -55,6 +55,7 @@
private:
ControlObject* m_pCOLoopStartPosition;
ControlObject* m_pCOLoopEndPosition;
+ ControlObject* m_pCOLoopEnabled;
ControlPushButton* m_pLoopInButton;
ControlPushButton* m_pLoopOutButton;
ControlPushButton* m_pReloopExitButton;
=== modified file 'mixxx/src/waveform/renderobject.cpp'
--- mixxx/src/waveform/renderobject.cpp 2009-02-06 09:20:10 +0000
+++ mixxx/src/waveform/renderobject.cpp 2009-11-18 00:45:31 +0000
@@ -3,11 +3,10 @@
#include "renderobject.h"
-void RenderObject::resize(int w, int h) {
-}
-void RenderObject::setup(QDomNode node) {
-}
-void RenderObject::draw(QPainter *pPainter, QPaintEvent *pEvent, QVector *buffer, double playpos, double rateAdjust) {
-}
-void RenderObject::newTrack(TrackInfoObject *pTrack) {
+RenderObject::RenderObject() : QObject() {
+
+}
+
+RenderObject::~RenderObject() {
+
}
=== modified file 'mixxx/src/waveform/renderobject.h'
--- mixxx/src/waveform/renderobject.h 2009-02-06 09:20:10 +0000
+++ mixxx/src/waveform/renderobject.h 2009-11-18 00:45:31 +0000
@@ -12,15 +12,16 @@
class TrackInfoObject;
class RenderObject : public QObject {
-
+ Q_OBJECT
public:
- RenderObject() {}
- ~RenderObject() {}
+ explicit RenderObject();
+ virtual ~RenderObject();
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;
+ virtual void draw(QPainter *pPainter, QPaintEvent *pEvent,
+ QVector *buffer, double playpos,
+ double rateAdjust) = 0;
virtual void newTrack(TrackInfoObject *pTrack) = 0;
-
};
#endif
=== modified file 'mixxx/src/waveform/waveformrenderer.cpp'
--- mixxx/src/waveform/waveformrenderer.cpp 2009-09-22 20:11:11 +0000
+++ mixxx/src/waveform/waveformrenderer.cpp 2009-11-18 00:45:31 +0000
@@ -7,6 +7,7 @@
#include
#include
#include
+#include
#include
#include
@@ -16,6 +17,7 @@
#include "waveformrenderbackground.h"
#include "waveformrenderbeat.h"
#include "waveformrendermark.h"
+#include "waveformrendermarkrange.h"
#include "waveformrendersignal.h"
#include "waveformrendersignalpixmap.h"
#include "trackinfoobject.h"
@@ -34,7 +36,7 @@
double msecs_old = 0, msecs_elapsed = 0;
while(!m_bQuit) {
-
+
if(m_iLatency != 0 && m_dPlayPos != -1 && m_dPlayPosOld != -1 && m_iNumSamples != 0) {
QTime now = QTime::currentTime();
double msecs_elapsed = m_playPosTime.msecsTo(now);
@@ -42,67 +44,77 @@
double adjust = (m_dPlayPos - m_dPlayPosOld) * math_min(1.0f, timeratio);
m_dPlayPosAdjust = adjust;
}
-
+
QThread::msleep(6);
}
-
+
}
WaveformRenderer::WaveformRenderer(const char* group) :
QThread(),
+ m_pGroup(group),
m_iWidth(0),
m_iHeight(0),
- m_iNumSamples(0),
bgColor(0,0,0),
signalColor(255,255,255),
colorMarker(255,255,255),
colorBeat(255,255,255),
colorCue(255,255,255),
+ m_iNumSamples(0),
+ m_iPlayPosTime(-1),
+ m_iPlayPosTimeOld(-1),
+ m_dPlayPos(0),
+ m_dPlayPosOld(-1),
+ m_dRate(0),
+ m_dRateRange(0),
+ m_dRateDir(0),
+ m_iDupes(0),
+ m_dPlayPosAdjust(0),
+ m_iLatency(0),
+ m_pSampleBuffer(NULL),
+ m_pPixmap(NULL),
+ m_pImage(),
m_iSubpixelsPerPixel(DEFAULT_SUBPIXELS_PER_PIXEL),
m_iPixelsPerSecond(DEFAULT_PIXELS_PER_SECOND),
- m_pImage(),
- m_dPlayPos(0),
- m_dPlayPosOld(-1),
- m_iPlayPosTime(-1),
- m_iPlayPosTimeOld(-1),
m_pTrack(NULL),
- m_pSampleBuffer(NULL),
- m_dPlayPosAdjust(0),
- m_iDupes(0),
m_bQuit(false)
{
- m_pPlayPos = new ControlObjectThreadMain(ControlObject::getControl(ConfigKey(group,"visual_playposition")));
+ m_pPlayPos = new ControlObjectThreadMain(
+ ControlObject::getControl(ConfigKey(group,"visual_playposition")));
if(m_pPlayPos != NULL)
- connect(m_pPlayPos, SIGNAL(valueChanged(double)), this, SLOT(slotUpdatePlayPos(double)));
-
-
- m_pLatency = new ControlObjectThreadMain(ControlObject::getControl(ConfigKey("[Master]","latency")));
+ connect(m_pPlayPos, SIGNAL(valueChanged(double)),
+ this, SLOT(slotUpdatePlayPos(double)));
+
+
+ m_pLatency = new ControlObjectThreadMain(
+ ControlObject::getControl(ConfigKey("[Master]","latency")));
if(m_pLatency != NULL)
- connect(m_pLatency, SIGNAL(valueChanged(double)), this, SLOT(slotUpdateLatency(double)));
-
+ connect(m_pLatency, SIGNAL(valueChanged(double)),
+ this, SLOT(slotUpdateLatency(double)));
+
m_pRenderBackground = new WaveformRenderBackground(group, this);
m_pRenderSignal = new WaveformRenderSignal(group, this);
m_pRenderSignalPixmap = new WaveformRenderSignalPixmap(group, this);
m_pRenderBeat = new WaveformRenderBeat(group, this);
- m_pRenderCue = new WaveformRenderMark(group, ConfigKey(group, "cue_point"), this);
- m_pRenderLoopStart = new WaveformRenderMark(group, ConfigKey(group, "loop_start_position"), this);
- m_pRenderLoopEnd = new WaveformRenderMark(group, ConfigKey(group, "loop_end_position"), this);
m_pCOVisualResample = new ControlObject(ConfigKey(group, "VisualResample"));
- m_pRate = new ControlObjectThreadMain(ControlObject::getControl(ConfigKey(group, "rate")));
+ m_pRate = new ControlObjectThreadMain(
+ ControlObject::getControl(ConfigKey(group, "rate")));
if(m_pRate != NULL) {
connect(m_pRate, SIGNAL(valueChanged(double)),
this, SLOT(slotUpdateRate(double)));
}
- m_pRateRange = new ControlObjectThreadMain(ControlObject::getControl(ConfigKey(group, "rateRange")));
+ m_pRateRange = new ControlObjectThreadMain(
+ ControlObject::getControl(ConfigKey(group, "rateRange")));
if(m_pRateRange != NULL) {
connect(m_pRateRange, SIGNAL(valueChanged(double)),
this, SLOT(slotUpdateRateRange(double)));
}
- m_pRateDir = new ControlObjectThreadMain(ControlObject::getControl(ConfigKey(group, "rate_dir")));
+ m_pRateDir = new ControlObjectThreadMain(
+ ControlObject::getControl(ConfigKey(group, "rate_dir")));
if (m_pRateDir) {
connect(m_pRateDir, SIGNAL(valueChanged(double)),
this, SLOT(slotUpdateRateDir(double)));
@@ -117,7 +129,7 @@
// Wait for the thread to quit
m_bQuit = true;
QThread::wait();
-
+
if(m_pCOVisualResample)
delete m_pCOVisualResample;
m_pCOVisualResample = NULL;
@@ -125,7 +137,7 @@
if(m_pRate)
delete m_pRate;
m_pRate = NULL;
-
+
if(m_pRateRange)
delete m_pRateRange;
m_pRateRange = NULL;
@@ -145,38 +157,24 @@
if(m_pRenderSignalPixmap)
delete m_pRenderSignalPixmap;
m_pRenderSignalPixmap = NULL;
-
+
if(m_pRenderSignal)
delete m_pRenderSignal;
m_pRenderSignal = NULL;
-
+
if(m_pRenderBeat)
delete m_pRenderBeat;
m_pRenderBeat = NULL;
-
- if(m_pRenderCue)
- delete m_pRenderCue;
- m_pRenderCue = NULL;
-
- if(m_pRenderLoopStart)
- delete m_pRenderLoopStart;
- m_pRenderLoopStart = NULL;
-
- if(m_pRenderLoopEnd)
- delete m_pRenderLoopEnd;
- m_pRenderLoopEnd = NULL;
-
}
void WaveformRenderer::slotUpdatePlayPos(double v) {
m_iPlayPosTimeOld = m_iPlayPosTime;
m_playPosTimeOld = m_playPosTime;
- m_dPlayPosOld = m_dPlayPos;
+ m_dPlayPosOld = m_dPlayPos;
m_dPlayPos = v;
m_iPlayPosTime = clock();
m_playPosTime = QTime::currentTime();
-
m_iDupes = 0;
m_dPlayPosAdjust = 0;
}
@@ -208,9 +206,12 @@
m_pRenderSignal->resize(w,h);
m_pRenderSignalPixmap->resize(w,h);
m_pRenderBeat->resize(w,h);
- m_pRenderCue->resize(w,h);
- m_pRenderLoopStart->resize(w,h);
- m_pRenderLoopEnd->resize(w,h);
+
+ QListIterator iter(m_renderObjects);
+ while (iter.hasNext()) {
+ RenderObject* ro = iter.next();
+ ro->resize(w,h);
+ }
}
void WaveformRenderer::setupControlObjects() {
@@ -222,7 +223,7 @@
// Let a sample be a sample in the original song.
// Let a downsample be a sample in the downsampled buffer
// Let a pixel be a pixel on the screen.
-
+
// W samples -> X downsamples -> Y pixels
// We start with the restriction that we desire 1 second of
@@ -244,7 +245,7 @@
// We combine 1 and 2 into one constraint:
// (f/z) = mn, or f = m * n * z
-
+
// REQUIRE : M * N * Z = F
// M : DOWNSAMPLES PER PIXEL
// N : SAMPLES PER DOWNSAMPLE
@@ -258,10 +259,10 @@
double m = m_iSubpixelsPerPixel; // M DOWNSAMPLES PER PIXEL
double z = m_iPixelsPerSecond; // Z PIXELS REPRESENTS 1 SECOND OF DATA
-
+
m_pCOVisualResample->set(m*z);
- qDebug() << "WaveformRenderer::setupControlObjects - VisualResample: " << m*z;
+ //qDebug() << "WaveformRenderer::setupControlObjects - VisualResample: " << m*z;
}
@@ -270,13 +271,9 @@
bgColor.setNamedColor(WWidget::selectNodeQString(node, "BgColor"));
bgColor = WSkinColor::getCorrectColor(bgColor);
- qDebug() << "Got bgColor " << bgColor;
-
signalColor.setNamedColor(WWidget::selectNodeQString(node, "SignalColor"));
signalColor = WSkinColor::getCorrectColor(signalColor);
- qDebug() << "Got signalColor " << signalColor;
-
colorMarker.setNamedColor(WWidget::selectNodeQString(node, "MarkerColor"));
colorMarker = WSkinColor::getCorrectColor(colorMarker);
@@ -286,13 +283,33 @@
colorCue.setNamedColor(WWidget::selectNodeQString(node, "CueColor"));
colorCue = WSkinColor::getCorrectColor(colorCue);
+ while (m_renderObjects.size() > 0) {
+ RenderObject* ro = m_renderObjects.takeFirst();
+ delete ro;
+ }
+
+ // Process any nodes
+ QDomNode child = node.firstChild();
+ while (!child.isNull()) {
+ RenderObject* pRenderObject = NULL;
+ if (child.nodeName() == "Mark") {
+ pRenderObject = new WaveformRenderMark(m_pGroup, this);
+ } else if(child.nodeName() == "MarkRange") {
+ pRenderObject = new WaveformRenderMarkRange(m_pGroup, this);
+ }
+ if (pRenderObject != NULL) {
+ if (m_pTrack != NULL)
+ pRenderObject->newTrack(m_pTrack);
+ pRenderObject->setup(child);
+ m_renderObjects.push_back(pRenderObject);
+ }
+ child = child.nextSibling();
+ }
+
m_pRenderBackground->setup(node);
m_pRenderSignal->setup(node);
m_pRenderSignalPixmap->setup(node);
m_pRenderBeat->setup(node);
- m_pRenderCue->setup(node);
- m_pRenderLoopStart->setup(node);
- m_pRenderLoopEnd->setup(node);
}
@@ -305,7 +322,7 @@
int monoSamples = (m_iNumSamples >> 3);
qDebug() << monoSamples << " samples for qimage";
QImage qi(monoSamples, m_iHeight, QImage::Format_RGB32);
-
+
QPainter paint;
paint.begin(&qi);
@@ -319,7 +336,7 @@
//paint.drawLine(QLine(i,0,i,m_iHeight/2));
//paint.drawLine(QLine(i,0,i,m_iHeight/2));
//}
-
+
for(int i=0;isize();
}
-
+
QPainter paint;
paint.begin(pm);
@@ -358,7 +375,7 @@
paint.translate(0,m_iHeight/2);
paint.scale(1.0,-1.0);
//paint.drawLine(QLine(0,0,resultSamples/2,0));
-
+
for(int i=0;iget();
int iCurPos = (int)(m_dPlayPos*m_pImage.width());
-
+
int halfw = m_iWidth/2;
int halfh = m_iHeight/2;
@@ -440,14 +457,14 @@
if(m_iWidth == 0 || m_iHeight == 0)
return;
-
+
/*
if(m_dPlayPos != -1 && m_dPlayPosOld != -1 && m_iNumSamples != 0) {
static double elatency = ControlObject::getControl(ConfigKey("[Master]","latency"))->get();
double latency = elatency;
latency *= 4;
latency *= CLOCKS_PER_SEC / 1000.0;
-
+
//int latency = m_iPlayPosTime - m_iPlayPosTimeOld;
double timeelapsed = (clock() - m_iPlayPosTime);
double timeratio = 0;
@@ -458,7 +475,7 @@
double timerun = m_iPlayPosTime - m_iPlayPosTimeOld;
-
+
playposadjust = ((m_dPlayPos*m_iNumSamples) - (m_dPlayPosOld*m_iNumSamples)) * timeelapsed;
playposadjust /= (latency*m_iNumSamples);
@@ -494,21 +511,23 @@
// Now scale so that positive-y points up.
pPainter->scale(1.0,-1.0);
-
+
// 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);
-
// Draw various markers.
- m_pRenderBeat->draw(pPainter,pEvent, m_pSampleBuffer, playpos, rateAdjust);
- m_pRenderCue->draw(pPainter,pEvent, m_pSampleBuffer, playpos, rateAdjust);
- m_pRenderLoopStart->draw(pPainter, pEvent, m_pSampleBuffer, playpos, rateAdjust);
- m_pRenderLoopEnd->draw(pPainter, pEvent, m_pSampleBuffer, playpos, rateAdjust);
-
+ m_pRenderBeat->draw(pPainter, pEvent, m_pSampleBuffer, playpos, rateAdjust);
+
+ QListIterator iter(m_renderObjects);
+ while (iter.hasNext()) {
+ RenderObject* ro = iter.next();
+ ro->draw(pPainter, pEvent, m_pSampleBuffer, playpos, rateAdjust);
+ }
+
pPainter->setPen(colorMarker);
-
+
// Draw the center vertical line
pPainter->drawLine(QLineF(m_iWidth/2.0,m_iHeight/2.0,m_iWidth/2.0,-m_iHeight/2.0));
@@ -526,9 +545,12 @@
m_pRenderSignal->newTrack(pTrack);
m_pRenderSignalPixmap->newTrack(pTrack);
m_pRenderBeat->newTrack(pTrack);
- m_pRenderCue->newTrack(pTrack);
- m_pRenderLoopStart->newTrack(pTrack);
- m_pRenderLoopEnd->newTrack(pTrack);
+
+ QListIterator iter(m_renderObjects);
+ while (iter.hasNext()) {
+ RenderObject* ro = iter.next();
+ ro->newTrack(pTrack);
+ }
}
int WaveformRenderer::getPixelsPerSecond() {
@@ -538,4 +560,3 @@
int WaveformRenderer::getSubpixelsPerPixel() {
return m_iSubpixelsPerPixel;
}
-
=== modified file 'mixxx/src/waveform/waveformrenderer.h'
--- mixxx/src/waveform/waveformrenderer.h 2009-09-22 20:11:11 +0000
+++ mixxx/src/waveform/waveformrenderer.h 2009-11-18 00:45:31 +0000
@@ -3,17 +3,20 @@
#define WAVEFORMRENDERER_H
#include
+#include
+#include
+#include
#include
#include
+#include
+#include
#include
-#include
-#include
#include "defs.h"
class TrackInfoObject;
class ControlObjectThreadMain;
-class QDomNode;
+class RenderObject;
class WaveformRenderBackground;
class WaveformRenderSignal;
class WaveformRenderSignalPixmap;
@@ -34,6 +37,7 @@
void precomputePixmap();
int getSubpixelsPerPixel();
int getPixelsPerSecond();
+
public slots:
void slotNewTrack(TrackInfoObject *pTrack);
void slotUpdateLatency(double latency);
@@ -41,13 +45,15 @@
void slotUpdateRate(double rate);
void slotUpdateRateRange(double rate_range);
void slotUpdateRateDir(double rate_dir);
-
+
protected:
void run();
private:
void setupControlObjects();
bool fetchWaveformFromTrack();
+
+ const char* m_pGroup;
int m_iWidth, m_iHeight;
QColor bgColor, signalColor, colorMarker, colorBeat, colorCue;
int m_iNumSamples;
@@ -58,7 +64,6 @@
int m_iDupes;
double m_dPlayPosAdjust;
int m_iLatency;
-
QVector *m_pSampleBuffer;
QPixmap *m_pPixmap;
@@ -69,23 +74,21 @@
ControlObjectThreadMain *m_pRate;
ControlObjectThreadMain *m_pRateRange;
ControlObjectThreadMain *m_pRateDir;
-
+
ControlObject *m_pCOVisualResample;
WaveformRenderBackground *m_pRenderBackground;
WaveformRenderSignal *m_pRenderSignal;
WaveformRenderSignalPixmap *m_pRenderSignalPixmap;
WaveformRenderBeat *m_pRenderBeat;
- WaveformRenderMark *m_pRenderCue;
- WaveformRenderMark *m_pRenderLoopStart;
- WaveformRenderMark *m_pRenderLoopEnd;
+
+ QList m_renderObjects;
const int m_iSubpixelsPerPixel;
const int m_iPixelsPerSecond;
TrackInfoObject *m_pTrack;
bool m_bQuit;
-
};
#endif
=== modified file 'mixxx/src/waveform/waveformrendermark.cpp'
--- mixxx/src/waveform/waveformrendermark.cpp 2009-02-06 09:29:07 +0000
+++ mixxx/src/waveform/waveformrendermark.cpp 2009-11-18 00:45:31 +0000
@@ -17,22 +17,25 @@
#include "widget/wwidget.h"
#include "trackinfoobject.h"
-WaveformRenderMark::WaveformRenderMark(const char *group, ConfigKey key, WaveformRenderer *parent) {
-
- m_pParent = parent;
- m_key = key;
-
- m_iMarkPoint = -1;
- m_iSampleRate = -1;
- m_dSamplesPerDownsample = -1;
- m_iNumSamples = 0;
-
- m_pMarkPoint = new ControlObjectThreadMain(ControlObject::getControl(key));
- connect(m_pMarkPoint, SIGNAL(valueChanged(double)), this, SLOT(slotUpdateMarkPoint(double)));
-
- m_pTrackSamples = new ControlObjectThreadMain(ControlObject::getControl(ConfigKey(group,"track_samples")));
+WaveformRenderMark::WaveformRenderMark(const char* pGroup,
+ WaveformRenderer *parent)
+ : m_pGroup(pGroup),
+ m_pParent(parent),
+ m_pMarkPoint(NULL),
+ m_pTrackSamples(NULL),
+ m_pTrack(NULL),
+ m_iMarkPoint(-1),
+ m_iWidth(0),
+ m_iHeight(0),
+ m_dSamplesPerDownsample(-1),
+ m_iNumSamples(0),
+ m_iSampleRate(-1) {
+
+ m_pTrackSamples = new ControlObjectThreadMain(
+ ControlObject::getControl(ConfigKey(pGroup,"track_samples")));
slotUpdateTrackSamples(m_pTrackSamples->get());
- connect(m_pTrackSamples, SIGNAL(valueChanged(double)), this, SLOT(slotUpdateTrackSamples(double)));
+ connect(m_pTrackSamples, SIGNAL(valueChanged(double)),
+ this, SLOT(slotUpdateTrackSamples(double)));
}
void WaveformRenderMark::slotUpdateMarkPoint(double v) {
@@ -69,45 +72,237 @@
m_dSamplesPerDownsample = n;
+ // TODO(rryan) This will possibly get us into trouble, because track samples
+ // might not be updated yet.
+ slotUpdateTrackSamples(m_pTrackSamples->get());
+ if (m_pMarkPoint)
+ slotUpdateMarkPoint(m_pMarkPoint->get());
}
void WaveformRenderMark::setup(QDomNode node) {
-
- markColor.setNamedColor(WWidget::selectNodeQString(node, "CueColor"));
- markColor = WSkinColor::getCorrectColor(markColor);
-
+ ConfigKey configKey;
+ configKey.group = m_pGroup;
+ configKey.item = WWidget::selectNodeQString(node, "Control");
+
+ if (m_pMarkPoint) {
+ // Disconnect the old control
+ disconnect(m_pMarkPoint, 0, this, 0);
+ delete m_pMarkPoint;
+ m_pMarkPoint = NULL;
+ }
+
+ m_pMarkPoint = new ControlObjectThreadMain(
+ ControlObject::getControl(configKey));
+ slotUpdateMarkPoint(m_pMarkPoint->get());
+ connect(m_pMarkPoint, SIGNAL(valueChanged(double)),
+ this, SLOT(slotUpdateMarkPoint(double)));
+
+ // Read the mark color, otherwise get MarkerColor of the Visual element
+ QString markColor = WWidget::selectNodeQString(node, "Color");
+ if (markColor == "") {
+ // As a fallback, grab the mark color from the parent's MarkerColor
+ markColor = WWidget::selectNodeQString(node.parentNode(), "MarkerColor");
+ qDebug() << "Didn't get mark Color, using parent's MarkerColor:"
+ << markColor;
+ m_markColor.setNamedColor(markColor);
+ // m_markColor = QColor(255 - m_markColor.red(),
+ // 255 - m_markColor.green(),
+ // 255 - m_markColor.blue());
+ } else {
+ m_markColor.setNamedColor(markColor);
+ }
+ m_markColor = WSkinColor::getCorrectColor(m_markColor);
+
+ // Read the text color, otherwise use the parent's BgColor.
+ QString textColor = WWidget::selectNodeQString(node, "TextColor");
+ if (textColor == "") {
+ textColor = WWidget::selectNodeQString(node.parentNode(), "BgColor");
+ qDebug() << "Didn't get mark TextColor, using parent's BgColor:"
+ << textColor;
+ m_textColor.setNamedColor(textColor);
+ // m_textColor = QColor(255 - m_textColor.red(),
+ // 255 - m_textColor.green(),
+ // 255 - m_textColor.blue());
+ } else {
+ m_textColor.setNamedColor(textColor);
+ }
+ m_textColor = WSkinColor::getCorrectColor(m_textColor);
+
+ QString markAlign = WWidget::selectNodeQString(node, "Align");
+ if (markAlign.compare("center", Qt::CaseInsensitive) == 0) {
+ m_markAlign = WaveformRenderMark::CENTER;
+ } else if (markAlign.compare("bottom", Qt::CaseInsensitive) == 0) {
+ m_markAlign = WaveformRenderMark::BOTTOM;
+ } else {
+ // Default
+ m_markAlign = WaveformRenderMark::TOP;
+ }
+
+ // Read the mark's text
+ m_markText = WWidget::selectNodeQString(node, "Text");
+ m_markPixmapPath = WWidget::selectNodeQString(node,"Pixmap");
+
+ setupMarkPixmap();
}
-void WaveformRenderMark::draw(QPainter *pPainter, QPaintEvent *event, QVector *buffer, double dPlayPos, double rateAdjust) {
-
- if(m_iSampleRate == -1 || m_iSampleRate == 0 || m_iNumSamples == 0)
+void WaveformRenderMark::draw(QPainter *pPainter, QPaintEvent *event,
+ QVector *buffer, double dPlayPos,
+ double rateAdjust) {
+ if (m_iSampleRate == -1 || m_iSampleRate == 0 || m_iNumSamples == 0)
return;
// necessary?
- if(buffer == NULL)
+ if (buffer == NULL)
return;
double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel()*(1.0+rateAdjust);
pPainter->save();
pPainter->scale(1.0/subpixelsPerPixel,1.0);
- pPainter->setPen(markColor);
-
+ QPen oldPen = pPainter->pen();
+ QBrush oldBrush = pPainter->brush();
+
double subpixelWidth = m_iWidth * subpixelsPerPixel;
double subpixelHalfWidth = subpixelWidth / 2.0;
double halfh = m_iHeight/2;
-
- if(m_iMarkPoint != -1) {
+
+ if (m_iMarkPoint != -1) {
double markPointMono = m_iMarkPoint >> 1;
double curPos = dPlayPos * (m_iNumSamples/2);
double i = (markPointMono - curPos)/m_dSamplesPerDownsample;
-
- if(abs(i) < subpixelHalfWidth) {
+
+ if (abs(i) < subpixelHalfWidth) {
double x = (i+subpixelHalfWidth);
+ QPen newPen = QPen(m_markColor);
+ newPen.setWidth(subpixelsPerPixel*2);
+ pPainter->setPen(newPen);
pPainter->drawLine(QLineF(x, halfh, x, -halfh));
+
+ pPainter->setPen(m_markColor);
+ pPainter->setBrush(QBrush(m_markColor));
+ QPolygonF topTriangle;
+ QPolygonF bottomTriangle;
+ double triWidth = subpixelsPerPixel * 8.0;
+ double triHeight = 10.0;
+ topTriangle << QPointF(x - 1 - triWidth/2.0f, halfh)
+ << QPointF(x + 1 + triWidth/2.0f, halfh)
+ << QPointF(x, halfh - triHeight);
+ bottomTriangle << QPointF(x - triWidth/2.0f, -halfh)
+ << QPointF(x + 1 + triWidth/2.0f, -halfh)
+ << QPointF(x, -halfh + triHeight);
+ pPainter->drawPolygon(topTriangle);
+ pPainter->drawPolygon(bottomTriangle);
+
+ if (!m_markPixmap.isNull()) {
+ pPainter->scale(subpixelsPerPixel, -1.0);
+ x = x / subpixelsPerPixel;
+ int pw = m_markPixmap.width();
+ int ph = m_markPixmap.height();
+
+ // Draw the pixmap in the right place
+ switch (m_markAlign) {
+ case WaveformRenderMark::BOTTOM:
+ // Bottom
+ pPainter->drawPixmap(x - pw/2.0, halfh - ph, m_markPixmap);
+ break;
+ case WaveformRenderMark::CENTER:
+ // Center
+ pPainter->drawPixmap(x - pw/2.0, 0 - ph/2.0, m_markPixmap);
+ break;
+ case WaveformRenderMark::TOP:
+ default:
+ // Top
+ pPainter->drawPixmap(x - pw/2.0, -halfh + 2.0, m_markPixmap);
+ break;
+ }
+ }
}
}
+ pPainter->setPen(oldPen);
+ pPainter->setBrush(oldBrush);
pPainter->restore();
}
+
+void WaveformRenderMark::setupMarkPixmap() {
+ // Load the pixmap from file -- takes precedence over text.
+ if (m_markPixmapPath != "") {
+ // TODO(XXX) We could use WPixmapStore here, which would recolor the
+ // pixmap according to the theme. Then we would have to worry about
+ // deleting it -- for now we'll just load the pixmap directly.
+ m_markPixmap = QPixmap(WWidget::getPath(m_markPixmapPath));
+
+ // If loading the pixmap didn't fail, then we're done. Otherwise fall
+ // through and render a label.
+ if (!m_markPixmap.isNull()) {
+ return;
+ }
+ }
+
+ // If no text is provided, leave m_markPixmap as a null pixmap
+ if (m_markText == "") {
+ return;
+ }
+
+ //QFont font("Bitstream Vera Sans");
+ //QFont font("Helvetica");
+ QFont font; // Uses the application default
+ font.setPointSize(8);
+ //font.setWeight(QFont::Bold);
+ //font.setLetterSpacing(QFont::AbsoluteSpacing, -1);
+
+ QFontMetrics metrics(font);
+
+ // Add left and right margins of one characters worth (based on average
+ // pixels / character).
+ double wordWidth = metrics.boundingRect(m_markText).width();
+ double wordHeight = metrics.height();
+
+ // A sensible margin for the horizontal is a quarter of the average
+ // character width.
+ //int marginX = wordWidth/m_markText.size()/4;
+ //int marginX = metrics.maxWidth() / 4;
+ double marginX = metrics.averageCharWidth() / 4.0;
+
+ double marginY = 0; // .1 * wordHeight
+
+ double markWidth = wordWidth + 2*marginX;
+ double markHeight = wordHeight + 2*marginY;
+
+ QRectF internalRect(marginX, marginY, wordWidth-1, wordHeight-1);
+ QRectF externalRect(0, 0, markWidth-1, markHeight-1);
+
+ m_markPixmap = QPixmap(markWidth, markHeight);
+
+ // Fill with transparent pixels
+ m_markPixmap.fill(QColor(0,0,0,0));
+
+ QPainter painter(&m_markPixmap);
+ painter.setRenderHint(QPainter::TextAntialiasing);
+ //painter.setRenderHint(QPainter::Antialiasing);
+ painter.setRenderHint(QPainter::HighQualityAntialiasing);
+ painter.setBackgroundMode(Qt::TransparentMode);
+ painter.setFont(font);
+ QColor color = m_textColor;
+ color = QColor(0xff - color.red(),
+ 0xff - color.green(),
+ 0xff - color.blue(),
+ 128);
+ painter.setPen(color);
+ painter.setBrush(QBrush(color));
+
+ // Stuff to test that the rectangles are correct.
+ //painter.setBrush(QBrush());
+ //painter.drawRect(externalRect);
+ //painter.drawRect(internalRect);
+
+ //painter.setBrush(QBrush());
+ //painter.drawRoundedRect(externalRect, 25, 60, Qt::RelativeSize);
+ painter.drawRoundedRect(externalRect, 2, 2);
+
+ painter.setPen(m_textColor);
+ painter.drawText(internalRect,
+ Qt::AlignCenter,
+ m_markText);
+}
=== modified file 'mixxx/src/waveform/waveformrendermark.h'
--- mixxx/src/waveform/waveformrendermark.h 2009-02-06 09:20:10 +0000
+++ mixxx/src/waveform/waveformrendermark.h 2009-11-18 00:45:31 +0000
@@ -4,6 +4,7 @@
#include
#include
+#include
#include
class QDomNode;
@@ -11,7 +12,7 @@
class QPaintEvent;
#include "configobject.h"
-#include "renderobject.h"
+#include "waveform/renderobject.h"
class ConfigKey;
class ControlObjectThreadMain;
@@ -21,16 +22,27 @@
class WaveformRenderMark : public RenderObject {
Q_OBJECT
public:
- WaveformRenderMark(const char *group, ConfigKey key, WaveformRenderer *parent);
+ explicit WaveformRenderMark(const char* pGroup,
+ WaveformRenderer *parent);
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, double rateAdjust);
void newTrack(TrackInfoObject *pTrack);
public slots:
void slotUpdateMarkPoint(double mark);
void slotUpdateTrackSamples(double samples);
private:
+ void setupMarkPixmap();
+
+ enum MarkAlign {
+ TOP = 0,
+ BOTTOM,
+ CENTER
+ };
+
+ const char* m_pGroup;
WaveformRenderer *m_pParent;
ControlObjectThreadMain *m_pMarkPoint;
ControlObjectThreadMain *m_pTrackSamples;
@@ -38,11 +50,14 @@
int m_iMarkPoint;
int m_iWidth, m_iHeight;
- QColor markColor;
+ QColor m_markColor;
+ QColor m_textColor;
+ QString m_markText;
+ QString m_markPixmapPath;
+ MarkAlign m_markAlign;
+ QPixmap m_markPixmap;
double m_dSamplesPerDownsample;
- ConfigKey m_key;
-
int m_iNumSamples;
int m_iSampleRate;
};
=== added file 'mixxx/src/waveform/waveformrendermarkrange.cpp'
--- mixxx/src/waveform/waveformrendermarkrange.cpp 1970-01-01 00:00:00 +0000
+++ mixxx/src/waveform/waveformrendermarkrange.cpp 2009-11-18 00:45:31 +0000
@@ -0,0 +1,233 @@
+// waveformrendermarkrange.cpp
+// Created 11/14/2009 by RJ Ryan (rryan@mit.edu)
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "waveformrendermarkrange.h"
+
+#include "waveformrenderer.h"
+#include "configobject.h"
+#include "controlobjectthreadmain.h"
+#include "controlobject.h"
+#include "widget/wskincolor.h"
+#include "widget/wwidget.h"
+#include "trackinfoobject.h"
+
+WaveformRenderMarkRange::WaveformRenderMarkRange(const char* pGroup,
+ WaveformRenderer *parent)
+ : m_pGroup(pGroup),
+ m_pParent(parent),
+ m_pMarkStartPoint(NULL),
+ m_pMarkEndPoint(NULL),
+ m_pMarkEnabled(NULL),
+ m_pTrackSamples(NULL),
+ m_pTrack(NULL),
+ m_bMarkEnabled(true),
+ m_iMarkStartPoint(-1),
+ m_iMarkEndPoint(-1),
+ m_iWidth(0),
+ m_iHeight(0),
+ m_dSamplesPerDownsample(-1),
+ m_iNumSamples(0),
+ m_iSampleRate(-1) {
+
+ m_pTrackSamples = new ControlObjectThreadMain(
+ ControlObject::getControl(ConfigKey(pGroup,"track_samples")));
+ slotUpdateTrackSamples(m_pTrackSamples->get());
+ connect(m_pTrackSamples, SIGNAL(valueChanged(double)),
+ this, SLOT(slotUpdateTrackSamples(double)));
+}
+
+void WaveformRenderMarkRange::slotUpdateMarkStartPoint(double v) {
+ //qDebug() << "WaveformRenderMarkRange :: MarkStartPoint = " << v;
+ m_iMarkStartPoint = (int)v;
+}
+
+void WaveformRenderMarkRange::slotUpdateMarkEndPoint(double v) {
+ //qDebug() << "WaveformRenderMarkRange :: MarkEndPoint = " << v;
+ m_iMarkEndPoint = (int)v;
+}
+
+void WaveformRenderMarkRange::slotUpdateMarkEnabled(double v) {
+ //qDebug() << "WaveformRenderMarkRange :: MarkEnabled = " << v;
+ m_bMarkEnabled = !(v == 0.0f);
+}
+
+void WaveformRenderMarkRange::slotUpdateTrackSamples(double samples) {
+ //qDebug() << "WaveformRenderMarkRange :: samples = " << int(samples);
+ m_iNumSamples = (int)samples;
+}
+
+void WaveformRenderMarkRange::resize(int w, int h) {
+ m_iWidth = w;
+ m_iHeight = h;
+}
+
+void WaveformRenderMarkRange::newTrack(TrackInfoObject* pTrack) {
+ m_pTrack = pTrack;
+ m_iMarkStartPoint = -1;
+ m_iMarkEndPoint = -1;
+ m_bMarkEnabled = true;
+ m_iNumSamples = 0;
+
+ // calculate beat info for this track:
+
+ int sampleRate = pTrack->getSampleRate();
+
+ // f = z * m * n
+ double m = m_pParent->getSubpixelsPerPixel();
+ double f = sampleRate;
+ double z = m_pParent->getPixelsPerSecond();
+ double n = f / (m*z);
+
+ m_iSampleRate = sampleRate;
+
+ m_dSamplesPerDownsample = n;
+
+ // TODO(rryan) This will possibly get us into trouble, because track samples
+ // might not be updated yet.
+ slotUpdateTrackSamples(m_pTrackSamples->get());
+ if (m_pMarkStartPoint)
+ slotUpdateMarkStartPoint(m_pMarkStartPoint->get());
+ if (m_pMarkEndPoint)
+ slotUpdateMarkEndPoint(m_pMarkEndPoint->get());
+}
+
+void WaveformRenderMarkRange::setup(QDomNode node) {
+
+ if (m_pMarkStartPoint) {
+ // Disconnect the old control
+ disconnect(m_pMarkStartPoint, 0, this, 0);
+ delete m_pMarkStartPoint;
+ m_pMarkStartPoint = NULL;
+ }
+
+ if (m_pMarkEndPoint) {
+ // Disconnect the old control
+ disconnect(m_pMarkEndPoint, 0, this, 0);
+ delete m_pMarkEndPoint;
+ m_pMarkEndPoint = NULL;
+ }
+
+ if (m_pMarkEnabled) {
+ // Disconnect the old control
+ disconnect(m_pMarkEnabled, 0, this, 0);
+ delete m_pMarkEnabled;
+ m_pMarkEnabled = NULL;
+ }
+
+ ConfigKey configKey;
+ configKey.group = m_pGroup;
+
+ configKey.item = WWidget::selectNodeQString(node, "StartControl");
+ m_pMarkStartPoint = new ControlObjectThreadMain(
+ ControlObject::getControl(configKey));
+ slotUpdateMarkStartPoint(m_pMarkStartPoint->get());
+ connect(m_pMarkStartPoint, SIGNAL(valueChanged(double)),
+ this, SLOT(slotUpdateMarkStartPoint(double)));
+
+ configKey.item = WWidget::selectNodeQString(node, "EndControl");
+ m_pMarkEndPoint = new ControlObjectThreadMain(
+ ControlObject::getControl(configKey));
+ slotUpdateMarkEndPoint(m_pMarkEndPoint->get());
+ connect(m_pMarkEndPoint, SIGNAL(valueChanged(double)),
+ this, SLOT(slotUpdateMarkEndPoint(double)));
+
+ // Leave m_pMarkEnabled NULL if it is not specified
+ if (!WWidget::selectNode(node, "EnabledControl").isNull()) {
+ configKey.item = WWidget::selectNodeQString(node, "EnabledControl");
+ m_pMarkEnabled = new ControlObjectThreadMain(
+ ControlObject::getControl(configKey));
+ slotUpdateMarkEnabled(m_pMarkEnabled->get());
+ connect(m_pMarkEnabled, SIGNAL(valueChanged(double)),
+ this, SLOT(slotUpdateMarkEnabled(double)));
+ }
+
+ // Read the mark color, otherwise get MarkerColor of the Visual element
+ QString markColor = WWidget::selectNodeQString(node, "Color");
+ if (markColor == "") {
+ // As a fallback, grab the mark color from the parent's MarkerColor
+ markColor = WWidget::selectNodeQString(node.parentNode(), "MarkerColor");
+ qDebug() << "Didn't get mark Color, using parent's MarkerColor:"
+ << markColor;
+ m_markColor.setNamedColor(markColor);
+ // m_markColor = QColor(255 - m_markColor.red(),
+ // 255 - m_markColor.green(),
+ // 255 - m_markColor.blue());
+ } else {
+ m_markColor.setNamedColor(markColor);
+ }
+ m_markColor = WSkinColor::getCorrectColor(m_markColor);
+
+ QString markDisabledColor = WWidget::selectNodeQString(node, "DisabledColor");
+ if (markDisabledColor == "") {
+ // As a fallback, grab the mark color from the parent's MarkerColor
+ markDisabledColor = WWidget::selectNodeQString(
+ node.parentNode(), "SignalColor");
+ qDebug() << "Didn't get mark Color, using parent's MarkerColor:"
+ << markDisabledColor;
+ m_markDisabledColor.setNamedColor(markDisabledColor);
+ // m_markDisabledColor = QColor(255 - m_markDisabledColor.red(),
+ // 255 - m_markDisabledColor.green(),
+ // 255 - m_markDisabledColor.blue());
+ } else {
+ m_markDisabledColor.setNamedColor(markDisabledColor);
+ }
+ m_markDisabledColor = WSkinColor::getCorrectColor(m_markDisabledColor);
+}
+
+
+void WaveformRenderMarkRange::draw(QPainter *pPainter, QPaintEvent *event,
+ QVector *buffer, double dPlayPos,
+ double rateAdjust) {
+ if (m_iSampleRate == -1 || m_iSampleRate == 0 || m_iNumSamples == 0)
+ return;
+
+ // necessary?
+ if (buffer == NULL)
+ return;
+
+ // The range is not active, do nothing.
+ if (m_iMarkStartPoint == -1 || m_iMarkEndPoint == -1)
+ return;
+
+ double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel()*(1.0+rateAdjust);
+
+ pPainter->save();
+ pPainter->scale(1.0/subpixelsPerPixel,1.0);
+ QPen oldPen = pPainter->pen();
+ QBrush oldBrush = pPainter->brush();
+
+ double subpixelWidth = m_iWidth * subpixelsPerPixel;
+ double subpixelHalfWidth = subpixelWidth / 2.0;
+ double halfh = m_iHeight/2;
+
+ double curPos = dPlayPos * (m_iNumSamples/2);
+
+ double markStartPointMono = m_iMarkStartPoint >> 1;
+ double markEndPointMono = m_iMarkEndPoint >> 1;
+
+ double iStart = (markStartPointMono - curPos)/m_dSamplesPerDownsample;
+ double xStart = iStart + subpixelHalfWidth;
+ double iEnd = (markEndPointMono - curPos)/m_dSamplesPerDownsample;
+ double xEnd = iEnd + subpixelHalfWidth;
+
+ QRectF markRect(QPointF(xStart, halfh), QPointF(xEnd, -halfh));
+
+ QColor color = m_bMarkEnabled ? m_markColor : m_markDisabledColor;
+ color.setAlphaF(0.2);
+ QPen newPen(color);
+ pPainter->setPen(newPen);
+ pPainter->setBrush(QBrush(color));
+ pPainter->drawRect(markRect);
+
+ pPainter->setPen(oldPen);
+ pPainter->setBrush(oldBrush);
+ pPainter->restore();
+}
=== added file 'mixxx/src/waveform/waveformrendermarkrange.h'
--- mixxx/src/waveform/waveformrendermarkrange.h 1970-01-01 00:00:00 +0000
+++ mixxx/src/waveform/waveformrendermarkrange.h 2009-11-18 00:45:31 +0000
@@ -0,0 +1,60 @@
+// waveformrendermarkrange.h
+// Created 11/14/2009 by RJ Ryan (rryan@mit.edu)
+
+#ifndef WAVEFORMRENDERMARKRANGE_H
+#define WAVEFORMRENDERMARKRANGE_H
+
+#include
+#include
+#include
+
+class QDomNode;
+class QPainter;
+class QPaintEvent;
+
+#include "configobject.h"
+#include "waveform/renderobject.h"
+
+class ConfigKey;
+class ControlObjectThreadMain;
+class WaveformRenderer;
+class TrackInfoObject;
+
+class WaveformRenderMarkRange : public RenderObject {
+ Q_OBJECT
+public:
+ explicit WaveformRenderMarkRange(const char* pGroup,
+ WaveformRenderer *parent);
+ void resize(int w, int h);
+ void setup(QDomNode node);
+ void draw(QPainter *pPainter, QPaintEvent *event,
+ QVector *buffer, double playPos, double rateAdjust);
+ void newTrack(TrackInfoObject *pTrack);
+
+public slots:
+ void slotUpdateMarkStartPoint(double mark);
+ void slotUpdateMarkEndPoint(double mark);
+ void slotUpdateMarkEnabled(double mark);
+ void slotUpdateTrackSamples(double samples);
+private:
+ const char* m_pGroup;
+ WaveformRenderer *m_pParent;
+
+ ControlObjectThreadMain *m_pMarkStartPoint;
+ ControlObjectThreadMain *m_pMarkEndPoint;
+ ControlObjectThreadMain *m_pMarkEnabled;
+ ControlObjectThreadMain *m_pTrackSamples;
+ TrackInfoObject *m_pTrack;
+
+ bool m_bMarkEnabled;
+ int m_iMarkStartPoint, m_iMarkEndPoint;
+ int m_iWidth, m_iHeight;
+ QColor m_markColor;
+ QColor m_markDisabledColor;
+
+ double m_dSamplesPerDownsample;
+ int m_iNumSamples;
+ int m_iSampleRate;
+};
+
+#endif
=== modified file 'mixxx/src/widget/wglwaveformviewer.cpp'
--- mixxx/src/widget/wglwaveformviewer.cpp 2009-07-12 08:02:43 +0000
+++ mixxx/src/widget/wglwaveformviewer.cpp 2009-11-18 00:45:31 +0000
@@ -18,9 +18,9 @@
m_pWaveformRenderer = pWaveformRenderer;
Q_ASSERT(m_pWaveformRenderer);
-
+
m_pGroup = group;
-
+
setAcceptDrops(true);
installEventFilter(this);
@@ -30,7 +30,7 @@
int desired_fps = 40;
int update_interval = 1000 / desired_fps;
m_iTimerID = startTimer(update_interval);
-
+
m_painting = false;
}
@@ -52,7 +52,7 @@
int sep = pos.indexOf(",");
int x = pos.left(sep).toInt();
int y = pos.mid(sep+1).toInt();
-
+
move(x,y);
// Acquire size
@@ -63,18 +63,23 @@
setFixedSize(x,y);
+ m_pWaveformRenderer->setup(node);
+
m_pWaveformRenderer->resize(x,y);
-
- m_pWaveformRenderer->setup(node);
}
void WGLWaveformViewer::paintEvent(QPaintEvent *event) {
QPainter painter;
painter.begin(this);
-
+
painter.setRenderHint(QPainter::Antialiasing);
+ //painter.setRenderHint(QPainter::TextAntialiasing);
+
+ // HighQualityAntialiasing makes some CPUs go crazy
+ //painter.setRenderHint(QPainter::HighQualityAntialiasing);
+
m_pWaveformRenderer->draw(&painter, event);
-
+
painter.end();
m_painting = false;
// QPainter goes out of scope and is destructed
@@ -84,7 +89,7 @@
//m_paintMutex.lock();
if(!m_painting) {
m_painting = true;
-
+
// The docs say update is better than repaint.
update();
//updateGL();
@@ -92,45 +97,6 @@
//m_paintMutex.unlock();
}
-
-void WGLWaveformViewer::initializeGL() {
- QGLWidget::initializeGL();
- //qDebug() << "QGL initializeGL";
-
- /*
- // setup backface culling so CCW polygons are facing out
- glFrontFace(GL_CCW);
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
-
- // enables zbuffer
- glEnable(GL_DEPTH_TEST);
-
- // enable alpha blending
- glEnable(GL_BLEND);
- */
-
-
-}
-
-void WGLWaveformViewer::resizeGL(int w, int h) {
- QGLWidget::resizeGL(w,h);
- //qDebug() << "QGL resizeGL " << w << " : " << h;
-
- //m_pWaveformRenderer->resize(w,h);
-}
-
-void WGLWaveformViewer::paintGL() {
- QGLWidget::paintGL();
-
- //qDebug() << "QGL paintGL";
-
- //m_pWaveformRenderer->glDraw();
- //m_painting = false;
-}
-
-
-
/** SLOTS **/
void WGLWaveformViewer::setValue(double) {
=== modified file 'mixxx/src/widget/wglwaveformviewer.h'
--- mixxx/src/widget/wglwaveformviewer.h 2009-04-15 01:40:11 +0000
+++ mixxx/src/widget/wglwaveformviewer.h 2009-11-18 00:45:31 +0000
@@ -30,7 +30,7 @@
void dropEvent(QDropEvent *event);
void setup(QDomNode node);
bool eventFilter(QObject *o, QEvent *e);
-
+
public slots:
void setValue(double);
signals:
@@ -39,11 +39,7 @@
void trackDropped(QString filename);
protected:
-
- void initializeGL();
- void resizeGL(int, int);
- void paintGL();
-
+
void timerEvent(QTimerEvent *);
void paintEvent(QPaintEvent* event);
@@ -56,7 +52,7 @@
/** Waveform Renderer does all the work for us */
WaveformRenderer *m_pWaveformRenderer;
-
+
bool m_painting;
QMutex m_paintMutex;
=== modified file 'mixxx/src/widget/woverview.cpp'
--- mixxx/src/widget/woverview.cpp 2009-11-11 02:10:46 +0000
+++ mixxx/src/widget/woverview.cpp 2009-11-18 00:45:31 +0000
@@ -9,20 +9,38 @@
// Copyright: See COPYING file that comes with this distribution
//
//
+<<<<<<< TREE
+=======
+
+#include
+>>>>>>> MERGE-SOURCE
#include
#include
#include
#include
#include
-#include
-#include
-#include
-#include
-
-#include "controlobject.h"
-#include "woverview.h"
-#include "wskincolor.h"
-#include "trackinfoobject.h"
+<<<<<<< TREE
+#include
+#include
+#include
+#include
+
+#include "controlobject.h"
+#include "woverview.h"
+#include "wskincolor.h"
+#include "trackinfoobject.h"
+=======
+#include
+#include
+#include
+#include
+
+#include "controlobject.h"
+#include "controlobjectthreadmain.h"
+#include "woverview.h"
+#include "wskincolor.h"
+#include "trackinfoobject.h"
+>>>>>>> MERGE-SOURCE
#include "mathstuff.h"
WOverview::WOverview(const char *pGroup, QWidget * parent)
@@ -34,30 +52,80 @@
m_bDrag = false;
m_pScreenBuffer = 0;
- QString pattern = "hotcue_%1_position";
-
- int i = 0;
- ConfigKey hotcueKey;
- hotcueKey.group = m_pGroup;
- hotcueKey.item = pattern.arg(i);
- ControlObject* pControl = ControlObject::getControl(hotcueKey);
-
-
- qDebug() << "Connecting hotcue controls.";
- while (pControl) {
- m_hotcueControls.push_back(pControl);
- m_hotcues.push_back(pControl->get());
- m_hotcueMap[pControl] = i;
-
- qDebug() << "Connecting hotcue" << hotcueKey.group << hotcueKey.item;
-
- connect(pControl, SIGNAL(valueChangedFromEngine(double)),
- this, SLOT(cueChanged(double)));
-
- hotcueKey.item = pattern.arg(++i);
- pControl = ControlObject::getControl(hotcueKey);
- }
-
+<<<<<<< TREE
+ QString pattern = "hotcue_%1_position";
+
+ int i = 0;
+ ConfigKey hotcueKey;
+ hotcueKey.group = m_pGroup;
+ hotcueKey.item = pattern.arg(i);
+ ControlObject* pControl = ControlObject::getControl(hotcueKey);
+
+
+ qDebug() << "Connecting hotcue controls.";
+ while (pControl) {
+ m_hotcueControls.push_back(pControl);
+ m_hotcues.push_back(pControl->get());
+ m_hotcueMap[pControl] = i;
+
+ qDebug() << "Connecting hotcue" << hotcueKey.group << hotcueKey.item;
+
+ connect(pControl, SIGNAL(valueChangedFromEngine(double)),
+ this, SLOT(cueChanged(double)));
+
+ hotcueKey.item = pattern.arg(++i);
+ pControl = ControlObject::getControl(hotcueKey);
+ }
+
+=======
+ m_pLoopStart = ControlObject::getControl(
+ ConfigKey(m_pGroup, "loop_start_position"));
+ connect(m_pLoopStart, SIGNAL(valueChanged(double)),
+ this, SLOT(loopStartChanged(double)));
+ connect(m_pLoopStart, SIGNAL(valueChangedFromEngine(double)),
+ this, SLOT(loopStartChanged(double)));
+ loopStartChanged(m_pLoopStart->get());
+ m_pLoopEnd = ControlObject::getControl(
+ ConfigKey(m_pGroup, "loop_end_position"));
+ connect(m_pLoopEnd, SIGNAL(valueChanged(double)),
+ this, SLOT(loopEndChanged(double)));
+ connect(m_pLoopEnd, SIGNAL(valueChangedFromEngine(double)),
+ this, SLOT(loopEndChanged(double)));
+ loopEndChanged(m_pLoopEnd->get());
+ m_pLoopEnabled = ControlObject::getControl(
+ ConfigKey(m_pGroup, "loop_enabled"));
+ connect(m_pLoopEnabled, SIGNAL(valueChanged(double)),
+ this, SLOT(loopEnabledChanged(double)));
+ connect(m_pLoopEnabled, SIGNAL(valueChangedFromEngine(double)),
+ this, SLOT(loopEnabledChanged(double)));
+ loopEnabledChanged(m_pLoopEnabled->get());
+
+ QString pattern = "hotcue_%1_position";
+
+ int i = 0;
+ ConfigKey hotcueKey;
+ hotcueKey.group = m_pGroup;
+ hotcueKey.item = pattern.arg(i);
+ ControlObject* pControl = ControlObject::getControl(hotcueKey);
+
+ qDebug() << "Connecting hotcue controls.";
+ while (pControl) {
+ m_hotcueControls.push_back(pControl);
+ m_hotcues.push_back(pControl->get());
+ m_hotcueMap[pControl] = i;
+
+ qDebug() << "Connecting hotcue" << hotcueKey.group << hotcueKey.item;
+
+ connect(pControl, SIGNAL(valueChangedFromEngine(double)),
+ this, SLOT(cueChanged(double)));
+ connect(pControl, SIGNAL(valueChanged(double)),
+ this, SLOT(cueChanged(double)));
+
+ hotcueKey.item = pattern.arg(++i);
+ pControl = ControlObject::getControl(hotcueKey);
+ }
+
+>>>>>>> MERGE-SOURCE
waveformChanged = false;
}
@@ -137,28 +205,65 @@
void WOverview::slotLoadNewWaveform(TrackInfoObject* pTrack)
{
- //Update this widget with new waveform summary data from the new track.
- setData(pTrack->getWaveSummary(),
- pTrack->getDuration()*pTrack->getSampleRate()*pTrack->getChannels());
- update();
-}
-
-void WOverview::cueChanged(double v) {
- qDebug() << "WOverview::cueChanged()";
- QObject* pSender = sender();
- if (!pSender)
- return;
-
- if (!m_hotcueMap.contains(pSender))
- return;
-
- int hotcue = m_hotcueMap[pSender];
- m_hotcues[hotcue] = v;
- qDebug() << "hotcue" << hotcue << "position" << v;
- update();
-}
-
-void WOverview::setData(QByteArray* pWaveformSummary, long liSampleDuration)
+<<<<<<< TREE
+ //Update this widget with new waveform summary data from the new track.
+ setData(pTrack->getWaveSummary(),
+ pTrack->getDuration()*pTrack->getSampleRate()*pTrack->getChannels());
+ update();
+}
+
+void WOverview::cueChanged(double v) {
+ qDebug() << "WOverview::cueChanged()";
+ QObject* pSender = sender();
+ if (!pSender)
+ return;
+
+ if (!m_hotcueMap.contains(pSender))
+ return;
+
+ int hotcue = m_hotcueMap[pSender];
+ m_hotcues[hotcue] = v;
+ qDebug() << "hotcue" << hotcue << "position" << v;
+ update();
+}
+
+void WOverview::setData(QByteArray* pWaveformSummary, long liSampleDuration)
+=======
+ //Update this widget with new waveform summary data from the new track.
+ setData(pTrack->getWaveSummary(),
+ pTrack->getDuration()*pTrack->getSampleRate()*pTrack->getChannels());
+ update();
+}
+
+void WOverview::cueChanged(double v) {
+ qDebug() << "WOverview::cueChanged()";
+ QObject* pSender = sender();
+ if (!pSender)
+ return;
+
+ if (!m_hotcueMap.contains(pSender))
+ return;
+
+ int hotcue = m_hotcueMap[pSender];
+ m_hotcues[hotcue] = v;
+ qDebug() << "hotcue" << hotcue << "position" << v;
+ update();
+}
+
+void WOverview::loopStartChanged(double v) {
+ m_dLoopStart = v;
+}
+
+void WOverview::loopEndChanged(double v) {
+ m_dLoopEnd = v;
+}
+
+void WOverview::loopEnabledChanged(double v) {
+ m_bLoopEnabled = !(v == 0.0f);
+}
+
+void WOverview::setData(QByteArray* pWaveformSummary, long liSampleDuration)
+>>>>>>> MERGE-SOURCE
{
m_pWaveformSummary = pWaveformSummary;
m_liSampleDuration = liSampleDuration;
@@ -311,6 +416,7 @@
paint.drawLine(m_iPos+1, 0, m_iPos+1, height());
//paint.drawLine(m_iPos-1, 0, m_iPos-1, height());
+<<<<<<< TREE
// Draw hotcues
if (m_liSampleDuration > 0) {
@@ -333,6 +439,61 @@
fPos+5, height());
paint.drawText(rect, Qt::AlignCenter, QString("%1").arg(i));
+=======
+ // Draw hotcues
+
+ if (m_liSampleDuration > 0) {
+ float fPos;
+
+ // Draw loop markers
+ QColor loopColor = m_qColorMarker;
+ if (!m_bLoopEnabled) {
+ loopColor = m_qColorSignal;
+ }
+ paint.setPen(loopColor);
+ if (m_dLoopStart != -1.0) {
+ fPos = m_dLoopStart * (width() - 2) / m_liSampleDuration;
+ paint.drawLine(fPos, 0, fPos, height());
+ }
+ if (m_dLoopEnd != -1.0) {
+ fPos = m_dLoopEnd * (width() - 2) / m_liSampleDuration;
+ paint.drawLine(fPos, 0, fPos, height());
+ }
+
+ if (m_dLoopStart != -1.0 && m_dLoopEnd != -1.0) {
+ //loopColor.setAlphaF(0.5);
+ paint.setOpacity(0.5);
+ //paint.setPen(loopColor);
+ paint.setBrush(QBrush(loopColor));
+ float sPos = m_dLoopStart * (width() - 2) / m_liSampleDuration;
+ float ePos = m_dLoopEnd * (width() - 2) / m_liSampleDuration;
+ QRectF rect(QPointF(sPos, 0), QPointF(ePos, height()-1));
+ paint.drawRect(rect);
+ paint.setOpacity(1.0);
+ }
+
+ QFont font;
+ font.setBold(false);
+ font.setPixelSize(height());
+ paint.setPen(m_qColorMarker);
+ paint.setFont(font);
+
+ for (int i = 0; i < m_hotcues.size(); ++i) {
+ int position = m_hotcues[i];
+ if (position == -1)
+ continue;
+ fPos = float(position) * (width()-2) / m_liSampleDuration;
+ //qDebug() << "Drawing cue" << i << "at" << fPos;
+ // paint.drawLine(fPos, 0,
+ // fPos, height());
+ // paint.drawLine(fPos+1, 0,
+ // fPos+1, height());
+ int textWidth = 5;
+ QRectF rect(fPos-5, 0,
+ fPos+5, height());
+
+ paint.drawText(rect, Qt::AlignCenter, QString("%1").arg(i));
+>>>>>>> MERGE-SOURCE
}
}
}
=== modified file 'mixxx/src/widget/woverview.h'
--- mixxx/src/widget/woverview.h 2009-11-11 02:10:46 +0000
+++ mixxx/src/widget/woverview.h 2009-11-18 00:45:31 +0000
@@ -49,20 +49,49 @@
QColor getSignalColor();
public slots:
void setValue(double);
- void slotLoadNewWaveform(TrackInfoObject* pTrack);
- private slots:
- void cueChanged(double v);
- private:
+<<<<<<< TREE
+ void slotLoadNewWaveform(TrackInfoObject* pTrack);
+ private slots:
+ void cueChanged(double v);
+ private:
+=======
+ void slotLoadNewWaveform(TrackInfoObject* pTrack);
+ private slots:
+ void cueChanged(double v);
+ void loopStartChanged(double v);
+ void loopEndChanged(double v);
+ void loopEnabledChanged(double v);
+ private:
+>>>>>>> MERGE-SOURCE
const char* m_pGroup;
bool waveformChanged;
- QList m_hotcueControls;
- QMap m_hotcueMap;
- QList m_hotcues;
-
+<<<<<<< TREE
+ QList m_hotcueControls;
+ QMap m_hotcueMap;
+ QList m_hotcues;
+
+=======
+ // Loop controls and values
+ ControlObject* m_pLoopStart;
+ ControlObject* m_pLoopEnd;
+ ControlObject* m_pLoopEnabled;
+ double m_dLoopStart, m_dLoopEnd;
+ bool m_bLoopEnabled;
+
+ // Hotcue controls and values
+ QList m_hotcueControls;
+ QMap m_hotcueMap;
+ QList m_hotcues;
+
+>>>>>>> MERGE-SOURCE
/** Pointer to array containing waveform summary */
+<<<<<<< TREE
QByteArray *m_pWaveformSummary;
+=======
+ QByteArray* m_pWaveformSummary;
+>>>>>>> MERGE-SOURCE
/** Duration of current track in samples */
int m_liSampleDuration;
/** True if slider is dragged. Only used when m_bEventWhileDrag is false */
=== modified file 'mixxx/src/widget/wwaveformviewer.cpp'
--- mixxx/src/widget/wwaveformviewer.cpp 2009-07-12 08:02:43 +0000
+++ mixxx/src/widget/wwaveformviewer.cpp 2009-11-18 00:45:31 +0000
@@ -21,7 +21,7 @@
Q_ASSERT(m_pWaveformRenderer);
m_pGroup = group;
-
+
setAcceptDrops(true);
installEventFilter(this);
@@ -31,7 +31,7 @@
int desired_fps = 1;
int update_interval = 1000 / desired_fps;
m_iTimerID = startTimer(update_interval);
-
+
m_painting = false;
}
@@ -47,7 +47,7 @@
int sep = pos.indexOf(",");
int x = pos.left(sep).toInt();
int y = pos.mid(sep+1).toInt();
-
+
move(x,y);
// Acquire size
@@ -58,19 +58,19 @@
setFixedSize(x,y);
+ m_pWaveformRenderer->setup(node);
+
m_pWaveformRenderer->resize(x,y);
-
- m_pWaveformRenderer->setup(node);
}
void WWaveformViewer::paintEvent(QPaintEvent *event) {
QPainter painter;
painter.begin(this);
-
+
painter.setRenderHint(QPainter::Antialiasing);
m_pWaveformRenderer->draw(&painter, event);
-
+
painter.end();
m_painting = false;
// QPainter goes out of scope and is destructed
@@ -80,7 +80,7 @@
//m_paintMutex.lock();
if(!m_painting) {
m_painting = true;
-
+
// The docs say update is better than repaint.
update();
}
=== modified file 'mixxx/src/widget/wwidget.cpp'
--- mixxx/src/widget/wwidget.cpp 2009-03-05 17:52:08 +0000
+++ mixxx/src/widget/wwidget.cpp 2009-11-18 00:45:31 +0000
@@ -30,7 +30,7 @@
WWidget::WWidget(QWidget * parent, Qt::WFlags flags) : QWidget(parent, flags)
{
-
+
m_fValue = 0.;
m_bOff = false;
connect(this, SIGNAL(valueChangedLeftDown(double)), this, SLOT(slotReEmitValueDown(double)));
@@ -83,9 +83,7 @@
// Get ConfigKey
QString key = selectNodeQString(con, "ConfigKey");
- ConfigKey configKey;
- configKey.group = key.left(key.indexOf(","));
- configKey.item = key.mid(key.indexOf(",")+1);
+ ConfigKey configKey = ConfigKey::parseCommaSeparated(key);
// Check that the control exists
ControlObject * control = ControlObject::getControl(configKey);