Skip to content

Commit d9704db

Browse files
authored
Merge pull request #13610 from ronso0/track-export-skip-fix
(fix) Track file export: various fixes
2 parents 106c0a4 + ece92f1 commit d9704db

5 files changed

Lines changed: 63 additions & 31 deletions

File tree

src/library/export/trackexportdlg.cpp

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -68,29 +68,30 @@ void TrackExportDlg::slotAskOverwriteMode(
6868
QMessageBox::Warning,
6969
tr("Overwrite Existing File?"),
7070
tr("\"%1\" already exists, overwrite?").arg(filename),
71-
QMessageBox::Cancel | QMessageBox::No | QMessageBox::NoToAll
72-
| QMessageBox::Yes | QMessageBox::YesToAll);
73-
question_box.setDefaultButton(QMessageBox::No);
74-
question_box.addButton(tr("&Overwrite"), QMessageBox::YesRole);
75-
question_box.addButton(tr("Over&write All"), QMessageBox::YesRole);
76-
question_box.addButton(tr("&Skip"), QMessageBox::NoRole);
77-
question_box.addButton(tr("Skip &All"), QMessageBox::NoRole);
71+
QMessageBox::Cancel);
7872

79-
switch (question_box.exec()) {
80-
case QMessageBox::No:
73+
QPushButton* pSkip = question_box.addButton(
74+
tr("&Skip"), QMessageBox::NoRole);
75+
QPushButton* pSkipAll = question_box.addButton(
76+
tr("Skip &All"), QMessageBox::NoRole);
77+
QPushButton* pOverwrite = question_box.addButton(
78+
tr("&Overwrite"), QMessageBox::YesRole);
79+
QPushButton* pOverwriteAll = question_box.addButton(
80+
tr("Over&write All"), QMessageBox::YesRole);
81+
question_box.setDefaultButton(pSkip);
82+
83+
question_box.exec();
84+
auto* pBtn = question_box.clickedButton();
85+
if (pBtn == pSkip) {
8186
promise->set_value(TrackExportWorker::OverwriteAnswer::SKIP);
82-
return;
83-
case QMessageBox::NoToAll:
87+
} else if (pBtn == pSkipAll) {
8488
promise->set_value(TrackExportWorker::OverwriteAnswer::SKIP_ALL);
85-
return;
86-
case QMessageBox::Yes:
89+
} else if (pBtn == pOverwrite) {
8790
promise->set_value(TrackExportWorker::OverwriteAnswer::OVERWRITE);
88-
return;
89-
case QMessageBox::YesToAll:
91+
} else if (pBtn == pOverwriteAll) {
9092
promise->set_value(TrackExportWorker::OverwriteAnswer::OVERWRITE_ALL);
91-
return;
92-
case QMessageBox::Cancel:
93-
default:
93+
} else {
94+
// Cancel
9495
promise->set_value(TrackExportWorker::OverwriteAnswer::CANCEL);
9596
}
9697
}

src/library/export/trackexportwizard.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ void TrackExportWizard::exportTracks() {
1414
}
1515

1616
bool TrackExportWizard::selectDestinationDirectory() {
17+
if (m_tracks.isEmpty()) {
18+
qInfo() << "TrackExportWizard: No tracks to export, cancel.";
19+
return false;
20+
}
21+
1722
QString lastExportDirectory = m_pConfig->getValue(
1823
ConfigKey("[Library]", "LastTrackCopyDirectory"),
1924
QStandardPaths::writableLocation(QStandardPaths::MusicLocation));

src/library/export/trackexportworker.cpp

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55

66
#include "moc_trackexportworker.cpp"
77
#include "track/track.h"
8+
#include "util/logger.h"
89

910
namespace {
1011

12+
const mixxx::Logger kLogger("TrackExportWorker");
13+
1114
QString rewriteFilename(const mixxx::FileInfo& fileinfo, int index) {
1215
// We don't have total control over the inputs, so definitely
1316
// don't use .arg().arg().arg().
@@ -26,9 +29,12 @@ QMap<QString, mixxx::FileInfo> createCopylist(const TrackPointerList& tracks) {
2629
// efficiently.
2730
QMap<QString, mixxx::FileInfo> copylist;
2831
for (const auto& pTrack : tracks) {
32+
VERIFY_OR_DEBUG_ASSERT(pTrack != nullptr) {
33+
continue;
34+
}
2935
auto fileInfo = pTrack->getFileInfo();
3036
if (fileInfo.resolveCanonicalLocation().isEmpty()) {
31-
qWarning()
37+
kLogger.warning()
3238
<< "File not found or inaccessible while exporting"
3339
<< fileInfo;
3440
// Skip file
@@ -51,7 +57,7 @@ QMap<QString, mixxx::FileInfo> createCopylist(const TrackPointerList& tracks) {
5157
break;
5258
}
5359
if (++duplicateCounter >= 10000) {
54-
qWarning()
60+
kLogger.warning()
5561
<< "Failed to generate a unique file name from"
5662
<< fileName
5763
<< "while exporting"
@@ -100,7 +106,7 @@ void TrackExportWorker::copyFile(
100106
switch (makeOverwriteRequest(dest_path)) {
101107
case OverwriteAnswer::SKIP:
102108
case OverwriteAnswer::SKIP_ALL:
103-
qDebug() << "skipping" << sourceFilename;
109+
kLogger.debug() << "skipping" << sourceFilename;
104110
return;
105111
case OverwriteAnswer::OVERWRITE:
106112
case OverwriteAnswer::OVERWRITE_ALL:
@@ -112,32 +118,32 @@ void TrackExportWorker::copyFile(
112118
}
113119
break;
114120
case OverwriteMode::SKIP_ALL:
115-
qDebug() << "skipping" << sourceFilename;
121+
kLogger.debug() << "skipping" << sourceFilename;
116122
return;
117123
case OverwriteMode::OVERWRITE_ALL:;
118124
}
119125

120126
// Remove the existing file in preparation for overwriting.
121127
QFile dest_file(dest_path);
122-
qDebug() << "Removing existing file" << dest_path;
128+
kLogger.debug() << "removing existing file" << dest_path;
123129
if (!dest_file.remove()) {
124130
const QString error_message = tr(
125131
"Error removing file %1: %2. Stopping.").arg(
126132
dest_path, dest_file.errorString());
127-
qWarning() << error_message;
133+
kLogger.warning() << error_message;
128134
m_errorMessage = error_message;
129135
stop();
130136
return;
131137
}
132138
}
133139

134-
qDebug() << "Copying" << sourceFilename << "to" << dest_path;
140+
kLogger.debug() << "copying" << sourceFilename << "to" << dest_path;
135141
QFile source_file(sourceFilename);
136142
if (!source_file.copy(dest_path)) {
137143
const QString error_message = tr(
138144
"Error exporting track %1 to %2: %3. Stopping.").arg(
139145
sourceFilename, dest_path, source_file.errorString());
140-
qWarning() << error_message;
146+
kLogger.warning() << error_message;
141147
m_errorMessage = error_message;
142148
stop();
143149
return;
@@ -164,7 +170,7 @@ TrackExportWorker::OverwriteAnswer TrackExportWorker::makeOverwriteRequest(
164170
}
165171

166172
if (!mode_future.valid()) {
167-
qWarning() << "TrackExportWorker::makeOverwriteRequest invalid answer from future";
173+
kLogger.warning() << "invalid answer from future";
168174
m_errorMessage = tr("Error exporting tracks");
169175
stop();
170176
return OverwriteAnswer::CANCEL;

src/library/trackset/baseplaylistfeature.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,15 @@ void BasePlaylistFeature::slotExportTrackFiles() {
632632
TrackPointerList tracks;
633633
for (int i = 0; i < rows; ++i) {
634634
QModelIndex index = pPlaylistTableModel->index(i, 0);
635-
tracks.push_back(pPlaylistTableModel->getTrack(index));
635+
auto pTrack = pPlaylistTableModel->getTrack(index);
636+
VERIFY_OR_DEBUG_ASSERT(pTrack != nullptr) {
637+
continue;
638+
}
639+
tracks.push_back(pTrack);
640+
}
641+
642+
if (tracks.isEmpty()) {
643+
return;
636644
}
637645

638646
TrackExportWizard track_export(nullptr, m_pConfig, tracks);

src/library/trackset/crate/cratefeature.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -833,17 +833,29 @@ void CrateFeature::slotExportPlaylist() {
833833
}
834834

835835
void CrateFeature::slotExportTrackFiles() {
836+
CrateId crateId(crateIdFromIndex(m_lastRightClickedIndex));
837+
if (!crateId.isValid()) {
838+
return;
839+
}
836840
// Create a new table model since the main one might have an active search.
837841
QScopedPointer<CrateTableModel> pCrateTableModel(
838842
new CrateTableModel(this, m_pLibrary->trackCollectionManager()));
839-
pCrateTableModel->selectCrate(m_crateTableModel.selectedCrate());
843+
pCrateTableModel->selectCrate(crateId);
840844
pCrateTableModel->select();
841845

842846
int rows = pCrateTableModel->rowCount();
843847
TrackPointerList trackpointers;
844848
for (int i = 0; i < rows; ++i) {
845-
QModelIndex index = m_crateTableModel.index(i, 0);
846-
trackpointers.push_back(m_crateTableModel.getTrack(index));
849+
QModelIndex index = pCrateTableModel->index(i, 0);
850+
auto pTrack = pCrateTableModel->getTrack(index);
851+
VERIFY_OR_DEBUG_ASSERT(pTrack != nullptr) {
852+
continue;
853+
}
854+
trackpointers.push_back(pTrack);
855+
}
856+
857+
if (trackpointers.isEmpty()) {
858+
return;
847859
}
848860

849861
TrackExportWizard track_export(nullptr, m_pConfig, trackpointers);

0 commit comments

Comments
 (0)