/** Add a new playlist tab. */ Playlist* TabPlaylist::addPlaylist() { QString newPlaylistName = tr("Playlist %1").arg(count() + 1); QByteArray ba; if (playlists().isEmpty()) { ba = SettingsPrivate::instance()->lastActivePlaylistGeometry(); } else { ba = currentPlayList()->horizontalHeader()->saveState(); } // Then append a new empty playlist to the others Playlist *p = new Playlist(_mediaPlayer, this); p->installEventFilter(this); if (!ba.isEmpty()) { p->horizontalHeader()->restoreState(ba); } // Always create an icon in Disabled mode. It will be enabled when one will provide some tracks int i = addTab(p, newPlaylistName); this->setTabIcon(i, this->defaultIcon(QIcon::Disabled)); connect(p->mediaPlaylist(), &QMediaPlaylist::mediaRemoved, this, [=](int start, int) { if (_mediaPlayer.data()->playlist() == p->mediaPlaylist() && p->mediaPlaylist()->currentIndex() == start) { _mediaPlayer.data()->stop(); } }); // Forward from inner class to MainWindow the signals connect(p, &Playlist::aboutToSendToTagEditor, this, &TabPlaylist::aboutToSendToTagEditor); connect(p, &Playlist::selectionChanged, this, &TabPlaylist::selectionChanged); // Check if tab icon should indicate that playlist has changed or not connect(p, &Playlist::contentHasChanged, this, [=]() { int playlistTabIndex = -1; for (int i = 0; i < playlists().count(); i++) { if (p == playlist(i)) { playlistTabIndex = i; break; } } if (playlistTabIndex != -1) { if (p->hash() != p->generateNewHash()) { this->setTabIcon(playlistTabIndex, this->defaultIcon(QIcon::Normal)); } } }); // Select the new empty playlist setCurrentIndex(i); uint hash = qHash(p); this->tabBar()->setTabData(i, hash); emit playlistCreated(); return p; }
void PlaylistDialog::populatePreviewFromUnsaved(const QItemSelection &, const QItemSelection &) { static const int MAX_TRACKS_PREVIEW_AREA = 30; bool b = unsavedPlaylists->selectionModel()->selectedIndexes().size() == 1; this->clearPreview(b); if (b) { QStandardItem *item = _unsavedPlaylistModel->itemFromIndex(unsavedPlaylists->selectionModel()->selectedIndexes().first()); Playlist *p = _unsaved.value(item); int max = qMin(p->mediaPlaylist()->mediaCount(), MAX_TRACKS_PREVIEW_AREA); for (int idxTrack = 0; idxTrack < max; idxTrack++) { QString title = p->model()->index(idxTrack, Playlist::COL_TITLE).data().toString(); QString artist = p->model()->index(idxTrack, Playlist::COL_ARTIST).data().toString(); QString album = p->model()->index(idxTrack, Playlist::COL_ALBUM).data().toString(); QTreeWidgetItem *item = new QTreeWidgetItem; item->setText(0, QString("%1 (%2 - %3)").arg(title, artist, album)); previewPlaylist->addTopLevelItem(item); } if (p->mediaPlaylist()->mediaCount() > MAX_TRACKS_PREVIEW_AREA) { QTreeWidgetItem *item = new QTreeWidgetItem; item->setText(0, tr("And more tracks...")); previewPlaylist->addTopLevelItem(item); } } }
/** Redefined: clean preview area, populate once again lists. */ void PlaylistDialog::open() { SettingsPrivate *settings = SettingsPrivate::instance(); if (settings->value("PlaylistDialogGeometry").isValid()) { this->restoreGeometry(settings->value("PlaylistDialogGeometry").toByteArray()); } this->clearPreview(false); for (int i = 0; i < _playlists.count(); i++) { Playlist *p = _playlists.at(i); if (p && p->id() == 0 && !p->mediaPlaylist()->isEmpty()) { QStandardItem *item = new QStandardItem(p->title()); _unsavedPlaylistModel->appendRow(item); _unsaved.insert(item, p); } } this->updatePlaylists(); QDialog::open(); this->activateWindow(); }