bool PlaylistFeature::dropAcceptChild(const QModelIndex& index, QList<QUrl> urls, QObject* pSource) { int playlistId = playlistIdFromIndex(index); //m_playlistDao.appendTrackToPlaylist(url.toLocalFile(), playlistId); QList<QFileInfo> files = DragAndDropHelper::supportedTracksFromUrls(urls, false, true); QList<TrackId> trackIds; if (pSource) { trackIds = m_pTrackCollection->getTrackDAO().getTrackIds(files); m_pTrackCollection->getTrackDAO().unhideTracks(trackIds); } else { // If a track is dropped onto a playlist's name, but the track isn't in the // library, then add the track to the library before adding it to the // playlist. // Adds track, does not insert duplicates, handles unremoving logic. trackIds = m_pTrackCollection->getTrackDAO().addTracks(files, true); } // remove tracks that could not be added for (int trackIdIndex = 0; trackIdIndex < trackIds.size(); ++trackIdIndex) { if (!trackIds.at(trackIdIndex).isValid()) { trackIds.removeAt(trackIdIndex--); } } // Return whether appendTracksToPlaylist succeeded. return m_playlistDao.appendTracksToPlaylist(trackIds, playlistId); }
void PlaylistFeature::onRightClickChild(const QPoint& globalPos, QModelIndex index) { //Save the model index so we can get it in the action slots... m_lastRightClickedIndex = index; int playlistId = playlistIdFromIndex(index); bool locked = m_playlistDao.isPlaylistLocked(playlistId); m_pDeletePlaylistAction->setEnabled(!locked); m_pRenamePlaylistAction->setEnabled(!locked); m_pLockPlaylistAction->setText(locked ? tr("Unlock") : tr("Lock")); //Create the right-click menu QMenu menu(NULL); menu.addAction(m_pCreatePlaylistAction); menu.addSeparator(); menu.addAction(m_pAddToAutoDJAction); menu.addAction(m_pAddToAutoDJTopAction); menu.addSeparator(); menu.addAction(m_pRenamePlaylistAction); menu.addAction(m_pDuplicatePlaylistAction); menu.addAction(m_pDeletePlaylistAction); menu.addAction(m_pLockPlaylistAction); menu.addSeparator(); menu.addAction(m_pAnalyzePlaylistAction); menu.addSeparator(); menu.addAction(m_pImportPlaylistAction); menu.addAction(m_pExportPlaylistAction); menu.exec(globalPos); }
bool PlaylistFeature::dragMoveAcceptChild(const QModelIndex& index, QUrl url) { int playlistId = playlistIdFromIndex(index); bool locked = m_playlistDao.isPlaylistLocked(playlistId); bool formatSupported = SoundSourceProxy::isUrlSupported(url) || Parser::isPlaylistFilenameSupported(url.toLocalFile()); return !locked && formatSupported; }
void BasePlaylistFeature::slotAnalyzePlaylist() { if (m_lastRightClickedIndex.isValid()) { int playlistId = playlistIdFromIndex(m_lastRightClickedIndex); if (playlistId >= 0) { QList<int> ids = m_playlistDao.getTrackIds(playlistId); emit(analyzeTracks(ids)); } } }
void BasePlaylistFeature::activateChild(const QModelIndex& index) { //qDebug() << "BasePlaylistFeature::activateChild()" << index; int playlistId = playlistIdFromIndex(index); if (playlistId != -1 && m_pPlaylistTableModel) { m_pPlaylistTableModel->setTableModel(playlistId); emit(showTrackModel(m_pPlaylistTableModel)); emit(enableCoverArtDisplay(true)); } }
void BasePlaylistFeature::addToAutoDJ(bool bTop) { //qDebug() << "slotAddToAutoDJ() row:" << m_lastRightClickedIndex.data(); if (m_lastRightClickedIndex.isValid()) { int playlistId = playlistIdFromIndex(m_lastRightClickedIndex); if (playlistId >= 0) { // Insert this playlist m_playlistDao.addPlaylistToAutoDJQueue(playlistId, bTop); } } }
bool PlaylistFeature::dragMoveAcceptChild(const QModelIndex& index, QUrl url) { //TODO: Filter by supported formats regex and reject anything that doesn't match. int playlistId = playlistIdFromIndex(index); bool locked = m_playlistDao.isPlaylistLocked(playlistId); QFileInfo file(url.toLocalFile()); bool formatSupported = SoundSourceProxy::isFilenameSupported(file.fileName()) || file.fileName().endsWith(".m3u") || file.fileName().endsWith(".m3u8") || file.fileName().endsWith(".pls"); return !locked && formatSupported; }
void BasePlaylistFeature::slotTogglePlaylistLock() { int playlistId = playlistIdFromIndex(m_lastRightClickedIndex); if (playlistId == -1) { return; } bool locked = !m_playlistDao.isPlaylistLocked(playlistId); if (!m_playlistDao.setPlaylistLocked(playlistId, locked)) { qDebug() << "Failed to toggle lock of playlistId " << playlistId; } }
void BasePlaylistFeature::slotDuplicatePlaylist() { int oldPlaylistId = playlistIdFromIndex(m_lastRightClickedIndex); if (oldPlaylistId == -1) { return; } QString oldName = m_playlistDao.getPlaylistName(oldPlaylistId); QString name; bool validNameGiven = false; while (!validNameGiven) { bool ok = false; name = QInputDialog::getText(NULL, tr("Duplicate Playlist"), tr("Enter name for new playlist:"), QLineEdit::Normal, //: Appendix to default name when duplicating a playlist oldName + tr("_copy" , "[noun]"), &ok).trimmed(); if (!ok || oldName == name) { return; } int existingId = m_playlistDao.getPlaylistIdFromName(name); if (existingId != -1) { QMessageBox::warning(NULL, tr("Playlist Creation Failed"), tr("A playlist by that name already exists.")); } else if (name.isEmpty()) { QMessageBox::warning(NULL, tr("Playlist Creation Failed"), tr("A playlist cannot have a blank name.")); } else { validNameGiven = true; } } int newPlaylistId = m_playlistDao.createPlaylist(name); if (newPlaylistId != -1 && m_playlistDao.copyPlaylistTracks(oldPlaylistId, newPlaylistId)) { emit(showTrackModel(m_pPlaylistTableModel)); } }
void BasePlaylistFeature::slotRenamePlaylist() { int playlistId = playlistIdFromIndex(m_lastRightClickedIndex); if (playlistId == -1) { return; } QString oldName = m_playlistDao.getPlaylistName(playlistId); bool locked = m_playlistDao.isPlaylistLocked(playlistId); if (locked) { qDebug() << "Skipping playlist rename because playlist" << playlistId << "is locked."; return; } QString newName; bool validNameGiven = false; while (!validNameGiven) { bool ok = false; newName = QInputDialog::getText(NULL, tr("Rename Playlist"), tr("Enter new name for playlist:"), QLineEdit::Normal, oldName, &ok).trimmed(); if (!ok || oldName == newName) { return; } int existingId = m_playlistDao.getPlaylistIdFromName(newName); if (existingId != -1) { QMessageBox::warning(NULL, tr("Renaming Playlist Failed"), tr("A playlist by that name already exists.")); } else if (newName.isEmpty()) { QMessageBox::warning(NULL, tr("Renaming Playlist Failed"), tr("A playlist cannot have a blank name.")); } else { validNameGiven = true; } } m_playlistDao.renamePlaylist(playlistId, newName); }
void BasePlaylistFeature::slotDeletePlaylist() { //qDebug() << "slotDeletePlaylist() row:" << m_lastRightClickedIndex.data(); int playlistId = playlistIdFromIndex(m_lastRightClickedIndex); if (playlistId == -1) { return; } bool locked = m_playlistDao.isPlaylistLocked(playlistId); if (locked) { qDebug() << "Skipping playlist deletion because playlist" << playlistId << "is locked."; return; } if (m_lastRightClickedIndex.isValid()) { Q_ASSERT(playlistId >= 0); m_playlistDao.deletePlaylist(playlistId); activate(); } }
void BasePlaylistFeature::slotExportPlaylist() { if (!m_pPlaylistTableModel) { return; } int playlistId = playlistIdFromIndex(m_lastRightClickedIndex); if (playlistId == -1) { return; } QString playlistName = m_playlistDao.getPlaylistName(playlistId); qDebug() << "Export playlist" << playlistName; QString lastPlaylistDirectory = m_pConfig->getValueString( ConfigKey("[Library]", "LastImportExportPlaylistDirectory"), QDesktopServices::storageLocation(QDesktopServices::MusicLocation)); // Open a dialog to let the user choose the file location for playlist export. // The location is set to the last used directory for import/export and the file // name to the playlist name. QString playlist_filename = playlistName; QString file_location = QFileDialog::getSaveFileName( NULL, tr("Export Playlist"), lastPlaylistDirectory.append("/").append(playlist_filename), tr("M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;" "PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt)")); // Exit method if user cancelled the open dialog. if (file_location.isNull() || file_location.isEmpty()) { return; } // Update the import/export playlist directory QFileInfo fileName(file_location); m_pConfig->set(ConfigKey("[Library]","LastImportExportPlaylistDirectory"), ConfigValue(fileName.dir().absolutePath())); // The user has picked a new directory via a file dialog. This means the // system sandboxer (if we are sandboxed) has granted us permission to this // folder. We don't need access to this file on a regular basis so we do not // register a security bookmark. // Create a new table model since the main one might have an active search. // This will only export songs that we think exist on default QScopedPointer<PlaylistTableModel> pPlaylistTableModel( new PlaylistTableModel(this, m_pTrackCollection, "mixxx.db.model.playlist_export")); pPlaylistTableModel->setTableModel(m_pPlaylistTableModel->getPlaylist()); pPlaylistTableModel->setSort(pPlaylistTableModel->fieldIndex( ColumnCache::COLUMN_PLAYLISTTRACKSTABLE_POSITION), Qt::AscendingOrder); pPlaylistTableModel->select(); // check config if relative paths are desired bool useRelativePath = static_cast<bool>(m_pConfig->getValueString( ConfigKey("[Library]", "UseRelativePathOnExport")).toInt()); if (file_location.endsWith(".csv", Qt::CaseInsensitive)) { ParserCsv::writeCSVFile(file_location, pPlaylistTableModel.data(), useRelativePath); } else if (file_location.endsWith(".txt", Qt::CaseInsensitive)) { if (m_playlistDao.getHiddenType(pPlaylistTableModel->getPlaylist()) == PlaylistDAO::PLHT_SET_LOG) { ParserCsv::writeReadableTextFile(file_location, pPlaylistTableModel.data(), true); } else { ParserCsv::writeReadableTextFile(file_location, pPlaylistTableModel.data(), false); } } else { // Create and populate a list of files of the playlist QList<QString> playlist_items; int rows = pPlaylistTableModel->rowCount(); for (int i = 0; i < rows; ++i) { QModelIndex index = pPlaylistTableModel->index(i, 0); playlist_items << pPlaylistTableModel->getTrackLocation(index); } if (file_location.endsWith(".pls", Qt::CaseInsensitive)) { ParserPls::writePLSFile(file_location, playlist_items, useRelativePath); } else if (file_location.endsWith(".m3u8", Qt::CaseInsensitive)) { ParserM3u::writeM3U8File(file_location, playlist_items, useRelativePath); } else { //default export to M3U if file extension is missing if(!file_location.endsWith(".m3u", Qt::CaseInsensitive)) { qDebug() << "Crate export: No valid file extension specified. Appending .m3u " << "and exporting to M3U."; file_location.append(".m3u"); } ParserM3u::writeM3UFile(file_location, playlist_items, useRelativePath); } } }