covermanager.cpp

来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 1,068 行 · 第 1/3 页

CPP
1,068
字号
    #endif}void CoverManager::showOnce( const QString &artist ){    if ( !s_instance ) {        artistToSelectInInitFunction = artist;        new CoverManager(); //shows itself    }    else {        s_instance->setActiveWindow();        s_instance->raise();    }}void CoverManager::slotArtistSelected( QListViewItem *item ) //SLOT{    if( item->depth() ) //album item        return;    QString artist = item->text(0);    if( artist.endsWith( ", The" ) )        CollectionView::instance()->manipulateThe( artist, false );    m_coverView->clear();    m_coverItems.clear();    // reset current view mode state to "AllAlbum" which is the default on artist change in left panel    m_currentView = AllAlbums;    m_viewMenu->setItemChecked( AllAlbums, true );    m_viewMenu->setItemChecked( AlbumsWithCover, false );    m_viewMenu->setItemChecked( AlbumsWithoutCover, false );    QProgressDialog progress( this, 0, true );    progress.setLabelText( i18n("Loading Thumbnails...") );    progress.QDialog::setCaption( i18n("...") );    //NOTE we MUST show the dialog, otherwise the closeEvents get processed    // in the processEvents() calls below, GRUMBLE! Qt sux0rs    progress.show();    progress.repaint( false );  //ensures the dialog isn't blank    //this is an extra processEvent call for the sake of init() and aesthetics    //it isn't necessary    kapp->processEvents();    //this can be a bit slow    QApplication::setOverrideCursor( KCursor::waitCursor() );    QueryBuilder qb;    QStringList albums;    qb.addReturnValue( QueryBuilder::tabArtist, QueryBuilder::valName );    qb.addReturnValue( QueryBuilder::tabAlbum,  QueryBuilder::valName );    qb.excludeMatch( QueryBuilder::tabAlbum, i18n( "Unknown" ) );    qb.sortBy( QueryBuilder::tabAlbum, QueryBuilder::valName );    qb.setOptions( QueryBuilder::optRemoveDuplicates );    qb.setOptions( QueryBuilder::optNoCompilations );    if ( item != m_artistView->firstChild() )        qb.addMatches( QueryBuilder::tabArtist, artist );    albums = qb.run();    //also retrieve compilations when we're showing all items (first treenode) or    //"Various Artists" (last treenode)    if ( item == m_artistView->firstChild() || item == m_artistView->lastChild() )    {        QStringList cl;        qb.clear();        qb.addReturnValue( QueryBuilder::tabAlbum,  QueryBuilder::valName );        qb.excludeMatch( QueryBuilder::tabAlbum, i18n( "Unknown" ) );        qb.sortBy( QueryBuilder::tabAlbum, QueryBuilder::valName );        qb.setOptions( QueryBuilder::optRemoveDuplicates );        qb.setOptions( QueryBuilder::optOnlyCompilations );        cl = qb.run();        for ( uint i = 0; i < cl.count(); i++ ) {            albums.append( i18n( "Various Artists" ) );            albums.append( cl[ i ] );        }    }    QApplication::restoreOverrideCursor();    progress.setTotalSteps( (albums.count()/2) + (albums.count()/10) );    //insert the covers first because the list view is soooo paint-happy    //doing it in the second loop looks really bad, unfortunately    //this is the slowest step in the bit that we can't process events    uint x = 0;    foreach( albums )    {        const QString artist = *it;        const QString album = *(++it);        m_coverItems.append( new CoverViewItem( m_coverView, m_coverView->lastItem(), artist, album ) );        if ( ++x % 50 == 0 ) {            progress.setProgress( x / 5 ); // we do it less often due to bug in Qt, ask Max            kapp->processEvents(); // QProgressDialog also calls this, but not always due to Qt bug!            //only worth testing for after processEvents() is called            if( progress.wasCancelled() )               break;        }    }    //now, load the thumbnails    for( QIconViewItem *item = m_coverView->firstItem(); item; item = item->nextItem() ) {        progress.setProgress( progress.progress() + 1 );        kapp->processEvents();        if( progress.wasCancelled() )           break;        static_cast<CoverViewItem*>(item)->loadCover();    }    updateStatusBar();}void CoverManager::showCoverMenu( QIconViewItem *item, const QPoint &p ) //SLOT{    #define item static_cast<CoverViewItem*>(item)    if( !item ) return;    enum { SHOW, FETCH, CUSTOM, DELETE, APPEND };    KPopupMenu menu;    menu.insertTitle( i18n( "Cover Image" ) );    QPtrList<CoverViewItem> selected = selectedItems();    if( selected.count() > 1 ) {        menu.insertItem( SmallIconSet( Amarok::icon( "download" ) ), i18n( "&Fetch Selected Covers" ), FETCH );        menu.insertItem( SmallIconSet( Amarok::icon( "files" ) ), i18n( "Set &Custom Cover for Selected Albums" ), CUSTOM );        menu.insertItem( SmallIconSet( Amarok::icon( "remove" ) ), i18n( "&Unset Selected Covers" ), DELETE );        menu.insertItem( SmallIconSet( Amarok::icon( "add_playlist" ) ), i18n( "&Append to Playlist" ), APPEND );    }    else {        menu.insertItem( SmallIconSet( Amarok::icon( "zoom" ) ), i18n( "&Show Fullsize" ), SHOW );        menu.insertItem( SmallIconSet( Amarok::icon( "download" ) ), i18n( "&Fetch From amazon.%1" ).arg( CoverManager::amazonTld() ), FETCH );        menu.insertItem( SmallIconSet( Amarok::icon( "files" ) ), i18n( "Set &Custom Cover" ), CUSTOM );        menu.insertItem( SmallIconSet( Amarok::icon( "add_playlist" ) ), i18n( "&Append to Playlist" ), APPEND );        menu.insertSeparator();        menu.insertItem( SmallIconSet( Amarok::icon( "remove" ) ), i18n( "&Unset Cover" ), DELETE );        menu.setItemEnabled( SHOW, item->hasCover() );        menu.setItemEnabled( DELETE, item->canRemoveCover() );    }    #ifndef AMAZON_SUPPORT    menu.setItemEnabled( FETCH, false );    #endif    switch( menu.exec(p) ) {        case SHOW:            viewCover( item->artist(), item->album(), this );            break;        #ifdef AMAZON_SUPPORT        case FETCH:            fetchSelectedCovers();            break;        #endif        case CUSTOM:        {            setCustomSelectedCovers();            break;        }        case DELETE:            deleteSelectedCovers();            break;       case APPEND:       {           CoverViewItem* sel;           for ( sel = selected.first(); sel; sel = selected.next() )           {               QString artist_id;               QString album_id;               artist_id.setNum( CollectionDB::instance()->artistID( sel->artist() ) );               album_id.setNum( CollectionDB::instance()->albumID( sel->album() ) );               Playlist::instance()->insertMedia( CollectionDB::instance()->albumTracks( artist_id, album_id ), Playlist::Append );           }           break;       }        default: ;    }    #undef item}void CoverManager::coverItemExecuted( QIconViewItem *item ) //SLOT{    #define item static_cast<CoverViewItem*>(item)    if( !item ) return;    item->setSelected( true );    if ( item->hasCover() )        viewCover( item->artist(), item->album(), this );    else        fetchSelectedCovers();    #undef item}void CoverManager::slotSetFilter() //SLOT{    m_filter = m_searchEdit->text();    m_coverView->selectAll( false);    QIconViewItem *item = m_coverView->firstItem();    while ( item )    {        QIconViewItem *tmp = item->nextItem();        m_coverView->takeItem( item );        item = tmp;    }    m_coverView->setAutoArrange( false );    for( QIconViewItem *item = m_coverItems.first(); item; item = m_coverItems.next() )    {        CoverViewItem *coverItem = static_cast<CoverViewItem*>(item);        if( coverItem->album().contains( m_filter, false ) || coverItem->artist().contains( m_filter, false ) )            m_coverView->insertItem( item, m_coverView->lastItem() );    }    m_coverView->setAutoArrange( true );    m_coverView->arrangeItemsInGrid();    updateStatusBar();}void CoverManager::slotSetFilterTimeout() //SLOT{    if ( m_timer->isActive() ) m_timer->stop();    m_timer->start( 180, true );}void CoverManager::changeView( int id  ) //SLOT{    if( m_currentView == id ) return;    //clear the iconview without deleting items    m_coverView->selectAll( false);    QIconViewItem *item = m_coverView->firstItem();    while ( item ) {        QIconViewItem *tmp = item->nextItem();        m_coverView->takeItem( item );        item = tmp;    }    m_coverView->setAutoArrange(false );    for( QIconViewItem *item = m_coverItems.first(); item; item = m_coverItems.next() ) {        bool show = false;        CoverViewItem *coverItem = static_cast<CoverViewItem*>(item);        if( !m_filter.isEmpty() ) {            if( !coverItem->album().contains( m_filter, false ) && !coverItem->artist().contains( m_filter, false ) )                continue;        }        if( id == AllAlbums )    //show all albums            show = true;        else if( id == AlbumsWithCover && coverItem->hasCover() )    //show only albums with cover            show = true;        else if( id == AlbumsWithoutCover && !coverItem->hasCover() )   //show only albums without cover            show = true;        if( show )    m_coverView->insertItem( item, m_coverView->lastItem() );    }    m_coverView->setAutoArrange( true );    m_viewMenu->setItemChecked( m_currentView, false );    m_viewMenu->setItemChecked( id, true );    m_coverView->arrangeItemsInGrid();    m_currentView = id;}void CoverManager::changeLocale( int id ) //SLOT{    QString locale = CoverFetcher::localeIDToString( id );    AmarokConfig::setAmazonLocale( locale );    m_amazonLocaleMenu->setItemChecked( m_currentLocale, false );    m_amazonLocaleMenu->setItemChecked( id, true );    m_currentLocale = id;}void CoverManager::coverFetched( const QString &artist, const QString &album ) //SLOT{    loadCover( artist, album );    m_coversFetched++;    updateStatusBar();}void CoverManager::coverRemoved( const QString &artist, const QString &album ) //SLOT{    loadCover( artist, album );    m_coversFetched--;    updateStatusBar();}void CoverManager::coverFetcherError(){    DEBUG_FUNC_INFO    m_coverErrors++;    updateStatusBar();}void CoverManager::stopFetching(){    Debug::Block block( __PRETTY_FUNCTION__ );    m_fetchCovers.clear();    m_fetchCounter = 0;    //delete all cover fetchers    QObjectList* list = queryList( "CoverFetcher" );    for( QObject *obj = list->first(); obj; obj = list->next()  )        obj->deleteLater();    delete list;    m_fetchingCovers = 0;    updateStatusBar();}// PRIVATEvoid CoverManager::loadCover( const QString &artist, const QString &album ){    for( QIconViewItem *item = m_coverItems.first(); item; item = m_coverItems.next() )    {        CoverViewItem *coverItem = static_cast<CoverViewItem*>(item);        if ( album == coverItem->album() && ( artist == coverItem->artist() || ( artist.isEmpty() && coverItem->artist().isEmpty() ) ) )        {            coverItem->loadCover();            return;        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?