![]() |
Mixxx
|
00001 00002 #include <QGLWidget> 00003 #include <QDebug> 00004 #include <QDomNode> 00005 #include <QEvent> 00006 #include <QDragEnterEvent> 00007 #include <QUrl> 00008 #include <QPainter> 00009 00010 00011 #include "mixxx.h" 00012 #include "trackinfoobject.h" 00013 #include "wwaveformviewer.h" 00014 #include "waveform/waveformrenderer.h" 00015 00016 00017 WWaveformViewer::WWaveformViewer(const char *group, WaveformRenderer *pWaveformRenderer, QWidget * parent, Qt::WFlags f) : QWidget(parent, f) 00018 { 00019 m_pWaveformRenderer = pWaveformRenderer; 00020 Q_ASSERT(m_pWaveformRenderer); 00021 00022 m_pGroup = group; 00023 00024 setAcceptDrops(true); 00025 00026 installEventFilter(this); 00027 m_painting = false; 00028 } 00029 00030 WWaveformViewer::~WWaveformViewer() { 00031 } 00032 00033 void WWaveformViewer::setup(QDomNode node) { 00034 int w = width(), h = height(); 00035 m_pWaveformRenderer->setup(node); 00036 m_pWaveformRenderer->resize(w, h); 00037 } 00038 00039 void WWaveformViewer::paintEvent(QPaintEvent *event) { 00040 QPainter painter; 00041 painter.begin(this); 00042 00043 painter.setRenderHint(QPainter::Antialiasing); 00044 00045 m_pWaveformRenderer->draw(&painter, event); 00046 00047 painter.end(); 00048 m_painting = false; 00049 // QPainter goes out of scope and is destructed 00050 } 00051 00052 void WWaveformViewer::refresh() { 00053 //m_paintMutex.lock(); 00054 if(!m_painting) { 00055 m_painting = true; 00056 00057 // The docs say update is better than repaint. 00058 update(); 00059 } 00060 //m_paintMutex.unlock(); 00061 } 00062 00065 bool WWaveformViewer::eventFilter(QObject *o, QEvent *e) { 00066 if(e->type() == QEvent::MouseButtonPress) { 00067 QMouseEvent *m = (QMouseEvent*)e; 00068 m_iMouseStart= -1; 00069 if(m->button() == Qt::LeftButton) { 00070 // The left button went down, so store the start position 00071 m_iMouseStart = m->x(); 00072 emit(valueChangedLeftDown(64)); 00073 } 00074 } else if(e->type() == QEvent::MouseMove) { 00075 // Only send signals for mouse moving if the left button is pressed 00076 if(m_iMouseStart != -1) { 00077 QMouseEvent *m = (QMouseEvent*)e; 00078 00079 // start at the middle of 0-127, and emit values based on 00080 // how far the mouse has travelled horizontally 00081 double v = 64 + (double)(m->x()-m_iMouseStart)/10; 00082 // clamp to 0-127 00083 if(v<0) 00084 v = 0; 00085 else if(v > 127) 00086 v = 127; 00087 emit(valueChangedLeftDown(v)); 00088 00089 } 00090 } else if(e->type() == QEvent::MouseButtonRelease) { 00091 emit(valueChangedLeftDown(64)); 00092 } else { 00093 return QObject::eventFilter(o,e); 00094 } 00095 return true; 00096 } 00097 00101 void WWaveformViewer::dragEnterEvent(QDragEnterEvent * event) 00102 { 00103 // Accept the enter event if the thing is a filepath. 00104 if (event->mimeData()->hasUrls() && 00105 event->mimeData()->urls().size() > 0) { 00106 ControlObject *pPlayCO = ControlObject::getControl( 00107 ConfigKey(m_pGroup, "play")); 00108 if (pPlayCO && pPlayCO->get()) { 00109 event->ignore(); 00110 } else { 00111 event->acceptProposedAction(); 00112 } 00113 } 00114 } 00115 00116 void WWaveformViewer::dropEvent(QDropEvent * event) 00117 { 00118 if (event->mimeData()->hasUrls() && 00119 event->mimeData()->urls().size() > 0) { 00120 QList<QUrl> urls(event->mimeData()->urls()); 00121 QUrl url = urls.first(); 00122 QString name = url.toLocalFile(); 00123 //If the file is on a network share, try just converting the URL to a string... 00124 if (name == "") 00125 name = url.toString(); 00126 00127 event->accept(); 00128 emit(trackDropped(name, m_pGroup)); 00129 } else { 00130 event->ignore(); 00131 } 00132 }