Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/widget/wwaveformviewer.cpp

Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines