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) {