1 #include "library/export/trackexportdlg.h"
2
3 #include <QDesktopServices>
4 #include <QFileInfo>
5 #include <QMessageBox>
6
7 #include "moc_trackexportdlg.cpp"
8 #include "util/assert.h"
9
TrackExportDlg(QWidget * parent,UserSettingsPointer pConfig,TrackExportWorker * worker)10 TrackExportDlg::TrackExportDlg(QWidget *parent,
11 UserSettingsPointer pConfig,
12 TrackExportWorker* worker)
13 : QDialog(parent),
14 Ui::DlgTrackExport(),
15 m_pConfig(pConfig),
16 m_worker(worker) {
17 setupUi(this);
18 connect(cancelButton,
19 &QPushButton::clicked,
20 this,
21 &TrackExportDlg::cancelButtonClicked);
22 exportProgress->setMinimum(0);
23 exportProgress->setMaximum(1);
24 exportProgress->setValue(0);
25 statusLabel->setText("");
26 setModal(true);
27
28 connect(m_worker,
29 &TrackExportWorker::progress,
30 this,
31 &TrackExportDlg::slotProgress);
32 connect(m_worker,
33 &TrackExportWorker::askOverwriteMode,
34 this,
35 &TrackExportDlg::slotAskOverwriteMode);
36 connect(m_worker,
37 &TrackExportWorker::canceled,
38 this,
39 &TrackExportDlg::cancelButtonClicked);
40 }
41
showEvent(QShowEvent * event)42 void TrackExportDlg::showEvent(QShowEvent* event) {
43 QDialog::showEvent(event);
44 VERIFY_OR_DEBUG_ASSERT(m_worker) {
45 // It's not worth checking for m_exporter != nullptr elsewhere in this
46 // class... it'll be clear very quickly that someone screwed up and
47 // forgot to call selectDestinationDirectory().
48 qDebug() << "Programming error: did not initialize m_exporter, about to crash";
49 return;
50 }
51 m_worker->start();
52 }
53
slotProgress(const QString & filename,int progress,int count)54 void TrackExportDlg::slotProgress(const QString& filename, int progress, int count) {
55 if (progress == count) {
56 statusLabel->setText(tr("Export finished"));
57 finish();
58 } else {
59 statusLabel->setText(tr("Exporting %1").arg(filename));
60 }
61 exportProgress->setMinimum(0);
62 exportProgress->setMaximum(count);
63 exportProgress->setValue(progress);
64 }
65
slotAskOverwriteMode(const QString & filename,std::promise<TrackExportWorker::OverwriteAnswer> * promise)66 void TrackExportDlg::slotAskOverwriteMode(
67 const QString& filename,
68 std::promise<TrackExportWorker::OverwriteAnswer>* promise) {
69 QMessageBox question_box(
70 QMessageBox::Warning,
71 tr("Overwrite Existing File?"),
72 tr("\"%1\" already exists, overwrite?").arg(filename),
73 QMessageBox::Cancel | QMessageBox::No | QMessageBox::NoToAll
74 | QMessageBox::Yes | QMessageBox::YesToAll);
75 question_box.setDefaultButton(QMessageBox::No);
76 question_box.setButtonText(QMessageBox::Yes, tr("&Overwrite"));
77 question_box.setButtonText(QMessageBox::YesToAll, tr("Over&write All"));
78 question_box.setButtonText(QMessageBox::No, tr("&Skip"));
79 question_box.setButtonText(QMessageBox::NoToAll, tr("Skip &All"));
80
81 switch (question_box.exec()) {
82 case QMessageBox::No:
83 promise->set_value(TrackExportWorker::OverwriteAnswer::SKIP);
84 return;
85 case QMessageBox::NoToAll:
86 promise->set_value(TrackExportWorker::OverwriteAnswer::SKIP_ALL);
87 return;
88 case QMessageBox::Yes:
89 promise->set_value(TrackExportWorker::OverwriteAnswer::OVERWRITE);
90 return;
91 case QMessageBox::YesToAll:
92 promise->set_value(TrackExportWorker::OverwriteAnswer::OVERWRITE_ALL);
93 return;
94 case QMessageBox::Cancel:
95 default:
96 promise->set_value(TrackExportWorker::OverwriteAnswer::CANCEL);
97 }
98 }
99
cancelButtonClicked()100 void TrackExportDlg::cancelButtonClicked() {
101 finish();
102 }
103
finish()104 void TrackExportDlg::finish() {
105 m_worker->stop();
106 m_worker->wait();
107 if (m_worker->errorMessage().length()) {
108 QMessageBox::warning(
109 nullptr,
110 tr("Export Error"),
111 m_worker->errorMessage(),
112 QMessageBox::Ok,
113 QMessageBox::Ok);
114 }
115 hide();
116 accept();
117 }
118