summaryrefslogtreecommitdiffstats
path: root/src/library/export/dlglibraryexport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/library/export/dlglibraryexport.cpp')
-rw-r--r--src/library/export/dlglibraryexport.cpp209
1 files changed, 209 insertions, 0 deletions
diff --git a/src/library/export/dlglibraryexport.cpp b/src/library/export/dlglibraryexport.cpp
new file mode 100644
index 0000000000..54992b3817
--- /dev/null
+++ b/src/library/export/dlglibraryexport.cpp
@@ -0,0 +1,209 @@
+#include "library/export/dlglibraryexport.h"
+
+#include <QFileDialog>
+#include <QFormLayout>
+#include <QGridLayout>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QPushButton>
+#include <QStandardPaths>
+#include <djinterop/enginelibrary.hpp>
+
+#include "library/export/engineprimeexportrequest.h"
+#include "library/trackcollection.h"
+#include "library/trackcollectionmanager.h"
+#include "library/trackset/crate/crateid.h"
+#include "library/trackset/crate/cratestorage.h"
+
+namespace el = djinterop::enginelibrary;
+
+namespace mixxx {
+
+namespace {
+const QString kDefaultMixxxExportDirName = QStringLiteral("mixxx-export");
+
+void populateCrates(
+ QListWidget& listWidget,
+ const TrackCollection& trackCollection) {
+ // Populate list of crates.
+ CrateSelectResult crates = trackCollection.crates().selectCrates();
+ Crate crate;
+ while (crates.populateNext(&crate)) {
+ auto pItem = std::make_unique<QListWidgetItem>(crate.getName());
+ pItem->setData(Qt::UserRole, crate.getId().value());
+ listWidget.addItem(pItem.release());
+ }
+}
+} // namespace
+
+DlgLibraryExport::DlgLibraryExport(
+ QWidget* parent,
+ UserSettingsPointer pConfig,
+ TrackCollectionManager* pTrackCollectionManager)
+ : QDialog(parent),
+ m_pConfig{pConfig},
+ m_pTrackCollectionManager{pTrackCollectionManager} {
+ // Selectable list of crates from the Mixxx library.
+ m_pCratesList = make_parented<QListWidget>();
+ m_pCratesList->setSelectionMode(QListWidget::ExtendedSelection);
+ populateCrates(*m_pCratesList, *m_pTrackCollectionManager->internalCollection());
+
+ // Read-only text fields showing key directories for export.
+ m_pBaseDirectoryTextField = make_parented<QLineEdit>();
+ m_pBaseDirectoryTextField->setReadOnly(true);
+ m_pDatabaseDirectoryTextField = make_parented<QLineEdit>();
+ m_pDatabaseDirectoryTextField->setReadOnly(true);
+ m_pMusicDirectoryTextField = make_parented<QLineEdit>();
+ m_pMusicDirectoryTextField->setReadOnly(true);
+
+ // Radio buttons to allow choice between exporting the whole music library
+ // or just tracks in a selection of crates.
+ m_pWholeLibraryRadio = make_parented<QRadioButton>(tr("Entire music library"));
+ m_pWholeLibraryRadio->setChecked(true);
+ m_pCratesList->setEnabled(false);
+ connect(m_pWholeLibraryRadio,
+ &QRadioButton::clicked,
+ this,
+ [this]() { m_pCratesList->setEnabled(false); });
+ m_pCratesRadio = make_parented<QRadioButton>(tr("Selected crates"));
+ connect(m_pCratesRadio,
+ &QRadioButton::clicked,
+ this,
+ [this]() { m_pCratesList->setEnabled(true); });
+
+ // Button to allow ability to browse for the export directory.
+ auto pExportDirBrowseButton = make_parented<QPushButton>(tr("Browse"));
+ connect(pExportDirBrowseButton,
+ &QPushButton::clicked,
+ this,
+ &DlgLibraryExport::browseExportDirectory);
+ auto pExportDirLayout = make_parented<QHBoxLayout>();
+ pExportDirLayout->addWidget(m_pBaseDirectoryTextField);
+ pExportDirLayout->addWidget(pExportDirBrowseButton);
+
+ auto pFormLayout = make_parented<QFormLayout>();
+ pFormLayout->addRow(tr("Base export directory"), pExportDirLayout);
+ pFormLayout->addRow(tr("Engine Prime database export directory"),
+ m_pDatabaseDirectoryTextField);
+ pFormLayout->addRow(tr("Copy music files to"), m_pMusicDirectoryTextField);
+
+ // Buttons to begin the export or cancel.
+ auto pExportButton = make_parented<QPushButton>(tr("Export"));
+ pExportButton->setDefault(true);
+ connect(pExportButton, &QPushButton::clicked, this, &DlgLibraryExport::exportRequested);
+ auto pCancelButton = make_parented<QPushButton>(tr("Cancel"));
+ connect(pCancelButton, &QPushButton::clicked, this, &QDialog::reject);
+
+ // Arrange action buttons at bottom of dialog.
+ auto pButtonBarLayout = make_parented<QHBoxLayout>();
+ pButtonBarLayout->addStretch(1);
+ pButtonBarLayout->addWidget(pExportButton);
+ pButtonBarLayout->addWidget(pCancelButton);
+
+ auto pLayout = make_parented<QGridLayout>();
+ pLayout->setColumnStretch(0, 1);
+ pLayout->setColumnStretch(1, 2);
+ pLayout->addWidget(m_pWholeLibraryRadio, 0, 0);
+ pLayout->addWidget(m_pCratesRadio, 1, 0);
+ pLayout->addWidget(m_pCratesList, 2, 0);
+ pLayout->addLayout(pFormLayout, 0, 1, 3, 1);
+ pLayout->addLayout(pButtonBarLayout, 3, 0, 1, 2);
+
+ setLayout(pLayout);
+ setWindowTitle(tr("Export Library"));
+
+ show();
+ raise();
+ activateWindow();
+}
+
+void DlgLibraryExport::setSelectedCrate(std::optional<CrateId> crateId) {
+ if (!crateId) {
+ m_pWholeLibraryRadio->setChecked(true);
+ m_pCratesList->setEnabled(false);
+ return;
+ }
+
+ m_pCratesRadio->setChecked(true);
+ m_pCratesList->setEnabled(true);
+ for (auto i = 0; i < m_pCratesList->count(); ++i) {
+ auto* pItem = m_pCratesList->item(i);
+ auto currCrateId = pItem->data(Qt::UserRole).toInt();
+ if (currCrateId == crateId.value().value()) {
+ m_pCratesList->setCurrentItem(pItem);
+ return;
+ }
+ }
+}
+
+void DlgLibraryExport::browseExportDirectory() {
+ QString lastExportDirectory =
+ m_pConfig->getValue(ConfigKey("[Library]", "LastLibraryExportDirectory"),
+ QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation));
+ auto baseDirectory =
+ QFileDialog::getExistingDirectory(NULL, tr("Export Library To"), lastExportDirectory);
+ if (baseDirectory.isEmpty()) {
+ return;
+ }
+ m_pConfig->set(
+ ConfigKey("[Library]", "LastLibraryExportDirectory"), ConfigValue(baseDirectory));
+
+ QDir baseExportDirectory{baseDirectory};
+ auto databaseDirectory = baseExportDirectory.filePath(
+ el::default_database_dir_name);
+ auto musicDirectory = baseExportDirectory.filePath(kDefaultMixxxExportDirName);
+
+ m_pBaseDirectoryTextField->setText(baseDirectory);
+ m_pDatabaseDirectoryTextField->setText(databaseDirectory);
+ m_pMusicDirectoryTextField->setText(musicDirectory);
+}
+
+void DlgLibraryExport::exportRequested() {
+ // Check a base export directory has been chosen
+ if (m_pBaseDirectoryTextField->text() == "") {
+ QMessageBox::information(this,
+ tr("No Export Directory Chosen"),
+ tr("No export directory was chosen. Please choose a directory "
+ "in order to export the music library."),
+ QMessageBox::Ok,
+ QMessageBox::Ok);
+ return;
+ }
+
+ // See if an EL DB exists in the chosen dir already, and ask the user for
+ // confirmation before proceeding if so.
+ if (el::database_exists(m_pDatabaseDirectoryTextField->text().toStdString())) {
+ int ret = QMessageBox::question(
+ this,
+ tr("Merge Into Existing Library?"),
+ tr("There is already an existing library in directory ") +
+ m_pDatabaseDirectoryTextField->text() +
+ tr("\nIf you proceed, the Mixxx library will be merged into "
+ "this existing library. Do you want to merge into the "
+ "the existing library?"),
+ QMessageBox::Yes | QMessageBox::Cancel,
+ QMessageBox::Cancel);
+ if (ret != QMessageBox::Yes) {
+ return;
+ }
+ }
+
+ // Construct a request to export the library/crates.
+ // Assumed to always be an Engine Prime export in this iteration of the
+ // dialog.
+ EnginePrimeExportRequest request;
+ request.engineLibraryDbDir = QDir{m_pDatabaseDirectoryTextField->text()};
+ request.musicFilesDir = QDir{m_pMusicDirectoryTextField->text()};
+ request.exportSelectedCrates = m_pCratesList->isEnabled();
+ if (request.exportSelectedCrates) {
+ for (auto* pItem : m_pCratesList->selectedItems()) {
+ CrateId id{pItem->data(Qt::UserRole).value<int>()};
+ request.crateIdsToExport.insert(id);
+ }
+ }
+
+ emit startEnginePrimeExport(std::move(request));
+ accept();
+}
+
+} // namespace mixxx