summaryrefslogtreecommitdiffstats
path: root/src/library/export/libraryexporter.cpp
blob: 130515d94cb3e38fb730e9e3a4606ace1f8c29ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "library/export/libraryexporter.h"

#include <QProgressDialog>
#include <QThreadPool>

#include "library/export/engineprimeexportjob.h"
#include "util/parented_ptr.h"

namespace mixxx {

LibraryExporter::LibraryExporter(QWidget* parent,
        UserSettingsPointer pConfig,
        TrackCollectionManager* pTrackCollectionManager)
        : QWidget{parent},
          m_pConfig{std::move(pConfig)},
          m_pTrackCollectionManager{pTrackCollectionManager} {
}

void LibraryExporter::requestExportWithOptionalInitialCrate(
        std::optional<CrateId> initialSelectedCrate) {
    if (!m_pDialog) {
        m_pDialog = make_parented<DlgLibraryExport>(
                this, m_pConfig, m_pTrackCollectionManager);
        connect(m_pDialog.get(),
                &DlgLibraryExport::startEnginePrimeExport,
                this,
                &LibraryExporter::beginEnginePrimeExport);
    } else {
        m_pDialog->show();
        m_pDialog->raise();
        m_pDialog->setWindowState(
                (m_pDialog->windowState() & ~Qt::WindowMinimized) |
                Qt::WindowActive);
    }

    m_pDialog->refresh();
    m_pDialog->setSelectedCrate(initialSelectedCrate);
}

void LibraryExporter::beginEnginePrimeExport(
        QSharedPointer<EnginePrimeExportRequest> pRequest) {
    // Note that the job will run in a background thread.
    auto pJobThread = make_parented<EnginePrimeExportJob>(
            this,
            m_pTrackCollectionManager,
            pRequest);
    connect(pJobThread, &EnginePrimeExportJob::finished, pJobThread, &QObject::deleteLater);

    // TODO(XXX) The conclusion of the export (succeeded/failed) could be better
    //  presented as a user notification, rather than using a message box, if
    //  such functionality is added to Mixxx.
    connect(pJobThread,
            &EnginePrimeExportJob::completed,
            this,
            [](int numTracks, int numCrates) {
                QMessageBox::information(nullptr,
                        tr("Export Completed"),
                        QString{tr("Exported %1 track(s) and %2 crate(s).")}
                                .arg(numTracks)
                                .arg(numCrates));
            });
    connect(pJobThread,
            &EnginePrimeExportJob::failed,
            this,
            [](const QString& message) {
                QMessageBox::critical(nullptr,
                        tr("Export Failed"),
                        QString{tr("Export failed: %1")}.arg(message));
            });

    // Construct a dialog to monitor job progress and offer cancellation.
    auto pProgressDlg = make_parented<QProgressDialog>(this);
    pProgressDlg->setLabelText(tr("Exporting to Engine Prime..."));
    pProgressDlg->setMinimumDuration(0);
    connect(pJobThread,
            &EnginePrimeExportJob::jobMaximum,
            pProgressDlg,
            &QProgressDialog::setMaximum);
    connect(pJobThread,
            &EnginePrimeExportJob::jobProgress,
            pProgressDlg,
            &QProgressDialog::setValue);
    connect(pJobThread, &EnginePrimeExportJob::finished, pProgressDlg, &QObject::deleteLater);
    connect(pProgressDlg,
            &QProgressDialog::canceled,
            pJobThread,
            &EnginePrimeExportJob::slotCancel);

    pJobThread->start();
}

} // namespace mixxx