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 + -
显示快捷键?