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