diff --git a/src/skin/legacyskinparser.cpp b/src/skin/legacyskinparser.cpp index 9a1af44f1ac..0977d2141ed 100644 --- a/src/skin/legacyskinparser.cpp +++ b/src/skin/legacyskinparser.cpp @@ -782,19 +782,22 @@ QWidget* LegacySkinParser::parseVisual(QDomElement node) { QWidget* LegacySkinParser::parseText(QDomElement node) { QString channelStr = lookupNodeGroup(node); + const char* pSafeChannelStr = safeChannelString(channelStr); BaseTrackPlayer* pPlayer = m_pPlayerManager->getPlayer(channelStr); if (!pPlayer) return NULL; - WTrackText* p = new WTrackText(m_pParent); + WTrackText* p = new WTrackText(pSafeChannelStr, m_pConfig, m_pParent); setupLabelWidget(node, p); connect(pPlayer, SIGNAL(newTrackLoaded(TrackPointer)), p, SLOT(slotTrackLoaded(TrackPointer))); connect(pPlayer, SIGNAL(unloadingTrack(TrackPointer)), p, SLOT(slotTrackUnloaded(TrackPointer))); + connect(p, SIGNAL(trackDropped(QString,QString)), + m_pPlayerManager, SLOT(slotLoadToPlayer(QString,QString))); TrackPointer pTrack = pPlayer->getLoadedTrack(); if (pTrack) { @@ -806,20 +809,22 @@ QWidget* LegacySkinParser::parseText(QDomElement node) { QWidget* LegacySkinParser::parseTrackProperty(QDomElement node) { QString channelStr = lookupNodeGroup(node); - + const char* pSafeChannelStr = safeChannelString(channelStr); BaseTrackPlayer* pPlayer = m_pPlayerManager->getPlayer(channelStr); if (!pPlayer) return NULL; - WTrackProperty* p = new WTrackProperty(m_pParent); + WTrackProperty* p = new WTrackProperty(pSafeChannelStr, m_pConfig, m_pParent); setupLabelWidget(node, p); connect(pPlayer, SIGNAL(newTrackLoaded(TrackPointer)), p, SLOT(slotTrackLoaded(TrackPointer))); connect(pPlayer, SIGNAL(unloadingTrack(TrackPointer)), p, SLOT(slotTrackUnloaded(TrackPointer))); + connect(p, SIGNAL(trackDropped(QString,QString)), + m_pPlayerManager, SLOT(slotLoadToPlayer(QString,QString))); TrackPointer pTrack = pPlayer->getLoadedTrack(); if (pTrack) { diff --git a/src/skin/tooltips.cpp b/src/skin/tooltips.cpp index 28a41fd33ba..5d16d6605f6 100644 --- a/src/skin/tooltips.cpp +++ b/src/skin/tooltips.cpp @@ -26,7 +26,7 @@ QList& Tooltips::add(QString id) { } void Tooltips::addStandardTooltips() { - QString dropTracksHere = tr("Drop tracks from library or external file manager here."); + QString dropTracksHere = tr("Drop tracks from library, external file manager, or other decks/samplers here."); QString resetToDefault = tr("Reset to default value."); QString leftClick = tr("Left-click"); QString rightClick = tr("Right-click"); @@ -406,12 +406,14 @@ void Tooltips::addStandardTooltips() { add("track_artist") << tr("Track Artist") << tr("Displays the artist of the loaded track.") - << trackTags; + << trackTags + << dropTracksHere; add("track_title") << tr("Track Title") << tr("Displays the title of the loaded track.") - << trackTags; + << trackTags + << dropTracksHere; add("track_album") << tr("Track Album") @@ -427,7 +429,8 @@ void Tooltips::addStandardTooltips() { add("text") << tr("Track Artist/Title") << tr("Displays the artist and title of the loaded track.") - << trackTags; + << trackTags + << dropTracksHere; add("flanger") << tr("Flanger") diff --git a/src/widget/wtrackproperty.cpp b/src/widget/wtrackproperty.cpp index 7ccab172d29..77dd654efd2 100644 --- a/src/widget/wtrackproperty.cpp +++ b/src/widget/wtrackproperty.cpp @@ -1,8 +1,15 @@ -#include "widget/wtrackproperty.h" -WTrackProperty::WTrackProperty(QWidget* pParent) - : WLabel(pParent) { +#include +#include + +#include "controlobject.h" +#include "widget/wtrackproperty.h" +WTrackProperty::WTrackProperty(const char* group, ConfigObject* pConfig, QWidget* pParent) + : WLabel(pParent), + m_pGroup(group), + m_pConfig(pConfig) { + setAcceptDrops(true); } WTrackProperty::~WTrackProperty() { @@ -41,3 +48,47 @@ void WTrackProperty::updateLabel(TrackInfoObject*) { } } } + +void WTrackProperty::mouseMoveEvent(QMouseEvent *event) { + if ((event->buttons() & Qt::LeftButton) && m_pCurrentTrack) { + QList locationUrls; + locationUrls.append(QUrl::fromLocalFile(m_pCurrentTrack->getLocation())); + + QMimeData* mimeData = new QMimeData(); + mimeData->setUrls(locationUrls); + + QDrag* drag = new QDrag(this); + drag->setMimeData(mimeData); + drag->setPixmap(QPixmap(":images/library/ic_library_drag_and_drop.png")); + drag->exec(Qt::CopyAction); + } +} + +void WTrackProperty::dragEnterEvent(QDragEnterEvent *event) { + if (event->mimeData()->hasUrls() && + event->mimeData()->urls().size() > 0) { + // Accept if the Deck isn't playing or the settings allow to interrupt a playing deck + if ((!ControlObject::get(ConfigKey(m_pGroup, "play")) || + m_pConfig->getValueString(ConfigKey("[Controls]", "AllowTrackLoadToPlayingDeck")).toInt())) { + event->acceptProposedAction(); + } else { + event->ignore(); + } + } +} + +void WTrackProperty::dropEvent(QDropEvent *event) { + if (event->mimeData()->hasUrls() && + event->mimeData()->urls().size() > 0) { + QUrl url = event->mimeData()->urls().first(); + QString filename = url.toLocalFile(); + // If the file is on a network share, try just converting the URL to a string + if (filename == "") { + filename = url.toString(); + } + event->accept(); + emit(trackDropped(filename, m_pGroup)); + } else { + event->ignore(); + } +} diff --git a/src/widget/wtrackproperty.h b/src/widget/wtrackproperty.h index 30f9b1f615c..e809f01dada 100644 --- a/src/widget/wtrackproperty.h +++ b/src/widget/wtrackproperty.h @@ -1,18 +1,26 @@ #ifndef WTRACKPROPERTY_H #define WTRACKPROPERTY_H -#include "widget/wlabel.h" -#include "trackinfoobject.h" +#include +#include +#include + +#include "configobject.h" #include "skin/skincontext.h" +#include "trackinfoobject.h" +#include "widget/wlabel.h" class WTrackProperty : public WLabel { Q_OBJECT public: - WTrackProperty(QWidget* pParent); + WTrackProperty(const char* group, ConfigObject* pConfig, QWidget* pParent); virtual ~WTrackProperty(); void setup(QDomNode node, const SkinContext& context); + signals: + void trackDropped(QString filename, QString group); + public slots: void slotTrackLoaded(TrackPointer track); void slotTrackUnloaded(TrackPointer track); @@ -21,6 +29,12 @@ class WTrackProperty : public WLabel { void updateLabel(TrackInfoObject*); private: + void dragEnterEvent(QDragEnterEvent *event); + void dropEvent(QDropEvent *event); + void mouseMoveEvent(QMouseEvent *event); + + const char* m_pGroup; + ConfigObject* m_pConfig; TrackPointer m_pCurrentTrack; QString m_property; }; diff --git a/src/widget/wtracktext.cpp b/src/widget/wtracktext.cpp index 8de2a1dd570..43f39f538a5 100644 --- a/src/widget/wtracktext.cpp +++ b/src/widget/wtracktext.cpp @@ -1,13 +1,18 @@ -#include "widget/wtracktext.h" +#include +#include -WTrackText::WTrackText(QWidget* pParent) - : WLabel(pParent) { +#include "controlobject.h" +#include "widget/wtracktext.h" +WTrackText::WTrackText(const char *group, ConfigObject *pConfig, QWidget* pParent) + : WLabel(pParent), + m_pGroup(group), + m_pConfig(pConfig) { + setAcceptDrops(true); } WTrackText::~WTrackText() { - } void WTrackText::slotTrackLoaded(TrackPointer track) { @@ -33,3 +38,47 @@ void WTrackText::updateLabel(TrackInfoObject*) { setText(m_pCurrentTrack->getInfo()); } } + +void WTrackText::mouseMoveEvent(QMouseEvent *event) { + if ((event->buttons() & Qt::LeftButton) && m_pCurrentTrack) { + QList locationUrls; + locationUrls.append(QUrl::fromLocalFile(m_pCurrentTrack->getLocation())); + + QMimeData* mimeData = new QMimeData(); + mimeData->setUrls(locationUrls); + + QDrag* drag = new QDrag(this); + drag->setMimeData(mimeData); + drag->setPixmap(QPixmap(":images/library/ic_library_drag_and_drop.png")); + drag->exec(Qt::CopyAction); + } +} + +void WTrackText::dragEnterEvent(QDragEnterEvent *event) { + if (event->mimeData()->hasUrls() && + event->mimeData()->urls().size() > 0) { + // Accept if the Deck isn't playing or the settings allow to interrupt a playing deck + if ((!ControlObject::get(ConfigKey(m_pGroup, "play")) || + m_pConfig->getValueString(ConfigKey("[Controls]", "AllowTrackLoadToPlayingDeck")).toInt())) { + event->acceptProposedAction(); + } else { + event->ignore(); + } + } +} + +void WTrackText::dropEvent(QDropEvent *event) { + if (event->mimeData()->hasUrls() && + event->mimeData()->urls().size() > 0) { + QUrl url = event->mimeData()->urls().first(); + QString fileName = url.toLocalFile(); + // If the file is on a network share, try just converting the URL to a string + if (fileName == "") { + fileName = url.toString(); + } + event->accept(); + emit(trackDropped(fileName, m_pGroup)); + } else { + event->ignore(); + } +} diff --git a/src/widget/wtracktext.h b/src/widget/wtracktext.h index 06993cfcd32..6a589ceb868 100644 --- a/src/widget/wtracktext.h +++ b/src/widget/wtracktext.h @@ -1,14 +1,21 @@ #ifndef WTRACKTEXT_H #define WTRACKTEXT_H -#include "widget/wlabel.h" +#include +#include +#include + +#include "configobject.h" #include "trackinfoobject.h" +#include "widget/wlabel.h" class WTrackText : public WLabel { Q_OBJECT public: - WTrackText(QWidget *parent); + WTrackText(const char* group, ConfigObject* pConfig, QWidget *parent); virtual ~WTrackText(); + signals: + void trackDropped(QString fileName, QString group); public slots: void slotTrackLoaded(TrackPointer track); @@ -18,7 +25,14 @@ class WTrackText : public WLabel { void updateLabel(TrackInfoObject*); private: + void dragEnterEvent(QDragEnterEvent *event); + void dropEvent(QDropEvent *event); + void mouseMoveEvent(QMouseEvent *event); + + const char* m_pGroup; + ConfigObject* m_pConfig; TrackPointer m_pCurrentTrack; }; + #endif /* WTRACKTEXT_H */