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