playlistbrowser.cpp
来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 1,990 行 · 第 1/5 页
CPP
1,990 行
item = new SmartPlaylist( m_smartDefaults, 0, i18n( "All Collection" ), qb.query() ); item->setPixmap( 0, SmallIcon( Amarok::icon( "collection" ) ) ); item->setKept( false ); /********** Favorite Tracks **************/ qb.initSQLDrag(); qb.sortByFavorite(); qb.setLimit( 0, 15 ); item = new SmartPlaylist( m_smartDefaults, item, i18n( "Favorite Tracks" ), qb.query() ); item->setKept( false ); last = 0; qb.initSQLDrag(); qb.sortByFavorite(); qb.setLimit( 0, 15 ); foreach( artists ) { QueryBuilder qbTemp( qb ); qbTemp.addMatch( QueryBuilder::tabArtist, *it ); last = new SmartPlaylist( item, last, i18n( "By %1" ).arg( *it ), qbTemp.query() ); last->setKept( false ); } /********** Most Played **************/ qb.initSQLDrag(); qb.sortBy( QueryBuilder::tabStats, QueryBuilder::valPlayCounter, true ); qb.setLimit( 0, 15 ); item = new SmartPlaylist( m_smartDefaults, item, i18n( "Most Played" ), qb.query() ); item->setKept( false ); last = 0; qb.initSQLDrag(); qb.sortBy( QueryBuilder::tabStats, QueryBuilder::valPlayCounter, true ); qb.setLimit( 0, 15 ); foreach( artists ) { QueryBuilder qbTemp( qb ); qbTemp.addMatch( QueryBuilder::tabArtist, *it ); last = new SmartPlaylist( item, last, i18n( "By %1" ).arg( *it ), qbTemp.query() ); last->setKept( false ); } /********** Newest Tracks **************/ qb.initSQLDrag(); qb.sortBy( QueryBuilder::tabSong, QueryBuilder::valCreateDate, true ); qb.setLimit( 0, 15 ); item = new SmartPlaylist( m_smartDefaults, item, i18n( "Newest Tracks" ), qb.query() ); item->setKept( false ); last = 0; qb.initSQLDrag(); qb.sortBy( QueryBuilder::tabSong, QueryBuilder::valCreateDate, true ); qb.setLimit( 0, 15 ); foreach( artists ) { QueryBuilder qbTemp( qb ); qbTemp.addMatch( QueryBuilder::tabArtist, *it ); last = new SmartPlaylist( item, last, i18n( "By %1" ).arg( *it ), qbTemp.query( true ) ); last->setKept( false ); } /********** Last Played **************/ qb.initSQLDrag(); qb.sortBy( QueryBuilder::tabStats, QueryBuilder::valAccessDate, true ); qb.setLimit( 0, 15 ); item = new SmartPlaylist( m_smartDefaults, item, i18n( "Last Played" ), qb.query( true ) ); item->setKept( false ); /********** Never Played **************/ qb.initSQLDrag(); qb.addNumericFilter( QueryBuilder::tabStats, QueryBuilder::valPlayCounter, "0" ); qb.sortBy( QueryBuilder::tabArtist, QueryBuilder::valName ); qb.sortBy( QueryBuilder::tabAlbum, QueryBuilder::valName ); qb.sortBy( QueryBuilder::tabSong, QueryBuilder::valTrack ); item = new SmartPlaylist( m_smartDefaults, item, i18n( "Never Played" ), qb.query( true ) ); item->setKept( false ); /********** Ever Played **************/ qb.initSQLDrag(); qb.excludeFilter( QueryBuilder::tabStats, QueryBuilder::valPlayCounter, "1", QueryBuilder::modeLess ); qb.sortBy( QueryBuilder::tabArtist, QueryBuilder::valName ); qb.sortBy( QueryBuilder::tabAlbum, QueryBuilder::valName ); qb.sortBy( QueryBuilder::tabSong, QueryBuilder::valTrack ); qb.sortBy( QueryBuilder::tabStats, QueryBuilder::valScore ); item = new SmartPlaylist( m_smartDefaults, item, i18n( "Ever Played" ), qb.query( true ) ); item->setKept( false ); /********** Genres **************/ item = new SmartPlaylist( m_smartDefaults, item, i18n( "Genres" ), QString() ); item->setKept( false ); last = 0; qb.initSQLDrag(); qb.sortBy( QueryBuilder::tabArtist, QueryBuilder::valName ); qb.sortBy( QueryBuilder::tabAlbum, QueryBuilder::valName ); qb.sortBy( QueryBuilder::tabSong, QueryBuilder::valTrack ); foreach( genres ) { QueryBuilder qbTemp( qb ); qbTemp.addMatch( QueryBuilder::tabGenre, *it ); last = new SmartPlaylist( item, last, i18n( "%1" ).arg( *it ), qbTemp.query( true ) ); last->setKept( false ); } /********** 50 Random Tracks **************/ qb.initSQLDrag(); qb.setOptions( QueryBuilder::optRandomize ); qb.setLimit( 0, 50 ); item = new SmartPlaylist( m_smartDefaults, item, i18n( "50 Random Tracks" ), qb.query( true ) ); item->setKept( false );}void PlaylistBrowser::editSmartPlaylist( SmartPlaylist* item ){ SmartPlaylistEditor dialog( this, item->xml() ); if( dialog.exec() == QDialog::Accepted ) { item->setXml ( dialog.result() ); item->setText( 0, dialog.name() ); if( item->isDynamic() ) // rebuild the cache if the smart playlist has changed Playlist::instance()->rebuildDynamicModeCache(); }}void PlaylistBrowser::saveSmartPlaylists( PlaylistCategory *smartCategory ){ QFile file( smartplaylistBrowserCache() ); if( !smartCategory ) smartCategory = m_smartCategory; // If the user hadn't set a collection, we didn't create the Smart Playlist Item if( !smartCategory ) return; QDomDocument doc; QDomElement smartB = smartCategory->xml(); smartB.setAttribute( "product", "Amarok" ); smartB.setAttribute( "version", APP_VERSION ); smartB.setAttribute( "formatversion", "1.8" ); QDomNode smartplaylistsNode = doc.importNode( smartB, true ); doc.appendChild( smartplaylistsNode ); QString temp( doc.toString() ); // Only open the file after all data is ready. If it crashes, data is not lost! if ( !file.open( IO_WriteOnly ) ) return; QTextStream smart( &file ); smart.setEncoding( QTextStream::UnicodeUTF8 ); smart << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; smart << temp;}/** ************************************************************************* * PARTIES ************************************************************************* **/QString PlaylistBrowser::dynamicBrowserCache() const{ return Amarok::saveLocation() + "dynamicbrowser_save.xml";}PlaylistCategory* PlaylistBrowser::loadDynamics(){ QFile file( dynamicBrowserCache() ); QTextStream stream( &file ); stream.setEncoding( QTextStream::UnicodeUTF8 ); QDomDocument d; QDomElement e; PlaylistCategory *after = m_smartCategory; if( CollectionDB::instance()->isEmpty() || !m_smartCategory ) // incase of no collection after = m_playlistCategory; if( !file.open( IO_ReadOnly ) || !d.setContent( stream.read() ) ) { /*Couldn't open the file or it had invalid content, so let's create some defaults*/ PlaylistCategory *p = new PlaylistCategory( m_listview, after, i18n("Dynamic Playlists") ); return p; } else { e = d.namedItem( "category" ).toElement(); QString version = e.attribute("formatversion"); if ( version == "1.2" ) { PlaylistCategory* p = new PlaylistCategory( m_listview, after, e ); p->setText( 0, i18n("Dynamic Playlists") ); return p; } else if ( version == "1.1" ) { // In 1.1, playlists would be referred only by its name. // TODO: We can *try* to convert by using findItem PlaylistCategory* p = new PlaylistCategory( m_listview, after, e ); p->setText( 0, i18n("Dynamic Playlists") ); fixDynamicPlaylistPath( p ); return p; } else { // Old unversioned format PlaylistCategory* p = new PlaylistCategory( m_listview, after, i18n("Dynamic Playlists") ); QListViewItem *last = 0; QDomNode n = d.namedItem( "dynamicbrowser" ).namedItem("dynamic"); for( ; !n.isNull(); n = n.nextSibling() ) { last = new DynamicEntry( p, last, n.toElement() ); } return p; } }}voidPlaylistBrowser::fixDynamicPlaylistPath( QListViewItem *item ){ DynamicEntry *entry = dynamic_cast<DynamicEntry*>( item ); if ( entry ) { QStringList names = entry->items(); QStringList paths; foreach( names ) { QString path = guessPathFromPlaylistName( *it ); if ( !path.isNull() ) paths+=path; } entry->setItems( paths ); } PlaylistCategory *cat = dynamic_cast<PlaylistCategory*>( item ); if ( cat ) { QListViewItem *it = cat->firstChild(); for( ; it; it = it->nextSibling() ) { fixDynamicPlaylistPath( it ); } }}QStringPlaylistBrowser::guessPathFromPlaylistName( QString name ){ QListViewItem *item = m_listview->findItem( name, 0, Qt::ExactMatch ); PlaylistBrowserEntry *entry = dynamic_cast<PlaylistBrowserEntry*>( item ); if ( entry ) return entry->name(); return QString();}void PlaylistBrowser::saveDynamics(){ Amarok::config( "PlaylistBrowser" )->writeEntry( "Dynamic Random Remove Played", m_randomDynamic->cycleTracks() ); Amarok::config( "PlaylistBrowser" )->writeEntry( "Dynamic Random Upcoming Count", m_randomDynamic->upcomingCount() ); Amarok::config( "PlaylistBrowser" )->writeEntry( "Dynamic Random Previous Count", m_randomDynamic->previousCount() ); Amarok::config( "PlaylistBrowser" )->writeEntry( "Dynamic Suggest Remove Played", m_suggestedDynamic->cycleTracks() ); Amarok::config( "PlaylistBrowser" )->writeEntry( "Dynamic Suggest Upcoming Count", m_suggestedDynamic->upcomingCount() ); Amarok::config( "PlaylistBrowser" )->writeEntry( "Dynamic Suggest Previous Count", m_suggestedDynamic->previousCount() ); QFile file( dynamicBrowserCache() ); QTextStream stream( &file ); QDomDocument doc; QDomElement dynamicB = m_dynamicCategory->xml(); dynamicB.setAttribute( "product", "Amarok" ); dynamicB.setAttribute( "version", APP_VERSION ); dynamicB.setAttribute( "formatversion", "1.2" ); QDomNode dynamicsNode = doc.importNode( dynamicB, true ); doc.appendChild( dynamicsNode ); QString temp( doc.toString() ); // Only open the file after all data is ready. If it crashes, data is not lost! if ( !file.open( IO_WriteOnly ) ) return; stream.setEncoding( QTextStream::UnicodeUTF8 ); stream << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; stream << temp;}void PlaylistBrowser::loadDynamicItems(){ // Make sure all items are unmarked for( uint i=0; i < m_dynamicEntries.count(); i++ ) { QListViewItem *it = m_dynamicEntries.at( i ); if( it ) static_cast<PlaylistBrowserEntry*>(it)->setDynamic( false ); } m_dynamicEntries.clear(); // Don't use remove(), since we do i++, which would cause skip overs!!! // Mark appropriate items as used markDynamicEntries();}/** ************************************************************************* * PODCASTS ************************************************************************* **/QString PlaylistBrowser::podcastBrowserCache() const{ //returns the playlists stats cache file return Amarok::saveLocation() + "podcastbrowser_save.xml";}PlaylistCategory* PlaylistBrowser::loadPodcasts(){ DEBUG_BLOCK QFile file( podcastBrowserCache() ); QTextStream stream( &file ); stream.setEncoding( QTextStream::UnicodeUTF8 ); QDomDocument d; QDomElement e; QListViewItem *after = 0; if( !file.open( IO_ReadOnly ) || !d.setContent( stream.read() ) ) { /*Couldn't open the file or it had invalid content, so let's create an empty element*/ PlaylistCategory *p = new PlaylistCategory( m_listview, after, i18n("Podcasts") ); p->setId( 0 ); loadPodcastsFromDatabase( p ); return p; } else { e = d.namedItem( "category" ).toElement(); if ( e.attribute("formatversion") == "1.1" ) { debug() << "Podcasts are being moved to the database..." << endl; m_podcastItemsToScan.clear(); PlaylistCategory *p = new PlaylistCategory( m_listview, after, e ); p->setId( 0 ); //delete the file, it is deprecated KIO::del( KURL::fromPathOrURL( podcastBrowserCache() ) ); if( !m_podcastItemsToScan.isEmpty() ) m_podcastTimer->start( m_podcastTimerInterval ); return p; } } PlaylistCategory *p = new PlaylistCategory( m_listview, after, i18n("Podcasts") ); p->setId( 0 ); return p;}void PlaylistBrowser::loadPodcastsFromDatabase( PlaylistCategory *p ){DEBUG_BLOCK if( !p ) p = m_podcastCategory; m_podcastItemsToScan.clear(); while( p->firstChild() ) delete p->firstChild(); QMap<int,PlaylistCategory*> folderMap = loadPodcastFolders( p ); QValueList<PodcastChannelBundle> channels; channels = CollectionDB::instance()->getPodcastChannels(); PodcastChannel *channel = 0; foreachType( QValueList<PodcastChannelBundle>, channels ) { PlaylistCategory *parent = p; const int parentId = (*it).parentId(); if( parentId > 0 && folderMap.find( parentId ) != folderMap.end() ) parent = folderMap[parentId]; channel = new PodcastChannel( parent, channel, *it ); bool hasNew = CollectionDB::instance()->query( QString("SELECT COUNT(parent) FROM podcastepisodes WHERE ( parent='%1' AND isNew=%2 ) LIMIT 1" ) .arg( (*it).url().url(), CollectionDB::instance()->boolT() ) ) .first().toInt() > 0; channel->setNew( hasNew ); if( channel->autoscan() ) m_podcastItemsToScan.append( channel ); } if( !m_podcastItemsToScan.isEmpty() ) m_podcastTimer->start( m_podcastTimerInterval );}QMap<int,PlaylistCategory*>PlaylistBrowser::loadPodcastFolders( PlaylistCategory *p ){DEBUG_BLOCK
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?