From b32addd507b8b3cd3481a41821c261bd306b1a25 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Wed, 8 Dec 2021 11:27:10 +0100 Subject: [PATCH 1/6] Remove from disk: enable for deck menus --- src/widget/wtrackmenu.cpp | 72 ++++++++++++++++++++++++----------- src/widget/wtrackproperty.cpp | 2 + 2 files changed, 51 insertions(+), 23 deletions(-) diff --git a/src/widget/wtrackmenu.cpp b/src/widget/wtrackmenu.cpp index 69b650fa4668..5f2314ccef9a 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 @@ -1782,14 +1790,26 @@ 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())) + + QString("

") + + tr("Note: if you are in Browse or Recording you need to " + "click the current view again to see changes."); + } else { + // ToDo(ronso0) Eject track after deletion. + 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 +1822,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 files could not be deleted from disk") + .arg(QString::number( + tracksToKeep.length())); + } else { + msgText = tr("Track file could not be deleted from disk."); + } + notDeletedLabel->setText(msgText); notDeletedLabel->setTextFormat(Qt::RichText); QListWidget* notDeletedListWidget = new QListWidget; @@ -1825,7 +1851,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) { From fda4ed1a41fdf8e0518305b81fb41f1069474f40 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Wed, 8 Dec 2021 17:02:27 +0100 Subject: [PATCH 2/6] Remove track from disk: eject from deck after deleting --- src/widget/wtrackmenu.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/widget/wtrackmenu.cpp b/src/widget/wtrackmenu.cpp index 5f2314ccef9a..855b76e8d89b 100644 --- a/src/widget/wtrackmenu.cpp +++ b/src/widget/wtrackmenu.cpp @@ -1802,7 +1802,11 @@ void WTrackMenu::slotRemoveFromDisk() { tr("Note: if you are in Browse or Recording you need to " "click the current view again to see changes."); } else { - // ToDo(ronso0) Eject track after deletion. + // Eject track from deck + ControlProxy* ejectTrackProxy = new ControlProxy( + m_deckGroup, "eject", this); + ejectTrackProxy->set(1.0); + msgTitle = tr("Track File Deleted"); msgText = tr( "Track file was deleted from disk and purged " From b9d5a4cf2d26de0449a7f06a827ec1ea91643936 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Thu, 9 Dec 2021 23:12:34 +0100 Subject: [PATCH 3/6] stop deck, eject track after confirmation, before deleting the file --- src/widget/wtrackmenu.cpp | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/widget/wtrackmenu.cpp b/src/widget/wtrackmenu.cpp index 855b76e8d89b..044f2c458f5d 100644 --- a/src/widget/wtrackmenu.cpp +++ b/src/widget/wtrackmenu.cpp @@ -1733,10 +1733,19 @@ void WTrackMenu::slotRemoveFromDisk() { delListWidget->addItems(locations); mixxx::widgethelper::growListWidget(*delListWidget, *this); // Warning text + QString delWarningText; + if (m_pTrackModel) { + delWarningText = tr("Permanently delete these files from disk?") + + QString("

") + + tr("This can not be undone!") + QString(""); + } else { + delWarningText = + tr("Stop the deck and permanently delete this track file from disk?") + + QString("

") + + tr("This can not be undone!") + QString(""); + } 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)); @@ -1770,6 +1779,17 @@ 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) { + ControlProxy* stopDeckProxy = new ControlProxy( + m_deckGroup, "stop", this); + stopDeckProxy->set(1.0); + ControlProxy* ejectTrackProxy = new ControlProxy( + m_deckGroup, "eject", this); + ejectTrackProxy->set(1.0); + } + // Set up and initiate the track batch operation const auto progressLabelText = tr("Removing %1 track file(s) from disk...", @@ -1802,11 +1822,6 @@ void WTrackMenu::slotRemoveFromDisk() { tr("Note: if you are in Browse or Recording you need to " "click the current view again to see changes."); } else { - // Eject track from deck - ControlProxy* ejectTrackProxy = new ControlProxy( - m_deckGroup, "eject", this); - ejectTrackProxy->set(1.0); - msgTitle = tr("Track File Deleted"); msgText = tr( "Track file was deleted from disk and purged " From e89aedfc97ca2c61a85ec05e7ddea47ed48775e1 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Fri, 4 Feb 2022 22:34:10 +0100 Subject: [PATCH 4/6] Remove from disk: use QStringLiteral, remove comments --- src/widget/wtrackmenu.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/widget/wtrackmenu.cpp b/src/widget/wtrackmenu.cpp index 044f2c458f5d..dcc2271708a4 100644 --- a/src/widget/wtrackmenu.cpp +++ b/src/widget/wtrackmenu.cpp @@ -1732,24 +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?") + - QString("

") + - tr("This can not be undone!") + QString(""); + QStringLiteral("

") + + tr("This can not be undone!") + QStringLiteral(""); } else { delWarningText = tr("Stop the deck and permanently delete this track file from disk?") + - QString("

") + - tr("This can not be undone!") + QString(""); + QStringLiteral("

") + + tr("This can not be undone!") + QStringLiteral(""); } QLabel* delWarning = new QLabel(); 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"), @@ -1818,7 +1818,7 @@ void WTrackMenu::slotRemoveFromDisk() { tr("%1 track files were deleted from disk and purged " "from the Mixxx database.") .arg(QString::number(tracksToPurge.length())) + - QString("

") + + QStringLiteral("

") + tr("Note: if you are in Browse or Recording you need to " "click the current view again to see changes."); } else { From 23b95810ffd8890f1bb504cf0cb746564148c471 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Fri, 4 Feb 2022 22:34:35 +0100 Subject: [PATCH 5/6] Remove from disk: reword 'not deleted' messages --- src/widget/wtrackmenu.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/widget/wtrackmenu.cpp b/src/widget/wtrackmenu.cpp index dcc2271708a4..e1aedcd0af49 100644 --- a/src/widget/wtrackmenu.cpp +++ b/src/widget/wtrackmenu.cpp @@ -1844,11 +1844,11 @@ void WTrackMenu::slotRemoveFromDisk() { QString msgText; if (m_pTrackModel) { msgText = - tr("The following %1 files could not be deleted from disk") + tr("The following %1 file(s) could not be deleted from disk") .arg(QString::number( tracksToKeep.length())); } else { - msgText = tr("Track file could not be deleted from disk."); + msgText = tr("This track file could not be deleted from disk"); } notDeletedLabel->setText(msgText); notDeletedLabel->setTextFormat(Qt::RichText); From 3c6e33d6d1da03bd094c452e38a823c8d5da80c1 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Fri, 4 Feb 2022 22:35:09 +0100 Subject: [PATCH 6/6] Remove from disk: use static ControlObject method to stop & eject track --- src/widget/wtrackmenu.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/widget/wtrackmenu.cpp b/src/widget/wtrackmenu.cpp index e1aedcd0af49..bc4f31bb7a69 100644 --- a/src/widget/wtrackmenu.cpp +++ b/src/widget/wtrackmenu.cpp @@ -1782,12 +1782,8 @@ 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) { - ControlProxy* stopDeckProxy = new ControlProxy( - m_deckGroup, "stop", this); - stopDeckProxy->set(1.0); - ControlProxy* ejectTrackProxy = new ControlProxy( - m_deckGroup, "eject", this); - ejectTrackProxy->set(1.0); + ControlObject::set(ConfigKey(m_deckGroup, "stop"), 1.0); + ControlObject::set(ConfigKey(m_deckGroup, "eject"), 1.0); } // Set up and initiate the track batch operation