summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mixer/playermanager.cpp11
-rw-r--r--src/mixer/playermanager.h1
-rw-r--r--src/skin/legacyskinparser.cpp12
-rw-r--r--src/util/dnd.h18
-rw-r--r--src/widget/wcoverart.cpp14
-rw-r--r--src/widget/wcoverart.h1
-rw-r--r--src/widget/woverview.cpp14
-rw-r--r--src/widget/woverview.h1
-rw-r--r--src/widget/wspinny.cpp14
-rw-r--r--src/widget/wspinny.h1
-rw-r--r--src/widget/wtrackproperty.cpp14
-rw-r--r--src/widget/wtrackproperty.h1
-rw-r--r--src/widget/wtracktext.cpp14
-rw-r--r--src/widget/wtracktext.h1
-rw-r--r--src/widget/wwaveformviewer.cpp14
-rw-r--r--src/widget/wwaveformviewer.h1
16 files changed, 108 insertions, 24 deletions
diff --git a/src/mixer/playermanager.cpp b/src/mixer/playermanager.cpp
index aa05ba3341..6938bc871b 100644
--- a/src/mixer/playermanager.cpp
+++ b/src/mixer/playermanager.cpp
@@ -556,6 +556,17 @@ Auxiliary* PlayerManager::getAuxiliary(unsigned int auxiliary) const {
return m_auxiliaries[auxiliary - 1];
}
+void PlayerManager::slotCloneDeck(QString source_group, QString target_group) {
+ BaseTrackPlayer* pPlayer = getPlayer(target_group);
+
+ if (pPlayer == NULL) {
+ qWarning() << "Invalid group argument " << target_group << " to slotCloneDeck.";
+ return;
+ }
+
+ pPlayer->slotCloneDeck(source_group);
+}
+
void PlayerManager::slotLoadTrackToPlayer(TrackPointer pTrack, QString group, bool play) {
// Do not lock mutex in this method unless it is changed to access
// PlayerManager state.
diff --git a/src/mixer/playermanager.h b/src/mixer/playermanager.h
index 3fc42e375a..a80731c041 100644
--- a/src/mixer/playermanager.h
+++ b/src/mixer/playermanager.h
@@ -182,6 +182,7 @@ class PlayerManager : public QObject, public PlayerManagerInterface {
// Slots for loading tracks into a Player, which is either a Sampler or a Deck
void slotLoadTrackToPlayer(TrackPointer pTrack, QString group, bool play = false);
void slotLoadToPlayer(QString location, QString group);
+ void slotCloneDeck(QString source_group, QString target_group);
// Slots for loading tracks to decks
void slotLoadTrackIntoNextAvailableDeck(TrackPointer pTrack);
diff --git a/src/skin/legacyskinparser.cpp b/src/skin/legacyskinparser.cpp
index 8b37001627..c8778b3aed 100644
--- a/src/skin/legacyskinparser.cpp
+++ b/src/skin/legacyskinparser.cpp
@@ -937,6 +937,8 @@ QWidget* LegacySkinParser::parseOverview(const QDomElement& node) {
connect(overviewWidget, SIGNAL(trackDropped(QString, QString)),
m_pPlayerManager, SLOT(slotLoadToPlayer(QString, QString)));
+ connect(overviewWidget, SIGNAL(cloneDeck(QString,QString)),
+ m_pPlayerManager, SLOT(slotCloneDeck(QString,QString)));
commonWidgetSetup(node, overviewWidget);
overviewWidget->setup(node, *m_pContext);
@@ -987,6 +989,8 @@ QWidget* LegacySkinParser::parseVisual(const QDomElement& node) {
connect(viewer, SIGNAL(trackDropped(QString, QString)),
m_pPlayerManager, SLOT(slotLoadToPlayer(QString, QString)));
+ connect(viewer, SIGNAL(cloneDeck(QString,QString)),
+ m_pPlayerManager, SLOT(slotCloneDeck(QString,QString)));
// if any already loaded
viewer->slotTrackLoaded(pPlayer->getLoadedTrack());
@@ -1012,6 +1016,8 @@ QWidget* LegacySkinParser::parseText(const QDomElement& node) {
p, SLOT(slotLoadingTrack(TrackPointer, TrackPointer)));
connect(p, SIGNAL(trackDropped(QString,QString)),
m_pPlayerManager, SLOT(slotLoadToPlayer(QString,QString)));
+ connect(p, SIGNAL(cloneDeck(QString,QString)),
+ m_pPlayerManager, SLOT(slotCloneDeck(QString,QString)));
TrackPointer pTrack = pPlayer->getLoadedTrack();
if (pTrack) {
@@ -1039,6 +1045,8 @@ QWidget* LegacySkinParser::parseTrackProperty(const QDomElement& node) {
p, SLOT(slotLoadingTrack(TrackPointer, TrackPointer)));
connect(p, SIGNAL(trackDropped(QString,QString)),
m_pPlayerManager, SLOT(slotLoadToPlayer(QString,QString)));
+ connect(p, SIGNAL(cloneDeck(QString,QString)),
+ m_pPlayerManager, SLOT(slotCloneDeck(QString,QString)));
TrackPointer pTrack = pPlayer->getLoadedTrack();
if (pTrack) {
@@ -1189,6 +1197,8 @@ QWidget* LegacySkinParser::parseSpinny(const QDomElement& node) {
spinny, SLOT(swap()));
connect(spinny, SIGNAL(trackDropped(QString, QString)),
m_pPlayerManager, SLOT(slotLoadToPlayer(QString, QString)));
+ connect(spinny, SIGNAL(cloneDeck(QString,QString)),
+ m_pPlayerManager, SLOT(slotCloneDeck(QString,QString)));
spinny->setup(node, *m_pContext);
spinny->installEventFilter(m_pKeyboard);
@@ -1243,6 +1253,8 @@ QWidget* LegacySkinParser::parseCoverArt(const QDomElement& node) {
} else if (pPlayer != nullptr) {
connect(pCoverArt, SIGNAL(trackDropped(QString, QString)),
m_pPlayerManager, SLOT(slotLoadToPlayer(QString, QString)));
+ connect(pCoverArt, SIGNAL(cloneDeck(QString,QString)),
+ m_pPlayerManager, SLOT(slotCloneDeck(QString,QString)));
}
return pCoverArt;
diff --git a/src/util/dnd.h b/src/util/dnd.h
index 9b08fc8138..462fae94e6 100644
--- a/src/util/dnd.h
+++ b/src/util/dnd.h
@@ -96,6 +96,24 @@ class DragAndDropHelper {
"AllowTrackLoadToPlayingDeck")).toInt();
}
+ static bool allowDeckCloneAttempt(const QMimeData& mimeData,
+ const QString& group) {
+ // only allow clones to decks
+ if (!PlayerManager::isDeckGroup(group, NULL)) {
+ return false;
+ }
+
+ if (!mimeData.hasText() ||
+ // prevent cloning to ourself
+ mimeData.text() == group ||
+ // only allow clone from decks
+ !PlayerManager::isDeckGroup(mimeData.text(), NULL)) {
+ return false;
+ }
+
+ return true;
+ }
+
static bool dragEnterAccept(const QMimeData& mimeData,
const QString& sourceIdentifier,
bool firstOnly,
diff --git a/src/widget/wcoverart.cpp b/src/widget/wcoverart.cpp
index baa7d2cfe4..d0195f4c42 100644
--- a/src/widget/wcoverart.cpp
+++ b/src/widget/wcoverart.cpp
@@ -264,12 +264,18 @@ void WCoverArt::dropEvent(QDropEvent *event) {
// accept track drops.
if (!m_group.isEmpty() &&
DragAndDropHelper::allowLoadToPlayer(m_group, m_pConfig)) {
- QList<QFileInfo> files = DragAndDropHelper::dropEventFiles(
- *event->mimeData(), m_group, true, false);
- if (!files.isEmpty()) {
+ if (DragAndDropHelper::allowDeckCloneAttempt(*event->mimeData(), m_group)) {
event->accept();
- emit(trackDropped(files.at(0).absoluteFilePath(), m_group));
+ emit(cloneDeck(event->mimeData()->text(), m_group));
return;
+ } else {
+ QList<QFileInfo> files = DragAndDropHelper::dropEventFiles(
+ *event->mimeData(), m_group, true, false);
+ if (!files.isEmpty()) {
+ event->accept();
+ emit(trackDropped(files.at(0).absoluteFilePath(), m_group));
+ return;
+ }
}
}
event->ignore();
diff --git a/src/widget/wcoverart.h b/src/widget/wcoverart.h
index e4cdf2f91c..40e4737191 100644
--- a/src/widget/wcoverart.h
+++ b/src/widget/wcoverart.h
@@ -33,6 +33,7 @@ class WCoverArt : public QWidget, public WBaseWidget {
signals:
void trackDropped(QString filename, QString group);
+ void cloneDeck(QString source_group, QString target_group);
private slots:
void slotCoverFound(const QObject* pRequestor,
diff --git a/src/widget/woverview.cpp b/src/widget/woverview.cpp
index 3bf5adf313..b50501b55a 100644
--- a/src/widget/woverview.cpp
+++ b/src/widget/woverview.cpp
@@ -600,12 +600,18 @@ void WOverview::dragEnterEvent(QDragEnterEvent* event) {
void WOverview::dropEvent(QDropEvent* event) {
if (DragAndDropHelper::allowLoadToPlayer(m_group, m_playControl->get() > 0.0,
m_pConfig)) {
- QList<QFileInfo> files = DragAndDropHelper::dropEventFiles(
- *event->mimeData(), m_group, true, false);
- if (!files.isEmpty()) {
+ if (DragAndDropHelper::allowDeckCloneAttempt(*event->mimeData(), m_group)) {
event->accept();
- emit(trackDropped(files.at(0).absoluteFilePath(), m_group));
+ emit(cloneDeck(event->mimeData()->text(), m_group));
return;
+ } else {
+ QList<QFileInfo> files = DragAndDropHelper::dropEventFiles(
+ *event->mimeData(), m_group, true, false);
+ if (!files.isEmpty()) {
+ event->accept();
+ emit(trackDropped(files.at(0).absoluteFilePath(), m_group));
+ return;
+ }
}
}
event->ignore();
diff --git a/src/widget/woverview.h b/src/widget/woverview.h
index 625a5bbf26..6d9483862a 100644
--- a/src/widget/woverview.h
+++ b/src/widget/woverview.h
@@ -42,6 +42,7 @@ class WOverview : public WWidget {
signals:
void trackDropped(QString filename, QString group);
+ void cloneDeck(QString source_group, QString target_group);
protected:
WOverview(
diff --git a/src/widget/wspinny.cpp b/src/widget/wspinny.cpp
index 06090d2631..1cec5a1389 100644
--- a/src/widget/wspinny.cpp
+++ b/src/widget/wspinny.cpp
@@ -688,12 +688,18 @@ void WSpinny::dragEnterEvent(QDragEnterEvent* event) {
void WSpinny::dropEvent(QDropEvent * event) {
if (DragAndDropHelper::allowLoadToPlayer(m_group, m_pPlay->get() > 0.0,
m_pConfig)) {
- QList<QFileInfo> files = DragAndDropHelper::dropEventFiles(
- *event->mimeData(), m_group, true, false);
- if (!files.isEmpty()) {
+ if (DragAndDropHelper::allowDeckCloneAttempt(*event->mimeData(), m_group)) {
event->accept();
- emit(trackDropped(files.at(0).absoluteFilePath(), m_group));
+ emit(cloneDeck(event->mimeData()->text(), m_group));
return;
+ } else {
+ QList<QFileInfo> files = DragAndDropHelper::dropEventFiles(
+ *event->mimeData(), m_group, true, false);
+ if (!files.isEmpty()) {
+ event->accept();
+ emit(trackDropped(files.at(0).absoluteFilePath(), m_group));
+ return;
+ }
}
}
event->ignore();
diff --git a/src/widget/wspinny.h b/src/widget/wspinny.h
index ef520c534a..f80c5c4f73 100644
--- a/src/widget/wspinny.h
+++ b/src/widget/wspinny.h
@@ -56,6 +56,7 @@ class WSpinny : public QGLWidget, public WBaseWidget, public VinylSignalQualityL
signals:
void trackDropped(QString filename, QString group);
+ void cloneDeck(QString source_group, QString target_group);
protected:
//QWidget:
diff --git a/src/widget/wtrackproperty.cpp b/src/widget/wtrackproperty.cpp
index 6f83a4561b..4b4e9bec43 100644
--- a/src/widget/wtrackproperty.cpp
+++ b/src/widget/wtrackproperty.cpp
@@ -67,12 +67,18 @@ void WTrackProperty::dragEnterEvent(QDragEnterEvent *event) {
void WTrackProperty::dropEvent(QDropEvent *event) {
if (DragAndDropHelper::allowLoadToPlayer(m_pGroup, m_pConfig)) {
- QList<QFileInfo> files = DragAndDropHelper::dropEventFiles(
- *event->mimeData(), m_pGroup, true, false);
- if (!files.isEmpty()) {
+ if (DragAndDropHelper::allowDeckCloneAttempt(*event->mimeData(), m_pGroup)) {
event->accept();
- emit(trackDropped(files.at(0).absoluteFilePath(), m_pGroup));
+ emit(cloneDeck(event->mimeData()->text(), m_pGroup));
return;
+ } else {
+ QList<QFileInfo> files = DragAndDropHelper::dropEventFiles(
+ *event->mimeData(), m_pGroup, true, false);
+ if (!files.isEmpty()) {
+ event->accept();
+ emit(trackDropped(files.at(0).absoluteFilePath(), m_pGroup));
+ return;
+ }
}
}
event->ignore();
diff --git a/src/widget/wtrackproperty.h b/src/widget/wtrackproperty.h
index c50c8b9177..8653832ecc 100644
--- a/src/widget/wtrackproperty.h
+++ b/src/widget/wtrackproperty.h
@@ -19,6 +19,7 @@ class WTrackProperty : public WLabel {
signals:
void trackDropped(QString filename, QString group);
+ void cloneDeck(QString source_group, QString target_group);
public slots:
void slotTrackLoaded(TrackPointer track);
diff --git a/src/widget/wtracktext.cpp b/src/widget/wtracktext.cpp
index 5c843229cd..f3314d06e6 100644
--- a/src/widget/wtracktext.cpp
+++ b/src/widget/wtracktext.cpp
@@ -56,12 +56,18 @@ void WTrackText::dragEnterEvent(QDragEnterEvent *event) {
void WTrackText::dropEvent(QDropEvent *event) {
if (DragAndDropHelper::allowLoadToPlayer(m_pGroup, m_pConfig)) {
- QList<QFileInfo> files = DragAndDropHelper::dropEventFiles(
- *event->mimeData(), m_pGroup, true, false);
- if (!files.isEmpty()) {
+ if (DragAndDropHelper::allowDeckCloneAttempt(*event->mimeData(), m_pGroup)) {
event->accept();
- emit(trackDropped(files.at(0).absoluteFilePath(), m_pGroup));
+ emit(cloneDeck(event->mimeData()->text(), m_pGroup));
return;
+ } else {
+ QList<QFileInfo> files = DragAndDropHelper::dropEventFiles(
+ *event->mimeData(), m_pGroup, true, false);
+ if (!files.isEmpty()) {
+ event->accept();
+ emit(trackDropped(files.at(0).absoluteFilePath(), m_pGroup));
+ return;
+ }
}
}
event->ignore();
diff --git a/src/widget/wtracktext.h b/src/widget/wtracktext.h
index 2cd0977b31..2fd1122039 100644
--- a/src/widget/wtracktext.h
+++ b/src/widget/wtracktext.h
@@ -16,6 +16,7 @@ class WTrackText : public WLabel {
signals:
void trackDropped(QString fileName, QString group);
+ void cloneDeck(QString source_group, QString target_group);
public slots:
void slotTrackLoaded(TrackPointer track);
diff --git a/src/widget/wwaveformviewer.cpp b/src/widget/wwaveformviewer.cpp
index 5074825475..1cbfe80751 100644
--- a/src/widget/wwaveformviewer.cpp
+++ b/src/widget/wwaveformviewer.cpp
@@ -161,12 +161,18 @@ void WWaveformViewer::dragEnterEvent(QDragEnterEvent* event) {
void WWaveformViewer::dropEvent(QDropEvent* event) {
if (DragAndDropHelper::allowLoadToPlayer(m_pGroup, m_pConfig)) {
- QList<QFileInfo> files = DragAndDropHelper::dropEventFiles(
- *event->mimeData(), m_pGroup, true, false);
- if (!files.isEmpty()) {
+ if (DragAndDropHelper::allowDeckCloneAttempt(*event->mimeData(), m_pGroup)) {
event->accept();
- emit(trackDropped(files.at(0).absoluteFilePath(), m_pGroup));
+ emit(cloneDeck(event->mimeData()->text(), m_pGroup));
return;
+ } else {
+ QList<QFileInfo> files = DragAndDropHelper::dropEventFiles(
+ *event->mimeData(), m_pGroup, true, false);
+ if (!files.isEmpty()) {
+ event->accept();
+ emit(trackDropped(files.at(0).absoluteFilePath(), m_pGroup));
+ return;
+ }
}
}
event->ignore();
diff --git a/src/widget/wwaveformviewer.h b/src/widget/wwaveformviewer.h
index 7d090080be..0609529c3a 100644
--- a/src/widget/wwaveformviewer.h
+++ b/src/widget/wwaveformviewer.h
@@ -34,6 +34,7 @@ class WWaveformViewer : public WWidget {
signals:
void trackDropped(QString filename, QString group);
+ void cloneDeck(QString source_group, QString target_group);
public slots:
void slotTrackLoaded(TrackPointer track);