diff --git a/src/widget/wtrackmenu.cpp b/src/widget/wtrackmenu.cpp
index 69b650fa4668..bc4f31bb7a69 100644
--- a/src/widget/wtrackmenu.cpp
+++ b/src/widget/wtrackmenu.cpp
@@ -535,8 +535,7 @@ void WTrackMenu::setupActions() {
}
}
- if (featureIsEnabled(Feature::RemoveFromDisk) &&
- m_pTrackModel->hasCapabilities(TrackModel::Capability::RemoveFromDisk)) {
+ if (featureIsEnabled(Feature::RemoveFromDisk)) {
m_pRemoveFromDiskMenu->addAction(m_pRemoveFromDiskAct);
addMenu(m_pRemoveFromDiskMenu);
}
@@ -790,9 +789,11 @@ void WTrackMenu::updateMenus() {
}
if (featureIsEnabled(Feature::RemoveFromDisk)) {
- bool locked = m_pTrackModel->hasCapabilities(TrackModel::Capability::Locked);
- if (m_pTrackModel->hasCapabilities(TrackModel::Capability::RemoveFromDisk)) {
- m_pRemoveFromDiskAct->setEnabled(!locked);
+ if (m_pTrackModel) {
+ bool locked = m_pTrackModel->hasCapabilities(TrackModel::Capability::Locked);
+ if (m_pTrackModel->hasCapabilities(TrackModel::Capability::RemoveFromDisk)) {
+ m_pRemoveFromDiskAct->setEnabled(!locked);
+ }
}
}
@@ -1704,14 +1705,21 @@ class RemoveTrackFilesFromDiskTrackPointerOperation : public mixxx::TrackPointer
} // anonymous namespace
void WTrackMenu::slotRemoveFromDisk() {
- const auto trackRefs = getTrackRefs();
QStringList locations;
- locations.reserve(trackRefs.size());
- for (const auto& trackRef : trackRefs) {
- QString location = trackRef.getLocation();
+ if (m_pTrackModel) {
+ const auto trackRefs = getTrackRefs();
+ locations.reserve(trackRefs.size());
+ for (const auto& trackRef : trackRefs) {
+ QString location = trackRef.getLocation();
+ locations.append(location);
+ }
+ locations.removeDuplicates();
+ } else if (m_pTrack) {
+ QString location = m_pTrack->getLocation();
locations.append(location);
+ } else {
+ return;
}
- locations.removeDuplicates();
{
// Prepare the delete confirmation dialog
@@ -1724,15 +1732,24 @@ void WTrackMenu::slotRemoveFromDisk() {
delListWidget->setFocusPolicy(Qt::ClickFocus);
delListWidget->addItems(locations);
mixxx::widgethelper::growListWidget(*delListWidget, *this);
- // Warning text
+
+ QString delWarningText;
+ if (m_pTrackModel) {
+ delWarningText = tr("Permanently delete these files from disk?") +
+ QStringLiteral("
") +
+ tr("This can not be undone!") + QStringLiteral("");
+ } else {
+ delWarningText =
+ tr("Stop the deck and permanently delete this track file from disk?") +
+ QStringLiteral("
") +
+ tr("This can not be undone!") + QStringLiteral("");
+ }
QLabel* delWarning = new QLabel();
- delWarning->setText(tr("Permanently delete these files from disk?") +
- QString("
") +
- tr("This can not be undone!") + QString(""));
+ delWarning->setText(delWarningText);
delWarning->setTextFormat(Qt::RichText);
delWarning->setSizePolicy(QSizePolicy(QSizePolicy::Minimum,
QSizePolicy::Minimum));
- // Buttons
+
QDialogButtonBox* delButtons = new QDialogButtonBox();
QPushButton* cancelBtn = delButtons->addButton(
tr("Cancel"),
@@ -1762,6 +1779,13 @@ void WTrackMenu::slotRemoveFromDisk() {
}
}
+ // If the operation was initiated from a deck's track menu
+ // we'll first stop the deck and eject the track.
+ if (m_pTrack) {
+ ControlObject::set(ConfigKey(m_deckGroup, "stop"), 1.0);
+ ControlObject::set(ConfigKey(m_deckGroup, "eject"), 1.0);
+ }
+
// Set up and initiate the track batch operation
const auto progressLabelText =
tr("Removing %1 track file(s) from disk...",
@@ -1782,14 +1806,25 @@ void WTrackMenu::slotRemoveFromDisk() {
// Show purge summary message
QMessageBox msgBoxPurgeTracks;
msgBoxPurgeTracks.setIcon(QMessageBox::Information);
- msgBoxPurgeTracks.setWindowTitle(tr("Track Files Deleted"));
- msgBoxPurgeTracks.setText(
- tr("%1 track files were deleted from disk and purged "
- "from the Mixxx database.")
- .arg(QString::number(tracksToPurge.length())) +
- QString("
") +
- tr("Note: if you are in Browse or Recording you need to "
- "click the current view again to see changes."));
+ QString msgTitle;
+ QString msgText;
+ if (m_pTrackModel) {
+ msgTitle = tr("Track Files Deleted");
+ msgText =
+ tr("%1 track files were deleted from disk and purged "
+ "from the Mixxx database.")
+ .arg(QString::number(tracksToPurge.length())) +
+ QStringLiteral("
") +
+ tr("Note: if you are in Browse or Recording you need to "
+ "click the current view again to see changes.");
+ } else {
+ msgTitle = tr("Track File Deleted");
+ msgText = tr(
+ "Track file was deleted from disk and purged "
+ "from the Mixxx database.");
+ }
+ msgBoxPurgeTracks.setWindowTitle(msgTitle);
+ msgBoxPurgeTracks.setText(msgText);
msgBoxPurgeTracks.setTextFormat(Qt::RichText);
msgBoxPurgeTracks.setStandardButtons(QMessageBox::Ok);
msgBoxPurgeTracks.exec();
@@ -1802,10 +1837,16 @@ void WTrackMenu::slotRemoveFromDisk() {
}
// Else show a message with a list of tracks that could not be deleted.
QLabel* notDeletedLabel = new QLabel;
- notDeletedLabel->setText(
- tr("The following %1 files could not be deleted from disk")
- .arg(QString::number(
- tracksToKeep.length())));
+ QString msgText;
+ if (m_pTrackModel) {
+ msgText =
+ tr("The following %1 file(s) could not be deleted from disk")
+ .arg(QString::number(
+ tracksToKeep.length()));
+ } else {
+ msgText = tr("This track file could not be deleted from disk");
+ }
+ notDeletedLabel->setText(msgText);
notDeletedLabel->setTextFormat(Qt::RichText);
QListWidget* notDeletedListWidget = new QListWidget;
@@ -1825,7 +1866,7 @@ void WTrackMenu::slotRemoveFromDisk() {
QDialog dlgNotDeleted;
dlgNotDeleted.setModal(true);
- dlgNotDeleted.setWindowTitle(tr("Remaining Track Files"));
+ dlgNotDeleted.setWindowTitle(tr("Remaining Track File(s)"));
dlgNotDeleted.setLayout(notDeletedLayout);
// Required for being able to close the dialog
connect(closeBtn, &QPushButton::clicked, &dlgNotDeleted, &QDialog::close);
diff --git a/src/widget/wtrackproperty.cpp b/src/widget/wtrackproperty.cpp
index dfc9f3db5f7a..580fc8b85768 100644
--- a/src/widget/wtrackproperty.cpp
+++ b/src/widget/wtrackproperty.cpp
@@ -18,6 +18,7 @@ constexpr WTrackMenu::Features kTrackMenuFeatures =
WTrackMenu::Feature::Reset |
WTrackMenu::Feature::BPM |
WTrackMenu::Feature::Color |
+ WTrackMenu::Feature::RemoveFromDisk |
WTrackMenu::Feature::FileBrowser |
WTrackMenu::Feature::Properties |
WTrackMenu::Feature::UpdateReplayGain;
@@ -94,6 +95,7 @@ void WTrackProperty::mouseMoveEvent(QMouseEvent* event) {
DragAndDropHelper::dragTrack(m_pCurrentTrack, this, m_group);
}
}
+
void WTrackProperty::mouseDoubleClickEvent(QMouseEvent* event) {
Q_UNUSED(event);
if (m_pCurrentTrack) {